Виділіть масив


35

Завдання

Цей виклик дуже простий. Ваш вхід - це прямокутний 2D масив цілих чисел, розміром принаймні 1 × 1. Його можна прийняти в будь-якому розумному форматі. Ваш висновок повинен бути вхідним масивом, але з усіма записами НЕ на першу або останній рядок або наборі стовпців в 0. Він повинен бути в тому ж форматі, що і вхідний.

Наприклад, якщо вхідний масив є

67  4 -8  5 13
 9 13 42  4 -7
 1  1  3 -9 29
16 99  8 77  0

то правильний вихід

67  4 -8  5 13
 9  0  0  0 -7
 1  0  0  0 29
16 99  8 77  0

Правила та оцінка

Ви можете написати повну програму або функцію, а функціям дозволяється змінювати вхід на місці замість повернення. Виграє найменший кількість байтів, а стандартні лазівки заборонені.

Тестові справи

Вони відформатовані у вигляді вкладених списків, щоб полегшити вставлення копій.

[[3]] -> [[3]]
[[7,2,8]] -> [[7,2,8]]
[[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
[[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
[[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
[[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
[[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]

Таблиця лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою. Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

## Language Name, N bytes

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

## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

## [><>](http://esolangs.org/wiki/Fish), 121 bytes

Відповіді:


13

MATL , 9 байт

0HJ_ht4$(

Введення у форматі

[67  4 -8  5 13;  9 13 42  4 -7;  1  1  3 -9 29; 16 99  8 77  0]

EDIT (12 червня 2016 р.): Щоб адаптуватись до змін у мові, посилання нижче _замінено наq .

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

0           % Push a 0: value that will be assigned into the array
HJ_h        % Vector [2, -1j]: this corresponds to index 2:end-1 for rows
t           % Duplicate: same index for columns
4$(         % Assignment indexing with 4 inputs: array, new value, row and col indices
            % Since the first input (array) to this function is currently missing, it's
            % implicitly taken at this point from stdin
            % Implicitly display stack contents, which is the modified array

2
Приємно! Я знав, що MATL буде працювати. : D
стакан

12

Java 7, як повністю названа функція: 85

void f(int[][]a){for(int i=0,j;++i<a.length-1;)for(j=1;j<a[i].length-1;)a[i][j++]=0;}

Ви можете запустити це в Java 8, щоб видалити кілька байт, але я насправді цього не роблю.


Не могли б ви заощадити місце за допомогою Arrays.fill(a[i],1,a[i].length-1,0);? Це всього 36 байт замість 37. =)
corsiKa

@corsiKa Було б добре, але мені доведеться імпортувати або повністю кваліфікувати це: /
Geobits

Щойно з цікавості, чому у вас обидві петлі різні? Чому ні for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;? Він не зберігає жодних байтів, але він більше відповідає тим, що обидві петлі однакові. :)
Кевін Круїйсен

12

Желе, 18 17 15 9 байт

0W&ṖZ
ÇÇ^

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Фон

Цей підхід ґрунтується на відповіді Jelly @ Sp3000 , зокрема на його ідеї скористатись векторизованими операціями між списками різної довжини.

Почнемо, беручи порозрядне І з 0 і кожне ціле число в першому рядку введення. Завдяки автоматичній векторизації цього можна досягти, взявши порозрядне AND з [0] та введення без останнього рядка. 0 поєднується з першим рядком, в результаті чого виникає ряд нулів. Оскільки решта рядків не мають аналогів у [0] , вони залишаються недоторканими.

Тепер ми транспонуємо результат, ще раз застосуємо вищезазначене перетворення (ефективно видаливши останній стовпець і обнуляючи перший), і знову перемістимо.

Для введення

 67   4  -8   5  13
  9  13  42   4  -7
  1   1   3  -9  29
 16  99   8  77   0

це призводить до

  0   0   0   0
  0  13  42   4
  0   1   3  -9

Тепер ми беремо побітовий XOR цього результату та оригінальної матриці. XORing цілого числа з собою дає 0 . XORing цілого числа з 0 (або зовсім не XORing) дає те саме ціле число. Це вигортає матрицю.

Як це працює

0W&ṖZ    Helper link. Argument: M (matrix)

0W       Yield [0].
   Ṗ     Yield M, without its last row.
  &      Take the bitwise AND of both.
    Z    Zip the result.

ÇÇ^      Main link. Input: A (matrix)

Ç        Call the helper link on A.
 Ç       Call the helper link on the result.
  ^      Take the bitwise XOR of the result and A.

8

Математика, 27 байт

(a=#;a[[2;;-2,2;;-2]]=0;a)&

2
Вражає. Тепер, чи можете ви поясніть це? Схоже, ви призначаєте внутрішні комірки до нуля, а -2s позначають другий другий-останній стовпець або рядок.
DavidC

Як це просто!
njpipeorgan

7

R , 33 48 байт

Я знаю, R не створений для гольфу. Але він створений для індексації позицій ... Завантаження прикладу;

a <- matrix(c(67,4,-8,5,13,9,13,42,4,-7,1,1,3,-9,29,16,99,8,77,0), ncol=5, byrow=TRUE)
a
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9   13   42    4   -7
# [3,]    1    1    3   -9   29
# [4,]   16   99    8   77    0

Замініть значення в будь-якій позиції, не в крайньому рядку чи стовпці, на 0:

x <- function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]<-0;a}

x(a)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]   67    4   -8    5   13
# [2,]    9    0    0    0   -7
# [3,]    1    0    0    0   29
# [4,]   16   99    8   77    0

Також перевіряємо тест з двома стовпцями:

b <- matrix(c(99,98,97,88,87,86), ncol=2, byrow=TRUE)
b
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

x(b)
#     [,1] [,2]
#[1,]   99   98
#[2,]   97   88
#[3,]   87   86

Потомство: попередня спроба

# a[2:(nrow(a)-1),2:(ncol(a)-1)]<-0 # previous attempt

Тестування всіх прикладів:

tests <- read.table(text="[[3]] -> [[3]]
                          [[7,2,8]] -> [[7,2,8]]
                          [[3],[5],[12],[-6]] -> [[3],[5],[12],[-6]]
                          [[99,98,97],[88,87,86]] -> [[99,98,97],[88,87,86]]
                          [[6,7],[8,9],[10,11]] -> [[6,7],[8,9],[10,11]]
                          [[-1,-2,-3],[1,2,3],[5,5,5]] -> [[-1,-2,-3],[1,0,3],[5,5,5]]
                          [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] -> [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]]
                          [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] -> [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]]")
tests$cols <- c(1,3,1,3,2,3,5,5)
tests$V1 <- gsub("\\[|\\]","",tests$V1)
tests$V1 <- paste0("c(",tests$V1,")")
tests$V3 <- gsub("\\[|\\]","",tests$V3)
tests$V3 <- paste0("c(",tests$V3,")")

testfn <- function(testno) {
  intest <- matrix(eval(parse(text=tests$V1[testno])), ncol=tests$cols[testno], byrow=TRUE)
  intest <- x(intest)
  outtest <- matrix(eval(parse(text=tests$V3[testno])), ncol=tests$cols[testno], byrow=TRUE)
  return(identical(intest, outtest))
}

sapply(seq_len(nrow(tests)), testfn)
# [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Що відбувається з 1 або 2 рядком або матрицею стовпців?
Менель

Добре, що перша спроба провалить тест з двома стовпцями та видаляє середній рядок. Я оновлю.
Джонатан Керролл

1
Ласкаво просимо до головоломки програмування та коду для гольфу! Ми вимагаємо, щоб усі матеріали були повноцінними програмами або функціями. У цьому випадку ваш набраний код є лише фрагментом, оскільки він передбачає, що змінна aіснує. Щоб відповідати нашим правилам, ви можете зробити його функцією, яка займає матрицю, як, наприклад, function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}47 байт.
Алекс А.

6

Mathematica 81 76 байт

(d=Dimensions@m;q=MemberQ;m Boole@Array[{1,d[[1]]}~q~#||{1,d[[2]]}~q~#2&,d])&

Як це працює

Припустимо, що вхідний масив зберігається в m. Розміри m{4,5} `

(m={{67,4,-8,5,13}, {9,13,42,4,-7}, {1,1,3,-9,29}, {16,99,8,77,0}})//MatrixForm

m


Кожна комірка у наступному масиві, aє Істиною, якщо комірка знаходиться або в першому, або ( ||) в останньому рядку, або в першому чи останньому стовпцях; інакше це Неправда.

(d=Dimensions@m;a=Array[MemberQ[{1,d[[1]]},#]||MemberQ[{1,d[[2]]},#2]&,d])&[m]//MatrixForm

true


Застосування функції Booleдо масиву перетворює True в 1 та False в 0.

b = Boole[a]

boole


Помножте матрицю mна b. Це помножує кожну клітинку в m на відповідну комірку в b.

m b

hollow matrix


Ви можете використовувати ||як АБО, щоб зберегти пару байт, і я бачу кілька інших байтів, які ви також можете зберегти!
Сіммонс

A Simmons, Дякую за пропозицію.
DavidC

# -Unitize @ ArrayFilter [Дет, Аррей [Норма @ * Список, Розміри @ #], 1] # &
njpipeorgan

@njpipeorgan, я пропоную вам надіслати його. (І сподіваємось пояснити, як це працює!)
DavidC

@DavidC Я опублікував свою відповідь
njpipeorgan

6

GNU Sed, 31

  • Завдяки @manatwork за збереження 4 байтів.

Версія 4.2.2 або більш рання до цього зобов’язання (обговорення) .

Оцінка включає +1 за -rваріант.

Рядки введення розділені новим рядком. Елементи в кожному рядку розділені однорядковими.

1n
$n
:
s/ -?\w+ / : /
t
y/:/0/

Пояснення

1n                   # 1st line: print unchanged, then load next line
$n                   # last line: print unchanged, then load next line (i.e. EOF and stop)
:                    # unnamed label
s/ -?\w+ / : /       # substitute a number in spaces with a `:` in spaces
t                    # If the above matched, jump back to the label and try again
y/:/0/;              # transliterate `:` to `0`

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


1
О, я бачу, це "фантазійний" спосіб обійти жодних лукаголов, і спасибі!
andlrc

1
Занадто багато дужок: 1n;$n;:;s/ -?\w+ / : /;t;y/:/0/.
манатура

1
Чи можете ви включити інформацію про фіксацію, яка змушує вашу відповідь працювати в блоці цитат, сайт дійсно повільний і потрібна 1 хвилина для повного завантаження
потрібна

@manatwork Спасибі - збережено 4 байти!
Цифрова травма

@Ferrybig Додав ще одне посилання на обговорення розробників на цю тему .
Цифрова травма

5

Октава, 34 байти

function h(M) M(2:end-1,2:end-1)=0

Зауважте, що для введення потрібні крапки з комою для розділення рядків масиву:

h([[3];[5];[12];[-6]])

Пояснення:

Індекси масивів Octave (і MATLAB) є 1-базисною. Визначаючи діапазон Array(1:end), ви отримаєте всі елементи (одномірного, у цьому прикладі) масиву. Array(2:end-1)дасть вам усі елементи, крім першого та останнього.

M(2:end-1,2:end-1)=0

встановлює 0всі елементи не в першому чи останньому рядку чи стовпці:

>> A = [[-1,-2,-3];[1,2,3];[5,5,5]]
A =

  -1  -2  -3
   1   2   3
   5   5   5

>> h(A)
M =

  -1  -2  -3
   1   0   3
   5   5   5

Якщо один з розмірів менший або дорівнює 2, діапазон end-1 становить менше , ніж 2, тому кінець діапазону (2:end-1)менше , ніж в початку. У цьому випадку Octave ігнорує діапазон і нічого не робить. Це аналогічно forциклу:

for (int i=2; i < 2; i++) {...}

Умова зупинки справедлива на першій ітерації, тому ми випадаємо з циклу.

>> A = [[6,7];[8,9];[10,11]]
A =

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11

5

Желе , 12 байт

ZṖṖ1;¥€
¬ÇÇ×

Я думаю, що це працює, все ще обертаючи голову навколо желе. Спробуйте в Інтернеті!

(Дякуємо @Dennis за -2 байти)

Працює шляхом множення вхідного масиву на масиви 1s і 0s на один вимір, менший кожен із них. Наприклад, для того, щоб [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]ми помножили стихія на

1 1 1 1
1 0 0 0
1 0 0 0

Повне пояснення

[Helper link - argument is a matrix]
Z           Zip
 ṖṖ         Pop last two elements, or [:-2]
   1;¥€     Append a 1 in front of every row

[Main link]
¬           Not, turning 0s to 1s and everything else to 0s. Even though some zeroes
            turn into 1s, it's fine because we multiply element-wise at the end,
            and 0*1 = 0
 ÇÇ         Perform helper link twice
   ×        Multiply element-wise

5

ES6, 52 48 46 байт

f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)

Редагувати: збережено 4 байти завдяки @ user81655. Збережено ще 2 байти завдяки @ETHproductions.


Розумний! Ось дуже схожий підхід, без gякого економиться кілька байтів:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
user81655

Хороша робота! Я рахую 48 байт (можливо, ви забули порахувати f=), але ви можете звести його до 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
звести

1
@ETHproductions Так, я забув рахувати f=. Також я трохи здивований, +.5але працює, але я бачу, що це додає рядок в іншому дзвінку.
Ніл


4

Математика, 55 байт

#-Unitize@ArrayFilter[Det,Power~Array~Dimensions@#,1]#&

Тестовий випадок

%[RandomInteger[9,{5,5}]]
(*
  {{8,8,3,6,5},
   {7,0,0,0,4},
   {2,0,0,0,7},
   {3,0,0,0,5},
   {8,6,1,0,8}}
*)

Пояснення

Основна думка цієї відповіді те саме, що відповідь DavidC (спочатку матрицю масок, а потім помножте її на початкову матрицю), але побудова матриці масок відрізняється.

ArrayFilter[f,list,r]карти fна кожен елемент listу радіусі відr .

ArrayFilter[f,{1,2,3,4,5},1]
(* { f[{1,1,2}], f[{1,2,3}], f[{2,3,4}], f[{3,4,5}], f[{4,5,5}] } *)

Зауважте, що граничні елементи дублюються там, де недостатньо сусідів. Якщо listвона має двовимірні показники, ця функція добре поєднується з тим, Detщоб дати бажаний результат, оскільки дублюються стовпці або рядки на чотирьох межах обмежують детермінанти.

ArrayFilter[Det,Power~Array~{4,4},1]
(*
  {{0, 0,  0,    0},
   {0, 12, 72,   0},
   {0, 48, 1152, 0},
   {0, 0,  0,    0}}
*)

де Power~Array~{4,4}гарантії визначників на внутрішніх положеннях є ненульовими. І

1-Unitize@%
(*
  {{1,1,1,1},
   {1,0,0,1},
   {1,0,0,1},
   {1,1,1,1}}
*)

дає матрицю маски.


4

Пітон, 50 байт

def f(a):
 for l in a[1:-1]:l[1:-1]=[0]*(len(l)-2)

Приймає список списків і змінює його на місці. Синтаксис зрізу Python не є незручним для цього завдання.

Я дізнався, що множення списку на від'ємне число призводить до порожнього списку, що дозволяє вищевказаному коду працювати на невеликих введеннях.


4

Джулія, 50 35 байт

A->A[2:size(A,1)-1,2:size(A,2)-1]=0

Це анонімна функція, яка приймає масив і змінює його на місці. Щоб викликати його, призначте його змінній.

Підхід тут досить простий: Для масиву введення n по m A ми призначаємо A ij = 0 для всіх i = 2, ..., n -1 і j = 2, ..., m -1, будуючи діапазони індексів. Діапазони можуть бути порожніми, як, наприклад, n або m = 1, в цьому випадку заміна не проводиться.

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

Збережено 15 байт завдяки Деннісу!


4

C, 62 байти

y;f(a,b,c)int **a;{for(b--;b-->1;)for(y=1;y<c-1;)a[b][y++]=0;}

Сподіваюся, що нормально брати довжину / ширину масиву як параметри. Я трохи пограв з memset / bzero, але множився наsizeof(int) різко збільшив розмір коду.

EDIT: 55 байт, якщо ми можемо додатково згорнути правила і зберегти наш масив як символи, оскільки кожен вхід - це лише одна цифра.

x;
#define f(a,b,c) for(x=1;x<b-1;)bzero(a[x++]+1,c-2);

EDIT: Дякую Вашингтону Гудесу за пораду!


Ви буквально намагалися помножити на sizeof(int)? Ви можете використати 4замість цього ...
anatolyg

sizeof(int) != 4на моїй машині: P
Josh

Б'юсь об заклад, це все одно одноцифрове число, яке ви можете використовувати.
anatolyg

Я мав на увазі в той момент, що я можу просто вирішити, що це масив символів, а не ints, оскільки проблема використовує лише одноцифрові числа. Просто залежить, наскільки ми хочемо згорнути правила.
Джош

Спасибі! Тепер я також можу користуватися віддаленим -->оператором;)
Джош

3

Perl 6 , 28 байт

{.[1..*-2]»[1..*-2] »=»0}

Це змінює вхідне місце

Використання

my @test-cases = (
  [[3],] => [[3],],
  [[7,2,8],] => [[7,2,8],],
  [[3],[5],[12],[-6]] => [[3],[5],[12],[-6]],
  [[99,98,97],[88,87,86]] => [[99,98,97],[88,87,86]],
  [[6,7],[8,9],[10,11]] => [[6,7],[8,9],[10,11]],
  [[ -1,-2,-3],[1,2,3],[5,5,5]] => [[ -1,-2,-3],[1,0,3],[5,5,5]],
  [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]] => [[67,4,-8,5,13],[9,0,0,0,-7],[1,0,0,0,29],[16,99,8,77,0]],
  [[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0],[1,0,1,0,1],[0,1,0,1,0]] => [[0,1,0,1,0],[1,0,0,0,1],[0,0,0,0,0],[1,0,0,0,1],[0,1,0,1,0]],
);

use Test;
plan +@test-cases;

for @test-cases {
  my $k = .key;
  {.[1..*-2]»[1..*-2] »=»0}( $k ); # <==
  ok $k eqv .value
}
1..8
ok 1 - 
ok 2 - 
ok 3 - 
ok 4 - 
ok 5 - 
ok 6 - 
ok 7 - 
ok 8 - 

{.[1..*-2]»[1..*-2]X=0}економить 2 байти
raiph

@raiph, здається, не працює для двох останніх випадків
Бред Гілберт b2gills

3

JavaScript ES6, 69 66 57 байт

Y=>Y.map((X,y)=>X.map((N,x)=>x*y&&X[x+1]+.5&&Y[y+1]?0:N))

Як це працює

Це рішення відображає кожен y-індекс yі x-індекс xу вхідному документі і вирішує, викидати чи ні, виходячи з цих двох індексів. Ми маємо зберегти чотири випадки:

  • x дорівнює 0
  • y дорівнює 0
  • x дорівнює довжині внутрішнього масиву, мінус 1
  • y дорівнює довжині зовнішнього масиву мінус 1

Ми можемо подбати про перші два з невеликим множенням: x*yповертає 0iff або xабо yє 0, і додатне ціле число в іншому випадку. Тепер для третього: ми можемо перевірити, якщо це X.length>x+1, але це займає багато байтів. Ще один спосіб зробити це - перевірити, чи попереду предмет неправдивий, а саме undefinedце ви отримуєте, намагаючись отримати доступ до неіснуючого предмета. Однак це також відповідає, якщо наступний елемент є 0, тому ми додаємо 0,5, щоб переконатися, що цього не відбувається:

1 + 0.5 = 1.5 (truthy)
0 + 0.5 = 0.5 (truthy)
-1 + 0.5 = -0.5 (truthy)
undefined + 0.5 = NaN (falsy)

Нарешті, четвертий пункт: оскільки зовнішній масив має лише масиви всередині, а будь-який масив є правдоподібним, ми можемо просто перевірити Y[y+1]. Тепер ?0:Nми перетворюємо його на те, 0якщо все вищезазначене виявилося правдивим; Nінакше. І це все!


3

Сітківка ,31 24 22

(?<=¶.+ )\S+(?= .*¶)
0

Збережено 2 байти завдяки випадковим

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

Можливо, є кращий спосіб зробити це, оскільки це просто досить основна багаторядкова заміна. По суті, ми знаходимо кожне число, якому передує новий рядок, деяка кількість символів і пробіл, і одразу слідує пробіл, а потім і зрештою слідує новий рядок. Потім ці цифри замінюються на 0.

Це не збереже колодки, але я не думаю, що це проблема.


3

Java 8, як лямбда-функція: 82 83 95 символів / байт

Підпис лямбда: int[][] -> (void)(тобто Consumer<int[][]>)

(a)->{int[]v={1,1};while(++v[0]<a.length){while(++v[1]<a[0].length)a[v[0]-1][v[1]-1]=0;v[1]=1}}

EDIT Зробив помилку, я подумав, що a [x, y] - x-й ряд, а yth col. Очевидно, що це має бути [x] [y], хоча!

EDIT Я забув тестувати код, і мені потрібно встановлювати стовпчик назад до нуля кожного разу всередині циклу, +12 байт. : /


3

Haskell, 59 58 байт

k _[x]=[x]
k f(x:y)=x:(f<$>init y)++[last y]
f=k(k(\_->0))

Розширено

onInner :: (a -> a) -> [a] -> [a]
onInner _ [x]    = [x]
onInner f (x:xs) = x : map f (init xs) ++ [last xs]

hollowOut :: [[Int]] -> [[Int]]
hollowOut = 
   onInner       -- leave first and last line alone 
     (onInner    -- leave first and last entry per line 
       (const 0) -- replace entries by 0
     )

Ви повинні мати можливість перетворитись ++[last y]на :(last y)або:last y
HEGX64

@ HEGX64: Ні, неправильний тип. x : map f (…)є вже типом [a]і last yмає тип a, тоді як (:) :: a -> [a] -> [a]. Додавання елемента в кінці списку в Haskell виглядає відстійним, оскільки ці списки є однозв'язаними прямими списками.
Зета

Опс. Я знав, що повинен був спробувати сам перед публікацією :)
HEGX64

1
Ви можете включити kв оператор інфіксной, скажімо , #і перевертати аргументи , щоб зберегти один байт: [x]#_=..., (x:y)#f=..., f=(#(# \_->0))і ви можете залишити назву вашої основної функції, тобто f=ще два байта.
німі

2

Піт, 18 байт

Qjbm:dSttld0P.Qe.Q

Пояснення

                   - autoassign Q=eval(input())
                   - autoassign .Q = map(eval, rest_of_input)
Q                  - imp_print(Q)
   m        P.Q    -  [V for d in .Q[:-1]]
      Sttld        -     range(1, len(d)-2+1)
    :d     0       -    assign_indexes(d, ^, 0)
 jb                - "\n".join(^)
               e.Q - imp_print(.Q[-1])

Вхідні масиви розділені новими рядками

Спробуйте тут


2

Groovy, 70 байт

Це не дуже креативно, але коротко!

g={a->for(i=1;i<a.size()-1;i++)for(j=1;j<a[i].size()-1;)a[i][j++]=0;a}

Пояснення

Закриття одним арг

g={a-> 

Повторіть внутрішній масив, пропустивши перший і останній елементи

for(i=1;i<a.size()-1;i++)

Ітерація над середніми елементами у внутрішньому масиві

for(j=1;j<a[i].size()-1;)

Встановіть елементи 0та повернітьсяa

a[i][j++]=0;a}

Тести

assert g([[3]]) == [[3]]
assert g([[7, 2, 8]]) == [[7, 2, 8]]
assert g([[3], [5], [12], [-6]]) == [[3], [5], [12], [-6]]
assert g([[99, 98, 97], [88, 87, 86]]) == [[99, 98, 97], [88, 87, 86]]
assert g([[6, 7], [8, 9], [10, 11]]) == [[6, 7], [8, 9], [10, 11]]
assert g([[-1, -2, -3], [1, 2, 3], [5, 5, 5]]) == [[-1, -2, -3], [1, 0, 3], [5, 5, 5]]
assert g([[67, 4, -8, 5, 13], [9, 13, 42, 4, -7], [1, 1, 3, -9, 29], [16, 99, 8, 77, 0]]) == [[67, 4, -8, 5, 13], [9, 0, 0, 0, -7], [1, 0, 0, 0, 29], [16, 99, 8, 77, 0]]
assert g([[0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0], [1, 0, 1, 0, 1], [0, 1, 0, 1, 0]]) == [[0, 1, 0, 1, 0], [1, 0, 0, 0, 1], [0, 0, 0, 0, 0], [1, 0, 0, 0, 1], [0, 1, 0, 1, 0]]

2

R, 71 64 57 байт

function(m){if(all((y<-dim(m)-1)>1))m[2:y[1],2:y[2]]=0;m}

редагувати -7 байт, явно маючи справу з <2-рядковими або <2-стовпчиковими матрицями, явно редагуючи2 -7 байт, призначаючи розміри матриці під час перевірки розміру


1

C ++, 80 79 байт

Очікує масив, як int**із заданими розмірами nта k:

void p(int**c,int n,int k){for(int j,i=1;1+i<n;++i)for(j=1;j+1<k;)c[i][j++]=0;}

Альтернатива, яка працює для будь-якого типу, який має size()та value_type & operator[](int)(98 байт):

template<class C>void p(C&c){for(int j,i=1;1+i<c.size();++i)for(j=1;j+1<c[i].size();)c[i][j++]=0;}

Розширена версія

template <class Container>
void hollowOut(Container & ctn){
    const auto size = ctn.size();

    for(typename Container::size_type i = 1; i + 1 < size; ++i) {
        const auto inner_size = ctn[i].size();

        for(decltype(inner_size) j = 1; j + 1 < inner_size; ++j) {
            ctn[i][j] = 0;
        }
    }
}

Здається, що додавання розмірів матриці до вводу є стандартною лазівкою
16-16

1

PHP, 82 81 80 71 байт

function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};

Бігайте так:

php -r '$f = function(&$z){for(;$z[++$i+1];)for(;0 .$z[0][++$$i+1];)$z[$i][$$i]=0;};   $z=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]; $f($z); print_r($z);'
  • Збережено байт, приймаючи рядки постійного розміру (thx для манантної роботи)
  • Збережено байт, зробивши його анонімною функцією
  • Збережено 7 байт, використовуючи truthyness наступного елемента масиву, запобігаючи викликам count, що є занадто довгою назвою для codegolf

Під час обробки матриці всі підмасиви повинні мати однакову довжину. Тож у внутрішній частині forзавжди безпечно повторювати count($z[0])-1до 1 символу.
манатура

1

APL, 17 байт 15 байт

{⍵×(⌽∨⊖)1∊¨⍳⍴⍵}

Як це працює

  • ⍳⍴⍵ генерує 2D масив, де всі комірки містять координати всіх комірок аргументу.
  • 1∊¨здійснює пошук у кожній такій комірці, якщо є 1, і повертає 1, якщо так, або 0 в іншому випадку. Це створює матрицю, де перший рядок і перший стовпець - 1s, а всі інші - 0.
  • (⌽∨⊖) поєднується з логічними "або" двома версіями матриці, один зворотний вздовж першого і один зворотний уздовж останньої осі.
  • ⍵× є стандартним множенням.

Ви можете замінити (⊣∨⊖∘⌽) на (⊖∨⌽), на два байти менше
Моріс Цука

Блискуче! Дозвольте мені це зробити!
lstefano

0

Perl, 34 + 2 = 36 байт

next if$.==1||eof;s/ .+?(?= )/ 0/g

Потрібен -pпрапор:

$ perl -pE'next if$.==1||eof;s/ .+?(?= )/ 0/g' <<< $'1 2 3\n4 5 6\n7 8 9'
1 2 3
4 0 6
7 8 9

Як це працює:

# '-p' Read each line into `$_` and auto prints
next if$.==1||eof; # `$.` is set to to the current line in file (1, 2, ..., n)
                   # and `eof` is true if its the last line
s/ .+?(?= )/ 0/g

0

Луа, 69 байт

function f(a)for i=2,#a-1 do
for o=2,#a[i]-1 do
a[i][o]=0
end
end end

Якби у мене були фігурні дужки замість дос та кінців ...


0

SmileBASIC, 69 51 байт

DEF H A,W,H
FOR I=1TO H-2FILL A,0,W*I+1,W-2NEXT
END

Для заповнення 2D-області в масиві зазвичай знадобиться використання FILL у циклі. Але працювати з двовимірними даними на графічній сторінці набагато простіше, тому спочатку масив скопіюється туди.

Aww Я думав, що я настільки розумний, використовуючи графічні команди ... але, виявляється, виклик FILL купу разів насправді коротший.

У будь-якому разі функціональними входами є масив та ширина / висота (Це стандартно в Smilebasic, оскільки немає можливості перевірити розміри масиву.)


0

APL (Dyalog Classic) , 12 байт

⊢-(⍉01↓⌽)⍣4

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

⍉⌽⍵ це нормальне обертання (повернути горизонтально і перемістити)

тут ми поєднуємо його з тим, 0⍪1↓⍵що замінює перший рядок нулями (опустити один рядок, а потім об'єднати 0 зверху) в один потяг:⍉0⍪1↓⌽

⍣4 повторюється 4 рази

⊢- віднімає з вихідної матриці

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.