Загрязненные квадраты


17

Вступление

Давайте рассмотрим следующий квадрат, состоящий только из цифр 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(левый нижний угол)?
Дрянная Монахиня

Ну, вы сказали, « самый большой незагрязненный квадрат »
Лики Монахиня

Допускается ли ошибка?
Утренняя монахиня

@KennyLau Вы имеете в виду на последнем тесте? Да, до тех пор, пока он не выдаст 0или что-то в этом роде.
Аднан

2
«Квадрат чисел» лучше обозначить как «квадрат цифр»
Мего

Ответы:


6

Желе , 19 16 байтов

Fœ^F}P
ḊṖZµ⁺⁸ßç?

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это устроено

ḊṖZµ⁺⁸ßç?  Main link. Argument: M (2D list)

Ḋ          Dequeue; remove the first row.
 Ṗ         Pop; remove the last row.
  Z        Zip; transpose rows with columns.
   µ       Combine the chain to the left into a link.
    ⁺      Copy the link, executing it twice.
           The copy removes the first and last column and restores the orientation.
       ç?  If the helper link returns a non-zero integer:
     ⁸       Return M unmodified.
      ß      Else, recursively call the main link on the "peeled" M.


Fœ^F}P     Helper link. Arguments: P ("peeled" M), M (unmodified)

F          Flatten P.
   F}      Flatten M.
 œ^        Perform multiset symmetric difference, removing the elements of P from
           the elements of M, respecting multiplicities, leaving precisely the
           elements of the outer shell.
     P     Return the product of the remaining elements.

8

JavaScript, 105 97 байт

Сохранено 8 байтов благодаря @Patrick Roberts!

l=a=>a.slice(1,-1)
p=a=>l(a).map(l)
c=a=>a.join``.replace(/[^0]/g,"")
s=a=>c(p(a))<c(a)?s(p(a)):a

Определяет функцию s, которая возвращает двумерный массив целых чисел, когда в качестве входных данных предоставляется двумерный массив целых чисел.

Как это устроено

  • Функция l: заданный массив a, возвращает копию без его первого и последнего индексов.

  • Функция p: для двумерного массива aвызывается lудаление первой и последней строки, затем для каждой оставшейся строки вызывается lудаление первого и последнего столбца. Это выполняет луковый пилинг.

  • Функция c: заданный 2D-массив a, возвращает строку, которая содержит только 0s в строковом виде a.

  • функция s: заданный 2D-массив a, вызывает cочищенную форму массива, заданного p, и сам массив. Сравнивает эти строки лексикографически, чтобы определить, имеет ли очищенная форма меньше 0s, чем оригинал. Если это так, то оригинал загрязнен, поэтому sрекурсивно вызывайте очищенную форму. В противном случае верните оригинал.


2
Вы можете удалить a.lengthиз endаргумента array.slicein lи сохранить 8 байтов. endразрешено быть отрицательным показателем.
Патрик Робертс

7

Сетчатка , 60- 57 байт

Число байтов предполагает кодировку ISO 8859-1. Конечный перевод строки является значительным.

+`(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)(^.+¶|¶.+$|.?\b.?)

Попробуйте онлайн!

объяснение

Из-за завершающего перевода строки он находит все совпадения регулярного выражения после `и удаляет их из входных данных. Из-за ведущего +это делается многократно, пока выход не перестанет изменяться (что будет, потому что регулярное выражение прекратит сопоставление).

Что касается самого регулярного выражения, оно состоит из двух частей:

(?<=(?=.*0|[^_]+(¶0|0¶|0.*$))^[^_]*)

Эта часть проверяет, есть ли где- 0нибудь во внешней оболочке. Это делается путем перемещения «курсора» движка regex в начало строки с помощью lookbehind (мы используем [^_]для сопоставления как цифры, так и перевод строки):

(?<=...^[^_]*)

И затем из этой позиции мы используем предварительный просмотр, чтобы найти 0либо в первой строке, рядом с переводом строки, либо в последней строке:

(?=.*0|[^_]+(¶0|0¶|0.*$))

Тогда фактическое совпадение будет состоять из первой строки (включая завершающий перевод строки), последней строки (включая перевод строки вперед) или из первого или последнего символа строки, где мы используем границу слова \bкак начало / конец строки якорь:

(^.+¶|¶.+$|.?\b.?)

6

MATL , 26 21 байт

t"t5LY)y5LZ)h?}6Lt3$)

Ввод в следующем формате

[1 0 3 4; 4 1 6 7; 8 4 1 4; 3 5 4 2]

Итак, остальные четыре контрольных случая

[1 2 3 4; 2 3 4 5; 3 4 5 6; 4 5 6 7]
[1 0 1; 0 1 0; 1 0 1]
[1 2 3; 2 0 4; 3 4 6]
[0 0 0; 0 0 0; 0 0 0]

