Забруднені квадрати


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(лівий нижній кут)?
— Лина монашка

Ну, ви сказали, " найбільший незабруднений майдан "
— Leaky Nun

Чи допускається помилка?
— Лина монашка

@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, яка повертає 2D масив цілих чисел, коли надається 2D масив цілих чисел як вхід.

Як це працює

  • функція l: заданий масив a, повертає копію без її першого та останнього індексів.

  • функція p: заданий 2D масив a, виклики lдля видалення першого та останнього рядка, потім для кожного виклику, що залишився, lдля видалення кулака та останнього стовпця. Це виконує лущення цибулі.

  • функція c: заданий 2D-масив a, повертає рядок, який містить лише 0s у строкованій формі a.

  • функція s: заданий 2D масив a, викликає cочищену форму масиву, задану p, і на сам масив. Порівнює ці рядки лексикографічно, щоб визначити, чи має очищена форма менше 0s, ніж вихідна. Якщо так, то оригінал забруднений, тому дзвоніть sрекурсивно на очищену форму. В іншому випадку поверніть оригінал.


2
Ви можете видалити a.lengthз endаргументу array.sliceв lі зберегти 8 байт. endможе бути від'ємним показником.
— Патрік Робертс

7

Сітківка , 60 57 байт

Кількість байтів передбачає кодування ISO 8859-1. Подача підводного каналу є значною.

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

Спробуйте в Інтернеті!

Пояснення

Завдяки підключеній лінії передачі, це знаходить усі збіги регулярних виразів після `та видаляє їх із вхідних даних. Завдяки ведучому +це робиться неодноразово, поки вихід не перестане змінюватися (це буде тому, що регулярний вимір припинить збігатися).

Що стосується самого регулярного виразу, він складається з двох частин:

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

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

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

А потім із цієї позиції ми використовуємо підказку, щоб знайти 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
Я отримую помилки в обох посиланнях. Чи потрібно нам щось робити, перш ніж натискати «запустити»!
— Луїс Мендо

Я, мабуть, повинен був сказати, що завжди буде помилка при запуску. Вихід знаходиться десь на другому рядку (він фактично надрукований і не є частиною повідомлення про помилку)
— Синій

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

Математика, 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.