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

    −87

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    >>> r=range(16);print '\n'.join(' '*y+' '.join('# '[x&y>0] for x in r) for y in r)
    # # # # # # # # # # # # # # # #
     #   #   #   #   #   #   #   #  
      # #     # #     # #     # #    
       #       #       #       #      
        # # # #         # # # #        
         #   #           #   #          
          # #             # #            
           #               #              
            # # # # # # # #                
             #   #   #   #                  
              # #     # #                    
               #       #                      
                # # # #                        
                 #   #                          
                  # #                            
                   #

    1. Почему f(x, y) = 1-sign(x&y) даёт в результате треугольник Серпинского?
    2. Олимпиада: на вашем любимом языке написать программу, которая выводит аналогичный фрактал(см. код). Победит тот язык, программа на котором займёт наименьшее число символов. Нулевое приближение на Python - 78 символов.

    Запостил: serpinski, 22 Сентября 2012

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

    • Чувак, ты не оставляешь нам пространства для маневра! Написал бы на бэйсике!
      Ответить
      • for x in range(16):print ' '*x,' '.join('# '[x&y>0] for y in range(16))

        71 символ. Я уверен, что на каком-нибудь J это заняло бы 10 символов.
        Первый вопрос более актуален.
        Ответить
        • Мне только до 38 удалось ужать:
          '# '{~(-r)|."0 1(,"2),&1@*AND/~r=:i.16
          # # # # # # # # # # # # # # # # 
           #   #   #   #   #   #   #   #  
            # #     # #     # #     # #   
             #       #       #       #    
              # # # #         # # # #     
               #   #           #   #      
                # #             # #       
                 #               #        
                  # # # # # # # #         
                   #   #   #   #          
                    # #     # #           
                     #       #            
                      # # # #             
                       #   #              
                        # #               
                         #
          Ответить
    • Меньше символов на разных языках тут: http://codegolf.stackexchange.com/questions/6281/draw-a-sierpinski-triangle
      Ответить
      • Не переходите по ссылке! Мой петушиный мозг взрывается от COM-файла размером в 10 байтов, рисующего треугольник Серпинского.
        Ответить
        • X: add al,0x13
          int 0x10
          and cl,ch
          mov ah,0x0C
          loop X


          04 13 CD 10 20 E9 B4 0C E2 F6


          И за это всего 8 плюсов. А ху еть.
          Ответить
      • Хм, ну если по тем правилам, то я могу до 10:
        *AND/~i.16
        0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
        0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
        0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
        0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 1
        0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
        0 1 0 1 1 1 1 1 0 1 0 1 1 1 1 1
        0 0 1 1 1 1 1 1 0 0 1 1 1 1 1 1
        0 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
        0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
        0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1
        0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1
        0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
        0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1
        0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1
        0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
        0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
        Ответить
      • > JavaFx, 400 bytes

        Кокой багор )))
        Ответить
    • Самое короткое, что получилось придумать, но это все равно много...
      (do* ((x 0 (1+ x)) (y 0 (floor x 16)))
           ((> x 255))
        (format t (if (zerop (mod x 16)) "~&~a~a" "~* ~a")
                (subseq "                " (- 16 y))
                (if (> (logand x y) 0) " " "#")))
      Ответить
    • for(y<-0 to 15)println(" "*y+(0 to 15-y).map(x=>if((x&y)>0)"  "else"# ").mkString)

      Scala, 82 символа. Если бы было неявное приведение Int => Boolean, можно было бы без if..else. Скобки в выражении
      (x&y)>0
      тоже вынужденная мера
      Ответить
    • (dotimes (x 256)
          (multiple-value-bind (y z) (floor x 16)
            (format t (if (= z 0) "~&~a~a" "~* ~a")
                    (subseq "                 " (- 16 y))
                    (if (> (logand x y) 0) " " "#"))))

      Немного короче, но все-таки multiple-value-bind уж очень длинное название :)
      Ответить
      • (subseq "                 " (- 16 y))
        масштабируемо (c)
        Ответить
        • Ну так ни один нормальный человек так писать никогда не будет, понятное дело... более того, мне никогда в жизни не встречалось практическое применение программе рисующей в консоли треугольник Серпинского.
          Ответить
          • Приколоть посонов с говнокода - это уже не практическое применение?
            Ответить
          • На практике надо код писать. Понятный код. Даже если треугольник Сепринского понадобится показателем качества будет простота, а не количество символов.
            Ответить
            • Алексей Максимович? Да что ж вы так неаккуратно отступы-то расставили, ай-я-яй!
              Ответить
            • ×   /  × ×  \ ×  \   × \
              На практике надо код писать.
                           × /  ×   /
                          Понятный код.
                                    \ × \  ×   ×× /   ×
                                   Даже если треугольник!
                               ×  /   × ×
                              Сепринского
                      × \ × ×  ×  × × / × ×   \ ×   ×     \ ×    ×  × /
                     понадобится показателем качества -- будет простота!
                     ×  ×  × / ×   ×  /  × ×
                     а не количество символов.

              Вот, как надо было!
              Ответить
      • Ты не поверишь, но пока ты написал самую длинную реализацию. Посчитай число пробелов и прочих непечатных знаков.
        Ответить
    • 74 символа на php:
      for($y=16;$y--;print"\n")for($x=16;$x--;)echo$x<16-$y?$y&$x?'  ':'* ':' ';
      Ответить
    • *учёл писать свой язык, в котором треугольник серпинского выводится одним символом*
      Ответить
    • Пишите на J. Похоже будет самый короткий вариант. Хаскеляцкая реализация возможно тоже будет короткая.
      Ответить
      • Вряд ли, сила хацкеля не в этом.
        Относительно сабжа, скорее, возможность несложно создавать "комбинаторные" edsl.
        Сорт оф прув: http://projects.haskell.org/diagrams/gallery/Sierpinski.html
        Ответить
        • О боже... одного говносинтаксиса не достаточно, на нем еще изобретают говносинтаксис... говно в степени.
          Ответить
          • А разве синтаксис и edsl не ортогональны? Ф-ию же не считаем элементом синтаксиса, важно ли, что она в операторном виде.
            Имхо хаскеле-вариант смотрится читабельнее, чем что-нибудь вроде:

            ...
            sierpinski n =     s
                              ===
                           (s ||| s) # centerX
              where s = sierpinski $ n-1
            
            
            (defun sierpinski (n)
              (if (eq n 1) ...
                (let ((s (sierpinski (1- n))))
                  (diagram-vertical-join
                   s
                   (diagram-center-x (diagram-horizontal-join s s))))))
            Ответить
            • Вы не поверите, любому вменяемому человеку нормально читается текст написаный на языке, который он может прочитать.
              На языке s===(s|||s) могут читать только японские дети дошкольного возраста, но они поймут ету записть как "мой покемон сильнее твоих двух покемонов". Как инструкцию начертить треугольник Серпинского - ни один человек никогда это не воспримет, даже на секунду сомнение такое не возникнет.
              Ответить
              • То есть основной момент - неинтуитивность операторов по сравнению с ф-ми?
                Претензия понятна, но в рамках конкретной библиотеки часто используемые бинарные ф-ии задать в виде операторов - вполне приемлемо
                (+ в данном случае акцент на равноправность аргументов).
                Да и глазу проще цепляться при наличии операторов (перебор, конечно, нежелателен).
                Ответить
                • Что-что... какому глазу куда цеплятся? Вам с такими утверждениями, лучше было бы в церкви кадилом махать, или писать пламенные воззвания изберателям. - Конечно, зачем существует куча исследований о том, как человеческий глаз устроен, как инфромация считывается и обрабатывается, эпическое количество диссертаций и практических исследований, вылившихся в итоге в программы по распознаванию текста и предметов на картинках и т.п. - а у вас глаз за что-то зацепился, и на этом одном единственном основании вы пришли к выводу, что херня, которую вы перепостили с какого-то блога читается хорошо... афигеть.
                  Ответить
                  • то есть, по-вашему, монотонный код легче читается?
                    Ответить
                    • чем больше скобок, тем лучше читается
                      Ответить
                      • И ведь, действительно: http://img264.imageshack.us/img264/1397/lispnd7.png
                        если вы заподозрили иронию, вы не ошиблись
                        Ответить
                        • Думаю, многие тут знаю, насколько я лоялен к лиспу. Мне правда очень нравится это семейство языков. Лиспы обычно изящны и чрезвычайно мощны, а скобок там на самом деле не намного больше, чем в C-подобных ЯП, просто они вкладываются глубже.

                          Тем не менее, у каждого лиспа, дожившего до наших дней, очень много недостатков. Scheme мне нравится, но отсутсвие макросов и системы модулей делает её малопригодной для серьёзных проектов. Common Lisp очень мощный, но меня отталкивает семейство lisp-2, они гораздо менее элегантные, чем lisp-1; отсутствие элементарного функционала в стандарте, а взамен куча бесполезного хлама, запутанная система пакетов. Удручает, что бинарные версии программ тянут тяжеленный рантайм.

                          Clojure - глоток свежего воздуха, но он, на мой взгляд, ещё слишком медлителен и жрёт слишком много памяти, + ограничения, наложенные жаба-машиной.

                          Haskell тоже далеко не идеален, но на фоне современных лиспов он выглядит как свинченная болтами металлическая конструкция на фоне шаткого строения, скреплённого изолентой и степлером.
                          Ответить
                          • Что рядом с диалектами лиспа делает Хаксель?

                            Если по лиспам ещё были какие-то аргументы, то про Хаксекель вы просто расчувствовались. В программировании в частности и в точных науках в целом - нет места чувствам. Лучше бы аргументы привели.
                            Ответить
                            • > Лучше бы аргументы привели
                              Ну, недостатки я уже приводил, да и достоинства тоже не раз. Достаточно высокая производительность и относительно низкое потребление памяти, наличие большого количества библиотек (структуры данных, парсеры, обработка текста, коннекторы базы данных, STM, etc.), высокая степень повторного использования кода, лаконичный и мощный синтаксис, мощная система типов, ленивые вычисления.
                              Ответить
                              • >> Достаточно высокая производительность и относительно низкое потребление памяти.
                                C++

                                >> наличие большого количества библиотек
                                C++ (Boost, Qt, OpenMP)

                                >> высокая степень повторного использования кода
                                С++ (крестошаблоны)

                                >> лаконичный и мощный синтаксис, мощная система типов, ленивые вычисления
                                Блин, так и знал, что кресты говно. Куда же без мощной системы типов и лаконичного синтаксиса.
                                Ответить
                                • У крестов есть явные проблемы с раздельной компиляцией. Я раньше не обращал на это внимания, но как сам начал писать, начало бросаться в глаза. Чтобы отделять интерфейс от реализации, приходится писать бойлерплейт с пИмплами, прикручивая умные указатели и дёргая кучу, либо вводить интерфейсы и фабрики. А если этим не заниматься и просто писать классы в стиле java/c#, время компиляции растёт довольно быстро.
                                  Ответить
                                  • +1, а ещё то, что шаблоны доступны только в заголовках, превращает их из реального инструмента в игрушку, которая годится лишь для троллинга.
                                    Ответить
                                  • я для себя давно решил - когда есть выбор, прекомпилированные заголовки с pure heavy template лучше и проще, чем самоизнасилование пимплами
                                    ускоряет и разработку, и доработку, и конечный машинный код
                                    Ответить
                                    • Ну пимплы чисто ради скорости сборки это конечно пиздец.

                                      Но у них цель немного другая:
                                      1) Бинарная совместимость - даже если добавили/убрали поля в приватной части, но не поменяли публичный интерфейс - dll/so все равно остается бинарно совместимой. Без pimpl - однозначная пересборка всех, кто юзает dll'ку.
                                      2) Скрытие в приватную часть засирающих всё что можно инклудов (типа windows.h).

                                      Ради этого pimpl и юзают тролльтехи в том же Qt.
                                      Ответить
                                      • все так, все так

                                        однако (не могу сказать за всех, конечно), в нашей конторе так сложилось, что самообновляющийся проект в поле у заказчика практически всегда реинсталлит себя (удаляет предыдущую установку, ставит новые бинарники), сохраняя лишь настройки - в т.ч. и потому, что положено по тз ставить версии в обратную сторону
                                        а раз так, то бинарная совместимость - слабое требование, если её не будет, никто не опечалится, и дллки все сплошь крестоблядские с трехэтажными шаблонами, где надо
                                        Ответить
                                        • Ну да, от использования пимпла в программах я тоже никакого профита не вижу.

                                          Имхо он имеет право на жизнь только в либах, которые юзают во многих-многих проектах, типа того же Qt. Было бы довольно неприятно обновлять все KDE'шные и Qt'шные проги только из-за изменения минорной циферки в Qt/KDE либах.

                                          P.S. А в винде почти всегда проще поставить нужные версии либ в папку с самой прогой, все равно 99%, что их у юзера нет.
                                          Ответить
                          • >Haskell тоже далеко не идеален
                            А можно тут поподробнее.
                            Ответить
                            • Ок, повторюсь: ленивый код кроме профита приносит ощутимый оверхед, кроме того, его гораздо сложнее отлаживать и профилировать. Монадический код - это вообще песня. Как правило, нетривиальный код, интенсивно использующий IO, требует подключения двух-пяти расширений языка и хорошего понимания стека трансформеров монад.
                              Туда же старый баттхёрт от того, что в стандартной библиотеке не отражены связи между сущностями, отчего легко найти группы по пять функций делающих одно и то же.
                              Из-за высоких абстракций и мощной типизации порой возникают проблемы, столкнуться с которыми в старой доброй императивщине просто не придётся.

                              Тем не менее, haskell - очень интересный и мощный язык, который во многом приятнее и компактнее той же scala.
                              Ответить
                              • Ок. Спасибо. То многомесячные усилия ХацкилГумна прошли как-то даром ибо в основном вызывали руку на лице.

                                Если кратко - принудительная чистота кода и полный отказ от императивщины таки сильно мешают людям.

                                Всё та же старая песня. Ну это ж намеренно так сделали.

                                Я-то надеялся услышать какие-то фундаментальные проблемы всплывшие после детального ознакомления, или непродуманности в дизайне.
                                Ответить
                                • > фундаментальные проблемы
                                  Ну, будь какие-то очень серьёзные и нерешаемые проблемы, его бы так не любили.
                                  На данный момент есть определённые проблемы с инфраструктурой, но в целом писать практичный, надёжный, переносимый и поддерживаемый код на Haskell на данный момент вполне можно.
                                  Ответить
                              • Протестую! Большинство часто используемых в библиотеках расширений — просто приятные плюшки для уменьшения бройлерплейта (типа автоматического вывода инстансов или перегрузки строковых литералов). Для «интенсивного использования IO» вообще достаточно голой do-нотации, а монадные трансформеры тоже больше для причёсывания кода служат.
                                Про проблемы от высоких абстракций тоже не очень понятно, что имелось в виду. Кроме проблем с вкуриванием, конечно :)
                                По остальным пунктам критика справедлива, да.
                                Ответить
                • Кстати, вот что пишет по этому поводу Oderdky в главе о комбинаторах парсеров, использующих операторы ~, ~>, <~, | и прочее:

                  "symbolic operators take less visual real estate than alphabetic ones. That’s important for a parser because it lets you concentrate on the grammar at hand, instead of the combinators themselves...
                  (if we use alphabetic names) somebody new to combinator parsing could probably figure out better what the code is supposed to do."


                  Т.е. для людей, знакомых с dsl, код читается легче, для незнакомых - сложнее. Всё зависит от целевой аудитории. Лично я в основном за операторы: "лучше день потерять, а потом за 5 минут долететь" (с)
                  Ответить
                  • Долго искал, но нашел.
                    Улучшенная клавиатура для набора программ на Хаскелле
                    https://fbcdn-sphotos-a-a.akamaihd.net/hphotos-ak-ash3/576028_265402913564203_338815110_n.jpg

                    Особенно хорошо подходит тем, кому не терпится написать встраиваемый язык, а символов непечатных - не хватает.
                    Распространение таких клавиатур в среде любителей Хаскелла позволит исправить так же некоторые вопиющие недостатки в языке. Например, реализовать числа не цифрами (что за плебейство вообще?), а наборами из костяшек домино, или пермутациями кубика Рубика.
                    Ответить
                    • > таких клавиатур
                      > пермутациями кубика Рубика.
                      Омг, сколько же там клавиш с ними.
                      Ответить
                      • Нужно понимать, что там не только клавиши, но и корды. Вообще, по описаниям очевидцев, с этой клавиатуры можно набрать что-то типа 6000 символов. Для кубика не хватит на первый взгляд, но не факт, и почти наверняка не все корды используются, если по-максимуму раскрутить, по, почти наверняка хватит.
                        Ответить
                        • > Вообще, по описаниям очевидцев, с этой клавиатуры можно набрать что-то типа 6000 символов.
                          Проблема в том, как запомнить какой как набирается ;)
                          Ответить
                        • >с этой клавиатуры можно набрать что-то типа 6000 символов
                          Да можно и одной кнопкой набрать любой символ юникода. Морзе подтверждает.

                          Это я про Alt+ молчу.
                          official_brainfuck_keyboard.jpg
                          Ответить
                          • Смотря что имеется в виду. Обычно под количеством символов которые можно набрать с клавиатуры имеется в виду то, сколько пермутаций в одном сигнале может обработать драйвер клавиатуры.
                            Например, хорошие игровые клавиатуры поэтому пишут, что можно нажать сколько угодно кнопок одновременно.
                            Обычные драйвера для Винды, например, не поддерживают корды больше четырех, или пяти кнопок, кажется. Но если пользоваться, например, ностромо с его драйверами, или какой-нибудь клавиатурой Стилсерис / Абисус и т.п. То можно и больше нажать. А то, что вы можете одной кнопкой набрать что угодн было еще очень давно проиллюстрировано Морзе.
                            Ответить
                            • >сколько пермутаций в одном сигнале
                              Ясно. Пермутации - это очень правильное слово.
                              Но на стандартной 101-клавишной клавиатуре всего-лишь двумя зажатыми клавишами можно сделать 101*100=101000 комбинаций. Что уже больше означенных 6000.

                              И буфер клавиатуры IBM PS/2 32 байта кажись. Туда влезает вроде 16 символов. Так что хватит на всех.
                              А на символ выделяется 2 байта, что уже даёт 65K вариантов.
                              Ответить
                              • Хз, я сейчас посчитал, получается, что в виндовсе максимально можно что-то типа P(101, 5) (за вычетом чего-то, т.как это 2^33 получается), либо P(101, 4) - это 2^26 примерно - т.е. еще много свободного места останется. Но это значит, что кордов всего сущестует от 97990200 до 9505049400. Наверное тот, кто писал про клавиатуру имел в виду что-то другое. Мне было лень считать. Может имелась в виду пропускная возможность порта, через который клавиатура подклюцается... а может просто код-пейдж.

                                + Я ошибся, когда инфу копировал, не 6 тысяч, а 60, но это роли не играет.

                                ЗЫ. Не, на всех не хватит, тот же ностромо может посылать одновременно все нажатые клавиши. Кроме того, он помнит, в каком порядке они были нажаты, итого получаем 15^15 примерно 2^58.
                                Ответить
                            • На дешёвках 2 буквенные кнопки уже запирают клавиатуру.
                              Ответить
                            • [зануда-mode]
                              >очень давно проиллюстрировано Морзе.
                              морзянка не является префиксным деревом и поэтому в ней возможны неоднозначности и, соотвественно, набрать что угодно не получится
                              [/зануда-mode]
                              Ответить
                              • >и поэтому в ней возможны неоднозначности
                                Невозможны. Там помимо - и . есть еще паузы между символами.
                                Крайне неоптимально, да. Тогда Шенон еще не родился. Кодинг Хаффмана и арифметический не изобрели.
                                Ответить
                              • Не уверен, как сказать по-русски sparse. Но она является sparse (разряженным?) языком. А все такие языки эквивалентны. В том числе и унарный {1, 11, 111, 1111, ... 1...1} :P Т.е. не все можно на таком языке сказать. Например, если бы давали имена всем комплексным числам, то слов в этом языке нам не хватило бы (но мы бы запарились давать имена до того, как заметили, что слов не хватает).
                                Ответить
                                • >Например, если бы давали имена всем комплексным числам, то слов в этом языке нам не хватило б
                                  Чего-чего?
                                  Как можно вообще дать имена всем числам?
                                  Можно всё сказать. Запросто.
                                  Вот например. Четные числа, подмножество натуральных.
                                  Можно поставить в соотвествие любому натуральному четное.
                                  2-1, 4-2, 6-3, 8-4, 10-5, 12-6 итд.
                                  Следовательно при помощи четных чисел можно пересчитать все натуральные.
                                  Мощность множества. Есть такое понятие.

                                  >но мы бы запарились давать имена до того, как заметили, что слов не хватает
                                  Надо думать, прежде чем начинать что-то делать. Особенно когда трудоемкость равна бесконечности.
                                  Ответить
                                  • >Как можно давать имена числам?
                                    Пример:
                                    1 - один.
                                    2 - два.
                                    3 - три.
                                    (attention on deck, chief officer's on deck!)
                                    Смысл вообще в чем: множество комплексных чисел - это множество первого порядка, а sparse алфавиты - это множество нулевого порядка, т.е. они не эквивалентны.
                                    Теорема Кантора, блин :)
                                    Ответить
                                • Теперь. Нам надо представить число. Любое. С любой произвольной точностью. Всё как в FPU. Пишем.
                                  111111          111           1                111
                                  Мантисса    Порядок     Мантисса     Порядок
                                  действит     действит       мним          мним
                                  части          части           части

                                  PS А. Еще знак забыл. Принцип тот же.
                                  Ответить
                                • По сути же это эквивалентно схеме кодирования (вроде как экспоненциальный код). Кстати она много где сейчас используется.

                                  И значит эквивалентно это такому вот коду:
                                  01
                                  011
                                  0111
                                  01111
                                  итд.
                                  Где 0 - это пауза. А 1 - это наш унарный символ.
                                  Ответить
                                • Вот, например. Хочу закодировать свой логин.
                                  Завожу кодовую таблицу.
                                  01 - 1
                                  011 - 2
                                  0111 - 3
                                  01111 - 4
                                  ..
                                  0111111111 - 9
                                  01111111111 - .
                                  011111111111 - "-"
                                  0111111111111- i
                                  011101111111111
                                  010111101011111
                                  01111111110110111111
                                  011111
                                  Ответить
                                  • Я даже не предполагал, что есть нули, только даже единиц достаточно. Главное - как-то обозначать промежутки между словами. Ну, или если промежутки между словами - тоже часть алфавита, то тогда нужны нули, конечно.
                                    Ответить
                                    • Обыватели представляют азбуку Морзе как тире и точки.
                                      Но они забывают о таком важнейшем элементе как пауза.

                                      Так вот.
                                      The duration of a dash is three times the duration of a dot. 
                                      Each dot or dash is followed by a short silence, equal to the dot duration. 
                                      The letters of a word are separated by a space equal to three dots (one dash), and two words are separated by a space equal to seven dots.
                                      The dot duration is the basic unit of time measurement in code transmission


                                      Хоть бы на вики штоле сходили.
                                      Или как по-вашему люди этим пользовались?

                                      Так вот кстати с этим была трабла при трансатлантической передаче.
                                      Всё из-за интерференции сигнала и того, что разные волны имеют разную скорость распространения и коеф. поглощения средой - некоторые сигналы приходили раньше других. И на другой конец приходила всякая херня, из-за перекрытия пауз. Rase condition во всей красе.
                                      Ответить
                                      • >Rase
                                        Race. selffix

                                        > только даже единиц достаточно
                                        Без пробелов (нулей), недостаточно.
                                        Энтропия тогда нулевая.
                                        А то будет:
                                        Ехал Морзе через Морзе
                                        видит Морзе: Морзе, Морзе
                                        Сунул Морзе Морзе в Морзе
                                        Морзе Морзе Морзе Морзе
                                        Ответить
                          • оптимус брейнфакус от артемия лебедева
                            Ответить
                    • К хаскеллу это не имеет никакого отношения, а вот к scalaz - вполне
                      Ответить
                  • >Кстати, вот что пишет по этому поводу Oderdky в главе о комбинаторах парсеров, использующих операторы ~, ~>, <~, | и прочее:

                    В скалке можно вводить операторы? А что там с ассоциативностью вновь введенных операторов и приоритетами?
                    Ответить
                    • Операторы в Scala - это просто методы, как в Ruby, это как-то уже обсуждалось на ГК. Ассоциативность и приоритет определяются довольно нетривиальными правилами (зависят от символов, входящих в оператор), приводить которые здесь не имеет особо смысла.
                      Ответить
                      • Очень глупо определять приоритет оператора по первому символу входящему в оператор (там конечно все сложнее, но не суть). По сути перед значащей частью оператора придется вставить символ отвечающий за приоритет. Читабельности и юзабельности нестандартному оператору это не добавляет.
                        Ответить
                        • мне тоже этот подход не особо нравится, в Haskell гораздо лучше сделали
                          Ответить
                          • А что там придумали в Хаскале? И если знаете, что там в языках ML-группы, типа F# или OCaml?
                            Ответить
                            • в Haskell явно задаёшь приоритет и ассоциативность своих операторов, гугли infixr, infixl, infix
                              Ответить
                              • Смайлики-операции забавные:
                                [|, |]
                                {-, -}
                                http://www.haskell.org/haskellwiki/Keywords#infix.2C_infixl.2C_infixr

                                Элсо по делу:
                                Идея хорошая. Жаль что в скалле не так. Я не уверен, но что-то мне кажется, что из-за перегрузок, приведения типов и наследования в совокупе это не сработает.
                                Элсо, как они делают это для операторов с одним аргументом? Ассоциативность влияет на такие операторы как-нибудь?
                                Ответить
                                • Если мне не изменяет память, в Haskell, в отличие от Scala, нельзя объявлять свои унарные операторы. В Scala это делается добавлением префикса unary_
                                  Ответить
                                  • >В Scala это делается добавлением префикса unary_
                                    1)a.operator1(b); эквивалентно
                                    a operator1 b;
                                    2)a.operator2(); эквивалентно
                                    operator1 a;
                                    3)function1(a); эквивалентно a.function1();
                                    Почему бы не сделать как-то так? Создатели Scala (Мартин Одесский и пр.) хоть в чем нибудь со мной согласны?
                                    Ответить
              • "Вы не поверите, любому вменяемому человеку нормально читается текст написаный на языке, который он может прочитать."
                потрясающая пустотой своей фраза.

                "На языке s===(s|||s) могут читать только японские дети дошкольного возраста, но они поймут ету записть как "мой покемон сильнее твоих двух покемонов". Как инструкцию начертить треугольник Серпинского - ни один человек никогда это не воспримет, даже на секунду сомнение такое не возникнет."
                Да ладно? А название функции ни на какую мысль не натолкнет? К тому же что могут понять и дети, нормальному человеку тоже должно быть понятно.
                Ответить
                • Да, потому что вы игнорируете очевидные вещи, и вам их нужно как ребенку объяснять, с той разницей, что у ребенка нет предвзятости, и он скорее всего поверит вменяемым доводам, а у вас желание самобытности и, в довесок к нему, куча всякой херни, которую вы приняли на веру вызывают сложности в понимании.

                  Да, потому, что я сптопицот раз до этого написал, что монотонный код читается АХУЕННО! - именно на этом самом основании вы сделали такой вывод - вы должны собой гордится!
                  Ответить
                • > s===(s|||s)
                  Операторы выглядят прекрасно при должном форматировании. К тому же, у них наверняка есть алиасы с читаемыми именами, что-то вроде
                  s `onTopOf` (s `beside` s)
                  Ответить
    • Трифорс и суда добрался.
      Ответить
      • Ых-хаха!
        Представил как Линк вырезает мечом алгоритм решения на шкуре камнееда :)
        Головоломка решена, дверца уровня открывается... :)
        Ответить
    • На OCaml (281 символ насчитал):
      let rec gen f next = match (f next) with
      	| true, v, next -> v^gen f next
      	| false, v, next -> "" in
      let get_line x = gen (fun y->(y<16,(if x land y>0 then "  " else " #"), y+1)) 0 in
      print_string (gen (fun (x, left) -> (x<16, left^get_line x^"\n", (x+1, left^" "))) (0, ""));;

      Толи просто я нуб, толи язык действительно заборитсый >_<. Но хоть чуток короче, чем пример с сайта на Haskell(291) и без монад - чисто функцильнально :)
      Ответить
    • Перевод:
      <?php $r=range(0,15);$a='array_map';$i='implode';
      echo $i("\n", $a(function($y)use($i,$r,$a){return str_repeat(' ',$y).$i(' ', $a(function($x)use($y){return '# '[intval(!empty($x&$y))];}, $r));}, $r));
      Ответить
    • 74:
      i,j;main(){while(i<32){for(j=0;j<32;putchar(i&j++?32:'o'));puts("");++i;}}
      https://ideone.com/oBWwye
      Ответить
    • 62:
      : s dup 0 do dup 0 do bl i j and 0= - emit loop cr loop ; 16 s
      https://ideone.com/q8G6Ta
      Ответить
      • показать все, что скрытоvanished
        Ответить
        • Я не знаю, как на языке "Ada" сделать побитовое "и".
          Ответить
          • Надо перевернуть кресты.
            Ответить
          • Просто подключаешь модуль Interfaces, а потом (если сделал Use Interfaces) пишешь:
            Unsigned_8(x) and Unsigned_8(y)
            Ответить
          • Моя первая программа на языке «Ада»:
            With Ada.Text_IO; Use Ada.Text_IO;  
            With Ada.Integer_Text_IO; Use Ada.Integer_Text_IO;
            With Interfaces; Use Interfaces;
            
            procedure Program is
            begin
              for y in reverse 0 .. 16 loop
                New_Line(1);
                Set_Col(Positive_Count(y+1));
                for x in reverse 0 .. 15-y loop
                  if (Unsigned_8(y) and Unsigned_8(x)) = 0 then
                    Put("*");
                  else
                    Put(" ");
                  end if;
                  Put(" ");
                end loop;
              end loop;
            end Program;


            https://ideone.com/HpK0kW
            Ответить
            • Positive_Count –— это тип, производный от целого питуха, с контрактом, что он должен быть положительным (т. е. ноль или отрицательное в него засунуть нельзя). Просто так число передать процедуре Set_Col нельзя, в неё можно передать только положительное число, т. е. значение, удовлетворяющее контракту Positive_Count.

              Оператор and не определён просто для чисел, но он определён для типов Unsigned_8, Unsigned_16, Unsigned_32 etc из модуля Interfaces.
              Ответить
            • Отдельного внимания заслуживают циклы в языке «Ада»:
              for y in reverse 0..16 loop

              Переменную y объявлять не надо: она создаётся в цикле. Её тип тоже указывать не надо, он выводится из диапазона. Диапазон (0..16) записан как одно выражение. Чтобы пройти его задом наперёд, есть слово «reverse».
              Ответить
              • Циклы в "Algol-68" тоже заслуживают внимания, кроме того что переменная объявляется в цикле оператором FOR интересно ещё то, что цикл состоит из нескольких частей FOR name FROM start BY step TO end WHILE condition DO something OD из которых обязательным является только DO something OD.

                []CHAR spaces = "                ";
                [][]CHAR a = ("* ","  ");
                
                FOR i FROM 15 BY -1 TO 0 DO
                    print(spaces[1:i]);
                    FOR j FROM 15 - i BY -1 TO 0 DO
                        print(a[(((BIN i) AND BIN j) = BIN 0 | 1 | 2)])
                    OD;
                    print(new line)
                OD
                (cond | a | b) это короткая запись для IF cond THEN a ELSE b FI.


                https://tio.run/##ZY7BCsIwEETv@Yohp0QsNIIiFg@toehBA8WLlByClJJSarGCF/89JioqurAwLPNm1rT1qZ3Na@dKvVqnBYbeHKsBS1D8DE1IqV8u4w2MjkDH3kZ5QkiuCljkhdpCTJEdEAnsFWJIRQLdn213Yc/0Uiys9lC4B655c5HP@Gc/vCkZY9lmB8uR7iSCbLh/JogYNwi/E675g1My@eruqita21WcKOncHQ
                Ответить
                • > DO something OD
                  Так это из «Algol-68» разработчики «Bash» взяли пары «if-fi», «case-esac» и тому подобные?
                  Ответить
                  • Возможно. Это вроде Дейкстра придумал CASE ... ESAC. Не знаю что здесь хорошего, по-моему хуйня, мне больше просто END или отступы нравятся.
                    Ответить
                  • Одно время это было модно. Во всех поделках Дональда Кнута такие же обороты.
                    Ответить
                • Заголовок цикла многословный, как в «Бейсике».

                  Вижу тернарник (cond | a | b).

                  Вижу объявления переменных, почти как в сишке, но всё же удобнее: скобочки у массива прилеплены к типу (почти как в «Паскале»), а не к переменной. Не нравится мне, как в сишке объявляются массивы, указатели на данные и указатели на функции.

                  Вижу довольно странную конструкцию «new line».

                  А BIN –— это такая же, как в языке «Ада», необходимость, чтобы получить доступ к битовому представлению?
                  Ответить
                  • > Вижу довольно странную конструкцию «new line».
                    Пробелы в идентификаторах игнорируются, а чтобы отличать операторы они пишутся КАПСОМ, или в типографике выделяются жырным.


                    > чтобы получить доступ к битовому представлению
                    Да, над INT побитовых операций нет, только над BITS, BIN как раз в них кастит.
                    Ответить
                    • Я недавно наткнулся на реализацию «Алгола», в которой ключевые слова вообще надо было брать в "кавычки" или в 'апострофы' (точно уже не помню), чтобы отличать их от идентификаторов. Именно поэтому я за "PHP".
                      Ответить
            • Было сложно, но я таки осилил объявить массив строк (но потом узнал, что Boolean в Integer не кастится:( ):
              With Ada.Text_IO, Interfaces;
              Use Ada.Text_IO, Interfaces;
              
              procedure Program is
                a : constant array (0 .. 1) of String(1 .. 2) := ("* ", "  ");
                t : Integer;
              begin
                for y in reverse 0 .. 31 loop
                  Set_Col(Positive_Count(y+1));
                  for x in reverse 0 .. 31-y loop
                    if (Unsigned_8(y) and Unsigned_8(x)) = 0 then t := 0; else t := 1; end if;
                    Put(a(t));
                  end loop;
                  New_Line;
                end loop;
              end Program;
              https://ideone.com/xmq3YZ
              Ответить
          • Ну и строгая же тупизация у языка «Ада»... Кругом контракты и производные типы.

            Если тайпдефом сделаешь два производных типа от Integer, то переменной одного типа просто так не сможешь присвоить значение другого, пока явно не укажешь, что нужно кастовать:
            type Goods is new Integer;
            type Bads is new Integer;
            
            Good_Count: Goods;
            Bad_Count: Bads;
            
            Good_Count := Bad_Count; -- не скомпилируется, потому что это разные типы
            Good_Count := Goods(Bad_Count); -- а так скомпилируется, потому что явный каст
            Ответить
            • Она вроде так специально спроектирована, чтоб как можно больше ошибок на этапе компиляции отловить.

              А ещё она вербозная, но зато читается довольно легко.
              Ответить
              • Её вроде бы для военных приложений проектировали, где нужна высокая надёжность, чтобы говнокод писа́ть было труднее.

                Кстати, на «ГК» нет раздела «Ада», потому что на языке «Ада» говнокод не пишут!
                Ответить
                • Я слышал, что одну из систем безопасности в наса проектировали на PowerBasic - так что не надо мне тут...
                  Ответить
                  • А ещё говорят, что одну из систем проектировали на «Лиспе». Вот несколько последних байтиков кода: )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))) ))))))))))))))))
                    Ответить
                    • Хм, обилие вложенных функций.
                      Ответить
                      • procedure TTutorApp.InitMenuBar;
                        var
                          R: TRect;
                        begin
                          GetExtent(R);
                          R.B.Y := R.A.Y + 1;
                          MenuBar := New(PMenuBar, Init(R, NewMenu(
                              NewItem('~N~ew', '', kbNoKey, cmNew, hcNew,
                              NewItem('~O~pen...', 'F3', kbF3, cmOpen, hcOpen,
                              NewItem('~S~ave', 'F2', kbF2, cmSave, hcSave,
                              NewItem('Save ~a~s...', '', kbNoKey, cmSaveAs, hcSaveAs,
                              NewLine(
                              NewItem('E~x~it', 'Alt+X', kbAltX, cmQuit, hcExit,
                              nil)))))))));
                        end;
                        Ответить
                      • показать все, что скрытоvanished
                        Ответить
                        • Много лет назад, когда некий Борис Файфель сцомпилировал на Visual Basic интерпретатор Лиспа и активно впаривал его на своём бложике. Язык-говно, кстати.
                          Ответить
                          • А что именно кажется говном: сама идея или синтаксис?

                            Вот эти вот скобочки –— это так называемые «S-expressions» (для краткости их называют «sexp»):
                            https://en.wikipedia.org/wiki/S-expression

                            Был альтернативный вариант синтаксиса –— «M-expressions», однако, он не прижился:
                            https://en.wikipedia.org/wiki/M-expression
                            Ответить
                            • 50/50
                              Мало того, что тупой синтаксис, так ещё и не компилируецца. Ради компилируемости я даже готов смириться с синтаксисом, так было с паскалью.
                              Ответить
                            • Я за "I-expressions".
                              Ответить
              • Для сишки и крестов выдумали «Lint» (100500 реализаций), «MISRA», «PVS-Studio», «clang-analyzer», «cppcheck», всякие тесты, всякие библиотеки, пытающиеся отловить баги, однако, любой программе на сишке или на крестах свойственно «переполнение буфера» и подобные неожиданности.

                А в языке «Ада» средства предотвращения ошибок из коробки.
                Ответить
    • BEGIN{
        a[0] = "* ";
        a[1] = "  ";
        s = "";
      
        for (i = 15; i >= 0; --i) {
          for (j = 0; j < i; ++j)
            s = s " ";
          for (j = 15 - i; j >= 0; --j)
            s = s a[and(i, j) > 0];
          s = s "\n";
        }
      
        print s;
      }
      https://ideone.com/5aW2xB
      Ответить
    • vanished
      Ответить

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