Программа в последнем тесте выдает ошибки, но выдает правильный вывод (что ничего). Спасибо @Dennis за внимание!

Попробуйте онлайн! , Или проверьте все контрольные примеры (включая код переноса).

объяснение

Это повторяет столько раз, сколько столбцов во входной матрице, что более чем достаточно. На каждой итерации оболочка удаляется или сохраняется в зависимости от ее значений.

t            % Take a matrix as input. Duplicate
"            % For each column (i.e. repeat that many times)
  t5LY)      %   Duplicate top of the stack. Extract first and last rows
  y5LZ)      %   Duplicate the element below the top. Extract first and last columns
  h          %   Concatenate the two arrays into a row vector
  ?          %   If all its entries are non-zero: do nothing
  }          %   Else
    6Lt3$)   %     Get the central part
             % End if, end for. Implicitly display

5

Pyth, 19 байт

.W}\0.-`H`JutCPG2HJ

Тестирование

.W}\0.-`H`JutCPG2HJ
.W                     While the first function returns true, apply the second
                       function, starting with the input.
           u    2H     Apply the following twice to the input:
              PG       Remove the last row
             C         Transpose
            t          Remove the first row
                       This removes the outermost shell.
          J            Save it to J
         `             Stringify the matrix
       `H              Stringify the input
     .-                Multiset difference
  }\0                  Check if there is a '0' in the resulting string.
                  J    If that succeeds, update the current value to J.
                       When it fails, return the current value.

4

JavaScript (ES6), 74 байта

f=s=>/^.*0|0\n|\n0|0.*$/.test(s)?f(s.replace(/^.*\n?|.(.*).|\n.*$/g,"$1")):s

Принимает ввод в виде строки с символами новой строки, разделяющими каждую строку (но без начального или конечного символа новой строки). Объяснение: /^.*0|0\n|\n0|0.*$/это регулярное выражение, которое соответствует загрязненным квадратам, в то время как /^.*\n?|.(.*).|\n.*$/соответствует тем частям квадрата, которые необходимо удалить, за исключением того, (.*)который необходимо сохранить. (Это короче, чем смотреть вперед или назад для символа новой строки.)


4

Perl 5, 63 + 3 = 66 байт

$_=<>;s/\A.*\n?|^.|.$|\n.*\Z//mg while/\A.*0|0$|^0|0.*\Z/;print

Требуется -0флаг. Ввод не должен содержать завершающий символ новой строки.


3

Пайк, 29 байт

"D3lt%sBR,"2*ER3*I
/)tOmtmOr;

Попробуй это здесь!

Также 29 байтов

QeQhQmhQme]4sBI
/)QtOmtmO=Qr;

Попробуй это здесь!


2
Я получаю ошибки в обеих ссылках. Нужно ли что-то делать, прежде чем нажимать «запустить»!
Луис Мендо

Я, наверное, должен был упомянуть, что всегда будет ошибка при запуске. Вывод находится где-то во второй строке (на самом деле он напечатан и не является частью сообщения об ошибке)
Blue

2

Pyth , 31 30 байт

L+hbeb.W!*F+1iRTs+yHyMHPtmPtdZ

Тестирование. (Последние ошибки тестового примера)

Улучшение: сделал часть экстрактора внешнего цикла функцией ( L+hbeb).

Предыдущая 31-байтовая версия:

.W!*F+1iRTs++hHm+hdedHeHPtmPtdZ

Как это устроено:

Код в основном: пока продукт внешней оболочки равен нулю, очистите его.

Давайте проанализируем основной код (здесь Q подразумевается):

.W<lambda:H><lambda:Z>Q

Начните с Q(ввода), whileпервой лямбды, выполните вторую лямбду.

Первая часть будет лямбда в H:

!*F+1iRTs++hHm+hdedHeH

Вторая часть будет лямбда в Z:

PtmPtdZ

Первая часть

!*F+1iRTs++hHm+hdedHeH

Давайте проанализируем это:

s++hHm+hdedHeH

s++             Concatenate:
   hH              1. the first row
     m+hdedH       2. the first and last item of each row
            eH     3. the last row

Так как Pyth использует префиксную нотацию , это будет оценено:

!*F+1iRT

     iRT  Convert each to integer
 *F+1     Product
!         Negate. If any element of the outer shell is zero, this would return 1.

Вторая часть

PtmPtdZ
  mPtdZ   the inner of each row
Pt        the inner rows

2

Mathematica, 78 байт

NestWhile[#[[a=2;;-2,a]]&,#,Count[{#[[b={1,-1}]],#[[;;,b]]},0,3]>0&]~Check~{}&

Анонимная функция, принимает входные данные в виде матрицы. Игнорируйте любые ошибки, которые могут возникнуть во время выполнения.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.