Привет!
Следующая встреча 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.
Ждём ваших решений!
http://pastebin.com/GQKx7u5v
Координально иной вариант с одним цыклом =)))
http://pastebin.com/HADiVRP4
Както не придумался говнокод
Пришлось хитрить.
http://pastebin.com/wKrsykcY
Подумай ещё! Я знаю, мы можешь…
Я думаю!
вот, в первом приближении
http://pastebin.com/Vaimb7Zn
Простейшая арифметика
http://pastebin.com/VCRzc6aD
А вот лаконично-читабельное на яве все равно говнокодом выходит :Р
http://pastebin.com/ChcDE0hd
oO
блин, ты меня опередил
))
я тоже самое хотел сделать только с одним System.out.println:
System.out.println(
“1\n”+
“2-1\n”+
“1-2-3\n”+
“4-3-2-1\n”+
“1-2-3-4-5\n”+
“6-5-4-3-2-1\n”);
Я протестую!
Очевидно что количество строк — переменное.
Пожалуйcта, вот вариант с переменным числом строк
http://lafy.livejournal.com/146122.html
Протестую что это говнокод!
Это 100% покрытие реквайрментов и ни строчки больше!
Есдинственное что не учёл автор, что вместо 6 может быть другое число, тоест вставить туда переменную
Я вот тоже не понял, почему народ парится… Ведь в задании всё чётко сказано!
http://pastebin.com/UhKKS9bU
Это был лаконичный вариант.
А вот говнокодистый:
http://pastebin.com/qbv1nvmu
Исправленный вариант лаконичного решения с правильными кавычками:
http://pastebin.com/D8DYuG98
v1.1
Это вы меня хорошо подловили, конечно.
Но давайте всё-таки поставим условие, что вместо 6 может быть любое число.
Ещё раз внимательно прочитал задание. Осознал свою ошибку.
Исправленный вариант:
http://pastebin.com/gNNrj8hH
Если нужна криптографическая стойкость, то можно доработать генератор.
Для этого требуется уточнить платформу на которой решение должно работать, а так же согласовать вопросы финансирования.
http://pastebin.com/LEekE5TY
print join(‘-’, $_%2 ? 1..$_ : reverse 1..$_ ).”\n” for 1..10;
Лаконичное — в строчку.
Читабельное — возможно не всеми.
Спозиционируйте, на свой взгляд, на 1 или 2,
тогда начну (переламывая своё естество) генерить альтернативу.
на Groovy — ещё короче и ясней
http://pastebin.com/EMj9cJEB
for ( i in 1..10 ) println( ( i%2 ? 1..i : i..1 ).join('-') );
мне кажется это пока что самое классное решение
Однозначно
+500
Da-da, poka chto Groovy rulez odnoznachno!
На Scala строчка получается немногим больше, хотя на мой взгляд, для непосвящённых выглядит понятнее.
for (arg <- args; size <- 1 to arg.toInt) println((if (size % 2 != 0) (1 to size) else (1 to size).reverse).mkString("", "-", ""))
Дело тут не в языке программирования, а в человеке, которые придумал такой лаконичный подход. Сергей, это гениально!
Спасибо
Вообще, это моя первая строчка на Groovy после “Hello World”.
Сначала на perl-е написал, потом решил перевести дословно в более общеупотребимый c/java синтаксис.
Groovy — очень приятный язык. Правда, скорость запуска слегка настораживает.
Как видно из комментраниев здесь, подобное можно написать и на других языках. Ты же посмотрел на проблему под другим углом, и нашёл самое красивое решение. Это и восхощает.
Скомпилированная программа на 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 * “-”}
C#
В поисках компромиса между лаконичностью и читабельностью:
http://pastebin.com/23Zbp9aX
Рождалось не то чтоб с трудом, но не уверен в качестве. Наверное можно и покруче замутить:
http://pastebin.com/CaWZkfwm
Вспомнил Haskell, хотя если б было чуть больше времени поковыряться было бы симпатичнее
http://codepad.org/dc1I9b23
прикольный сервис. Надо его начать юзать.
http://pastebin.com/LxMjrxDZ
do{$_||=qq=1\n2-1\n=,$”=”",print}
while s=\n\d+=qq@\@{[-$&,-$&-1,"\n",$&+2,-$&-1,-$&]}@=e&&$&<8;
Лаконично, но точно говнокодисто.
даже с хайлайтером не понять, как работает Ж)
http://pastebin.com/k3Aiqrmr
Вот что у меня получилось.
Просто и читаемо
Вот почти тоже самое только с одно переменной S1
http://pastebin.com/jCbzcfuk
Такой же понятный код как и на Haskell
http://codepad.org/yd4zyhGA лаконично на Питоне.
Говнокод позже, тружусь, пока он мне еще недостаточно противен.
Солюшн на BrainFuck
Два варианта – попробуйте сами определить где лаконичный/красивый/читабельный, а где говнокод
http://pastebin.com/ERu5cUVj
http://pastebin.com/z3LuMxDz
Для сомневающихся:http://4mhz.de/bfdev.html
Дла тех кто не в курсе: http://ru.wikipedia.org/wiki/Brainfuck
аааааа! ю ар зе бест!
))
А самое удивительное то, что это работает:
http://www.vimeo.com/12304308
А код точно работающий? Я не проверял, но вызывает сомнений второй вызов функции range() с тремя параметрами в функции mod_range(), в то время как функция range() описана с двумя параметрами и должна сама определять направление по первым двум параметрам.
Эдуард, внимательней надо быть с реплаями. В BrainFuck нет никаких функций по определению
Это я не к тому реплику написал.
Хотел к версии Саши на JavaScript.
Уже второй раз не к тому пишу. Либо это я, либо браузер…
Не смог перенести твою реплику в свою ветку. Останется тут.
Да, Эдуард – оно точно работает и то, что ты показал, это небольшой баг, который ни на что не влияет. Это недорефакторизм.
http://pastebin.com/PKbQ9bup – вот так правильнее и тебя ничего смущать не будет. просто в начале 1 или -1 я передовал в явном виде. А потом переделал на автоматическое определение оного.
Спасибо, Саша.
omfg!! Как насчет варианта на Whitespace?
)
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
ты затмил всех
Ну он затмил одну сторону. Вторая сторона уже затмена Сергеем с груви. =)
Читабельное и понятное (на мой взгляд) решение на Scala: http://pastebin.com/MgYaLTrW
Строк много, и можно записать намного компактнее, но так лучше читается.
А вот примерно то же самое заговнокожено: http://pastebin.com/V3H3pX9K
Если кто-то хочет попробовать, как это всё работает, можно скачать нормальную и испорченную версии.
Для запуска потребуется Java 5 или новее. Scala не нужна – в комплекте есть всё необходимое для запуска. Надо распаковать ZIP и запустить lister.cmd в Windows или lister.sh в Linux. в качестве параметра принимается то самое число, регулирующее размер выводимого списка. Можно попробовать задавать любые целые числа, если число меньше 1, просто нечего будет показывать. Параметров может быть сколько угодно – программа выведет списки для каждого указанного в параметрах числа.
Нормальная версия на Scala, укороченная до скрипта, но, тем не менее, довольно легко читаемая: http://pastebin.com/eLzu4KB7
Вот это и есть КОД. А всё остальное, что мы тут наложили, по определению – ГОВНОКОД, так как его можно улучшить. А я говнокодер.
Оказывается, на Scala тоже так можно (скрипт принимает неограниченное число целочисленных параметров):
for (arg <- args; size <- 1 to arg.toInt) println((if (size % 2 != 0) (1 to size) else (1 to size).reverse).mkString("", "-", ""))
Я и не знал.
Дофига тут уже решений, смотрю.
Которое называю четаемое http://pastebin.com/T77GgEV5
Гавнокод http://pastebin.com/rNJRL0H1
Не судите строго, ребята.
import Data.List as DLdumpLines :: 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]
Всем привет!
Вот решение на ПыХПы (PHP)
http://pastebin.com/SUtvNH2n
Чтоб не плагиатить сначала сделал, потом смотрел, что другие предлагают. Посути одно и тоже разве что код на ПХП небыл представлен.
Судите сами. Думаю код читабелен для всех. ($i%2 вычисление остатка при делении числа $i на 2, если кто непонял)
Говнокод получится если делать реверс массиву или текстовому значению.
Гавнокод! Обойдёмся простейшими операциями с текстом и числами.
http://pastebin.com/gdBarRzw
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
Компактно на С++ http://pastebin.com/6ZE2xKS5
То же самое, но заговнокожено http://pastebin.com/YLt3yNVm
http://pastebin.com/CSaaXJqf
java
читерство – используется старонняя библиотека
Весь Groovy это сторонняя библиотека для java
Ну, тогда JRuby, Scala и многое другое, даже Clojure – это сторонние библиотеки для Java.
ну камон. у Groovy есть синтаксис.
а так я могу взять Серёгину прогу и вызвать как библиотку, и будет у меня самый элегантнаый код с одним вызовом
1. В условии нет ограничений на использование библиотек.
2. Библиотека используется для представления данных, сама по себе она не содержит алгоритм который нужно реализовать.
3. Смысл Java в том что мы не ограничены единственным фреймворком который идёт с платформой, для java – 99 библиотек
со сторонними зависимотями это норма а не исключение.
да, в этом ты прав. но тогда это просто сводится к тому, кто какие библиотеки найбёт. и тоже самое в C#
Моя первая программа на 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)))))
Интереса ради реализация на bash
for ARG in "$@"; dofor 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
Так короче:
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
Короткий вариант на 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)));
}
Оно не компилируется.
Если исправить ошибки и добавить обработку параметров, чтобы задавать размерность выводимого списка, этот алгоритм будет работать долько для однозначных чисел. А вот из “10″ при переворачивании строки выйдет уже “01″.
Спасибо Эдуард! На самом деле код компилировался, но видимо часть кода после угловой скобки просто была автоматически вырезана из поста. А замечание насчет однозначных чисел справедливое. Исправленный вариант получился немного длиннее, но тоже достаточно лаконичный. На этот раз залил код в pastebin и написал также второе, более развернутое решение. Правда на мой взгляд говнокод получился в коротком решении.
Лаконичное решение: http://pastebin.com/jD60iriR
Развернутое решение: http://pastebin.com/4TTruaUp
Web играет злые шутки.
[...] встрече были объявлены поделители очередного домашнего задания, которое предоставил Андрей [...]