Karena pengumuman yang lama, lama, dan lama ditunggu-tunggu tentang rilis Rebol yang akan datang sebagai perangkat lunak open source , saya kembali ke dialek peliharaan saya untuk menyelesaikan masalah Bingo ini . Saya mungkin akan segera dapat mendistribusikan Rebmu sebagai paket GPL kecilnya sendiri. :)
Rebmu 88 karakter
Dalam notasi kompak:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Dialek ini menggunakan trik yang saya sebut mushing yang dijelaskan di halaman Rebmu . Ini "sah" dalam arti bahwa itu tidak menipu pengurai; ini Rebol yang valid ... dan benar-benar dapat secara bebas berbaur dengan kode biasa serta (ahem) "long-form" Rebmu ... yang mana BTW akan terdiri dari 141 karakter:
[rt z 5 [g: is g pc r a z is g a ap g pc a sb 6 z ap v '*] l 5 [a: g l 5 [ap g f a sk+ a 5]] hd+ g u [ra g in- nt r m '* fis g v 5] p "BINGO!"]
(Mengingat bahwa saya mengklaim kompresi adalah trik yang dapat dilakukan tanpa bantuan otomatisasi atau kompilasi, saya benar-benar mengembangkan kode dalam bentuk bubur. Ini tidak sulit.)
Ini sebenarnya cukup sederhana, tidak ada yang istimewa - saya yakin programmer Rebol lainnya bisa mencukur habis. Beberapa sumber berkomentar ada di GitHub , tetapi trik utama yang saya gunakan adalah membangun semua solusi yang mungkin dalam seri panjang ("daftar", "array", apa-apa-apa). Saya membangun solusi diagonal selama loop input, karena dibutuhkan lima penyisipan di kepala dan lima menambahkan di ekor untuk membuat mereka ... dan sudah ada loop lima iterasi yang sedang berlangsung.
Semuanya mudah memetakan ke kode Rebol, dan saya belum melemparkan "perpustakaan matriks" ke Rebmu dengan transposisi atau tipuan lain yang sepertinya sering muncul. Suatu hari saya akan melakukan itu tetapi untuk saat ini saya hanya mencoba bekerja relatif dekat dengan media Rebol itu sendiri. Hal-hal yang tampak samar seperti:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... agak sederhana:
[
; assign the series pointer "g" to the result of inserting
; the z'th element picked out of reading in some series
; from input that was stored in "a"...this pokes an element
; for the forward diagonal near the front of g
g: insert g (pick (readin-mu a) z)
; insert the read-in series "a" from above into "g" as well,
; but *after* the forward diagonal elements we've added...
insert g a
; for the reverse diagonal, subtract z from 6 and pick that
; (one-based) element out of the input that was stored in "a"
; so an element for the reverse diagonal is at the tail
append g (pick a (subtract 6 z))
; so long as we are counting to 5 anyway, go ahead and add an
; asterisk to a series we will use called "v" to search for
; a fulfilled solution later
append v '*
]
Catatan: Tanda kurung ditambahkan di atas untuk kejelasan. Tetapi programmer Rebol (seperti penutur bahasa Inggris) umumnya menghindari penerapan info struktural tambahan untuk menunjukkan tata bahasa dalam komunikasi ... alih-alih menyimpannya untuk aplikasi lain ...
Sama seperti bonus tambahan untuk menunjukkan betapa menariknya ini sebenarnya, saya akan memberikan beberapa campuran kode normal untuk menjumlahkan papan. Gaya pemrograman sebenarnya ... kompatibel:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]
temp-series: g
sum: 0
loop 5 * 5 [
square: first temp-series
if integer! == type? square [
sum: sum + square
]
temp-series: next temp-series
]
print ["Hey grandma, the board sum is" sum]
l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Itu juga Rebmu yang valid, dan itu akan memberimu jumlah papan yang bagus sebelum bermain Bingo denganmu. Dalam contoh yang diberikan, katanya Hey grandma, the board sum is 912
. Yang mana mungkin benar. Tapi Anda mengerti maksudnya. :)
row
dengan nama satu karakter. Belum teruji: cobai in'*'*5]
dan ganti[x=='*']
dengan[x==i]
.APL (82)
{
...}¨⍳5
: lakukan 5 kali:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: baca baris (⍞
) dan petakan semua karakter yang bukan digit atau spasi0
, lalu evaluasi garis.B←↑
: ubah menjadi matriks (5x5 jika inputnya benar), dan simpan di B.{
...}0=B
: papan awal memiliki 1 di ruang kosong (0) dan 0 di ruang lain.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: jika garis, kolom, atau diagonal diisi:'BINGO!'
: lalu outputBINGO
∇⍵∨B=⍎1↓⎕←⍞
: jika tidak, baca baris (⍞
), gema itu (⎕←
), letakkan karakter pertama (1↓
), evaluasi untuk mendapatkan angka (⍎
), lihat di mana itu terjadi di papan tulis (B=
), tandai (⍵∨
), dan coba lagi (∇
) .sumber
K, 114
Diberi papan
b
dan panggilanc
.
sumber