Учитывая долгое, долгое и долгожданное объявление о предстоящем выпуске Rebol в качестве программного обеспечения с открытым исходным кодом , я вернулся к своему любимому диалекту, чтобы решить эту проблему Bingo . Возможно, скоро я смогу распространять Rebmu как собственный пакет GPL для подростков. :)
Ребму 88 персонажей
В компактной записи:
rtZ5[GisGpcRaZisGaAPgPCaSB6zAPv'*]l5[AgL5[apGfAsk+A5]]hd+Gu[raGin-NTrM'*fisGv5]p"BINGO!"
В диалекте используется трюк, который я называю грибованием, который объясняется на странице Ребму . Это «законно» в том смысле, что не обманывает парсер; это действительно Rebol ... и фактически может свободно смешиваться с обычным кодом, а также (ahem) "long-form" Rebmu ... который, кстати, будет 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 никаких «матричных библиотек» с транспозицией или другими уловками, которые, кажется, часто появляются. Когда-нибудь я это сделаю, но сейчас я просто пытаюсь работать относительно близко к самому 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]
.APL (82)
{
...}¨⍳5
: сделать 5 раз:⍎(K,K)[⍞⍳⍨K←11↑⎕D]
: прочитать строку (⍞
) и отобразите все символы, которые не являются цифрами или пробелами0
, затем оцените строку.B←↑
: превратить его в матрицу (5x5, если введено правильно) и сохранить в B.{
...}0=B
: стартовая доска имеет 1 в свободном пространстве (0) и 0 в других пространствах.(D≡(⍵∨⌽⍵)∧D←=/¨⍳⍴⍵)∨∨/(∧⌿⍵)∨∧/⍵
: если линия, столбец или диагональ заполнены:'BINGO!'
: затем выводBINGO
∇⍵∨B=⍎1↓⎕←⍞
: в противном случае прочитайте строку (⍞
), выведите его (⎕←
), удалите первый символ (1↓
), оцените его, чтобы получить число (⍎
), посмотрите, где оно встречается на доске (B=
), отметьте его (⍵∨
) и попробуйте снова (∇
) ,источник
К, 114
Учитывая доску
b
и звонкиc
,
источник