Ваша цель - проверить, действительна ли заполненная доска Сапер . Это означает, что каждое число является правильным количеством мин в соседних с ним клетках, включая диагонали. Доска не оборачивается.
Как обычно , вы должны дать функцию или программу, и самый короткий код в байтах побеждает.
Смотрите также прошлые проблемы, чтобы создать , решить и полностью внедрить Сапер.
Входные данные:
Одна строка , как это: 02X2 13X2 X211
.
Ряды доски тральщика разделены пробелами. Итак, вышесказанное представляет плату 3х4:
02X2
13X2
X211
Каждая ячейка представляет собой символ:
X
для шахты, или номер0
через8
.Все строки имеют одинаковую длину.
Есть как минимум 3 строки и 3 столбца.
Ввод не начинается и не заканчивается пробелом, но вы можете добавить новую строку в конце, если хотите.
Выход:
Последовательная Истина на правильных досках и постоянное значение Фалси на неправильных досках. Согласованный означает, что все выходы Truthy одинаковы и все выходы Falsey одинаковы.
Контрольные примеры
Каждая строка - это отдельный контрольный пример.
True
:
02X2 13X2 X211
XXXX XXXX XXXX XXXX
XX4X2 5X6X4 XX6XX 4XX54 2X4XX
False
:
02X2 13X2 X212
XXXX XXXX X7XX XXXX
XX5X2 5X6X4 XX6XX 4XX54 2X5XX
источник
Ответы:
Python 2,
132 129128Я использовал
enumerate
в гольфе ... и даже использовал вrange
другом месте в той же программе. Очевидно, что-то здесь не так.Редактировать: перебирать,
dict(enumerate(s))
а неenumerate(s)
, поэтомуenumerate
не нужно вызывать дважды.источник
~
! И из словарей для правильной индексации.~
операторе иронически заставил меня заметить, что я использовал его дважды безо всякой причины, хотя использование его только один раз, очевидно, могло бы выполнить то же самое. Я думал, что словарная часть была забавной, спасибо.Пиф, 43
Попробуй это здесь .
Объяснение:
Jhxzd
: Это расположение первого пробела на входе + 1. (z
на входеd
это пробел.) Это разделение на входе между вертикально смежными ячейками на плате.!f
: Это логическое not (!
) для filter (f
), которое будетTrue
тогда и только тогда, когда выражение ложно для каждого элемента последовательности.-@zT
: Возьмите символ в местоположенииT
(лямбда-переменную) из входных данных и удалите все появления: (Это будет правдой, если символ не удален, и ложным, если это так.+" X"
: Удалить пробел, X и`
Репрsm
: сумма карты в/ \X
: количество "X" в:+*JNz
: Часть ввода с префиксомJ
фиктивных символовtd+d2
: От д-1 до д + 2.m+T*kJU3
: Для d в [T, T + J, T + 2 * J].Uz
Для Т вrange(len(input))
.источник
APL (NARS2000) (74)
Также работает в Dyalog APL, если
⎕ML
установлено3
.Объяснение:
⊃⍵⊂⍨⍵≠' '
: Трещина⍵
пробелы и использовать списки для формирования матрицы.G←¯1+⎕D⍳
: найдите индекс⎕D
для каждого значения, вычтите 1 и сохраните вG
. (⎕D
содержит цифры, любая не цифра превратится в10
).Z←G↑⍨2+⍴G
: добавить две строки и столбцы нулей на краю матрицы, чтобы справиться с циклом{
...}¨⍳⍴Z
: для каждой позиции вZ
, найдите количество бомб в окрестности Мура этой позиции:G∘.⊖(G←2-⍳3)∘.⌽⊂Z
: поворотZ
влево, вправо, вверх, вниз, влево-вверх, вправо-вверх, влево-вниз и вправо-вниз.⍵∘⌷¨
: для каждого из них найдите элемент⍵
в каждой из этих повернутых матриц+/∊9<
: посчитать, сколько элементов больше 9 (это количество бомб).(⍴G)↑
: снова удалить добавленные нули,G=
: проверить,G
равен ли каждый элемент количеству бомб, окружающих эту позицию (это должно быть верно для всех квадратов, не являющихся бомбами),(G>9)∨
: и проверьте, выше ли элементы в (G
чем9
это бомбы).~0∊
: вернуть,1
если полученная матрица не содержит нулей (= все квадраты либо бомбы, либо правильное число), и0
если это так.источник
C #,
321 320305Первая попытка игры в гольф, и я знаю, что C # не идеальный язык.
Я надеюсь, что написание метода экземпляра разрешено, в противном случае добавьте еще 7 символов для
static
.Разнесены:
Использование Linq экономит место по сравнению с циклами for, но его сложнее отлаживать.
Я выучил несколько вещей, таких как преобразование
char => int
путем вычитания'0'
.Казалось, проще заполнить доску пробелами, поэтому итерации по ней будут проще.
источник
-'0'
на-48
. Работает для меня и сохраняет несколько байтов для различных 'X' и ''Python 2, 121
Это сильно вдохновлено ответом Feersum . Порядок дня излишний: вместо того, чтобы проверять наличие мин в 9 соседних ячейках, проверяйте каждую отдельную ячейку, чтобы узнать, является ли она соседней.
Мы проверяем, являются ли две ячейки соседями
2>r>-2<c<2
, гдеr
и гдеc
различия в строках и столбцах ячеек эквивалентны{r,c}<{-1,0,1}
. Эти координаты вычисляются из индексов ячеекI
иi
какc=I%n-i%n
иr=I/n-i/n
. Более эффективно индексировать непосредственно в строку и извлекать строки и столбцы, чем преобразовывать его в 2D-объект, такой как список списков. Проверка шахтыB[i]>'W'
здесь эквивалентнаB[i]=='X'
.Использование
enumerate
спасло бы два символа над уродливым,range(len(B))
за исключением того, что оно возвращает объект итератора, который не поддерживает два вложенных цикла через него.источник
~B.find
./
и негативы, потому что они округляют и негативы.Python 2, 140
источник
JavaScript (ES6),
135133125122Обеспечить ввод функции в виде строки:
Для объяснения см. Старую версию ниже. Новая версия заменяет
for
циклыevery
вызовами и использует переменнуюe="every"
для выполненияsomeArray[e](...)
вместоsomeArray.every(...)
.Кроме того, счетчик
k
теперь индексируется1
так, чтобыk+=...
выражение всегда было верным, чтобыevery
цикл продолжался. Мы убираем это лишнее1
, вычитаяtrue
результат (который численно приводится1
), возвращаемыйevery
операцией[-1,0,k=1][e](...)
.Старая версия:
Код с пробелами и комментариями:
Метод
every
массива JavaScript принимает обратный вызов и применяет обратный вызов ко всем элементам массива. Если какой-либо обратный вызов возвращает ложное значение,every
вызов возвращаетсяfalse
.Логические значения в JS приводятся к 1 или 0, когда являются частью дополнения. Для каждого окружающего пространства мы «добавляем» логический результат сравнения его значения
X
и затем добавляем это значение к счетчикуk
в выраженииk += (... == "X")
. Следовательно,k
содержит счетчик числа окружающихX
s, потому чтоtrue
считается как1
иfalse
считается как0
.источник
c=="X"
попытаться!c/1
, это сэкономит вам огромное количество байт! Если не получится, попробуйте!!c/1
. Аргументация в том'X'/1 => NaN
, что иNaN
фальсификация. Вы проверяете, еслиc=='X'
, почему бы не попробовать проверить, если это не такfalse
?(!c)/1
, к сожалению, не помогает; Мне нужно иметь круглые скобки для!(c/1)
, что стоит 2. Кроме того,0/1
это ложь, поэтому неверный ввод "0X
" будет иметь неправильный результатtrue
. Лучшее, что я могу сделать, все еще уважая нули, - это объединить два условия в отрицательную фразу, например!(+c+1&&k-c)
, но это такой же длины, как у меня уже есть.!(k-1-c)
проверяет оба условия, потому что, еслиk
совпаденияc
(минус 1 смещение), то отрицание делает0
истинным, а еслиc
не число, мы получаемNaN
и отрицание такжеtrue
.CJam,
70 6563 байтаЭто может быть много в гольфе.
Дает
1
действительную доску и0
недействительную доску.Контрольные примеры
вход
Выход
Попробуйте онлайн здесь
источник
JavaScript (ES6) 98
Использование некоторых для применения функции к каждому символу строки.
Функция возвращает
Внутренняя проверка выполняется с использованием карты только потому, что она короче, чем forEach
некоторые возвращают true при первом значении truey (в данном случае, ненулевом), что означает неудачную проверку. Результат сводится на нет, чтобы дать более узнаваемую истину / ложь.
Тест в консоли FireFox / FireBug
Выход
источник
R 156 символов
С отступами, пробелами и переносами строк для удобочитаемости:
Примеры:
источник