Drążyć tablicę


35

Zadanie

To wyzwanie jest bardzo proste. Twój dane wejściowe to prostokątna tablica liczb całkowitych 2D o wymiarach co najmniej 1 × 1. Można go pobrać w dowolnym rozsądnym formacie. Wynikiem powinna być tablica wejściowa, ale ze wszystkimi wpisami nie w pierwszym lub ostatnim wierszu lub kolumnie ustawionymi na 0. Musi być w tym samym formacie co dane wejściowe.

Na przykład, jeśli tablica wejściowa to

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

wtedy prawidłowe wyjście to

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

Zasady i punktacja

Możesz napisać pełny program lub funkcję, a funkcje mogą modyfikować wprowadzone dane zamiast zwracać je. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.

Przypadki testowe

Są one formatowane jako listy zagnieżdżone, aby ułatwić kopiowanie i wklejanie.

[[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]]

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

## Language Name, N bytes

Jeśli chcesz dołączyć wiele liczb (np. Ponieważ poprawiłeś swój wynik lub chcesz osobno wymienić flagi interpretera), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Odpowiedzi:


13

MATL , 9 bajtów

0HJ_ht4$(

Dane wejściowe są w formacie

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

EDYCJA (12 czerwca 2016 r.): Aby dostosować się do zmian w języku, poniższy link został _zastąpiony przezq .

Wypróbuj online !

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
Miły! Wiedziałem, że MATL będzie w biegu. : D
zlewka

12

Java 7, jako funkcja o pełnej nazwie: 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;}

Mógłbyś lambda to w Javie 8, aby usunąć kilka bajtów, ale tak naprawdę tego nie robię.


Czy możesz zaoszczędzić miejsce za pomocą Arrays.fill(a[i],1,a[i].length-1,0);? To tylko 36 bajtów zamiast 37. =)
corsiKa

@corsiKa Byłoby miło, ale musiałbym go zaimportować lub w pełni zakwalifikować: /
Geobits

Właśnie z ciekawości, dlaczego różnią się obie pętle? Dlaczego nie for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;? Nie zapisuje żadnych bajtów, ale jest bardziej spójny, ponieważ obie pętle są takie same. :)
Kevin Cruijssen

12

Galaretka, 18 17 15 9 bajtów

0W&ṖZ
ÇÇ^

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

tło

To podejście opiera się na odpowiedzi Jelly @ Sp3000 , a konkretnie na jego pomyśle wykorzystania wektoryzowanych operacji między listami o różnych długościach.

Zaczynamy od pobrania bitowego AND od 0 i każdej liczby całkowitej w pierwszym rzędzie danych wejściowych. Ze względu na automatyczną wektoryzację można to osiągnąć, przyjmując bitowe ORAZ [0] i dane wejściowe bez ostatniego wiersza. 0 jest sparowane z pierwszym wierszem, co daje rząd zer. Ponieważ pozostałe wiersze nie mają odpowiednika w [0] , pozostają nietknięte.

Teraz transponujemy wynik, ponownie zastosujemy powyższą transformację (skutecznie usuwając ostatnią kolumnę i zerując pierwszą), i ponownie transponujemy.

Dla danych wejściowych

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

to skutkuje

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

Teraz bierzemy bitowy XOR tego wyniku i pierwotną macierz. XOR liczby całkowitej z samym sobą daje 0 . XOR liczby całkowitej z 0 (lub wcale nie XOR) daje tę samą liczbę całkowitą. To wydrąża matrycę.

Jak to działa

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

Mathematica, 27 bajtów

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

2
Imponujący. Czy mógłbyś to wyjaśnić? Wygląda na to, że ponownie przypisujesz komórki wewnętrzne do zera, a -2s oznacza drugą przedostatnią kolumnę lub wiersz.
DavidC

Jakie to proste!
njpipeorgan

7

R , 33 48 bajtów

Wiem, że R nie jest przeznaczony do gry w golfa. Ale jest przeznaczony do indeksowania pozycji ... Ładowanie przykładu;

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

Zamień wartość w dowolnym miejscu poza rzędem lub kolumną krawędzi na 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

Sprawdzanie również testu 2-kolumnowego:

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

