Решение задачи о возрастах детей
|
5 Авг, 2011 @ 11:12
|
|---|
Итак, вчера (а кто-то и сегодня ночью по московскому времени) мы занимались решением хитроумной задачи по матану. Я несколько удивлён, что моя публикация оной задачи вызвала такое оживление, но это и хорошо. Сегодня я хотел бы подвести итоги конкурса и определить победителей.
Каюсь, я виноват в том, что изначально некорректно определил условия получения приза. В связи с этим пришлось заниматься проверкой алгоритмов на общность, поскольку некоторые алгоритмы (в том числе и опубликованный первым с правильным ответом) были узки и заточены под решение (1, 6, 6) (которое и является правильным ответом). Но поскольку виноват я, то я считаю, что справедливо будет то, что никто не уйдёт без приза из тех, кто дал правильный ответ.
В связи с этим объявляю своё решение. Думаю, что будет справедливо и идеологически верно то, чтобы книга о годном языке программирования Haskell досталась камраду, написавшему программу для решения на негодном языке программирования Java. Надеюсь, что мои коллеги по цеху функционального программирования не будут оспаривать данное решение и согласятся с его правильностью. Итак, победитель — licvidator. Чествуем!!!
Остальные, кто правильно решил задачу и доказал общность своих алгоритмов, также получают призы. Для каждого, кто перечислен ниже, я готов сгенерировать персональный электронный экземпляр одной из книг: «14 занимательных эссе о языке Haskell и функциональном программировании» или «Методы получения, представления и обработки знаний с НЕ-факторами» на выбор каждого поощряемого коллеги. Персональный экземпляр обозначает, что я пришлю вам файл PDF, в котором будет сделана дарственная надпись конкретно для вас.
Итак, следующих камрадов и коллег прошу прислать мне на почту darkus.14@gmail.com ваш выбор, свою контактную информацию, полные ФИО и пожелания по тексту надписи (если есть и чтобы удостовериться, что я буду каждому делать именно персональный экземпляр, а не вышлю всем один и тот же заготовленный файл): boud, cursed_in, ajtkulov, Alexey G, Andrev Trofimov, Oleg Vershinin, Завьялов Дмитрий, teegaar, Курносов Николай, udpn, jtraub, zhectjahsik, brainbench, namash. Жду информацию, однако хочу сказать, что отреагирую и подготовлю всё не ранее, чем через полторы недели, так что наберитесь терпения.
Камрада licvidator также прошу прислать мне на почту контактную информацию и всё остальное, что надо для оформления книги и отправки её почтой.
Ну и напоследок опубликую своё решение, которое написал, когда решал задачу у камрада dm_kalashnikov. Вот оно (на языке Haskell, разумеется):
import Data.List
import Data.Function
ages n = map (filter (\([x, y, _], _) -> x < y)) $
filter ((> 1) . length) $
groupBy ((==) `on` snd) $
sortBy (compare `on` snd) [([x, y, z], x + y + z) |
x <- [1..n],
y <- [x..(n `div` x) + 1],
z <- [y..(n `div` (x * y)) + 1],
x * y * z == n]
Дополнение: Также для тех коллег, которым положен персональный электронный экземпляр одной из книг, я могу договориться с издательством Самиздал о предоставлении скидки 10 % при заказе моих книг. Кому из перечисленных коллег это предложение интересно, также прошу написать мне в почту. Жду писем.
|
Попробовал сообразить такое на Erlang. Не хватает нормальных генераторов списков и груп бай (или я что-то не знаю x_x).
do(A) -> B = [{[X, Y, Z], X + Y + Z} || X <- lists:seq(1, A), Y <- lists:seq(X, lists:max([X, A div X + 1])), Z <- lists:seq(Y, lists:max([Y, A div (X * Y) + 1])), X * Y * Z == A], C = lists:filter(fun({_, S} = E) -> lists:keymember(S, 2, B -- [E]) end, B), lists:filter(fun({[X, Y, _], _}) -> X < Y end, C).
Явно меньше буковок чем в моем оригинальном решении (:
Меньше, да. Но Хаскел более крутъ :).
![[User Picture Icon]](http://l-userpic.livejournal.com/99062364/26371555) |
| From: | lenstr |
| Date: |
Август, 5, 2011 09:15 (UTC) |
|
|
|
|
(Link) |
|
Очень красивое и выразительно решение. Я в восторге ")
User namash referenced to your post from No title saying: [...] Вчера получил поощрительный приз от за задачку [...]
Жгёшь, камрадище. Давай ещё.
|
|