Вступление
Давайте рассмотрим следующий квадрат, состоящий только из цифр 0 - 9
:
1034
4167
8414
3542
Внешняя оболочка этого квадрата:
1034
4 7
8 4
3542
Он содержит нули, поэтому нам нужно очистить внешнюю оболочку, оставив:
16
41
Внешняя оболочка этого квадрата:
16
41
Он не содержит нулей и поэтому является незагрязненным квадратом. Таким образом , в основном, определение из незараженного квадрата , когда внешняя оболочка квадрата не содержит ни одного нуля.
Задание
Учитывая квадрат цифр (содержащий только неотрицательные целые числа) в любом приемлемом формате, выведите наибольший незагрязненный квадрат , постоянно снимая внешнюю оболочку в любом приемлемом формате.
Контрольные примеры
Тестовый пример 1:
Input Output
1234 1234
2345 2345
3456 3456
4567 4567
Контрольный пример 2:
Input Output
123 123
204 204
346 346
Тестовый пример 3:
Input Output
101 1
010
101
Контрольный пример 4:
Input Output
000 (none)
000
000
Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
416\n841\n354\n
(левый нижний угол)?0
или что-то в этом роде.Ответы:
Желе ,
1916 байтовПопробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
JavaScript,
10597 байтСохранено 8 байтов благодаря @Patrick Roberts!
Определяет функцию
s
, которая возвращает двумерный массив целых чисел, когда в качестве входных данных предоставляется двумерный массив целых чисел.Как это устроено
Функция
l
: заданный массивa
, возвращает копию без его первого и последнего индексов.Функция
p
: для двумерного массиваa
вызываетсяl
удаление первой и последней строки, затем для каждой оставшейся строки вызываетсяl
удаление первого и последнего столбца. Это выполняет луковый пилинг.Функция
c
: заданный 2D-массивa
, возвращает строку, которая содержит только0
s в строковом видеa
.функция
s
: заданный 2D-массивa
, вызываетc
очищенную форму массива, заданногоp
, и сам массив. Сравнивает эти строки лексикографически, чтобы определить, имеет ли очищенная форма меньше0
s, чем оригинал. Если это так, то оригинал загрязнен, поэтомуs
рекурсивно вызывайте очищенную форму. В противном случае верните оригинал.источник
a.length
изend
аргументаarray.slice
inl
и сохранить 8 байтов.end
разрешено быть отрицательным показателем.Сетчатка ,
60-57 байтЧисло байтов предполагает кодировку ISO 8859-1. Конечный перевод строки является значительным.
Попробуйте онлайн!
объяснение
Из-за завершающего перевода строки он находит все совпадения регулярного выражения после
`
и удаляет их из входных данных. Из-за ведущего+
это делается многократно, пока выход не перестанет изменяться (что будет, потому что регулярное выражение прекратит сопоставление).Что касается самого регулярного выражения, оно состоит из двух частей:
Эта часть проверяет, есть ли где-
0
нибудь во внешней оболочке. Это делается путем перемещения «курсора» движка regex в начало строки с помощью lookbehind (мы используем[^_]
для сопоставления как цифры, так и перевод строки):И затем из этой позиции мы используем предварительный просмотр, чтобы найти
0
либо в первой строке, рядом с переводом строки, либо в последней строке:Тогда фактическое совпадение будет состоять из первой строки (включая завершающий перевод строки), последней строки (включая перевод строки вперед) или из первого или последнего символа строки, где мы используем границу слова
\b
как начало / конец строки якорь:источник
MATL ,
2621 байтВвод в следующем формате
Итак, остальные четыре контрольных случая
Программа в последнем тесте выдает ошибки, но выдает правильный вывод (что ничего). Спасибо @Dennis за внимание!
Попробуйте онлайн! , Или проверьте все контрольные примеры (включая код переноса).
объяснение
Это повторяет столько раз, сколько столбцов во входной матрице, что более чем достаточно. На каждой итерации оболочка удаляется или сохраняется в зависимости от ее значений.
источник
Pyth, 19 байт
Тестирование
источник
JavaScript (ES6), 74 байта
Принимает ввод в виде строки с символами новой строки, разделяющими каждую строку (но без начального или конечного символа новой строки). Объяснение:
/^.*0|0\n|\n0|0.*$/
это регулярное выражение, которое соответствует загрязненным квадратам, в то время как/^.*\n?|.(.*).|\n.*$/
соответствует тем частям квадрата, которые необходимо удалить, за исключением того,(.*)
который необходимо сохранить. (Это короче, чем смотреть вперед или назад для символа новой строки.)источник
Perl 5, 63 + 3 = 66 байт
Требуется
-0
флаг. Ввод не должен содержать завершающий символ новой строки.источник
Пайк, 29 байт
Попробуй это здесь!
Также 29 байтов
Попробуй это здесь!
источник
Pyth ,
3130 байтТестирование. (Последние ошибки тестового примера)
Улучшение: сделал часть экстрактора внешнего цикла функцией (
L+hbeb
).Предыдущая 31-байтовая версия:
Как это устроено:
Код в основном: пока продукт внешней оболочки равен нулю, очистите его.
Давайте проанализируем основной код (здесь Q подразумевается):
Начните с
Q
(ввода),while
первой лямбды, выполните вторую лямбду.Первая часть будет лямбда в
H
:Вторая часть будет лямбда в
Z
:Первая часть
Давайте проанализируем это:
Так как Pyth использует префиксную нотацию , это будет оценено:
Вторая часть
источник
Mathematica, 78 байт
Анонимная функция, принимает входные данные в виде матрицы. Игнорируйте любые ошибки, которые могут возникнуть во время выполнения.
источник