Враховуючи довге, довге і тривале прострочення оголошення про майбутній реліз Rebol як програмного забезпечення з відкритим кодом , я повернувся до свого діалекту для домашніх тварин, щоб вирішити цю проблему Бінго . Я скоро зможу розповсюдити Rebmu як власний, підлітковий пакет GPL. :)
Ребму 88 символів
У компактних позначеннях:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
Діалект використовує трюк, який я називаю mushing, який пояснюється на сторінці Rebmu . Це "законно" в тому сенсі, що він не обманює аналізатор; це дійсно Rebol ... і насправді його можна вільно змішати зі звичайним кодом, а також (ах) "довгою формою" 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, і я ще не кинув жодної "матричної бібліотеки" в Rebmu за допомогою транспозиції чи інших трюків, які, здається, з’являються часто. Колись я це зроблю, але поки що я просто намагаюся працювати відносно близько до середовища самого Ребола. Криптично виглядають такі речі, як:
[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!"
Це також дійсний Ребму, і він дасть вам гарну суму на дошці, перш ніж грати з Бінго з вами. У наведеному прикладі йдеться Hey grandma, the board sum is 912. Що, мабуть, правильно. Але ви розумієте. :)
rowім'ям, яке має один знак. Не перевірено: спробуйтеi in'*'*5]замінити[x=='*']на[x==i].