Loading...
+ Нов въпрос
dmartinov avatar dmartinov 37 Точки

Hex-Colors

Здравейте, ще се осмеля да помоля за малко насоки за тази задача. Разбирам условието и разбирам какво трябва да се направи, но нещо се оплетох как трябва да подходя - как интелигентно да извлека двойките за аритметичните операции? Направих набързо едно глупаво решение с 6 променливи, 6 входни потока, които прекарвам през std::hex и...работи, но се натъкнах на проблема когато получа 0 и трябва да изпечатам 00. Това го оправих с някакви измислени if-ове. Та, това беше, за да тествам дали съм разбрал правилно условието и изглежда, че съм схванал идеята, но подхода.....мъгла в главата ми :D 

Тагове:
0
C++ Fundamentals
Vankata83 avatar Vankata83 72 Точки

Здравей колега

Аз си напълних два масива с двата входа - на всеки един масив елементите са двойките от входа.

След това ги обхождам(независимо од сайза на кой масив, защото са с еднаква големина) и правя съответните аритметични действия.

Накрая печатам резултата, като използвам готовата функция hex както и std::setfill('0') и std::setw(2) Последните две запълват с нула ако символите са по - малко от два.

1
Vankata83 avatar Vankata83 72 Точки

Самите двойки може да вземеш като обиколош стринга и вземаш събстринг (i, 2)

Като i го увеличаваш с две във for цикъла. Като първоначалната стойност на i е 1, за да избегнеш #

1
Knightwalker avatar Knightwalker 38 Точки

Здравей, интересна задача. Мога да ти споделя аз как я реших.

По задание ни е казано, че за да смесим два цвята стратегията е да вземем 1-ви цвят и да го разцепим на 3 компонента. После да вземем 2-ри цвят и него да го разцепим на 3 компонента. След което да изчислим на всеки компонент средната стойност и да го обърнем обратно в hexadecimal.

  • Color1 has the components red1, green1, blue1,
  • Color2 has the components red2, green2, blue2,
  • The "average" of those two colors is calculated as (red1 + red2) / 2, (green1 + green2) / 2, (blue1 + blue2) / 2.
  • For our 2 example colors #ff0000 and #808000, the average would be #bf4000

Аз подходих по следния начин:

int main()
{
	string color_one = ""; cin >> color_one;
	string color_two = ""; cin >> color_two;

	stringstream ss; ss << "#";

първо ги взех двете числа и направо си подготвих изхода в стрингстрийм, като му залепих "#"

	for (int i = 0; i < 3; i++)
	{
		int n1 = stoi(color_one.substr(i * 2 + 1, 2), nullptr, 16);
		int n2 = stoi(color_two.substr(i * 2 + 1, 2), nullptr, 16);
		ss << hex << setw(2) << setfill('0') << (n1 + n2) / 2;
	}

после, понеже знам че всеки цвят е съставен от 3 компонента, въртя цикъл до 3 и със substring, взимам точно 2 цифри от стринга. Тоест i * 2 + 1 , а това + 1 е за да не прочета първият "#" символ.

  • при първо въртене i = 0 , color_one = (0 * 2 + 1, 2) = ff  ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. ff = 255
  • при първо въртене i = 0, color_two = (0 * 2 + 1, 2) = 80 ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. 80 = 128
  •  
  • при първо въртене i = 0 , color_one = (1 * 2 + 1, 2) = 00 ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. 00 = 0
  • при първо въртене i = 0, color_two = (1 * 2 + 1, 2) = 80 ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. 80 = 128
  •  
  • при първо въртене i = 0 , color_one = (2 * 2 + 1, 2) = 00 ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. 00 = 0
  • при първо въртене i = 0, color_two = (2 * 2 + 1, 2) = 00 ... също така на функцията substr, казваме че формата е 16 (hexadecimal) и тя го обръща. 00 = 0

повреме на въртенето със stoi() ги конвертираш към инт, събираш ги, делиш ги на 2 и ги долепяш във стрингстрийма ss .

Цялостно решение:

#include<iostream>;
#include<string>;
#include<sstream>;
#include<iomanip>;
using namespace std;

int main()
{
	string color_one = ""; cin >> color_one;
	string color_two = ""; cin >> color_two;

	stringstream ss; ss << "#";
	for (int i = 0; i < 3; i++)
	{
		int n1 = stoi(color_one.substr(i * 2 + 1, 2), nullptr, 16);
		int n2 = stoi(color_two.substr(i * 2 + 1, 2), nullptr, 16);
		ss << hex << setw(2) << setfill('0') << (n1 + n2) / 2;
	}

	string result(ss.str());
	cout << result << endl;

	return 0;
}
1
dmartinov avatar dmartinov 37 Точки

Супер сте! Благодаря ви и на двамата. 

Признавам, че през цялото време логика комбинираща решението на двама ви ми се въртя в главата, но ей тоя пусти substr как не се сетих за него......толкова много ме спъна това. След малко като довърша решението си, да видя дали няма да се спъна някъде другаде, и ще покажа и моя вариант. Ама така е, който няма глава, има форум :D

0
23/10/2019 11:43:20
dmartinov avatar dmartinov 37 Точки

Така, ето го и моето решение. Има какво да се желае от гледна точка на изчистване на кода, но като за набързо, става :) Отново ви благодаря! 

#include <sstream>
#include <string>
#include <iostream>
#include <vector>
#include <iomanip>

void calculateNewColor (std::string firstColor, std::string secondColor) {

    std::vector<std::string> firstSubstrings;
    std::vector<std::string> secondSubstrings;

    for (size_t i = 1; i < firstColor.size(); i += 2) {
        firstSubstrings.push_back(firstColor.substr(i,2));
        secondSubstrings.push_back(secondColor.substr(i,2));
    }

    int firstNewColor = 0;
    int secondNewColor = 0;

    std::cout << '#';

    for (size_t i = 0; i < firstSubstrings.size(); ++i) {

        std::stringstream firstIss(firstSubstrings[i]);
        std::stringstream secondIss(secondSubstrings[i]);

        firstIss >> std::hex >> firstNewColor;
        secondIss >> std::hex >> secondNewColor;

        std::cout << std::hex << std::setw(2) << std::setfill('0') << (firstNewColor + secondNewColor)/2;
    }
}

int main() {

    std::string firstColor;
    std::string secondColor;

    std::cin >> firstColor;
    std::cin >> secondColor;

    calculateNewColor (firstColor, secondColor);

  return 0;
}

0
23/10/2019 12:10:29
Knightwalker avatar Knightwalker 38 Точки

Здравей, ами поста ми беше изтрит понеже май не трябваше да си поствам кода, но ще ти споделя най-правилният вариант според мен. С риск да не повторя това което колегата казва -> най-удобно е да въртиш цикъл до 3, и да ги взимаш по 2-йки със събстринг. 

Демек при събстринг от (i * 2 + 1, 2) на всяко въртене ако имаме bf8000 

-първият път ще вземе bf

-вторият път ще вземе 80

-третият път ще вземе 00

А тези проверки с нулите могат допълнително да се избегнат с <iomanip> header и функцийте setw(2) setfill('0'). 

0
dmartinov avatar dmartinov 37 Точки

Мммм, не поста си ти е тук :) Или поне този в който си отговорил на въпроса ми още преди аз да пиша. Иначе да, аз идеята за решаването я имах, но извличането на 2-ките от стринга ме спъваше много. Просто изобщо не се сетих за substr. Щом ме подсетихте за него след 15 мин я реших :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.