Привет!
Следующая встреча 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.
Ждём ваших решений!
Aleksandr Motsjonov
http://pastebin.com/GQKx7u5v
Aleksandr Motsjonov
Координально иной вариант с одним цыклом =)))
http://pastebin.com/HADiVRP4
Андрей Филимонов
Както не придумался говнокод 🙂 Пришлось хитрить.
http://pastebin.com/wKrsykcY
Андрей Солнцев
Подумай ещё! Я знаю, мы можешь…
Андрей Филимонов
Я думаю!
Андрей Филимонов
вот, в первом приближении
http://pastebin.com/Vaimb7Zn
Антон Танасенко
Простейшая арифметика
http://pastebin.com/VCRzc6aD
Антон Танасенко
А вот лаконично-читабельное на яве все равно говнокодом выходит :Р
w32blaster
http://pastebin.com/ChcDE0hd
oO
Антон Архипов
блин, ты меня опередил :)))
я тоже самое хотел сделать только с одним System.out.println:
System.out.println(
«1n»+
«2-1n»+
«1-2-3n»+
«4-3-2-1n»+
«1-2-3-4-5n»+
«6-5-4-3-2-1n»);
Андрей Филимонов
Я протестую! 🙂 Очевидно что количество строк — переменное.
Jevgeni Holodkov
Пожалуйcта, вот вариант с переменным числом строк 🙂
http://lafy.livejournal.com/146122.html
Евгений Голобородько
Протестую что это говнокод!
Это 100% покрытие реквайрментов и ни строчки больше! 🙂
Евгений Голобородько
Есдинственное что не учёл автор, что вместо 6 может быть другое число, тоест вставить туда переменную 🙂
Maxim
Я вот тоже не понял, почему народ парится… Ведь в задании всё чётко сказано!
http://pastebin.com/UhKKS9bU
Maxim
Это был лаконичный вариант.
А вот говнокодистый:
http://pastebin.com/qbv1nvmu
Maxim
Исправленный вариант лаконичного решения с правильными кавычками:
http://pastebin.com/D8DYuG98
v1.1
Андрей Солнцев
Это вы меня хорошо подловили, конечно.
Но давайте всё-таки поставим условие, что вместо 6 может быть любое число.
Maxim
Ещё раз внимательно прочитал задание. Осознал свою ошибку.
Исправленный вариант:
http://pastebin.com/gNNrj8hH
Maxim Litvinov
Если нужна криптографическая стойкость, то можно доработать генератор.
Для этого требуется уточнить платформу на которой решение должно работать, а так же согласовать вопросы финансирования.
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
Однозначно
Maxim Litvinov
+500
Andrei Solntsev
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
По сути тоже самое только на питоне. Но есть один ньюанс — в Питоне очень строго с автоконвертациями. Т.е. язык пусть и динамический, но без авто-конвертация. (И на то есть аргументы) Т.е. я не могу так просто сджойнить инты со стрингами. По-этому пришлось ещё сделать из списка интов список стрингов. В остальном — то же самое.
Александр Мочёнов
Если захотеть написать так же клёва на ЖаваСкрипте, то придёться немного дополнить язык. (range, foreach)
тогда получить очень даже прикольно (23-25 строки)
http://pastebin.com/b31NNYwL
Антон Архипов
попробовал сделать тоже самое на руби. фиговенько вышло. руби тупит на вычислении от переменной к константе (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 🙂
Антон Архипов
или так, но сути не меняет
(1..10).each {|x| puts (x%2==0 ? (1..x).to_a.reverse : (1..x)).to_a * “-”}
Igor Menkov
C#
В поисках компромиса между лаконичностью и читабельностью:
http://pastebin.com/23Zbp9aX
Рождалось не то чтоб с трудом, но не уверен в качестве. Наверное можно и покруче замутить:
http://pastebin.com/CaWZkfwm
Jevgeni Kabanov
Вспомнил Haskell, хотя если б было чуть больше времени поковыряться было бы симпатичнее 🙂
http://codepad.org/dc1I9b23
Александр Мочёнов
прикольный сервис. Надо его начать юзать.
Sergei Kirjanov
http://pastebin.com/LxMjrxDZ
do{$_||=qq=1\n2-1\n=,$»=»»,print}
while s=\n\d+=qq@\@{[-$&,-$&-1,»\n»,$&+2,-$&-1,-$&]}@=e&&$&<8;
Лаконично, но точно говнокодисто.
даже с хайлайтером не понять, как работает Ж)
Mastahh
http://pastebin.com/k3Aiqrmr
Вот что у меня получилось.
Просто и читаемо 😀
Mastahh
Вот почти тоже самое только с одно переменной S1
http://pastebin.com/jCbzcfuk
Такой же понятный код как и на Haskell 😀
Juri Hudolejev
http://codepad.org/yd4zyhGA лаконично на Питоне.
Говнокод позже, тружусь, пока он мне еще недостаточно противен.
Oleg Tsernetsov
Солюшн на BrainFuck
Два варианта — попробуйте сами определить где лаконичный/красивый/читабельный, а где говнокод 🙂
http://pastebin.com/ERu5cUVj
http://pastebin.com/z3LuMxDz
Для сомневающихся:http://4mhz.de/bfdev.html
Дла тех кто не в курсе: http://ru.wikipedia.org/wiki/Brainfuck
Антон Архипов
аааааа! ю ар зе бест! :)))
Oleg Tsernetsov
А самое удивительное то, что это работает:
http://www.vimeo.com/12304308
Eduard Shustrov
А код точно работающий? Я не проверял, но вызывает сомнений второй вызов функции range() с тремя параметрами в функции mod_range(), в то время как функция range() описана с двумя параметрами и должна сама определять направление по первым двум параметрам.
Oleg Tsernetsov
Эдуард, внимательней надо быть с реплаями. В BrainFuck нет никаких функций по определению 🙂
Eduard Shustrov
Это я не к тому реплику написал. 🙂 Хотел к версии Саши на JavaScript.
Уже второй раз не к тому пишу. Либо это я, либо браузер…
Александр Мочёнов
Не смог перенести твою реплику в свою ветку. Останется тут.
Да, Эдуард — оно точно работает и то, что ты показал, это небольшой баг, который ни на что не влияет. Это недорефакторизм.
http://pastebin.com/PKbQ9bup — вот так правильнее и тебя ничего смущать не будет. просто в начале 1 или -1 я передовал в явном виде. А потом переделал на автоматическое определение оного.
Eduard Shustrov
Спасибо, Саша. 🙂
Jevgeni Holodkov
omfg!! Как насчет варианта на Whitespace? :))
Oleg Tsernetsov
Whitespace так Whitespace.
http://pastebin.com/raw.php?i=ukr97DKT
бегин и энд вставлены только для того, чтобы pastebin не протримал сорс на вводе. Транслятор их игнорит.
Пруфлинк
http://www.vimeo.com/12436769
Адаптированный вариант (для слабаков 🙂
http://pastebin.com/raw.php?i=3raEXYND
Для непросвещенных и потенциальных адептов секты
http://ru.wikipedia.org/wiki/Whitespace
Антон Архипов
ты затмил всех 🙂
Александр Мочёнов
Ну он затмил одну сторону. Вторая сторона уже затмена Сергеем с груви. =)
Eduard Shustrov
Читабельное и понятное (на мой взгляд) решение на Scala: http://pastebin.com/MgYaLTrW
Строк много, и можно записать намного компактнее, но так лучше читается.
А вот примерно то же самое заговнокожено: http://pastebin.com/V3H3pX9K
Eduard Shustrov
Если кто-то хочет попробовать, как это всё работает, можно скачать нормальную и испорченную версии.
Для запуска потребуется Java 5 или новее. Scala не нужна — в комплекте есть всё необходимое для запуска. Надо распаковать ZIP и запустить lister.cmd в Windows или lister.sh в Linux. в качестве параметра принимается то самое число, регулирующее размер выводимого списка. Можно попробовать задавать любые целые числа, если число меньше 1, просто нечего будет показывать. Параметров может быть сколько угодно — программа выведет списки для каждого указанного в параметрах числа.
Eduard Shustrov
Нормальная версия на Scala, укороченная до скрипта, но, тем не менее, довольно легко читаемая: http://pastebin.com/eLzu4KB7
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("", "-", ""))
Я и не знал. 🙂
Jevgeni Marenkov
Дофига тут уже решений, смотрю.
Которое называю четаемое http://pastebin.com/T77GgEV5
Гавнокод http://pastebin.com/rNJRL0H1
Не судите строго, ребята.
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]
Dumka
Всем привет!
Вот решение на ПыХПы (PHP)
http://pastebin.com/SUtvNH2n
Чтоб не плагиатить сначала сделал, потом смотрел, что другие предлагают. Посути одно и тоже разве что код на ПХП небыл представлен.
Судите сами. Думаю код читабелен для всех. ($i%2 вычисление остатка при делении числа $i на 2, если кто непонял)
Говнокод получится если делать реверс массиву или текстовому значению.
Dumka
Гавнокод! Обойдёмся простейшими операциями с текстом и числами.
http://pastebin.com/gdBarRzw
pemerkra
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
n0rb
Компактно на С++ http://pastebin.com/6ZE2xKS5
То же самое, но заговнокожено http://pastebin.com/YLt3yNVm
m-a-m-o-n.livejournal.com/
http://pastebin.com/CSaaXJqf
java
Антон Архипов
читерство — используется старонняя библиотека 🙂
Jevgeni Holodkov
Весь Groovy это сторонняя библиотека для java
Eduard Shustrov
Ну, тогда JRuby, Scala и многое другое, даже Clojure — это сторонние библиотеки для Java. 😉
Антон Архипов
ну камон. у Groovy есть синтаксис.
а так я могу взять Серёгину прогу и вызвать как библиотку, и будет у меня самый элегантнаый код с одним вызовом 🙂
m-a-m-o-n.livejournal.com/
1. В условии нет ограничений на использование библиотек.
2. Библиотека используется для представления данных, сама по себе она не содержит алгоритм который нужно реализовать.
3. Смысл Java в том что мы не ограничены единственным фреймворком который идёт с платформой, для java — 99 библиотек
со сторонними зависимотями это норма а не исключение.
Антон Архипов
да, в этом ты прав. но тогда это просто сводится к тому, кто какие библиотеки найбёт. и тоже самое в C#
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)))))
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
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
Eduard Shustrov
Web играет злые шутки. 🙂