Re[3]: Project Euler Solutions in F#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.06.09 21:00
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Вот мой вариант:

П>
П>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

Мой вариант Вашего варианта (работает немного дольше), но менее запутанный.
Re[4]: Project Euler Solutions in F#
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.06.09 21:32
Оценка:
Здравствуйте, 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

Быть может есть такой метод, а я его просто еще не открыл для себя?
Re: Project Euler Solutions in Nemerle
От: Oyster Украина https://github.com/devoyster
Дата: 02.07.09 13:14
Оценка: 22 (2)
Как писал выше, даю ссылку на мои решения задач с Project Euler (задачи с 1 по 89 включительно) на языке Nemerle: http://code.google.com/p/projecteuler-solutions-in-nemerle/source/browse/#svn/trunk/ProjectEuler/Tasks.

Несколько комментариев к выложенному мной коду:


Надеюсь, кому-то будет полезно и интересно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.