1. Python / Говнокод #12850

    −99

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    # 2017991 => 20/17/99
                    # 658581 => 65/85
                    # 6585 => 65
    
                    id = id[:(len(id)%2) - 2]
                    subfolders = ''.join([(i and i % 2 == 0 and '/' or '') + x for  i, x  in enumerate(id)])

    В 4 часа утра написал такой вот щит. Можно по вашему мнению это как-то упросить?

    Запостил: sbb, 04 Апреля 2013

    Комментарии (116) RSS

    • >>> s = '098922'
      >>> '/'.join([''.join(l) for l in zip(s[::2], s[1::2])])
      '09/89/22'
      Ответить
      • для его примера '658581' не будет работать

        мне что-то кроме
        '/'.join([id[:(len(id)%2)-2][i:i+2] for i in xrange(0,len(id) + len(id)%2 - 2,2)])

        ничего в голову не лезет
        Ответить
        • эм, а почему нельзя: '/'.join(id[i:i+2] for i in range(0,len(id)-2,2))
          Ответить
          • Эм, а почему нельзя вопросительный знак в конце вопросительного предложения поставить?
            Ответить
            • очевидно же: было влом в code оборачивать, а иначе "?" сливался бы с кодом, а перед ":" по стилистике не подходило, доступно?)
              Ответить
    • >id = id[:(len(id)%2) - 2]
      че это?
      Ответить
    • '/'.join(re.findall(r'.{2}', (id + (len(id) & 1) * 'x')[: - 2]))

      Не корысти ради, а из любви к исскуству.
      Ответить
    • А в императивном смысле переписать что-то мешает, или надо выебнтуться получше?
      Ответить
      • > а в императивном смысле

        какая гадость, наоборот же, не хватает функциональщины: intercalate "/" . init . splitEvery 2
        Ответить
        • Лол, init то нах ввернул. Если число элементов в списке кратно числу элементов в группе, то получится не верно работающая программа
          Ответить
          • > Если число элементов в списке кратно ..

            С этого момента поподробнее: вход / что по-вашему выдаст / что по-вашему должна?
            Ответить
            • Вход: 101615
              Должно: 10/16/15
              Получили из-за init : 10/16
              Ответить
              • А вы комменты принциально в коде пропускаете, а то:

                >> # 658581 => 65/85
                Ответить
                • Да это что-то странное. Где такое может понадобится?
                  Ответить
      • Крестоимперативненько:
        http://ideone.com/1XGMTD
        Немного понятней, чем в топике, но всё равно отстой.
        Ответить
        • Блин, никто даже не заметил variable size array на стеке... Я вот только недавно об этом узнал.
          Ответить
          • гццизм
            Ответить
            • В clang тоже работает, хоть и не стандарт.
              Ответить
              • судя по живому рабочему космосу
                -pedantic
                шланг 3.2: source.cpp:12:13: warning: variable length arrays are a C99 feature [-Wvla]
                г-ацетилцистеин 4.8.0: source.cpp:12:10: warning: ISO C++ forbids variable length array [-Wvla]
                Ответить
                • Да, я знаю, мы тут баловались с VLA в сишке, решили посмотреть, как кресты их прожуют. Прожевали. Самый угар был, когда мы скормили ГЦЦ VLA, содержащий типы с нетривиальными деструкторами, и кинули из функции исключение. Скомпилилось, и деструкторы отработали! А шланг ругнулся на не-PODы в массиве.
                  В продакшене этому, конечно, не место.
                  Ответить
                  • как качество (скорость, размер) бинарника шланга в сравнении с гцц?
                    в продакшене
                    Ответить
                    • Шланг я только у себя на машине держу, в нём инспекции годные и вывод ошибок более-менее вменяемый.
                      Ответить
                      • офтопа ради
                        не пойму отчего прямо сейчас в бубунтовском gcc version 4.7.2 (Ubuntu/Linaro 4.7.2-2ubuntu1) линковка с порядком опций g++ -L ... -llib1 -llib2 -o result objects нихера не работает - не находит никаких символов из указанных библиотек, а с порядком опций g++ -L ... -o result objects -llib1 -llib2 всё нормально
                        чудеса какие то
                        Ответить
                        • Порядок либ имеет значение, но чтобы положение -o влияло на результат... Очень странно, первый раз такое вижу. А в других релизах бубунты работало?
                          Ответить
                          • мне стыдно рассказывать, в каком конкретно релизе работало)
                            вот сейчас экспериментирую с bleeding-edge и удивляюсь
                            Ответить
          • gcc 4.7.2 уже пытается поддерживать С++14? Хотя больше похоже на гецецизм. Потому что в С++14 хотели std::dynamic_array навертеть над std::alloca
            Ответить
        • Простите, а вы действительно хотели показать, что две говняные строчки на Python'e с успехом заменяют сорок две строчки на си плюс плюс?
          Ответить
          • Ну, во-первых, соответсвующего кода там всего около 15 строк. Во-вторых, плюсовый код более общий. Ну и в третьих, расход ресурсов не сопоставим.
            Ответить
            • Вот, убрал ГЦЦзмы, добавил крестолюбства, опубликовал на православном ЖивомРабочемКосмосе
              http://liveworkspace.org/code/25xGpo$3
              Ответить
              • >const std::pair<char*, std::ptrdiff_t> buf =
                > std::get_temporary_buffer<char>(group_si ze);
                >
                > if (buf.second < group_size) {
                > std::return_temporary_buffer(buf.first);
                > throw std::runtime_error("Can't allocate temporary buffer");
                Лол, get_temporary_buffer не обязан выдавать тебе весь запрошенный буфер даже при достаточных ресурсах, так что ты заюзал компилятороспицифичную вещь
                Ответить
                • Да, это я немного затупил. Тогда вот так
                  http://liveworkspace.org/code/25xGpo$5
                  Можно было бы сделать размер группы параметром шаблона, но тогда можно будет использовать только константу времени компиляции, да и параметр шаблона надо будет указывать явно. Вот простая "неленивая" версия в стиле 3.14
                  http://liveworkspace.org/code/1kfHVC$0
                  Ответить
                  • Вторая версия в этом посте мне нравится и вообще заметно похудела, а вот первая с утечками памяти не торт
                    Ответить
                    • Да, утечка, если запись в OutputIterator кидает исключения. А ты можешь предложить более изящный, безопасный и компактный вариант первой версии без буста и дополнительных классов?

                      P.S. Эх, с VLA очень удобно получается...
                      Ответить
                      • std::string вместо char*
                        Ответить
                        • Да, что-то я туплю к вечеру. Жаль, не получится избавиться от цикла в 13-14
                          http://liveworkspace.org/code/25xGpo$10
                          Ответить
                          • Хотя, если добавить вспомогательный алгоритм, то код становится довольно читабельным
                            http://liveworkspace.org/code/25xGpo$13
                            Ответить
                            • > bound_copy
                              Вот и мне не нравится, что стандартные алгоритмы не имеют версии ограничиные размером всех источников и приемников. По мне так лишний камень в огород безопасности С++.
                              Ответить
                              • Да, для меня это тоже загадка. Видимо, не хотели добавлять ещё 80 алгоритмов, отличающихся одним параметром.
                                Ответить
                              • > bound_copy
                                По уму он должен пару итераторов возвращать, чтобы можно было проверить, какая последовательность кончилась раньше. Но мне было лень писать лишние буквы.
                                Ответить
              • А вообще ты написал обощённое чудовище. У любого сишника или хацкелиста это получилось бы в пару строчек и соответственно в одну
                Ответить
                • Я знаю, и я об этом ниже написал. На самом деле хотелось поиграться с VLA.
                  Ответить
    • извините, но уровень "интуитивности" и "читабельности" вашего питона превышает интелектуальные способности моего мозга.

      на перле, как понял:
      @a = m/(.{1,2})/g; 
      $id = $a[$#a];
      @subfolders = join('/', @a[0..$#a-1]);


      почему никто сверху не пользуется жадностью регулярок, я не понимаю.
      Ответить
      • А, ну, вобщем, да, так:
        '/'.join(re.findall(r'.{1,2}', s)[: -1])

        было бы короче.
        Ответить
        • Ну можно и так, но мне кажется что использовать для этого регулярки - это тот еще оверкилл...
          Ответить
          • Ну так Питон весь интерпретируемый. Какая разница интерпретировать регулярное выражение, или выражение на Питоне? Тем более, что тут нужно понимать так, что строки будут короткие.
            Ответить
            • > Какая разница интерпретировать регулярное выражение, или выражение на Питоне?

              я бы не стал на этом останавливаться... действительно, какая разница: интерпретировать цикл или рекурсию? (а поддержки tco нема) etc
              Ответить
              • Ну так есть же рядом тест. Даже при том, что регулярное выражение компилируется каждый раз, результат всего в 2.5 раз лучше. Если скомпилировать, то будет практически одинаково.
                Ответить
                • То есть акцент на провизводительности, обходя стороной, что по смыслу регулярки здесь не очень подходят? (и что-то мне подсказывает, что если потребуются подстроки большей длины, то у регулярок будет хуже)

                  > Ну так есть же рядом тест

                  Смотрю на поля cumtime для test_regex и test_for и вижу, что здесь регулярки не нужны. А куда надо?
                  Ответить
                  • Код получился короче и понятнее: потому, что мы использовали функции с названиями объясняющими, что код делает вместо использования более общей конструкции - цикла.
                    Чтобы понять, что в цикле происходит разбивка на части и аггрегация, нам нужно читать и понимать что делает код, а не что должен делать. Это более затратная операция, которая чревата ошибками вызваными невнимательностью.
                    Врезультате мы получили соизмеримые результаты по времени - ну так чего эще хочется?
                    Вы хотите оптимизировать? Питон позволяет расширения на Си - если так сильно хочется, напишите на си и подключите.
                    Ответить
                    • >Код получился короче и понятнее
                      >Вы хотите оптимизировать? Питон позволяет расширения на Си - если так сильно хочется, напишите на си и подключите.

                      Понятнее? Все ебанулись штоле со своими регулярками, пёрлом, крестами и итераторами:?
                      var a="2017991",n=2,b="";
                          for(var i=0, len=a.length-n; i < len; i += n) {
                             if (b.length>0) b+="\\";
                             b+=a.substr(i, n);
                          }
                      console.log(b);

                      Сука, блядь, в школу, немедленно. Изучать цикл фор. Пиздец...


                      >но уровень "интуитивности" и "читабельности" вашего питона
                      Будто бы пёрл лучше? Такое же говно.
                      Ответить
                      • Бурные нестихающие апплодисменты.
                        Ответить
                        • Теперь я понимаю что этому треду не хватает LINQ.
                          http://ideone.com/jZWel5
                          Знаю String.Join некошерно, надо было Aggregate
                          Ответить
                          • А вот тепэрь представьте, что в Питоне 5 вдруг регулярные выражения таки действительно распраллелят. Т.как мы написали декларативный код, который разрешает среде оптимизировать вычисления, то среда сможет сгенерировать код, который сделает аггрегацию не за О(n), а за O(log n) (теоретически, с параллельными вычислениями, это должно быть выполнимо).
                            А те, кто делал аггрегацию в цикле - остануться за бортом (т.как они уже написали алгоритм так, что он должен быть линейным).
                            Ответить
                            • циклы в пятом питоне распараллелят быстрее
                              Ответить
                              • Произвольный цикл в принципе нельзя распараллелить. Тот, который в коде выше нужно будет переписывать, т.как он под это не заточен.
                                Ответить
                                • > Произвольный цикл в принципе нельзя распараллелить.
                                  #pragma omp parallel
                                  Питон вообще не параллелится тредами из-за своего дурацкого GIL. А тайком поднимать процессы для обработки регулярок как-то глупо.
                                  Ответить
                                  • 1. У Питона нет какой-то одной единственной реализации. В Питоне 5 их будет 3, для разных операционных систем, все из трех будут компилироваться в инструкции процессора этой системы, используя технологии параллельного вычисления, которые НВидия по доброте душевной начала за пять лет до этого распространять под ГПЛ лицензией.
                                    2. Абстракция тредов останется в далеком прошлом, вместе с ХМЛ, Явой и 64-битными системами.
                                    3. Регулярные выражения будут развиваться и дополнятся новыми классами. После того как расширение предложеное Микрософтом будет принято в новой версии ПОСИКС - регулярные выражения смогут описывать рекурсивные грамматики. А через год - не только рекурсивные, но и контексто-зависимые. В дальнейшем в стандарт добавят ПОС-тэггинг, систему выведения типов для естесственных языков и много других плюшек. Регулярные выражения станут неотъемлимой частью детских книжек и школьных учебников по литературе.
                                    Ответить
                                    • А вот мне кажется ещё двух обратно несовместимых мажорных версий питон не переживёт.
                                      Ответить
                                      • > ещё двух обратно несовместимых мажорных версий
                                        Если они начнут пилить четвертую до полураспада второй - то и ее уже не переживет ;)
                                        Ответить
                                      • Ну как бы... суперкомпутеры существенно подешевели. А там все другое. Особенно железо и абстракции, которые над ним строятся. Если НВидия доведет дело до победного конца, и эти компутеры будут продавать в качестве обычных ПК - то все языки нужно будет фундаментально переделывать.
                                        Лисп - в меньшей степени, а вот такие, в которых синтаксис языка создавал какие-то договоренности по поводу функционирования системы (типа, как в Эрланге реализованы потоки, или как уже вышеупомянутый цикл for в куче языков) - вымрут как фортрановские встроенные функции предназначавшиеся только для печати на матричный принтер.
                                        Ответить
                                    • >После того как расширение предложеное Микрософтом будет принято в новой версии ПОСИКС
                                      Открытому стандарту придёт пиздец.

                                      >расширение предложеное Микрософтом
                                      EEE

                                      >Если НВидия доведет дело до победного конца, и эти компутеры будут продавать в качестве обычных ПК
                                      Это только в ваших мечтах. А люди в реальном мире будут десятилетиями писать фор.
                                      Ответить
                                    • wvxvw, чё ты куришь?
                                      Ответить
                                  • 4. Эйк застрелится из томми-гана бережно хранимого в бейсменте его загороднего домика, предварительно с особой жестокостью расстреляв всех членов ЕС коммитета, включая бывших и соискателей. В прощальной записке, он признается, что с первых дней работы в Мозилле был негласным ставлеником Микрософта, и делал все возможное для того, чтобы браузерные технологии развивались как можно медленнее.
                                    5. Компания Уолт Дизней подарит Китайской Народной Республике дочернее предприятие Лукас Филмз. Врезультате в течение года появится сразу тринадцать новых полноформатных эпизодов саги, проливающих свет на благородное происхождение джедаев из потомков династии Минь, вовремя принявших сторону Гоминьдана в народно-освободительной войне.
                                    Ответить
                                    • Что вы принимаете?

                                      Объясняю. В данном примере самым важным куском и одновременно бутылочным горлышком, является работа с памятью.
                                      Никакая нвидиа, никакой интерпретатор лиспа, никакой AssParallel и никакой майкрософт не ускорит memcpy и миллионом суперкомпьютеров.

                                      Latency памяти в сотни раз выше процессорной. Это основы.
                                      Ответить
                                      • 6. В г. Челябинске проведут электричество, и окажется, что предположения и рассчеты сделанные до этого челябинскими программистами недостаточно хорошо соответствуют реалиям электронно-вычислительной техники. Но воспитанные суровыми трудовыми буднями, труженики не пойдут на поводу у изменчивой действительности. Воспитатние ведь такая вещь - не забудешь, не пропьешь!
                                        Ответить
                                      • Ну вообще тут вроде разрабатывают сильномногослойные быстродействующие чипы памяти...
                                        Ответить
                                        • кто? уже давно разработано. статическая память называется и по себестоимости в 7 раз дороже динамической (да, я готов заплатить эту сумму за память) (хотя пока массово не начнут продавать - она будет раз в 20 дороже)
                                          Ответить
                                        • > тут вроде разрабатывают сильномногослойные быстродействующие чипы памяти

                                          Тут это где? На говнокоде?
                                          Уже десятилетие кормят нас анонсами всяких "перспективных" Z-RAM, TRAM итп.
                                          А толку то? DRAM по-прежнему рулит. Попытка интела поюзать Rambus закончилась известно чем.
                                          А толку?

                                          >да, я готов заплатить эту сумму за память
                                          Где ты возьмешь столько? На Хацкиле денег не платят, только борщ.
                                          Ответить
                                          • Память стоймостью с комп - это норм, если будет быстродействие L2. Один же комп мне мамка уже купила.
                                            Ответить
                                            • > Память стоймостью с комп
                                              > быстродействие L2.
                                              Поделишься ссылочкой, где можно купить пару гиг SRAM с быстродействием L2 всего лишь по цене компа? ;)
                                              Ответить
                                              • Ну он не об том говорил.
                                                >если будет

                                                >Один же комп мне мамка уже купила.
                                                Лол, с этого и надо было начинать.
                                                Ответить
                                  • import parallel from supercomputar
                                    Ответить
                            • > что в Питоне 5 вдруг регулярные выражения таки действительно распраллелят

                              Полагаю при этом они не будут совместимы по синтаксису с регэксами в Python 4 и 3. Потому код придется переписывать но новую версию.
                              Суть Питона тм
                              Ответить
                              • питон не умеет ползать параллельно, он может только асинхронно скручиваться
                                Ответить
                                • Тру. Асинхронность - это, по большей части, костыль вокруг "нимагу в треды". Хотя костыли есть в любом языке.
                                  Ответить
                      • > "\\"
                        Зачем здесь это виндоблядство?
                        Ответить
                      • Интересно какой функцианальный идиот молча минуснул, а?

                        В моём показательном варианте ровно один недостаток - строки в жс немутабельные.
                        Очевидно оно заменяется массивом, буфером или указателем на b.
                        А потом
                        memcpy(b+bi,a+i,n) или там sb.append(a.subString(i,i+n))
                        Ответить
          • http://pastebin.com/BAqkn6R2

            Если интересно.
            Ответить
      • Та это вообще пиздец, а не тред. Очень показательно.
        Задачка, которая проще и главное понятнее описывается на обычном языке чем на всех убернавороченных пифонах, хацкилях, регулярках и примкнувших к ним крестах.

        Ну кстати пример Романа, несмотря на крестоблядство мне понравился. Человек думает чуть шире - делая код универсальным.
        Ответить
        • > Задачка, которая проще и главное понятнее описывается на обычном языке

          как по мне, большинство извращений на треде по двум причинам: (А) народ слишком сильно (предварительно) оптимизирует и (Б) чем выше уровень языка, тем сложнее в нем работать с простыми вещами как символ или строка.

          на перле можно было бы и по другому написать, как на ц/крестах, без регулярок (не тестировал):
          $id = "2017991";
          @subfolders = ();
          while (length ($id) > 2) {
            push @subfolders, substr($id, 0, 2, '');
          }
          warn "$id ".join('/',@subfolders);


          но народу же хочется все в одну неотлаживаемую строку впихнуть...

          ЗЫ к слову, в перле регулярками с извращениями точно можно в одну строку впихнуть.
          Ответить
          • >но народу же хочется все в одну неотлаживаемую строку впихнуть...
            И чтоб понять оную потребуется больше времени чем три очевидных строки с циклом.

            > большинство извращений на треде по двум причинам
            a) sicp и функциональщина головного мозга. reusable,reusable,reusable. combination and abstraction. functions.
            б) выебоны
            в) готовые либы совсем отучили думать головой

            В итоге вся изобретательность идёт на комбинацию готовых компонентов (в особо запущенных случаях создается целый reusable велосипед).

            >чем выше уровень языка, тем сложнее в нем работать с простыми вещами как символ или строка.
            Неправда это.

            >warn "$id ".join('/',@subfolders);
            Всё ваши варианты с join - джва прохода, пусть даже там ленивый итератор, всё-равно будет лишний цикл.
            Ответить
            • > Всё ваши варианты с join - джва прохода всё-равно будет лишний цикл.

              Все ваши варианты без join - хоть и один проход, все равно будет лишний if в цикле.

              :)
              Ответить
              • >все равно будет лишний if в цикле.
                Зря вы так. Это уже сто раз проходили.
                var a="2017991",n=2,b="";
                 for(var i=0, len=a.length-n; i < len; i += n)
                       b+=a.substr(i, n)+"/";
                if (b.length) b=b.substring(0,b.length-1);
                console.log(b);

                Боюсь представить сколько ifов и прочего оверхеда будет в регэксе.
                Ответить
                • "Боюсь представить сколько ifов и прочего оверхеда будет в регэксе."

                  вообще то это была "шутка" на тему "premature optimization is the root of all evil." (c) Donald Knuth.
                  Ответить
                  • > "premature optimization is the root of all evil." (c) Donald Knuth.
                    И поэтому надо писать эзотерический код?
                    Ответить
                • Окей, а теперь давайте поподробнее про "лишние ифы". Поскольку имеем дело с ж. скриптом:
                  1. += должен проверять типы параметров. Это много условий. (функция генерик).
                  2. Нужно проверять не изменилось ли значение len - т.как язык таких гарантий не дает.
                  3. + аналогично += должен проверять типы параметров.
                  4. Динамический резолвинг свойств substr и length - при чем каждый раз, как они встречаются в коде во время выполнения.
                  5. - тоже ведь должен определить типы аргументов.
                  6. Ну и в конце концов - присваивание и резолвинг объекта к которому применяется свойство - тоже должны и на null проверить, и на то, что выражению слева разрешено присваивать.

                  Возможна временная ситуация, когда более общий код, в котором программист не задает явно стратегию выполнения не оптимизирован (Питон никто особо и не пытался оптимизировать), а код, в котором операции делаются на низком уровне работает лучше т.как его было в данный момент легче оптимизировать (т.как он больше похож на целевое представление).

                  Но эта ситуация такой вечно не останется. Тому пример Явовский JIT, который через много лет научился хорошо компилировать. Со всякими хитрыми оптимизациями и т.п.
                  Ответить
                  • Читая этот тред я прикрываю рукой лицо.

                    >1. += должен проверять типы параметров.
                    >Это много условий. (функция генерик).
                    Единственная проблема моего кода += (копирование в новую переменную, о чем вы не сказали) описана тут:
                    http://govnokod.ru/12850#comment174324
                    ...

                    > Динамический резолвинг свойств substr и length
                    >пример Явовский JIT, который через много лет научился хорошо компилировать.
                    js давно компилируется. Даже убогий ie научился. Я уже где-то вам сообщал об этом немаловажном факте, ломающем всю вашу аргументацию.
                    Ответить
                    • Ну и что, что компилируется? Все равно нужно во время выполнения кода подтверждать существование свойства. Таким образом гарантируется безопасность типов.
                      Если вам интересно об этом узнать по-подробнее, рекомендую к прочтению: Types and Programming Languages, Benjamin C. Pierce, ISBN 0-262-16209-1 или более новое издание, если есть. (Книга представляет собой пособие для студентов вузов факультетов информатики, автор - преподаватель или преподавал в MIT).
                      Человек, кстати сказать, поборник и потворник статической типизации.
                      Ответить
                      • >во время выполнения кода подтверждать существование свойства
                        Один раз компилируется и потом работает нативно - в этом суть JIT.
                        Если объект не менялся, а меняться он никак не мог, потому что строки иммутабельны подтверждать ничего не надо. И ссылка на объект тоже не меняется.

                        Именно потому ВНЕЗАПНО js делает по скорости всякие путхоны
                        http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=v8&lang2=pyt hon3
                        Ответить
                        • И при этом проигрывает Лиспу, например.
                          А вот теперь, вы то этого, конечно, напробовались в жизни, и знаете прекрасно - чего бы это я стал напоминать. Но, так, на всякий случай: когда вы работаете с компилятором Лиспа, то вы во время разработки получаете от него информацию нужную для понимания того, как компилятор понял вашу программу, и как ему можно "помочь", чтобы он сгенерировал лучший код.
                          Но вот если вы думаете, что это хоть в какой-то степени возможно применить к ж. скрипту - вы сильно заблуждаетесь. В языке нет достаточно средств для того, чтобы выразить компилятору, что именно нужно сделать с кодом. А это бывает необходимо в любой нетривиальной ситуации.
                          Питон никто не пытался оптимизировать. Возможно ли его лучше оптимизировать чем ж. скрипт? - вот это другой вопрос, на который я бы ответил утвердительно. И особенно это случится, когда в нем будут аннотации типов (описание http://www.python.org/dev/peps/pep-3107/). В Питоне нет таких тяжело запущенных случаев, которы встречаются в ж. скрипте, таких как неявные конвертации. Но есть и недостатки (неявный вызов методов), которые мешают однозначному выведению типов.
                          Ответить
                          • Аннотации аргументов функций ввели в третьей ветке давно, они даже в книжке Лутца описаны. Только интерпретатору до них совершенно нет дела.
                            Ответить
                            • Ну я даже не знаю... я говорю дословно что Возможно ли его лучше оптимизировать чем ж. скрипт? - вот это другой вопрос, на который я бы ответил утвердительно.
                              А вы отвечаете про что-то совсем другое.
                              Ответить
                              • >>> особенно это случится, когда в нем будут аннотации типов
                                >> Аннотации аргументов функций ввели в третьей ветке
                                > А вы отвечаете про что-то совсем другое.
                                ну да, ну да.
                                Ответить
                          • > Питон никто не пытался оптимизировать
                            PyPy
                            Ответить
                            • пиу пиу
                              Ответить
                            • Питон не пытались оптимизировать - тот Питон о тестах которого мы сейчас говорим не пытались оптимизировать. Пи* же не говорит обо всех Питонах, он привел пример бенчмарков конкретной реализации.
                              Кроме ПиПи есть еще Питон который компилириуется в Си исходный код, ну а потом - это уже Си программа. (Так Ютуб начинали).
                              Ответить
                          • > Питон никто не пытался оптимизировать
                            Cyton
                            Stackless Python
                            Ответить
                    • > js давно компилируется
                      У меня дежавю, но, кмк, все уже сообщали и не по разу. А воз и ныне там.
                      Ответить
        • > проще и главное понятнее описывается на обычном языке чем на ...

          Надеюсь, про пифон вы не делаете вывод из пары неоптимальных примеров? А с хацкилем что не так, предвосхищая вброс про библиотеку легко пишется, если бы не было: splitEvery _ [] = []; splitEvery n xs = chunk : splitEvery n rest where (chunk, rest) = splitAt n xs

          btw, задача "сделать !@#$ато" записывается намного проще на естественном языке
          Ответить
          • > не делаете вывод из пары неоптимальных примеров
            Нет. Не делаю. Тут же важно кто и как на нем пишет, потом уже сам язык.
            Ответить
        • > Человек думает чуть шире - делая код универсальным
          На самом деле это скорее хаскель-код, написанный на крестах. Фактически, там реализована "сопрограмма", перекачивающая группы символов из входной последовательности в выходную. По сути вывод начинается ещё до того, как достигается конец входной строки.
          Для решения задачки это лютый оверкилл, идея приносит профит только на длинных последовательностях, но меня неотвратимо тянет к подобным вещам...
          Ответить
          • >"сопрограмма", перекачивающая группы символов из входной последовательности в выходную
            Оно же итератор, оно же ленивый список. Как там "любая достаточно сложная программа на С содержит заново написанную, неспецифицированную, глючную и медленную реализацию половины языка Lisp"

            > но меня неотвратимо тянет к подобным вещам...
            Потому и понравилось - проход один (хотя не знаю может питонвское re тоже ленивое?)
            Я тоже везде такой подход стараюсь использовать. Еще кстати задолго до того как впервые увидел ленивые фп языки.
            Это осознание силы ленивого кода пришло из io потоков.

            А так говно, да. Страшное.
            Ответить
            • > Это осознание силы ленивого кода пришло из io потоков.
              Ну и какая у них там сила? Неужели закрытие потока до завершения чтения всех данных из-за лени? Кулстори, бро
              Ответить
              • Даже ёжику понятно, что чтобы скопировать/трансформировать один поток в другой, нужно создать буфер и перекачивать данные через него.
                Ответить
    • Если я верно понял задачу, надо разбить строку на пары символов, отбросить последнюю полную или неполную пару, и склеить символом /.

      Тогда может так?
      '/'.join([s[i:i+2] for i in xrange(0,len(s),2)][:-1])
      Ответить
      • списал? http://govnokod.ru/12850#comment174222 :trf:
        Ответить
        • Там без [:-1], неправильный результат будет для чётной длины стринга.
          Ответить
          • а вы проверили, прежде чем постить? а то ведь в незначительные отличия входит не только [:2], но и len(..)-2
            Ответить

    Добавить комментарий