Сапер - популярная игра-головоломка, в которой вы должны выяснить, какие плитки являются «минами», не нажимая на эти плитки. Каждая ячейка является либо шахтой (представленной *
), либо подсказкой, то есть числом от 0 до 8, представляющим, сколько из 8 соседних плиток является минами. Ваша задача сегодня - взять доску с минами и заполнить все подсказки. Например, посмотрите на следующую доску 5х4 с 5 минами:
*
* *
*
*
После заполнения подсказок доска будет выглядеть так:
2*211
*33*1
12*32
0112*
подробности
Вы должны написать либо полную программу, либо функцию, которая принимает сетку символов, содержащую только пробелы и звездочки, и выводит другую сетку, где каждый пробел заменяется количеством смежных мин (звездочек). Любой из этих форматов является приемлемым для ваших сеток:
Строка с переводом строки
2D список символов / односимвольные строки
Список строк
Вы можете предположить, что сетка будет по крайней мере 1x1, хотя возможно, что это будут все мины или все пространства.
Сетка ввода всегда будет заполнена соответствующим количеством пробелов. Как обычно, это код-гольф , поэтому применяются стандартные лазейки и выигрывает самый короткий ответ в байтах!
Образец ввода-вывода
Чтобы вы могли видеть пробелы, я покажу все примеры ввода-вывода с квадратными скобками.
Input:
[ * ]
[* ]
[ ]
[ ]
[ ** ]
[ * * ]
Output:
[1101*1]
[*10111]
[110000]
[012210]
[12**21]
[1*33*1]
Input:
[****]
[****]
Output:
[****]
[****]
Input:
[ ]
[ ]
[ ]
[ ]
Output:
[000]
[000]
[000]
[000]
Input:
[* ]
[** ]
[ ]
[ *]
Ouput:
[*310]
[**10]
[2221]
[001*]
Input:
[** ]
[* *]
[ * ]
[ ]
[* ]
[**** ]
Output:
[**1011]
[*4211*]
[12*111]
[121100]
[*43210]
[****10]
Input:
[ * ]
[ * ]
[ * ]
[** *** ]
[ *** ]
[ ]
[ ** ]
[ * * ]
[* ** ]
[ ** ]
Output:
[00001*1111]
[00002221*1]
[22102*4321]
[**102***31]
[221013***1]
[0000013542]
[0112111**1]
[12*2*12442]
[*212112**2]
[1100002**2]
источник
Ответы:
MATL ,
1817 байтСпасибо @ mbomb007 за исправление на входе теста 6
Ввод представляет собой двумерный массив символов в формате
Попробуйте онлайн!
Контрольные примеры: 1 , 2 , 3 , 4 , 5 , 6 .
объяснение
источник
JavaScript (ES6),
11496 байтРедактировать: Сохранено 18 байт благодаря идее @ETHproductions.
источник
a=>a.map((s,i)=>s.replace(/ /g,(_,j)=>a.slice(i-!!i,i+2).reduce((t,s)=>t+(q=i=>s[i+j]>' ')(-1)+q(0)+q(1),0)))
R,
127112 байтспасибо @gtwebb и @ sebastian-c за улучшения.
Известные моменты:
Матрицы являются векторами в R. Вам не нужно двумерное индексирование, чтобы получить элементы.
seq(M)
вернет последовательность той же "длины" (строки х столбцы), что иM
.Вы не можете смешивать положительные и отрицательные индексы извлечения в R.
M[-3]
Это законный код R, но не то, что нужно.Ввод в виде матрицы R. Некоторые примеры:
источник
T
вместоTRUE
. Мне удалось снять несколько скобок с одной из функций if:f=function(M){a=nrow(M);b=ncol(M);for(i in seq(M))if(M[i]!="*")M[i]=sum(M[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)]=="*",na.rm=T);M}
b=ncol(M)
а затем не используете это, чтобы вы могли избавиться от этого.M->{a=nrow(M);p=M=='*';M[]=ifelse(p,'*',sapply(seq(M),i->sum(p[pmax(i+c(-1,1,-a+-1:1,a+-1:1),0)],na.rm=T)))}
- однако, это немного обманывает, потому что требуется переопределенная<-
лямбда, см. Klmr / functions / lambdaJava, 190 байт
Редактировать:
Snipet
Ungolfed:
Идео это.
источник
x,y,i,j
c[i][j]==32
и так далее, и просто изменил их в части Ungolfed0000*1\n*10011\n110000\n000000\n00**10\n0*22*1
. Не могли бы вы добавить тестовую ссылку на ideone.com? РЕДАКТИРОВАТЬ: Кроме того, если я не делаю что-то не так, ваш вывод кода в гольф:ssss0s\n0sssss\nssssss\nssssss\nss00ss\ns0ss0s
для первого теста (он заменил все*
на нули ..): SJavaScript (ES6), 107
Ввод / вывод в виде массива строк
обратите внимание, что когда функция s вызывается с элементом списка l вне границ, параметр
a
имеетundefined
иc+a
будет результатом" undefined"
благодаря необычным правилам преобразования javascriptБолее читаемый
источник
Python 2, 138 байт
Определяет функцию,
f
которая принимает входную строку каки печатает строку в STDOUT:
источник
enumerate(s,2)
), и заменить все вхожденияi + 2
сi
иi - 1
сi - 3
. Это сбрит пару байтов.JavaScript (ES6)
186182177161152 байтаОбновить
Код выше для
" *"
возврата"2*"
. Это исправлено в следующем скрипте.168167 байтПопробуй это здесь.
источник
t+=(a[x+i%3-1]||[])[y+i/3-1|0]==k
должен работать аналогичным образом и сохранить васtry
/catch
часть.(a[x+i%3-1]||1)[y+i/3-1|0]
.Haskell, 115 байт
Определяет функцию
f
в списках строкисточник
Python 2, 192 байта
-3 байта благодаря Copper, -10 байт, если разрешено изменение входной сетки, еще -11 байт для избавления
continue
и еще -12 байт для исключения переменной счетчикаИспользует список из списка символов
L
и создает дополненную версиюK
, поэтому без проблем на границах. ОтступИспользование:
источник
if'*'==L[y][x]:
чтобы сохранить байт.r=range;
на той же строкеn,S,s
, вы можете сохранить пять символов, заменив вызовыrange(...)
сr(...)
.ange
около того 8 байт, но я должен добавить,r
и,range
который также 8 байт , поэтому ничего не заработал.range
.Руби, 112
Принимает и возвращает строку. Строка должна быть разделена символом новой строки и завершена символом новой строки.
в тестовой программе
источник
TSQL
292291 байтGolfed:
Ungolfed:
скрипка
источник
;
в начале вашего кода? Кажется, ты это посчитал.Ракетка 415 байт
Ungolfed:
Тестирование (выводится как одна строка с указанным номером столбца; также будет работать с пробелами):
Выход:
источник
PHP,
145133132127 байтпринимает входные данные как одну строку, разделенную новой строкой. Беги с
-r
.сломать
источник
"!">$n=$s[$p]
вместо того, чтобы" "==$n=$s[$p]
сохранить один байтTurtlèd , 99 байт
(упс, я постоянно забываю ссылку: |)
Принимает входные данные с скобками вокруг каждой строки
Turtlèd не может принимать многострочный ввод, поэтому после последней строки запишите
|
в конец сигнала вводОбратите внимание, что несовпадающие скобки вызваны тем, что открытые скобки анализируют следующий символ как часть команды скобок
Попробуйте онлайн!
Как это работает (общее описание):
До тех пор,
|
пока он не введен, он записывает ввод в каждой строке с помощью скобок, чтобы помочь ему распознать конец каждой строки. После того, как это произошло, он возвращается к началу ввода. Он проходит через каждый символ ввода. Если это пространство, оно осматривает пространство, добавляя один к счетчику для каждой найденной бомбы. после каждой строки удаляет скобки. Когда он доходит до последней строки, с | в нем он останавливается и удаляет |. Сетка неявно печатается.источник
C
152150147145 байтовВвод осуществляется в виде двумерного массива символов, за которым следуют номера строк и столбцов. Результат будет возвращен на место.
(В основном) Унгольфед:
Подход прост: зацикливайтесь на каждой позиции, зацикливайтесь на соседях и складывайте все звездочки. Есть два трюка на битовом уровне:
Когда мы решаем, является ли ячейка звездочкой или нет, мы можем просто проверить, установлен ли бит восьмого места, потому что число в ячейке должно быть меньше 8 (максимальное значение ячейки).
Мы можем превратить символ пробела в нулевой символ, используя ИЛИ-16.
Редактировать: Гольф от двух байтов, используя
/
вместо>=
.Изменить: еще пять байтов, изменив направление петель.
источник
C #, 341 байт
Наивная реализация, которая определенно может быть сокращена.
источник
Python 2, 183 байта
источник