Title : Menghitung Multi Sistem Bilangan Numerik Dengan Eval di Ruby
Released : 2016-07-01 03:10:54 -0400
Viewed : 548

Yarp, tadi ceritanya lagi bikin persiapan buat event IT RACE 2.0 tahun 2016 ini, event ini akan diselenggarakan secara rutin tahunan. Tapi tergantung kalo ada sponsor sih. Dan kebetulan untuk tahun ini Kecamatan Kota Ternate Utara bakal jadi sponsor sekaligus tuan rumah kegiatan komunitas Zona IT Ternate.

Sebagai pemanasan, publish dulu sebuah soal matematika yang disamarkan dalam bentuk sistem bilangan numerik Hexa dan Biner. Pertanyaannya kayak gini:

Berapakah

6F + 7A - 10010011 / 2A + (BB x 11100111) - AA

Jawabannya dikirim melalui email, dan dalam waktu beberapa jam, akhirnya email berdatangan dari para calon kontestan, dengan beragam cara dan beragam jawaban pula. Heuheu... 

Jika jawaban yang benar dari para peserta lebih dari 1, maka kriteria pemenang dicari berdasarkan proses yang paling efisien dan efektif. Tapi gak menutup kemungkinan kalo prosesnya unik. :)

Ada yang ngoding pake python, ada yang konversi aplikasi gadget, dan ada pula yang menjabarkan per langkah. Penjabaran sederhana dari soal diatas adalah sebagai berikut:

[mix] 6F + 7A - 10010011 / 2A + (BB x 11100111) - AA

[bin] 01101111 + 01111010 - 10010011 / 00101010 + (10111011 x 11100111) - 10101010

[dec] 111 + 122 - 147 / 42 + (187 x 231) - 170

[math] 111 + 122 - (147/42) + (187 x 231) - 170

Tapi karena kontes ini lebih menarik dengan programming, gak mungkin kan kalo nanti pas lombanya dimulai, harus menghabiskan waktu berjam-jam hanya untuk menghitung soal-soal semacam ini? Jadi solusinya adalah.... yarp, ngoding. :)

Pas bikin soal ini sebenarnya aku sendiri belum ngitung. hehe. Makanya gak nyadar kalo hasil pembagian tidak menghasilkan bilangan bulat. :p

So, buat para peserta yang tadi udah pada ngirim jawaban, ne aku buatkan penyelesaiannya menggunakan Ruby.

#!/usr/bin/env ruby class Fixnum def convert_base(to) self.to_s(to).to_i end end soal="6F + 7A - 10010011 / 2A + ( BB * 11100111 ) - AA" c=[] soal.split().each {|i| c.push((i.length==2) ? i.hex.convert_base(10): (i.length==8) ? i.to_i(2).convert_base(10) : i) } p eval(c.join())

dan jawabannya adalah....

43256.5 , boleh dibulatkan kebawah menjadi 43256 atau keatas menjadi 43257.

Selamat buat Stephan EL'wiin Shaarawy yang berhasil menjawab pertanyaan ini dengan benar. Kirim no.hp mu di email yak, atau inbox di fb untuk pengiriman hadiah :)