จากการประกาศใช้เวลานานนานและยาวนานของการปล่อย Rebol ของซอฟต์แวร์โอเพนซอร์ซฉันจึงกลับไปใช้ภาษาสัตว์เลี้ยงของฉันเพื่อแก้ไขปัญหาบิงโกนี้ อีกไม่นานฉันอาจแจกจ่าย Rebmu เป็นแพ็คเกจ GPL ที่เป็นของตัวเองได้ :)
Rebmu 88 ตัวอักษร
ในสัญลักษณ์ขนาดกะทัดรัด:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
ภาษาที่ใช้เป็นเคล็ดลับที่ฉันโทรmushingซึ่งจะมีการอธิบายในหน้า Rebmu มัน "ถูกต้อง" ในแง่ที่ว่ามันไม่ได้โกง parser นี่เป็น Rebol ที่ถูกต้อง ... และจริง ๆ แล้วสามารถผสมกับรหัสปกติได้อย่างอิสระรวมทั้ง (ahem) "Rebmu" แบบยาว "... ซึ่ง BTW จะเป็น 141 ตัวอักษร:
[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!"]
(เนื่องจากฉันอ้างว่าการบีบอัดเป็นเคล็ดลับที่เราสามารถทำได้โดยไม่ต้องอาศัยความช่วยเหลือของระบบอัตโนมัติหรือการคอมไพล์ฉันจึงพัฒนารหัสในรูปแบบที่หยาบมันไม่ใช่เรื่องยาก)
จริงๆแล้วมันค่อนข้างง่ายไม่มีอะไรพิเศษ - ฉันแน่ใจว่าโปรแกรมเมอร์ของ Rebol คนอื่น ๆ สามารถกำจัดสิ่งต่าง ๆ ออกไปได้ บาง แหล่งความเห็นอยู่บน GitHubแต่เคล็ดลับหลักที่ฉันใช้คือการสร้างโซลูชันที่เป็นไปได้ทั้งหมดในชุดยาว ("รายการ", "อาร์เรย์" สิ่งที่มีคุณ) ฉันสร้างวิธีแก้ปัญหาแนวทแยงในระหว่างลูปอินพุทเนื่องจากมันใช้เวลาห้าครั้งในการแทรกที่ส่วนหัวและอีกห้าส่วนท้ายที่จะทำให้พวกเขา ... และมีการวนรอบวนซ้ำห้าครั้ง
ทุกอย่างแมปไปยังรหัส Rebol อย่างง่ายดายและฉันยังไม่ได้โยน "matrix matrix" ใด ๆ ลงใน Rebmu ด้วยการเปลี่ยนตำแหน่งหรือลูกเล่นอื่น ๆ ที่ดูเหมือนจะเกิดขึ้นบ่อยครั้ง สักวันหนึ่งฉันจะทำอย่างนั้น แต่ตอนนี้ฉันแค่พยายามทำงานใกล้เคียงกับสื่อของ Rebol เอง สิ่งที่ดูเป็นความลับเช่น:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... ค่อนข้างง่าย:
[
; 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 '*
]
หมายเหตุ: วงเล็บถูกเพิ่มด้านบนเพื่อความชัดเจน แต่โปรแกรมเมอร์ของ Rebol (เช่นผู้พูดภาษาอังกฤษ) มักจะหลีกเลี่ยงการใช้คำบรรยายเสริมโครงสร้างเพื่อระบุไวยากรณ์ในการสื่อสาร ... แทนที่จะบันทึกไว้สำหรับแอปพลิเคชันอื่น ...
เช่นเดียวกับโบนัสเพิ่มเติมเพื่อแสดงให้เห็นว่าสิ่งนี้น่าสนใจจริง ๆ ฉันจะใส่รหัสปกติลงในผลรวมของกระดาน รูปแบบการเขียนโปรแกรมเป็นจริง ... เข้ากันได้:
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!"
นั่นคือ Rebmu ที่ถูกต้องเช่นกันและมันจะให้ผลรวมของบอร์ดที่ดีก่อนที่จะเล่นบิงโกกับคุณ Hey grandma, the board sum is 912ในตัวอย่างที่ได้รับก็กล่าวว่า ซึ่งน่าจะถูก แต่คุณได้รับจุด :)
rowด้วยชื่อองค์กร ยังไม่ทดลอง: ลองi in'*'*5]และแทนที่ด้วย[x=='*'][x==i]