Potomność: poprzednia próba

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

Testowanie wszystkich przykładów:

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

Co dzieje się z macierzą 1 lub 2 wierszy lub kolumn?
mnel

Dobra uwaga, pierwsza próba kończy się niepowodzeniem testu 2-kolumnowego i usuwa środkowy wiersz. Zaktualizuję.
Jonathan Carroll

1
Witamy w Programowaniu Puzzle i Code Golf! Wymagamy, aby wszystkie zgłoszenia były pełnymi programami lub funkcjami. W takim przypadku kod oceniany jest tylko fragmentem kodu, ponieważ zakłada on, że zmienna aistnieje. Aby zachować zgodność z naszymi regułami, możesz uczynić ją funkcją, która pobiera macierz, na przykład function(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}47 bajtów.
Alex A.

6

Mathematica 81 76 bajtów

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

Jak to działa

Załóżmy, że tablica wejściowa jest zapisana w m . Wymiary mto {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


Każda komórka w poniższej tablicy a ma wartość True, jeśli komórka znajduje się w pierwszym lub ( ||) w ostatnim wierszu lub w pierwszej lub ostatniej kolumnie; w przeciwnym razie jest to fałsz.

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

prawdziwe


Zastosowanie funkcji Booledo tablicy konwertuje True na 1 i False na 0.

b = Boole[a]

boole


Pomnóż macierz mprzez b. To mnoży każdą komórkę wm przez odpowiednią komórkę wb.

m b

pusta matryca


Możesz użyć ||jako swojej OR, aby zapisać kilka bajtów, a ja widzę kilka innych bajtów, które możesz zapisać!
A Simmons,

Simmons, dziękuję za sugestię.
DavidC

# -Unitize @ ArrayFilter [Det, Array [Norm @ * List, Dimensions @ #], 1] # &
njpipeorgan

@njpipeorgan, sugeruję przesłanie go. (I miejmy nadzieję wyjaśnij, jak to działa!)
DavidC

@DavidC Zamieściłem odpowiedź
njpipeorgan

6

GNU Sed, 31

  • Dzięki @manatwork za zapisanie 4 bajtów.

Wersja 4.2.2 lub wcześniejsza przed tym zatwierdzeniem (dyskusja) .

Wynik obejmuje +1 dla -r opcji.

Wiersze wejściowe są oddzielone znakiem nowej linii. Elementy w każdym rzędzie są oddzielone jednym wierszem.

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

Wyjaśnienie

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`

Wypróbuj online.


1
Och, rozumiem, to „fantazyjny” sposób na obejście się bez spojrzeń, i dzięki!
andlrc

1
Zbyt wiele szelki: 1n;$n;:;s/ -?\w+ / : /;t;y/:/0/.
manatwork

1
Czy możesz podać informacje o zatwierdzeniu, które sprawiają, że Twoja odpowiedź działa w bloku cytatu, strona jest naprawdę wolna i pełne załadowanie zajmuje 1 minutę
Ferrybig

@manatwork Thanks - zapisane 4 bajty!
Cyfrowa trauma

@ Ferrybig Dodano kolejny link do dyskusji deweloperów na ten temat .
Cyfrowa trauma

5

Oktawa, 34 bajty

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

Zauważ, że dane wejściowe wymagają średników do oddzielenia wierszy tablicy:

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

Wyjaśnienie:

Indeksy tablic oktawowych (i MATLAB) są oparte na 1. Określenie zakresu Array(1:end)da ci wszystkie elementy tablicy (jednowymiarowej, w tym przykładzie). Array(2:end-1)da ci wszystkie elementy oprócz pierwszego i ostatniego.

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

ustawia na 0wszystkie elementy spoza pierwszego lub ostatniego wiersza lub kolumny:

>> 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

Jeśli jeden z wymiarów jest mniejszy lub równy 2, zakres end-1jest mniejszy niż 2, dlatego koniec zakresu (2:end-1)jest mniejszy niż początek. W takim przypadku Octave ignoruje zakres i nic nie robi. Jest to analogiczne do forpętli:

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

Warunek zatrzymania jest prawdziwy przy pierwszej iteracji, więc wypadamy z pętli.

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

    6    7
    8    9
   10   11

>> h(A)
M =

    6    7
    8    9
   10   11

5

Galaretka , 12 bajtów

ZṖṖ1;¥€
¬ÇÇ×

Myślę, że to działa, wciąż owijając głowę wokół galaretki. Wypróbuj online!

(Dzięki @Dennis za -2 bajty)

Działa poprzez pomnożenie tablicy wejściowej przez tablice 1s i 0s o jeden wymiar mniejsze w każdym kierunku. Na przykład, [[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]mnożymy elementarnie przez

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

Pełne wyjaśnienie

[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 bajtów

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

Edycja: Zapisano 4 bajty dzięki @ user81655. Zaoszczędź kolejne 2 bajty dzięki @ETHproductions.


Sprytny! Oto bardzo podobne podejście, bez gktórego oszczędza się kilka bajtów:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
user81655

Dobra robota! Zliczam 48 bajtów (być może zapomniałeś policzyć f=), ale możesz sprowadzić go do 46:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
ETHprodukcje

1
@ETHproductions Tak, zapomniałem policzyć f=. Jestem też nieco zaskoczony, +.5ale widzę, że dodaje ciąg znaków w drugim wywołaniu.
Neil,


4

Mathematica, 55 bajtów

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

Przypadek testowy

%[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}}
*)

Wyjaśnienie

Główna idea tej odpowiedzi jest taka sama jak odpowiedź DavidC (najpierw skonstruuj matrycę maski, a następnie pomnóż ją do oryginalnej matrycy), ale konstrukcja matrycy maski jest inna.

ArrayFilter[f,list,r]mapuje fna każdy element listw promieniu 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}] } *)

Zauważ, że elementy brzegowe są powielane, gdy nie ma wystarczającej liczby sąsiadów. Gdy listma 2 wymiary, ta funkcja działa dobrze razem z, Detaby dać pożądany rezultat, ponieważ zduplikowane kolumny lub wiersze na czterech granicach znikają determinanty.

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

gdzie Power~Array~{4,4}gwarantuje, że wyznaczniki pozycji wewnętrznych będą niezerowe. I

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

daje matrycę maski.


4

Python, 50 bajtów

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

Akceptuje listę list i modyfikuje ją na miejscu. Składnia plastra Pythona nie jest niewygodna dla tego zadania.

Nauczyłem się, że pomnożenie listy przez liczbę ujemną powoduje, że lista jest pusta, co pozwala powyższemu kodowi działać na małych danych wejściowych.


4

Julia, 50 35 bajtów

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

Jest to anonimowa funkcja, która przyjmuje tablicę i modyfikuje ją w miejscu. Aby go wywołać, przypisz go do zmiennej.

Podejście tutaj jest dość prosty: Dla n przez m wejściowej macierzy A , możemy przypisać ij = 0 dla wszystkich i = 2, ..., n -1 i j = 2, ..., m -1 konstruując zakresy indeksów. Zakresy mogą być puste, np. Jeśli n lub m = 1, w którym to przypadku nie jest wykonywana zamiana.

Wypróbuj online

Zaoszczędź 15 bajtów dzięki Dennisowi!


4

C, 62 bajty

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

Mam nadzieję, że można przyjmować parametry długości / szerokości tablicy jako parametry. Grałem trochę z memset / bzero, ale pomnożenie przez sizeof(int)drastycznie zwiększyło rozmiar kodu.

EDYCJA: 55 bajtów, jeśli możemy dalej zginać reguły i przechowywać naszą tablicę jako znaki, ponieważ dane wejściowe to tylko jedna cyfra.

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

EDYCJA: Dzięki Washington Guedes za wskazówkę!


Czy dosłownie próbowałeś pomnożyć sizeof(int)? Zamiast 4tego możesz użyć ...
anatolyg

sizeof(int) != 4na mojej maszynie: P
Josh

Założę się, że wciąż jest to liczba jednocyfrowa, której możesz użyć.
anatolyg

W tym momencie mogłem po prostu zdecydować, że jest to tablica znaków, a nie liczb całkowitych, ponieważ problem wykorzystuje tylko liczby jednocyfrowe. Tylko zależy, jak daleko chcemy nagiąć reguły.
Josh

Dzięki! Teraz mogę także użyć -->operatora odsunięcia ;)
Josh

3

Perl 6 , 28 bajtów

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

To modyfikuje dane wejściowe w miejscu

Stosowanie

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}zapisuje 2 bajty
raiph

@raiph wydaje się, że nie działa w dwóch ostatnich przypadkach
Brad Gilbert b2gills

3

JavaScript ES6, 69 66 57 bajtów

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

Jak to działa

To rozwiązanie mapuje każdy indeks y i indeks yx xna wejściu i decyduje, czy je wyrzucić na podstawie tych dwóch indeksów. Są cztery przypadki, które musimy zachować:

  • x wynosi 0
  • y wynosi 0
  • x równa się długości wewnętrznej tablicy minus 1
  • y równa się długości zewnętrznej tablicy minus 1

Możemy zająć się pierwszymi dwoma z niewielkim pomnożeniem: x*yzwraca 0iff albo xalbo ywynosi 0, a dodatnią liczbę całkowitą w przeciwnym razie. Po trzecie: możemy sprawdzić, czy X.length>x+1to zajmuje dużo bajtów. Innym sposobem na to jest sprawdzenie, czy przedmiot przed tobą jest fałszem, a mianowicie undefined, co dostajesz, próbując uzyskać dostęp do nieistniejącego elementu. Jednak to pasuje również, jeśli następny element jest 0, więc dodajemy 0,5, aby upewnić się, że tak się nie stanie:

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

Wreszcie czwarty punkt: ponieważ zewnętrzna tablica zawiera tylko tablice, a każda tablica jest prawdziwa, możemy po prostu sprawdzić Y[y+1]. Teraz ?0:Nzmieniamy na, 0jeśli wszystkie powyższe okazały się prawdziwe; NInaczej. I to wszystko!


3

Siatkówka ,31 24 22

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

Oszczędność 2 bajtów dzięki randomra

Wypróbuj online!

Jest prawdopodobnie lepszy sposób, aby to zrobić, ponieważ jest to po prostu podstawowa zamiana wielu linii. Zasadniczo znajdujemy każdą liczbę, która jest poprzedzona znakiem nowej linii, pewną liczbę znaków i spację, a po niej bezpośrednio następuje spacja, a następnie, a po niej ostatecznie nowa linia. Wszystkie te liczby są następnie zastępowane przez0 .

Nie pozwoli to zachować wypełnienia kolumn, ale nie sądzę, żeby to był problem.


3

Java 8, jako funkcja lambda: 82 83 95 znaków / bajtów

Podpis Lambda: int[][] -> (void)(tj. 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}}

EDYCJA Popełniłem błąd, myślałem, że [x, y] to x rząd i y kolumna. Oczywiście powinno to być [x] [y]!

EDYCJA Zapomniałem przetestować kod i muszę za każdym razem w pętli ustawiać kolumnę na zero, +12 bajtów. : /


3

Haskell, 59 58 bajtów

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

Rozszerzony

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
     )

Powinieneś być w stanie zmienić się ++[last y]w :(last y)lub:last y
HEGX64

@ HEGX64: Nie, zły typ. x : map f (…)jest już typu [a]i last yma typ a, natomiast (:) :: a -> [a] -> [a]. Dodanie elementu na końcu listy w rodzaju Haskell jest do bani, ponieważ te listy są pojedynczymi połączonymi listami do przodu.
Zeta

Opps. Wiedziałem, że powinienem sam to wypróbować przed opublikowaniem :)
HEGX64

1
kPowiedzmy, że możesz zmienić się w operatora infix# i klapki argumenty, aby zapisać jeden bajt: [x]#_=..., (x:y)#f=..., f=(#(# \_->0))i można upuścić nazwę swojej podstawowej funkcji, czyli f=przez następne dwa bajty.
nimi

2

Pyth, 18 bajtów

Qjbm:dSttld0P.Qe.Q

Wyjaśnienie

                   - 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])

Tablice wejściowe są oddzielone znakami nowej linii

Wypróbuj tutaj


2

Groovy, 70 bajtów

To nie jest bardzo kreatywne, ale jest krótkie!

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

Wyjaśnienie

Zamknięcie z jednym argumentem

g={a-> 

Iteruj po wewnętrznej tablicy, pomijając pierwszy i ostatni element

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

Iteruj po środkowych elementach w wewnętrznej tablicy

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

Ustaw elementy 0i wróća

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

Testy

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 bajtów

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

edytuj -7 bajtów jawnie zajmując się macierzami <2-rzędowymi lub <2-kolumnowymi jawnie edytuj 2-7 bajtów, przypisując wymiary matrycy, sprawdzając rozmiar


1

C ++, 80 79 bajtów

Oczekuje tablicy jak int**przy danych rozmiarach ni 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;}

Alternatywa, która działa dla każdego typu, który ma size()i value_type & operator[](int)(98 bajtów):

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;}

Wersja rozszerzona

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;
        }
    }
}

Wydaje się, że dodanie wymiarów macierzy do danych wejściowych to standardowa luka
aross

1

PHP, 82 81 80 71 bajtów

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

Uruchom tak:

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);'
  • Zapisano bajt, zakładając stały rozmiar wierszy (dzięki za manatwork)
  • Zapisano bajt, czyniąc go anonimową funkcją
  • Zaoszczędzono 7 bajtów, stosując prawdziwość następnego elementu tablicy, zapobiegając wywołaniom count, co jest zbyt długą nazwą dla codegolf

Podczas przetwarzania macierzy wszystkie pod-tablice powinny mieć tę samą długość. Tak więc w środku forjest bezpieczne, aby zawsze iterować, count($z[0])-1aby zaoszczędzić 1 postać.
manatwork

1

APL, 17 bajtów 15 bajtów

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

Jak to działa

  • ⍳⍴⍵ generuje tablicę 2D, w której wszystkie komórki zawierają współrzędne wszystkich komórek argumentu.
  • 1∊¨przeszukuje każdą taką komórkę, jeśli występuje 1, i zwraca 1, jeśli tak, lub 0 w przeciwnym razie. To buduje macierz, w której pierwszy wiersz i pierwsza kolumna to 1s, a cała reszta to 0.
  • (⌽∨⊖) łączy się z logiczną „lub” dwiema wersjami macierzy, jedną odwróconą wzdłuż pierwszej i drugą odwróconą wzdłuż ostatniej osi.
  • ⍵× to standardowe mnożenie.

Możesz zastąpić (⊣∨⊖∘⌽) (⊖∨⌽), dwa bajty mniej
Moris Zucca

Znakomity! Pozwól mi to zrobić!
lstefano

0

Perl, 34 + 2 = 36 bajtów

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

Wymaga -pflagi:

$ 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

Jak to działa:

# '-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

Lua, 69 bajtów

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

Gdybym tylko miał kręcone szelki zamiast dos i końcówek ...


0

SmileBASIC, 69 51 bajtów

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

Wypełnienie obszaru 2D w tablicy zwykle wymagałoby użycia FILL w pętli. Ale znacznie łatwiej jest pracować z danymi 2D na stronie graficznej, więc najpierw tablica jest tam kopiowana.

Aww Myślałem, że jestem taki sprytny, używając poleceń graficznych ... ale okazuje się, że wywoływanie FILL kilka razy jest w rzeczywistości krótsze.

W każdym razie wejściowymi funkcjami są tablica oraz szerokość / wysokość (jest to standard w Smilebasic, ponieważ nie ma możliwości sprawdzenia wymiarów tablicy).


0

APL (Dyalog Classic) , 12 bajtów

⊢-(⍉01↓⌽)⍣4

Wypróbuj online!

⍉⌽⍵ jest zwykle rotacja (odwróć w poziomie i transponuj)

tutaj łączymy go z, 0⍪1↓⍵który zastępuje pierwszy wiersz zerami (upuść jeden wiersz, a następnie połącz 0 na górze) w jednym pociągu:⍉0⍪1↓⌽

⍣4 powtarza się 4 razy

⊢- odejmuje od oryginalnej macierzy

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.