На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (5) [1] 2 3 ... Последняя » все  ( Перейти к последнему сообщению )  
> Простая задача
    Архипростая задача - http://codeforces.ru/contest/538/problem/B
    но короткое и красивое решение требует сил.

    Мое решение, правда на D:
    Скрытый текст
    ExpandedWrap disabled
      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;
      }
      Цитата OpenGL @
      Тоже участвуешь в соревнованиях там? :)
      Это моя первая задача там :)

      Добавлено
      Вот тут нашел вырвиглазное перловое решение. Ничего не понимаю :)
      ExpandedWrap disabled
        $_ = <>;
            $w = $_,
            y/1-9/0-8/,
            push @a, $w - $_
            while - $_;
        print 0 + @a, "$/@a"
        Моё на плюсах. Думаю, при наличии чего-либо а-ля linq можно короче :)
        ExpandedWrap disabled
          #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);
              }
          }
          Вот аналог моего дешного решения на плюсах:
          ExpandedWrap disabled
            #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 << " ";
                }
            }


          Добавлено
          Еще слегка упростил:
          ExpandedWrap disabled
            #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 << " ";
                }
            }
          Сообщение отредактировано: applegame -
            Собственно идея простая, и думается везде вше именно она и реализована
            Пара утверждений:
            1. Любую десятичную цифру можно получить, просуммировав не более 9 раз в соответствующем разряде цифру "1". Суммирование "0" не оказывает влияния на результат.
            2. Хотя цифру можно получить суммируя "1" в младшем разряде, это приводит к увеличению числа слагаемых сверх 9.

            Поэтому получаем алгоритм

            выписываем десятичную запись числа
            заменяем все цифры не являющиеся нулями на "1"
            выводим получившийся результат, как очередное слагаемое
            вычитаем значение слагаемого из числа
            если результат не ноль возвращаемся к началу алгоритма

            в результате получаем не более 9 слагаемых
            о первой цифре заботиться не надо, в десятичной записи она всегда ненулевая, кроме случая, когда число равно нулю
              Цитата applegame @
              Вот тут нашел вырвиглазное перловое решение. Ничего не понимаю

              Автор Перловского исходника - обычный понторез. Дело в том, что Perl - язык достаточно свободного синтаксиса, чем и воспользовался автор, дабы затуманить мозги Цэ++ тру-кодерам :lol: Привожу более удобоваримый вариант на Перле:
              ExpandedWrap disabled
                $_ = <>;              # читаем из 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/" указания что именно транслируем

              Вот и вся кухня. Алгоритм виден по комментариям. Обожаю Перл, но осуждаю понторезов :lol:
              Сообщение отредактировано: JoeUser -
                Цитата JoeUser @
                Привожу более удобоваримый вариант на Перле

                :lool:
                  А что не так? :-?
                    Ну я особой разницы между

                    ExpandedWrap disabled
                      $_ = <>;
                          $w = $_,
                          y/1-9/0-8/,
                          push @a, $w - $_
                          while - $_;
                      print 0 + @a, "$/@a"


                    и

                    ExpandedWrap disabled
                      $_ = <>;
                      while (-$_) {
                        $w = $_;
                        y/1-9/0-8/;
                        push @a, $w - $_;
                      }
                      print 0 + @a, "$/@a"


                    Не вижу. В плане понятности.

                    А вот за разъяснения и комментарии спасибо :)
                      Ну ... я хрен его знает чего сказать :-? По мне второй вариант - конфетка в плане "понятности".
                      Щя сек ... поищу на форуме давнишнюю свою тему по поводу Перла ...

                      Добавлено
                      Вот, прочитай тему. Вот тут эталонный туман.

                      Добавлено
                      Я об этом. Под рутом не запускать!!!!
                      ExpandedWrap disabled
                        $??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see
                        JoeUser, ты ж понимаешь, что кто-нибудь да запустит. Заикаешь если вдруг, будешь знать, из-за чего.
                          Скрытый текст
                          Цитата Qraizer @
                          JoeUser, ты ж понимаешь, что кто-нибудь да запустит. Заикаешь если вдруг, будешь знать, из-за чего.

                          Ну я ж спецом предупредил, вменяемым людям, ИМХО, этого достаточно.
                            Цитата applegame @
                            короткое и красивое решение на D

                            Пфф… =)
                            ExpandedWrap disabled
                              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
                              Приводить код на неведомом ЯП без комментов - моветон! Ящетаю.
                                Цитата JoeUser @
                                Приводить код на неведомом ЯП без комментов - моветон! Ящетаю.

                                Скрытый текст
                                Для applegame'а, на чей пост я отвечал, как и для большинства здесь отписавшихся, он вполне ведом, насколько я знаю. =)
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.0963 ]   [ 15 queries used ]   [ Generated: 8.07.26, 04:01 GMT ]