Простая задача
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.42] |
|
|
Правила раздела:
| Страницы: (5) [1] 2 3 ... Последняя » все ( Перейти к последнему сообщению ) |
Простая задача
|
Сообщ.
#1
,
|
|
|
|
Архипростая задача - http://codeforces.ru/contest/538/problem/B
но короткое и красивое решение требует сил. Мое решение, правда на D: Скрытый текст ![]() ![]() import std.stdio; import std.range; import std.string; import std.algorithm; void main() { string s = readln.chomp; int n = s.reduce!max - '0'; n.writeln; n.iota.map!(i => s.map!(c => c > i + '0' ? "1" : "0").join.find!(c => c != '0')).join(" ").writeln; } |
|
Сообщ.
#2
,
|
|
|
|
Это моя первая задача там
Добавлено Вот тут нашел вырвиглазное перловое решение. Ничего не понимаю ![]() ![]() ![]() $_ = <>; $w = $_, y/1-9/0-8/, push @a, $w - $_ while - $_; print 0 + @a, "$/@a" |
|
Сообщ.
#3
,
|
|
|
|
Моё на плюсах. Думаю, при наличии чего-либо а-ля linq можно короче
![]() ![]() ![]() #include <iostream> #include <algorithm> #include <string> using namespace std; int main() { std::string str; cin >> str; cout << *std::max_element(str.begin(), str.end()) - '0' << std::endl; while(!str.empty()) { int i = 0; while(i < str.size() && str[i] == '0') ++i; int j = i; while(j < str.size()) { if(str[j] == '0') cout << '0'; else { cout << '1'; --str[j]; } ++j; } cout << " "; str = str.substr(i); } } |
|
Сообщ.
#4
,
|
|
|
|
Вот аналог моего дешного решения на плюсах:
![]() ![]() #include <iostream> #include <algorithm> #include <string> using namespace std; int main() { string str; cin >> str; char n = *std::max_element(str.begin(), str.end()); cout << n << endl; for(char i = '0'; i < n ; ++i) { auto zero = ""; for(int j = 0; j < str.length(); ++j) { if(str[j] > i) { cout << "1"; zero = "0"; } else { cout << zero; } } cout << " "; } } Добавлено Еще слегка упростил: ![]() ![]() #include <iostream> #include <algorithm> #include <string> using namespace std; int main() { string str; cin >> str; char n = *std::max_element(str.begin(), str.end()); cout << n << endl; for(char i = '0'; i < n ; ++i) { auto d = ""; for(int j = 0; j < str.length(); ++j) cout << (d = str[j] > i ? d = "1" : d[0] == 0 ? "" : "0"); cout << " "; } } |
|
Сообщ.
#5
,
|
|
|
|
Собственно идея простая, и думается везде вше именно она и реализована
Пара утверждений: 1. Любую десятичную цифру можно получить, просуммировав не более 9 раз в соответствующем разряде цифру "1". Суммирование "0" не оказывает влияния на результат. 2. Хотя цифру можно получить суммируя "1" в младшем разряде, это приводит к увеличению числа слагаемых сверх 9. Поэтому получаем алгоритм выписываем десятичную запись числа заменяем все цифры не являющиеся нулями на "1" выводим получившийся результат, как очередное слагаемое вычитаем значение слагаемого из числа если результат не ноль возвращаемся к началу алгоритма в результате получаем не более 9 слагаемых о первой цифре заботиться не надо, в десятичной записи она всегда ненулевая, кроме случая, когда число равно нулю |
|
Сообщ.
#6
,
|
|
|
|
Цитата applegame @ Вот тут нашел вырвиглазное перловое решение. Ничего не понимаю Автор Перловского исходника - обычный понторез. Дело в том, что Perl - язык достаточно свободного синтаксиса, чем и воспользовался автор, дабы затуманить мозги Цэ++ тру-кодерам Привожу более удобоваримый вариант на Перле:![]() ![]() $_ = <>; # читаем из STDIN строку в "базовый" скаляр, более наглядно: $_ = <STDIN> ; while (-$_) { # проверяем "минус базовый скаляр" не равер нулю $w = $_; # в переменную $w копируем значение базового скаляра y/1-9/0-8/; # в базовом скаляре транслируем цифры по правилу 9->8, 8->7 ... 1->0 push @a, $w - $_; # в массив @a заносим значение ($w -$_) } print 0 + @a, "$/@a" # распечатываем длину массива и его содержимое Небольшие разъяснения: 1) был использован "постфиксный" вариант while вместо "while($A==1) { $B=2 }" использовали аналог "$B=2 while $A==1", при этом опустив скобки в проверяемом выражении 2) вместо группировки наборов операторов в блок "{...}" - применили "операцию запятая" 3) использовав "стандартный скаляр" - избавились в строчке трансляции "y/1-9/0-8/" указания что именно транслируем Вот и вся кухня. Алгоритм виден по комментариям. Обожаю Перл, но осуждаю понторезов |
|
Сообщ.
#7
,
|
|
|
|
Цитата JoeUser @ Привожу более удобоваримый вариант на Перле |
|
Сообщ.
#8
,
|
|
|
|
А что не так?
|
|
Сообщ.
#9
,
|
|
|
|
Ну я особой разницы между
![]() ![]() $_ = <>; $w = $_, y/1-9/0-8/, push @a, $w - $_ while - $_; print 0 + @a, "$/@a" и ![]() ![]() $_ = <>; while (-$_) { $w = $_; y/1-9/0-8/; push @a, $w - $_; } print 0 + @a, "$/@a" Не вижу. В плане понятности. А вот за разъяснения и комментарии спасибо |
|
Сообщ.
#10
,
|
|
|
|
Ну ... я хрен его знает чего сказать
По мне второй вариант - конфетка в плане "понятности". Щя сек ... поищу на форуме давнишнюю свою тему по поводу Перла ... Добавлено Вот, прочитай тему. Вот тут эталонный туман. Добавлено Я об этом. Под рутом не запускать!!!! ![]() ![]() $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see |
|
Сообщ.
#11
,
|
|
|
|
JoeUser, ты ж понимаешь, что кто-нибудь да запустит. Заикаешь если вдруг, будешь знать, из-за чего.
|
|
Сообщ.
#12
,
|
|
|
|
Скрытый текст Цитата Qraizer @ JoeUser, ты ж понимаешь, что кто-нибудь да запустит. Заикаешь если вдруг, будешь знать, из-за чего. Ну я ж спецом предупредил, вменяемым людям, ИМХО, этого достаточно. |
|
Сообщ.
#13
,
|
|
|
|
Цитата applegame @ короткое и красивое решение на D Пфф… =) ![]() ![]() import Data.Char toBinList [] = [] toBinList s = let (hd, tl) = part s in hd : toBinList (dropWhile (== '0') tl) part = unzip . map choose choose '0' = ('0','0') choose c = ('1', chr $ ord c - 1) main = do s <- getLine let l = toBinList s print $ length l putStrLn $ unwords l |
|
Сообщ.
#14
,
|
|
|
|
Приводить код на неведомом ЯП без комментов - моветон! Ящетаю.
|
|
Сообщ.
#15
,
|
|
|
|
Цитата JoeUser @ Приводить код на неведомом ЯП без комментов - моветон! Ящетаю. Скрытый текст Для applegame'а, на чей пост я отвечал, как и для большинства здесь отписавшихся, он вполне ведом, насколько я знаю. =) |