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


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.