Đưa ra thông báo dài, quá hạn, dài hạn về việc phát hành sắp tới của Rebol dưới dạng phần mềm nguồn mở , tôi quay lại phương ngữ thú cưng của mình để giải quyết vấn đề Bingo này . Tôi có thể sớm có thể phân phối Rebmu dưới dạng gói GPL thiếu niên của riêng mình. :)
Trong ký hiệu nhỏ gọn:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Các phương ngữ sử dụng một thủ thuật tôi gọi mushing đó được giải thích trên trang Rebmu . Đó là "hợp pháp" theo nghĩa là nó không lừa đảo trình phân tích cú pháp; đây là Rebol hợp lệ ... và thực sự có thể được xen kẽ tự do với mã thông thường cũng như (ahem) "dạng dài" Rebmu ... mà BTW sẽ có 141 ký tự:
[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!"]
(Cho rằng tôi khẳng định việc nén là một mẹo mà người ta có thể làm mà không cần sự trợ giúp của tự động hóa hoặc biên dịch, tôi thực sự phát triển mã ở dạng được nhúng. Nó không khó.)
Nó thực sự khá đơn giản, không có gì đặc biệt - Tôi chắc rằng các lập trình viên Rebol khác có thể loại bỏ mọi thứ. Một số nguồn nhận xét là trên GitHub , nhưng mẹo chính tôi sử dụng là xây dựng tất cả các giải pháp có thể trong một chuỗi dài ("danh sách", "mảng", những gì bạn có). Tôi xây dựng các giải pháp đường chéo trong vòng lặp đầu vào, vì phải mất năm lần chèn vào đầu và năm lần nối ở đuôi để tạo ra chúng ... và đã có một vòng lặp năm bước đang diễn ra.
Toàn bộ điều này dễ dàng ánh xạ tới mã Rebol và tôi chưa ném bất kỳ "thư viện ma trận" nào vào Rebmu với sự hoán vị hoặc các mánh lới quảng cáo khác dường như xuất hiện thường xuyên. Một ngày nào đó tôi sẽ làm điều đó nhưng bây giờ tôi chỉ đang cố gắng làm việc tương đối gần với phương tiện của chính Rebol. Những thứ có vẻ khó hiểu như:
[g: is g pc r a z is g a ap g pc a sb 6 z ap v '*]
... khá đơn giản:
[
; 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 '*
]
Lưu ý: Dấu ngoặc đơn được thêm ở trên cho rõ ràng. Nhưng các lập trình viên Rebol (như người nói tiếng Anh) thường tránh áp dụng các chú thích cấu trúc bổ sung để chỉ ra ngữ pháp trong giao tiếp ... thay vì lưu chúng cho các ứng dụng khác ...
Giống như một phần thưởng bổ sung để cho thấy điều này thực sự thú vị như thế nào, tôi sẽ đưa vào một số hỗn hợp mã thông thường để tổng hợp bảng. Các phong cách lập trình thực sự ... tương thích:
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!"
Đó là Rebmu hợp lệ là tốt, và nó sẽ cung cấp cho bạn một khoản tiền tốt đẹp trước khi chơi Bingo với bạn. Trong ví dụ đưa ra, nó nói Hey grandma, the board sum is 912. Điều này có lẽ đúng. Nhưng bạn sẽ có được điểm. :)
rowbằng một tên một char. Chưa được kiểm tra: thửi in'*'*5]và thay thế[x=='*']bằng[x==i].