devclub.eu quiz

Jun 05, 2010 20:46

На 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 )

devclub, clojure, it

Leave a comment

Comments 36

jdevelop June 6 2010, 06:58:27 UTC

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

lafy June 6 2010, 07:45:20 UTC
О, это же pattern matching?

Reply

jdevelop June 6 2010, 07:57:36 UTC
нет, тут guards

Reply

lafy June 6 2010, 07:59:36 UTC
Ок, я про guards ничего не знаю..

Reply


fidelite June 6 2010, 15:23:15 UTC
ой "вырезано цензурой"!

:))))))))))))))))))))))))))))))))))))))))

Reply

lafy June 6 2010, 17:12:37 UTC
Я все могу объяснить! ))

Reply

fidelite June 6 2010, 17:24:51 UTC
если только доходчиво :)

Reply


Хе-хе asolntsev June 7 2010, 05:30:31 UTC
"но читабельность, как ни странно, сохранена - любой программист сможет всегда вызывать macroexpand и понять, как работает тот или иной макрос"

Все уловили тут тонкую кибернетическую хитрость?
Код как бы должен быть читаемым сам по себе, без запускания чего бы то ни было...

Reply

Re: Хе-хе lafy June 7 2010, 06:45:15 UTC
Во первых IDE может делать macroexpand самостоятельно. Во вторых - я говорю о читаемости для пользователя функции, а не для ее разработчика. В этом случае должно быть:
а) хорошее имя
б) хороший docstring/javadoc
в) понятная логика "как оно работает"

Без запускания чего-либо ты сможешь прочитать только имя. Для javadoc-а нужно будет его сгенерить (а ведь он может и не идти в комплекте с софтом). Здесь docstring укладывает его на лопатки. Для white-box reasoning-а читабельность макроса будет лучше, чем читабельность математических, тринарных i%2? ..: .. и прочих хитрых манипуляций. Единственное к чему можно придраться в макросах - они сложнее для поддержки и конкретно этот макрос не скалируем на большие объемы данных. Но в данном случае это несущественные требования :)

Reply


alexott June 7 2010, 12:57:15 UTC
а почему не в лоб, вот так, например:

(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

lafy June 7 2010, 14:16:05 UTC
Я почти так и сделал сначала (разве что использовал even? вместо mod и не использовал identity. Но в таком виде код проигрывает читабельности груви, поэтому пришлось генерить print выражения, чтобы хоть как-то выделиться перед ним :)

Reply

У меня получилось очень похоже edbond August 12 2010, 21:36:01 UTC


(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

Up