На
devclub.eu куча решений к
quiz-у, который предложил Андрей Солнцев.
Задание: Напечатать на экране следующее:
1
2-1
1-2-3
4-3-2-1
1-2-3-4-5
6-5-4-3-2-1
(Естественно, вместо 6 может быть любое число).
(
Мои мысли по поводу этого задания и вариант на Clojure )
Comments 36
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]
Быстрое решение в лоб, вероятно есть более короткие )
Reply
Reply
Reply
Reply
:))))))))))))))))))))))))))))))))))))))))
Reply
Reply
Reply
Все уловили тут тонкую кибернетическую хитрость?
Код как бы должен быть читаемым сам по себе, без запускания чего бы то ни было...
Reply
а) хорошее имя
б) хороший docstring/javadoc
в) понятная логика "как оно работает"
Без запускания чего-либо ты сможешь прочитать только имя. Для javadoc-а нужно будет его сгенерить (а ведь он может и не идти в комплекте с софтом). Здесь docstring укладывает его на лопатки. Для white-box reasoning-а читабельность макроса будет лучше, чем читабельность математических, тринарных i%2? ..: .. и прочих хитрых манипуляций. Единственное к чему можно придраться в макросах - они сложнее для поддержки и конкретно этот макрос не скалируем на большие объемы данных. Но в данном случае это несущественные требования :)
Reply
(require '[clojure.contrib.str-utils :as str])
(defn print-ranges [n]
(doall (for [s (range 1 (inc n))]
(println (str/str-join "-" ((if (zero? (mod s 2)) reverse identity)
(range 1 (inc s))))))))
Reply
Reply
(defn j
[x]
(doall (for [a (range 1 (inc x))
:let [f (if (even? a) reverse identity)]]
(->> (range 1 (inc a))
(f)
(interpose "-")
(apply str)
(println)))))
Если убрать последний println то ф-я вернет список
("1" "2-1" "1-2-3" "4-3-2-1" "1-2-3-4-5" "6-5-4-3-2-1")
Reply
Leave a comment