Pembukaan
Bilangan bulat selalu genap atau ganjil . Bahkan bilangan bulat dapat dibagi dua, bilangan bulat ganjil tidak.
Saat Anda menambahkan dua bilangan bulat, Anda dapat menyimpulkan apakah hasilnya akan genap atau ganjil berdasarkan apakah puncaknya genap atau ganjil:
- Even + Even = Even
- Genap + Ganjil = Ganjil
- Ganjil + Genap = Ganjil
- Ganjil + Ganjil = Merata
Demikian juga, ketika Anda mengalikan dua bilangan bulat Anda dapat menyimpulkan apakah hasilnya akan genap atau ganjil berdasarkan apakah faktor genap atau ganjil:
- Even * Even = Even
- Even * Odd = Even
- Ganjil * Genap = Genap
- Ganjil * Ganjil = Ganjil
Dengan demikian, jika Anda mengetahui kerataan atau keanehan semua variabel dalam ekspresi matematika yang hanya melibatkan penambahan dan perkalian, Anda dapat menyimpulkan apakah hasilnya akan genap atau ganjil.
Sebagai contoh, kita dapat dengan yakin mengatakan bahwa (68 + 99) * 37
menghasilkan ganjil karena genap ditambah ganjil ( 68 + 99
) adalah ganjil, dan yang ganjil lain ganjil ( odd * 37
) memberikan ganjil.
Tantangan
Tulis program atau fungsi yang menggunakan string yang hanya berisi empat karakter eo+*
. String ini mewakili ekspresi matematika yang diberikan dalam notasi awalan yang hanya melibatkan penambahan ( +
) dan perkalian ( *
). Masing-masing e
mewakili beberapa nomor genap sembarang, dan masing-masing o
mewakili beberapa angka ganjil yang sewenang-wenang.
Tugas Anda adalah menyederhanakan ekspresi, mencetak, atau mengembalikan tunggal e
atau o
berdasarkan apakah hasil ekspresi itu genap atau ganjil.
Anda dapat mengasumsikan bahwa input akan selalu dalam notasi awalan yang valid. Secara khusus, masing +
- masing dan *
akan selalu memiliki dua operan yang sesuai terjadi setelahnya. Operan ini dapat berupa satu e
atau o
, +
atau *
ekspresi lain yang pada gilirannya memiliki operan.
Misalnya, input *+eoo
dapat dibaca sebagai mul(add(e, o), o)
, atau (e + o) * o
dalam notasi infiks normal . The e
dan yang pertama o
adalah operan sesuai dengan +
, dan +eo
dan yang terakhir o
adalah operan yang sesuai dengan *
.
Untuk memperjelasnya, berikut adalah beberapa input yang tidak valid yang memiliki notasi awalan yang salah:
eo
ooe
o+e
ee*
+*oe
+e*o
Satu baris baru yang tertinggal di output baik-baik saja, tetapi jika tidak, plain e
untuk genap atau o
ganjil adalah yang seharusnya menjadi output.
Kode terpendek dalam byte menang.
Uji Kasus
(Baris kosong hanya untuk membantu memisahkan kasus serupa secara visual.)
e -> e
o -> o
+ee -> e
+eo -> o
+oe -> o
+oo -> e
*ee -> e
*eo -> e
*oe -> e
*oo -> o
+e+ee -> e
+e+eo -> o
+e+oe -> o
+e+oo -> e
+e*ee -> e
+e*eo -> e
+e*oe -> e
+e*oo -> o
+o+ee -> o
+o+eo -> e
+o+oe -> e
+o+oo -> o
+o*ee -> o
+o*eo -> o
+o*oe -> o
+o*oo -> e
*e+ee -> e
*e+eo -> e
*e+oe -> e
*e+oo -> e
*e*ee -> e
*e*eo -> e
*e*oe -> e
*e*oo -> e
*o+ee -> e
*o+eo -> o
*o+oe -> o
*o+oo -> e
*o*ee -> e
*o*eo -> e
*o*oe -> e
*o*oo -> o
++eee -> e
++eeo -> o
++eoe -> o
++eoo -> e
++oee -> o
++oeo -> e
++ooe -> e
++ooo -> o
+*eee -> e
+*eeo -> o
+*eoe -> e
+*eoo -> o
+*oee -> e
+*oeo -> o
+*ooe -> o
+*ooo -> e
*+eee -> e
*+eeo -> e
*+eoe -> e
*+eoo -> o
*+oee -> e
*+oeo -> o
*+ooe -> e
*+ooo -> e
**eee -> e
**eeo -> e
**eoe -> e
**eoo -> e
**oee -> e
**oeo -> e
**ooe -> e
**ooo -> o
+e+e+e+ee -> e
+o+o+o+oo -> o
*e*e*e*ee -> e
*o*o*o*oo -> o
+e+o+e+oe -> e
+o+e+o+eo -> o
*e*o*e*oe -> e
*o*e*o*eo -> e
+e*e+e*ee -> e
+o*o+o*oo -> o
*e+e*e+ee -> e
*o+o*o+oo -> o
+**++*+*eeoeeooee -> e
+**++*+***eooeoeooeoe -> e
+**+***+**++**+eooeoeeoeeoeooeo -> o
+e*o*e**eoe -> e
+*e+e+o+e**eeoe -> e
**o++*ee*++eoe*eo+eoo -> o
sumber
eval
OK?Jawaban:
CJam,
181713 byteTerima kasih kepada aditsu karena telah menghemat 4 byte.
Coba test suite di sini. (Test suite terlalu panjang untuk permalink. Cukup salin dari spec tantangan.)
Penjelasan
sumber
Pyth,
1614 bytePyth sendiri dapat mengevaluasi string, yaitu dalam sintaks Pyth. Karena itu saya ganti
e
dano
dengan4
dan5
. Maka evaluasi akan memberi saya nomor genap atau ganjil, dan saya dapat dengan mudah mencetak hasilnya.Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
Penjelasan tambahan untuk mengganti.
G
adalah variabel yang diinisialisasi dengan alfabetabc...xyz
.U9
adalah daftar[0, 1, ..., 8]
.XzGU9
mengganti huruf-huruf alfabet dengan nilai-nilai daftar. Jadia
akan diganti dengan0
,b
dengan1
, ...,e
dengan4
, ...,i
dengan8
,j
dengan0
, ..., dano
dengan5
. Karena itu sayae
diganti dengan angka genap dano
angka ganjil. Semua penggantian lainnya tidak berpengaruh sama sekali.sumber
Perl,
504540 karakter(39 karakter kode + 1 opsi baris perintah karakter.)
Contoh dijalankan:
sumber
while/../
?sed
versinya ... Terima kasih, @primo.1while s/\+oe...
,. Saya juga cukup yakin[+*]
bisa diganti dengan\W
.gema
Membuatku gila ...)Retina , 29 byte
Untuk versi file satu nyaman
-s
bendera digunakan.Kami bertukar ekspresi aneh (
*oo
,+oe
,+eo
) untuko
sampai kita bisa, maka menukar ekspresi simbol huruf-huruf yang tersisa untuke
. Kami ulangi ini sampai kami bisa dan huruf terakhir adalah hasil kami.(Solusi ini mirip dengan jawaban Perl manatwork .)
Cobalah online! (oleh Dennis)
sumber
Python 2, 90
The
iter
Fungsi adalah cara yang baik untuk membuat string input ke dalam antrian FIFO yang ingat berapa banyak string telah diurai di panggilan darif
. Ini idempoten, jadi tidak ada salahnya untuk menyebutnya lagi ketika input sudah menjadi iterator daripada string. Setengah dari jawaban yang dimulai denganor'oe'
... sepertinya itu memang golf, tapi aku tidak bisa menemukan apa pun.-1 terima kasih kepada Sp3000.
sumber
iter
sangat mengejutkan pikiran saya.eval
:def f(s,e=0,o=1):i=iter(s);a=next(i);return'eo'[eval(a*(a>'a')or f(i)+a+f(i))%2]
Mathematica,
9184 byteMencari cara untuk kompres ini ...
sumber
//.
lebih pendek dariFixedPoint
.Python 2, 80 byte
Ini dibangun di atas jawaban yang sangat cerdik dari feersum yang menggunakan a
iter
untuk mengimplementasikan operasi notasi Polandia. Gagasan baru adalah untuk digunakaneval
untuk mengevaluasi ekspresi+
dan*
denganeval(f(i)+a+f(i))
, di mana operatora
ditempatkan infiks antara hasil rekursif. Eval menggunakan bindinge=0,o=1
dalam argumen fungsi opsional. Output kemudian diambil mod 2.sumber
e+o
, jadi perlu variabel untuk merujuk ke angka.C, 79 byte
Rekursi langsung. Bergantung pada beberapa properti bitwise (kebetulan?) Dari empat karakter input yang diizinkan.
sumber
Utilitas Shell + GNU, 33
Masukan diambil dari STDIN.
Ini melakukan trik yang sama untuk membalikkan input dan mengevaluasi dengan kalkulator berbasis tumpukan - dalam hal ini
dc
. Kita bisa menggantie
dano
dengan0
dan1
, tetapi kemudian spasi perlu dimasukkan untuk mencegah penguraian angka yang serakah ke angka yang salah.Sebaliknya
e
diganti denganK
yang merupakandc
perintah untuk mendorong presisi saat ini ke tumpukan, yang secara default adalah 0. Dano
diganti denganO
yang merupakandc
perintah untuk mendorong basis keluaran saat ini ke tumpukan. Ini perlu aneh, jadi kita atur ke 15 denganFo
sebelum melakukan hal lain di dc.Maka itu hanya masalah mengambil mod 2 dan mencetak
2%p
. Satu-satunya nilai yang mungkin sekarang0
dan1
, jadi tidak masalah bahwa basis output adalah 15. Kemudiantr
diterjemahkan kembali keo
ataue
.Saya suka itu jika Anda memicingkan mata, sumber ini hampir seperti
dc Forever OK
.sumber
Serius , 24 byte
Manipulasi tumpukan yang lebih efisien mungkin bisa membuat ini lebih pendek, tapi meh, saya senang dengan itu.
Mengambil input sebagai string, misalnya
"+*oee"
Coba online (input harus dimasukkan secara manual)
Penjelasan:
sumber
Ruby, 61 byte
Menggunakan parsing keturunan rekursif dan aljabar boolean.
Fungsi membaca satu karakter dari stdin sekaligus. Jika berbunyi a
+
atau a*
, ia menyebut dirinya dua kali untuk menentukan ganjil atau genap. Fungsi kembalitrue
untuk ganjil danfalse
untukeven
. Operator^
XOR dan&
AND digunakan untuk menentukan "keanehan" dari penambahan dan ekspresi perkalian masing-masing.Berikut ini adalah versi yang tidak dikoleksi:
Terima kasih @Shel untuk menunjukkan bug di versi awal.
sumber
+ee
memberio
. Saya suka ide ituf^f
dengan!f^f
danf&f
denganf|f
dan berfungsi. Program untuk menjalankan test case: pastebin.com/ufXfd1vcf^f
danf&f
membalik$_==?e
dan?e:?o
sebaliknya :)Minkolang 0,14 , 40 byte
Saya mencoba melakukan metode eval yang cerdik, tetapi ternyata setiap nilai yang ditambahkan ke kotak kode di luar ruang asli tidak akan pernah tercapai oleh penghitung program. Jadi saya melakukan metode eval yang kurang pintar. : P
Coba di sini.
Penjelasan
sumber
JavaScript,
110 10694 byteTentu saja bukan solusi terkecil, tetapi kemungkinan solusi terkecil dalam bahasa verbal seperti JavaScript!
sumber
?:
.while(i.length>2)i=i.replace(/[+*][eo]{2}/,function(o){return"+oe+eo*oo".indexOf(o)>=0?"o":"e"})
. Atau jika Anda mengubah ke fungsi panah gemuk ECMAScript 6, makawhile(i.length>2)i=i.replace(/[+*][eo]{2}/,o=>"+oe+eo*oo".indexOf(o)>=0?"o":"e")
. Namun sayangnya persyaratan mengatakan program atau fungsi, sedangkan kode Anda saat ini adalah cuplikan. Ini harus menangani input dan output atau argumen dan mengembalikan nilai.i
seperti yang Anda katakan.O ,
24201918 byteMengambil input, membalikkannya, menetapkan
e
ke 2 dano
ke 1 danmempostingnya ke Tumblr untukmengevaluasinya sebagai kode O.Penjelasan:
sumber
GNU Sed, 36
Setelah posting saya melihat ini persis pendekatan yang sama seperti @ manatwork ini Perl jawaban dan @ randomra Retina jawaban . Jadi saya kira saya sebaiknya pergi jauh-jauh dan meminjamnya
\W\w\w
juga.Terima kasih kepada @Ruud karena mencukur 4 byte.
sumber
+
, Anda kehilangan 2 byte karena melarikan diri|
, tetapi hasil akhirnya adalah Anda memenangkan 1 byte untuk opsi menjatuhkan-r
.|
kebutuhan untuk melarikan diri ketika-r
tidak digunakan. Namun, 2 byte lagi dari skor - terima kasih!Haskell, 160 byte
Panggil
f
.sumber
JavaScript,
9271 byteIni agak dikaburkan, tapi saya ingin melakukan sesuatu menggunakan
eval
operator dan bitwise. Beranotasi:Pengulangan
(e[…]>"e")
sedikit mengganggu saya, tetapi berikut ini juga tidak lebih baik (103 byte):Jadi pada akhirnya, pendekatan @ Arkain dengan pencocokan substring sederhana adalah unggul. Dibuat menjadi fungsi, dengan beberapa optimisasi:
sumber
Dart, 173 byte
Ini tidak kompetitif, tetapi apa pun itu. Inti dari solusinya adalah, mulai dari 0, secara rekursif mengganti setiap operator dengan evaluasi pasangan karakter mengikuti operator itu dan kemudian menghapus karakter-karakter tersebut dari daftar.
sumber
Haskell, 231 byte
Berikut ini pendekatan menggunakan bahasa yang serius;)
Versi golf:
Contoh:
Versi tidak digabungkan dan cukup komprehensif:
Contoh:
Fitur: Pencocokan pola dan rekursi.
sumber
Jolf, 11 byte
(Noncompetitive, karena bahasa memposting pertanyaan.) Coba di sini!
(Ganti
\x12
dengan karakter sebenarnya\x12
. Ini harus dilakukan secara otomatis dalam juru bahasa.)Penjelasan:
sumber
Python 3,
171145135 byteTidak kompetitif, tetapi saya senang melakukannya, jadi saya tidak bisa menyimpannya sendiri. Tidak seperti entri Python rekursif-iterator (sangat pintar) oleh feersum , entri ini membalikkan input dan kemudian melakukan parsing berbasis tumpukan yang baik dari notasi Polandia terbalik.
sumber
callable()
elegan, tapi panjang. (Membalikkan kondisi dan menghapusnot
akan lebih pendek.) Periksa sebaliknya jika m adalah bilangan bulatm in[0,1]
akan lebih pendek, tetapi memeriksa apakah c adalah nilaic in'eo'
akan lebih pendek. Ini nantinya sama denganc>'a'
dalam kasus ini.for
:s+=[c>'e'if c>'a'else{'*':o.and_,'+':o.xor}[c](s.pop(),s.pop())]
s.pop()
(dua kali) setiap loop. Saya tidak repot-repot menguji sampai sekarang; tapi hei, intinya diperdebatkan sekarang.operator
modul?bool.__and__()
danbool.__xor__()
yang handier:s+=[c>'e'if c>'a'else getattr(s.pop(),{'*':'__and__','+':'__xor__'}[c])(s.pop())]
. Namun berdasarkan gnibbler 's ujung mengiris , yang dapat diubah menjadis+=[c>'e'if c>'a'else getattr(s.pop(),'__'+('axnodr'[c>'*'::2])+'__')(s.pop())]
.^
,&
) danoperator
rekanannya, lupa tentang metode yang benar-benar mengimplementasikannya. Oh, danreversed()
sekarang telah dibatalkan berkat tips golf Python lainnya .Haskell,
9894 byteMaaf mengganggu Anda dengan upaya Haskell yang lain; hanya ingin membuktikannya sangat mungkin dalam waktu kurang dari 100 byte.
Menentukan fungsi
p
yang menerima ekspresi apa pun yang valid sebagai parameter, dan mengembalikan hasilnya sebagai string dengan panjang 1.Contoh:
Fungsi ini bekerja dengan mengurangi berulang-ulang operator paling kanan dalam string sampai tidak ada operator yang tersisa.
sumber
Tambahkan ++ , 46 byte
Cobalah online!
Footer hanya menyebutkan semua input contoh dan output yang sesuai.
Bagaimana itu bekerja
Seperti kehilangan jawaban di sini, ini menggunakan penggantian dan evaluasi. Fungsi utama kami adalah
f
, dang
merupakan fungsi pembantu. Kami akan menggunakan"*e*o*e*oe"
(yange
) sebagai contoh.f
dimulai dengan mengambil string input dan membalikkannya, menghasilkan"eo*e*o*e*"
. Kami kemudian memetakang
setiap elemen:g
dimulai dengan menduplikasi argumen, untuk menyimpan salinan hingga perintah terakhir. Kami kemudian memeriksa apakah argumennya ada dalam string"oe"
, menghasilkan 1 untuk huruf dan 0 untuk*
atau+
. Kami kemudian mendorong argumen lagi dan memeriksa apakah itu sama dengan"e"
. Hasil ini kemudian ditambahkan ke cek sebelumnya. Ini menghasilkan 0 untuk salah satu*
atau+
, 1 untuko
dan 2 untuke
. Kami kemudian mengambil OR logis antara nilai ini dan argumen. Jika nilainya 0 , diganti dengan argumen (yaitu*
atau+
), jika tidak dibiarkan apa adanya (yaitu 1 dan 2 ).Ini mengubah semua huruf dalam kebalikan dari input menjadi nilai numerik. Kami kemudian menggabungkan setiap elemen dengan spasi, untuk memastikan angka tidak digabungkan. Sebagai contoh kita, ini menghasilkan string
"2 1 * 2 * 1 * 2 *"
. Kita kemudian dapat mengevaluasi ini, menggunakan notasi postfix Add ++, menghasilkan 8 . Kami kemudian mengambil paritas dari nilai ini, menghasilkan 0 untuk bilangan genap dan 1 untuk bilangan ganjil, sebelum mengindeks ke dalam string"eo"
dan mengembalikan huruf yang sesuai.sumber