23:42 

Haskell

Добрый вечер.
Есть программа на хаскель. Находит и печатает все варианты таких расстановок символов +, -, *, / и круглых скобок в n-значном номере билета, что результатом вычислений будет число 100. Деление допустимо только в случае деления нацело, а количество цифр в билете (n) может быть произвольным.

tickets ds = (ds, foldl (\n c -> 10*n + digitToInt c) 0 ds) :
[("("++ld++[op]++rd++")", f lv rv) |
(op,f) <- [('+',(+)),('-',(-)),('*',(*)),('/',(div))],
n<-[1..length ds-1], (ld,lv) <- tickets (take n ds),
(rd,rv) <- tickets (drop n ds), op /= '/' || (rv /= 0
&& lv `mod` rv == 0)]
happy = map fst . (filter ((==)100 . snd)) . tickets

В моем распоряжении крайне мало времени, чтобы ее понять. Не навостриться писать такие же завороты, а понять эту. Знаю только основы языка.
Если не трудно, опишите, пожалуйста, принцип работы этой программы построчно.
Спасибо.

@темы: Computer Science

Комментарии
2010-06-03 в 00:16 

Forumsdk
это какой язык?

З.Ы. хехе недавно ехал в автобусе и кто-то сказал, про то, что так интереснее, чем считать, счастливый или нет :) теперь каждый раз при проезде мозг тренирую, только я использую все известные мне мат. функции :)

З.З.Ы только что вспомнил, то когда то на олимпиаде подобную задачу решали, но уже не вспомню как, а думать лень

2010-06-03 в 00:20 

red cheese [DELETED user]
Forumsdk, в заголовке написано, Haskell

я тоже) но подставляю все рандомно, в программу это ни разу не запихивала

2010-06-03 в 00:28 

Тигр
Попробуй связаться с сим человечищем. Он точно project euler на Haskell проходил - может подскажет тебе чего.... =))

2010-06-03 в 00:30 

Тигр, спасибо за наводку) а это удобно?

2010-06-03 в 01:29 

Тигр
Alexandrine, это мой двоюрный брат =) незнаю, как он к людям относится, по-разному наверное =)

2010-06-03 в 01:30 

Тигр, можно я на вас сошлюсь тогда?))

2010-06-03 в 01:34 

Тигр
Alexandrine, можно =)

2010-06-03 в 01:40 

Тигр, спасибо большое!!))

2010-06-03 в 18:03 

Пау-чок
И после этого говорят, что в перле зубодробительный синтаксис... =\

2010-06-03 в 18:16 

в перле такое же убийство..

2010-06-03 в 21:42 

Пау-чок
Как я в общих чертах понял программу, происходит полный перебор всех возможных валидных комбинаций (т.е. где нету деления на ноль и дробных частных) строк, составленных из цифр номера билета, вставленных между ними заданных операций (+,-,*,/) и расстановок скобок. На этапе построения каждой такой строки её численное значение вычисляется и сопоставляется ей. Потом те строки, сопоставленные которым значения не равны 100 выкидываются.
На яваскрипте это бы выглядело примерно так:


2010-06-04 в 23:51 

O,
спасибо вам огромное-преогромное!
я ее поняла, ура!)

2010-06-05 в 14:25 

Пау-чок
Alexandrine Не за что =)

Комментирование для вас недоступно.
Для того, чтобы получить возможность комментировать, авторизуйтесь:
 
РегистрацияЗабыли пароль?

ru_programming

главная