Здравствуйте, Пельмешко, Вы писали:
П>Вот мой вариант:
П>П>let solve n =
П> let pows = [| for i in 0 .. 9 -> pown i n |]
П> let list = new ResizeArray<int>()
П> let rec test i x s =
П> let rec loop j =
П> if j < pows.Length then test (i+1) (10*x+j) (s+pows.[j]); loop (j+1)
П> if i <= n then loop 0
П> elif x = s && s > 1 then list.Add(s);
П> test 0 0 0; list |> Seq.sum
П>
let solve2 p =
let digits = [0..9]
let pows = [| for i in 0 .. 9 -> pown i p |]
let rec loop n c ds sum =
if c > p then
if n = ds then
printfn "%d" n
sum + n
else sum
else
digits |> List.fold (fun s d -> loop (n*10 + d) (c+1) (ds + pows.[d]) s) sum
loop 0 0 0 -1
Мой вариант Вашего варианта (работает немного дольше), но менее запутанный.
Здравствуйте, samius, Вы писали:
По случаю хочу поинтересоваться у знатаков вот по какому вопросу
В этом коде
S>S>let solve2 p =
S> let digits = [0..9]
S> ...
S> digits |> List.fold (fun s d -> loop (n*10 + d) (c+1) (ds + pows.[d]) s) sum
S>
список цифр нужен только для того, чтобы сделать по нему fold. Но этот список легко генерируется.
можно было бы это все переписать в
state1 |> Seq.unfold (fun ...) |> Seq.fold (fun ...) state2
вот их сингатуры
val unfold : ('State -> ('T * 'State) option) -> 'State -> seq<'T>
val fold : ('State -> 'T -> 'State) -> 'State -> seq<'T> -> 'T
А теперь хочется чего-то нехорошего. Хочется какой-то метод, который бы делал unfold и fold сразу. Брать какое-то состояние, метод его обработки, и крутить состояние в методе, но возвращать не последовательность значений, а результирующее состояние.
val ??? : ('State -> 'State option) 'State -> 'State
Быть может есть такой метод, а я его просто еще не открыл для себя?
Как писал выше, даю ссылку на мои решения задач с
Project Euler (задачи с 1 по 89 включительно) на языке Nemerle:
http://code.google.com/p/projecteuler-solutions-in-nemerle/source/browse/#svn/trunk/ProjectEuler/Tasks.
Несколько комментариев к выложенному мной коду:
Скорее всего, выложенный ProjectEuler.sln не будет открываться с установленной VS Integration для Nemerle, так как я с ним работал больше года назад. Но код самих решений должен компилироваться.
Каждое решение находится в отдельном файле с именем вида "TaskXXX.n", где XXX — номер задачи. Также собственно код решения всегда находится в методе класса-наследника TaskBase — мне так было удобней их потом запускать.
Иногда в коде используется класс Oyster.Math.IntX — это мой класс для работы с целыми неограниченной точности, скачать можно тут: http://intx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=10694.
Подсветки кода нет, потому что Google Code не хочет подсвечивать файлы с расширением *.n и я не знаю, можно ли его настроить так, чтобы он подсвечивал код так же, как код C# (файлы *.cs).
Надеюсь, кому-то будет полезно и интересно.