metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-12-21 01:48 pm

Конкурс в fpprog#3

На лоре феерический срач по третьем номеру журнала и заданиям на конкурсе в нем.

Кстати, задачи реально сложноваты, да. Там одного анализа входных данных - башкой удвинуться можно. Это, кстати, и правильно, а то всякий идиотизм учебный с обычных олимпиад и конкурсов в уныние вгоняет.

Да, кстати, я понял, что деградировал окончательно - мне хотелось бы сделать решение тамошних задач, но я этого сделать не смогу - ибо туп, ленив, занят на двух работах, а интереса, который бы меня заставил это все преодолеть уже того нет.
Видимо, придется в итоге все таки идти работать в НИИ Говна и Торфа, администрировать убунты у научных сотрудников, программировать "через силу" - это невозможно, быдлокодерское говнище получается.

PS: Фак мой мозг. Анонимусы с лора пишут, что все задачи предложены людьми, которые у меня во френдах - [livejournal.com profile] rssh и [livejournal.com profile] jek_hor. (Чорт, и авторы статей в журнале, в общем-то тоже). "Объединенная секта функциональщиков, линуксоидов и гуру-программистов".

[identity profile] theiced.livejournal.com 2009-12-21 04:42 pm (UTC)(link)
http://projecteuler.net/index.php?section=problems&id=202

а это насчёт идиотизмов `олимпиадных`. слабо? ;]

[identity profile] antilamer.livejournal.com 2009-12-21 05:51 pm (UTC)(link)
Тупая задачка, уже почти решил, но пора домой - завтра доделаю :)

[identity profile] antilamer.livejournal.com 2009-12-22 11:19 am (UTC)(link)
Сдал. Но покряхтел; противная задачка, не люблю такие :(

module Main where

import Control.Monad

answer alpha ps = sum [(if even (length s) then 1 else -1) * f (product s) | s <- filterM (const [True,False]) ps]
  where m = case (alpha`mod`3) of 0->0; 1->2; 2->1
        f p = (alpha-1-first)`div`(3*p) where first = head [x | x <- [p,2*p..], x`mod`3 == m]

main = putStrLn . show $ answer ((12017639147+3)`div`2) [5,11,17,23,29,41,47]

[identity profile] metaclass.livejournal.com 2009-12-22 11:36 am (UTC)(link)
Хех, очередной ад, который [livejournal.com profile] lionet расшифровывать придется, а [livejournal.com profile] zabivator очередной пост на 1500 комментов напишет.
Ну а я просто посыплю голову пеплом - связь между задачей и ответом для меня сильно смутная :)

[identity profile] antilamer.livejournal.com 2009-12-22 11:40 am (UTC)(link)
Ненене, Дэвид Блейн, в жопу расшифровку - я ее еще загольфил из любви к искусству, после того как написал :)

По сути там просто надо найти count {x in 1..N-1: coprime(x,N) AND (x+N)`mod`3 == 0}, где N=(K+3)/2, где K - число в условии.

Для этого я разложил руками N на простые множители (coprime(x,N) <-> x не делится ни на один из них), и с помощью стандартной формулы про диаграммы Венна посчитал этот count более или менее влоб.

[identity profile] lionet.livejournal.com 2009-12-22 11:43 am (UTC)(link)
Для начала, рассмотрим что мы имеем в последней строке:

main = putStrLn . show $ answer ((12017639147+3)`div`2) [5,11,17,23,29,41,47]

Показываем результат работы функции answer, которая запускается с двумя магическими аргументами.

Затем идёт вот что:

answer alpha ps = sum [(if even (length s) then 1 else -1) * f (product s) | s <- filterM (const [True,False]) ps]
where m = case (alpha`mod`3) of 0->0; 1->2; 2->1
f p = (alpha-1-first)`div`(3*p) where first = head [x | x <- [p,2*p..], x`mod`3 == m]


пипец какой-то...

[identity profile] antilamer.livejournal.com 2009-12-22 11:47 am (UTC)(link)
At least you did your best :)

[identity profile] lionet.livejournal.com 2009-12-22 11:50 am (UTC)(link)
Да не говори, самому стыдно! :)