hakimrie

See also: Other Geeks@INDC

Jumlahno Digite

kali ini saya menerapkan teknik menulis yang baik (aneh), he..he, yaitu membuat judul yang membuat orang selain orang jawa nggak ngeh, dan akhirnya ingin membaca dan melihat isi postingan saya kali ini :D. ok, kali ini saya ingin mencatat perjalanan saya yang sampai pada projek Euler (yang eksplor F# sejak dulu pasti sudah tahu ini), salah satu pertanyaanya adalah berapa hasil penjumlahan tiap digit dari 2 pangkat 1000, ini pertanyaan ke-16, nah akhirnya saya coba menjawabnya dengan F# , itung - itung sambil belajar F#, begini:

let duaPangkat1000 = (powi 2I 1000)
let rec sumAllDigitFrom x =
    match x with
    | x when (x < 10I) -> x
    | _ -> (x % 10I) + (sumAllDigitFrom (x/10I))

let dpx = (sumAllDigitFrom duaPangkat1000)
printf "2^1000 = %A\nHasil Penjumlahan tiap digit = %A" duaPangkat1000 dpx

 

nah, uniknya disini setelah kita bisa mejawab kita dapat melihat cara menjawab orang lain, nah saya lihatlah jawaban orang lain itu; orang pertama menjawab pake assembly (codenya panjang, padahal biasanya orang itu jawabannya pendek/singkat banget meski pake assembly), terus lihat agak kebawah lagi ada yang pake ruby (duh tadi kenapa gak pake ruby) kaya gini:

sum = 0
(2**1000).to_s.each_byte {|b| sum+=b.chr.to_i}
puts sum

pendek banget kan :), kemudian saya lihat Haskell (oh, saya belum pernah mrogram pake Haskell, tapi dia peserta GSoC juga Smile ) begini:

sum (map (digitToInt) (show (2^1000)))

nah lho, ini sama - sama functional kenapa bisa singkat gini, sebenarnya masih ada sebelas halaman lagi untuk dilihat, tapi saya malas Stick out tongue, kayak search engine cukup halaman pertama, akhirnya saya mencoba mengkompress kode saya di atas, dan setelah cukup lama (harus baca manual F# lagi bo!) dan akhirnya saya mentok disini, ini dia kode saya yang baru:

List.of_array(((powi 2I 1000).ToString()).ToCharArray())
        |> List.map(fun x -> int(x.ToString())) |> List.fold1_left(+) |> print_any

 

semua kode selengkapnya saya ini:

image

tuh, saya tulis kode dalam haskellnya juga untuk membandingkan, dan ternyata saya tidak bisa mengkompress kode program saya seperti itu, karena masih kurang ilmu [:'(]

dan hasil eksekusinya:

image

tiga baris pertama itu merupakan hasil perhitungan 2 pangkat 1000 dan baris terakhir adalah jawabannya, versi perhitungan panjang dengan fungsi rekursif, dan yang diperoleh dari kode program yang kayaknya lebih pendek = 1366 (hooray! kali ini saya pake visual studio)

iya kan, (saya) masih kalah saja dengan haskell, pertanyaan saya adalah, adakah solusi yang lebih pendek dalam F# ? (giliran anda menjawab di bagian komentar postingan ini Yes )

Share this post: | | | |
Posted: Apr 07 2008, 01:54 AM by hakimrie | with 4 comment(s)
Filed under:

Comments

cahnom said:

Ora mudeng

# April 7, 2008 9:11 AM

hakimrie said:

he..he.. soale ora penting yo? nyantai wae om, minggu ngarep InsyAllah tak mulai posting nggae C# :)

matur suwun

# April 7, 2008 3:16 PM

hakimrie said:

kali ini saya tidak sedang membahas salah satu jawaban pada Projec Euler seperti sebelumnya , tapi kali

# April 11, 2008 12:29 AM

Asynchronous Workflow di F# « Jampasir’s Weblog said:

Pingback from  Asynchronous Workflow di F# &laquo; Jampasir&#8217;s Weblog

# April 11, 2008 12:32 AM