Домашнее задание на июнь

Привет!
Следующая встреча DevClub состоится в конце июня (дата уточняется).

Но уже сейчас у нас есть домашнее задание для закрепления материалов последней встречи. Победитель получит признание соплеменников и ценный приз!

Задание: Напечатать на экране следующее:
1
2-1
1-2-3
4-3-2-1
1-2-3-4-5
6-5-4-3-2-1
(Естественно, вместо 6 может быть любое число).

Внимание! Необходимо представить два решения на любом языке:
1. Максимально лаконичное/красивое/читабельное
2. Максимально говнокодистое (но не слишком много. Скажем, ограничение в один экран.)

Решения можно представить в комментариях к этому посту со ссылкой на код в http://pastebin.com либо послать на адрес andrei[тчк]solntsev[сбк]gmail[тчк]com.

Ждём ваших решений!

Назад

Обзор встречи 26.05.2010

Далее

Tallink ищет Java и SQL программистов!

77 комментариев

  1. Aleksandr Motsjonov

    Координально иной вариант с одним цыклом =)))
    http://pastebin.com/HADiVRP4

  2. Андрей Филимонов

    Както не придумался говнокод 🙂 Пришлось хитрить.

    http://pastebin.com/wKrsykcY

  3. Андрей Филимонов

    вот, в первом приближении

    http://pastebin.com/Vaimb7Zn

  4. Антон Танасенко

    Простейшая арифметика
    http://pastebin.com/VCRzc6aD

    • Антон Танасенко

      А вот лаконично-читабельное на яве все равно говнокодом выходит :Р

  5. Это вы меня хорошо подловили, конечно.
    Но давайте всё-таки поставим условие, что вместо 6 может быть любое число.

    • Maxim

      Ещё раз внимательно прочитал задание. Осознал свою ошибку.
      Исправленный вариант:
      http://pastebin.com/gNNrj8hH

      • Если нужна криптографическая стойкость, то можно доработать генератор.
        Для этого требуется уточнить платформу на которой решение должно работать, а так же согласовать вопросы финансирования.

  6. Sergei Kirjanov

    http://pastebin.com/LEekE5TY

    print join(‘-‘, $_%2 ? 1..$_ : reverse 1..$_ ).»\n» for 1..10;

    Лаконичное — в строчку.
    Читабельное — возможно не всеми.

    Спозиционируйте, на свой взгляд, на 1 или 2,
    тогда начну (переламывая своё естество) генерить альтернативу.

    • Sergei Kirjanov

      на Groovy — ещё короче и ясней

      http://pastebin.com/EMj9cJEB


      for ( i in 1..10 ) println( ( i%2 ? 1..i : i..1 ).join('-') );

      • мне кажется это пока что самое классное решение

        • Oleg Tsernetsov

          Однозначно

        • Da-da, poka chto Groovy rulez odnoznachno!

          • Eduard Shustrov

            На Scala строчка получается немногим больше, хотя на мой взгляд, для непосвящённых выглядит понятнее. 🙂

            for (arg <- args; size <- 1 to arg.toInt) println((if (size % 2 != 0) (1 to size) else (1 to size).reverse).mkString("", "-", ""))

            Дело тут не в языке программирования, а в человеке, которые придумал такой лаконичный подход. Сергей, это гениально!

            • Sergei Kirjanov

              Спасибо 🙂

              Вообще, это моя первая строчка на Groovy после «Hello World».
              Сначала на perl-е написал, потом решил перевести дословно в более общеупотребимый c/java синтаксис.
              Groovy — очень приятный язык. Правда, скорость запуска слегка настораживает.

              • Eduard Shustrov

                Как видно из комментраниев здесь, подобное можно написать и на других языках. Ты же посмотрел на проблему под другим углом, и нашёл самое красивое решение. Это и восхощает.

                Скомпилированная программа на Groovy загружается и работает так же быстро, как и на Java. 🙂

        • Ок. Да. признаю. Решение простое =)
          http://pastebin.com/RiX884Mm
          По сути тоже самое только на питоне. Но есть один ньюанс — в Питоне очень строго с автоконвертациями. Т.е. язык пусть и динамический, но без авто-конвертация. (И на то есть аргументы) Т.е. я не могу так просто сджойнить инты со стрингами. По-этому пришлось ещё сделать из списка интов список стрингов. В остальном — то же самое.

      • попробовал сделать тоже самое на руби. фиговенько вышло. руби тупит на вычислении от переменной к константе (x..1), приходится делать хак (1..x).to_a.reverse

        плюс руби не понимает что достаточно бы написать x%2 а хочет именно x%2==0

        (1..10).each {|x| puts (x%2==0 ? (1..x).to_a.reverse : (1..x)).to_a.join(«-«)}

        имхо, всем осталось только соревноваться в категории WTF 🙂

  7. Igor Menkov

    C#

    В поисках компромиса между лаконичностью и читабельностью:
    http://pastebin.com/23Zbp9aX

    Рождалось не то чтоб с трудом, но не уверен в качестве. Наверное можно и покруче замутить:
    http://pastebin.com/CaWZkfwm

  8. Jevgeni Kabanov

    Вспомнил Haskell, хотя если б было чуть больше времени поковыряться было бы симпатичнее 🙂

    http://codepad.org/dc1I9b23

  9. Sergei Kirjanov

    http://pastebin.com/LxMjrxDZ

    do{$_||=qq=1\n2-1\n=,$»=»»,print}
    while s=\n\d+=qq@\@{[-$&,-$&-1,»\n»,$&+2,-$&-1,-$&]}@=e&&$&<8;

    Лаконично, но точно говнокодисто.
    даже с хайлайтером не понять, как работает Ж)

  10. Mastahh

    http://pastebin.com/k3Aiqrmr
    Вот что у меня получилось.
    Просто и читаемо 😀

  11. Mastahh

    Вот почти тоже самое только с одно переменной S1
    http://pastebin.com/jCbzcfuk
    Такой же понятный код как и на Haskell 😀

  12. Juri Hudolejev

    http://codepad.org/yd4zyhGA лаконично на Питоне.

    Говнокод позже, тружусь, пока он мне еще недостаточно противен.

  13. Oleg Tsernetsov

    Солюшн на BrainFuck

    Два варианта — попробуйте сами определить где лаконичный/красивый/читабельный, а где говнокод 🙂

    http://pastebin.com/ERu5cUVj
    http://pastebin.com/z3LuMxDz

    Для сомневающихся:http://4mhz.de/bfdev.html
    Дла тех кто не в курсе: http://ru.wikipedia.org/wiki/Brainfuck

  14. Eduard Shustrov

    Читабельное и понятное (на мой взгляд) решение на Scala: http://pastebin.com/MgYaLTrW
    Строк много, и можно записать намного компактнее, но так лучше читается.

    А вот примерно то же самое заговнокожено: http://pastebin.com/V3H3pX9K

    • Eduard Shustrov

      Если кто-то хочет попробовать, как это всё работает, можно скачать нормальную и испорченную версии.

      Для запуска потребуется Java 5 или новее. Scala не нужна — в комплекте есть всё необходимое для запуска. Надо распаковать ZIP и запустить lister.cmd в Windows или lister.sh в Linux. в качестве параметра принимается то самое число, регулирующее размер выводимого списка. Можно попробовать задавать любые целые числа, если число меньше 1, просто нечего будет показывать. Параметров может быть сколько угодно — программа выведет списки для каждого указанного в параметрах числа.

  15. Eduard Shustrov

    Нормальная версия на Scala, укороченная до скрипта, но, тем не менее, довольно легко читаемая: http://pastebin.com/eLzu4KB7

  16. Eduard Shustrov

    Вот это и есть КОД. А всё остальное, что мы тут наложили, по определению — ГОВНОКОД, так как его можно улучшить. А я говнокодер. 🙂

    Оказывается, на Scala тоже так можно (скрипт принимает неограниченное число целочисленных параметров):
    for (arg <- args; size <- 1 to arg.toInt) println((if (size % 2 != 0) (1 to size) else (1 to size).reverse).mkString("", "-", ""))

    Я и не знал. 🙂

  17. Jevgeni Marenkov

    Дофига тут уже решений, смотрю.
    Которое называю четаемое http://pastebin.com/T77GgEV5
    Гавнокод http://pastebin.com/rNJRL0H1
    Не судите строго, ребята.

  18. jdevelop

    import Data.List as DL

    dumpLines :: Int -> [String]
    dumpLines n = DL.map step [1..n]
    where
    step x | odd x = DL.concat . DL.intersperse "-" $ DL.map show [1..x]
    | even x = DL.concat . DL.intersperse "-" . DL.reverse $ DL.map show [1..x]

  19. Dumka

    Всем привет!

    Вот решение на ПыХПы (PHP)

    http://pastebin.com/SUtvNH2n

    Чтоб не плагиатить сначала сделал, потом смотрел, что другие предлагают. Посути одно и тоже разве что код на ПХП небыл представлен.

    Судите сами. Думаю код читабелен для всех. ($i%2 вычисление остатка при делении числа $i на 2, если кто непонял)

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

  20. Haskell, почти говнокод.

    import Data.List

    ( \len -> mapM_ ( putStrLn . intercalate «-» . map show ) $ take len $ zipWith ($) ( map (\x -> if x then (foldl (flip (:)) [] ) else id) $ iterate not True ) $ iterate (\(x:xs)-> (x+1):x:xs) [1]) 6

  21. n0rb

    Компактно на С++ http://pastebin.com/6ZE2xKS5
    То же самое, но заговнокожено http://pastebin.com/YLt3yNVm

    • читерство — используется старонняя библиотека 🙂

      • Весь Groovy это сторонняя библиотека для java

        • Eduard Shustrov

          Ну, тогда JRuby, Scala и многое другое, даже Clojure — это сторонние библиотеки для Java. 😉

        • ну камон. у Groovy есть синтаксис.

          а так я могу взять Серёгину прогу и вызвать как библиотку, и будет у меня самый элегантнаый код с одним вызовом 🙂

      • 1. В условии нет ограничений на использование библиотек.
        2. Библиотека используется для представления данных, сама по себе она не содержит алгоритм который нужно реализовать.
        3. Смысл Java в том что мы не ограничены единственным фреймворком который идёт с платформой, для java — 99 библиотек
        со сторонними зависимотями это норма а не исключение.

  22. Eduard Shustrov

    Моя первая программа на Clojure. 🙂 Реализует гениальный алгоритм Сергея Кирьянова. Программа полноценная, обрабатывает параметры, не требует сторонных библиотек. Как её можно сократить?

    (doseq [arg *command-line-args*]
    (doseq [size (range 1 (+ (Integer/parseInt arg) 1))]
    (let [list (apply str (interpose "-" (range 1 (+ size 1))))]
    (println (if (= 0 (mod size 2)) (apply str (reverse list)) list)))))

  23. Eduard Shustrov

    Интереса ради реализация на bash 🙂

    for ARG in "$@"; do
    for SIZE in $(seq 1 $ARG); do
    if [ $(($SIZE % 2)) -eq 0 ]
    then FIRST=$SIZE; LAST=1; INC=-1
    else FIRST=1; LAST=$SIZE; INC=1
    fi
    echo $(seq -s- $FIRST $INC $LAST)
    done
    done

    • Eduard Shustrov

      Так короче:
      for ARG in "$@"; do for SIZE in $(seq 1 $ARG); do
      [ $(($SIZE % 2)) -eq 0 ] && echo $(seq -s- $SIZE -1 1) || echo $(seq -s- 1 1 $SIZE)
      done; done

  24. Dmitri Konovalov

    Короткий вариант на Java. Идея не нова (поздно зашел), но точно такого вроде еще не было.

    public static void main(String[] args){
    StringBuilder sb = new StringBuilder(«»);
    for(int i=1; i1 ? sb.reverse().append(«-» + i) : sb.reverse().append(String.valueOf(i)));

    }

    • Eduard Shustrov

      Оно не компилируется. 🙂

      • Eduard Shustrov

        Если исправить ошибки и добавить обработку параметров, чтобы задавать размерность выводимого списка, этот алгоритм будет работать долько для однозначных чисел. А вот из «10» при переворачивании строки выйдет уже «01». 🙂

        • Dmitri Konovalov

          Спасибо Эдуард! На самом деле код компилировался, но видимо часть кода после угловой скобки просто была автоматически вырезана из поста. А замечание насчет однозначных чисел справедливое. Исправленный вариант получился немного длиннее, но тоже достаточно лаконичный. На этот раз залил код в pastebin и написал также второе, более развернутое решение. Правда на мой взгляд говнокод получился в коротком решении.

          Лаконичное решение: http://pastebin.com/jD60iriR
          Развернутое решение: http://pastebin.com/4TTruaUp

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

создано с помощью WordPress & Автор темы: Anders Norén