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
var QUESTION_ID=71591,OVERRIDE_USER=32014;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Java 7, jako funkcja o pełnej nazwie: 85
Mógłbyś lambda to w Javie 8, aby usunąć kilka bajtów, ale tak naprawdę tego nie robię.
źródło
Arrays.fill(a[i],1,a[i].length-1,0);
? To tylko 36 bajtów zamiast 37. =)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. :)Galaretka,
1817159 bajtówWypró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
to skutkuje
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
źródło
Mathematica, 27 bajtów
źródło
-2
s oznacza drugą przedostatnią kolumnę lub wiersz.R ,
3348 bajtówWiem, że R nie jest przeznaczony do gry w golfa. Ale jest przeznaczony do indeksowania pozycji ... Ładowanie przykładu;
Zamień wartość w dowolnym miejscu poza rzędem lub kolumną krawędzi na 0:
Sprawdzanie również testu 2-kolumnowego:
Potomność: poprzednia próba
Testowanie wszystkich przykładów:
źródło
a
istnieje. Aby zachować zgodność z naszymi regułami, możesz uczynić ją funkcją, która pobiera macierz, na przykładfunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
47 bajtów.Mathematica
8176 bajtówJak to działa
Załóżmy, że tablica wejściowa jest zapisana w
m
. Wymiarym
to {4,5} `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.Zastosowanie funkcji
Boole
do tablicy konwertuje True na 1 i False na 0.Pomnóż macierz
m
przezb
. To mnoży każdą komórkę wm przez odpowiednią komórkę wb.źródło
||
jako swojej OR, aby zapisać kilka bajtów, a ja widzę kilka innych bajtów, które możesz zapisać!GNU Sed, 31
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.
Wyjaśnienie
Wypróbuj online.
źródło
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Oktawa, 34 bajty
Zauważ, że dane wejściowe wymagają średników do oddzielenia wierszy tablicy:
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.ustawia na
0
wszystkie elementy spoza pierwszego lub ostatniego wiersza lub kolumny:Jeśli jeden z wymiarów jest mniejszy lub równy 2, zakres
end-1
jest 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 dofor
pętli:Warunek zatrzymania jest prawdziwy przy pierwszej iteracji, więc wypadamy z pętli.
źródło
Galaretka , 12 bajtów
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 przezPełne wyjaśnienie
źródło
ES6,
524846 bajtówEdycja: Zapisano 4 bajty dzięki @ user81655. Zaoszczędź kolejne 2 bajty dzięki @ETHproductions.
źródło
g
któ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)
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)
f=
. Jestem też nieco zaskoczony,+.5
ale widzę, że dodaje ciąg znaków w drugim wywołaniu.JavaScript,
625956 bajtówTo podejście oczekuje ciągu jako argumentu. Możesz zobaczyć, co robi regex tutaj: https://regex101.com/r/kC6xA8/3
źródło
Mathematica, 55 bajtów
Przypadek testowy
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]
mapujef
na każdy elementlist
w promieniur
.Zauważ, że elementy brzegowe są powielane, gdy nie ma wystarczającej liczby sąsiadów. Gdy
list
ma 2 wymiary, ta funkcja działa dobrze razem z,Det
aby dać pożądany rezultat, ponieważ zduplikowane kolumny lub wiersze na czterech granicach znikają determinanty.gdzie
Power~Array~{4,4}
gwarantuje, że wyznaczniki pozycji wewnętrznych będą niezerowe. Idaje matrycę maski.
źródło
Python, 50 bajtów
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.
źródło
Julia,
5035 bajtówJest 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!
źródło
C, 62 bajty
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.
EDYCJA: Dzięki Washington Guedes za wskazówkę!
źródło
sizeof(int)
? Zamiast4
tego możesz użyć ...sizeof(int) != 4
na mojej maszynie: P-->
operatora odsunięcia ;)Perl 6 , 28 bajtów
To modyfikuje dane wejściowe w miejscu
Stosowanie
źródło
{.[1..*-2]»[1..*-2]X=0}
zapisuje 2 bajtyJavaScript ES6,
696657 bajtówJak to działa
To rozwiązanie mapuje każdy indeks y i indeks
y
xx
na wejściu i decyduje, czy je wyrzucić na podstawie tych dwóch indeksów. Są cztery przypadki, które musimy zachować:x
wynosi 0y
wynosi 0x
równa się długości wewnętrznej tablicy minus 1y
równa się długości zewnętrznej tablicy minus 1Możemy zająć się pierwszymi dwoma z niewielkim pomnożeniem:
x*y
zwraca0
iff albox
alboy
wynosi 0, a dodatnią liczbę całkowitą w przeciwnym razie. Po trzecie: możemy sprawdzić, czyX.length>x+1
to zajmuje dużo bajtów. Innym sposobem na to jest sprawdzenie, czy przedmiot przed tobą jest fałszem, a mianowicieundefined
, co dostajesz, próbując uzyskać dostęp do nieistniejącego elementu. Jednak to pasuje również, jeśli następny element jest0
, więc dodajemy 0,5, aby upewnić się, że tak się nie stanie: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:N
zmieniamy na,0
jeśli wszystkie powyższe okazały się prawdziwe;N
Inaczej. I to wszystko!źródło
Siatkówka ,
31 2422Oszczę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 przez
0
.Nie pozwoli to zachować wypełnienia kolumn, ale nie sądzę, żeby to był problem.
źródło
Java 8, jako funkcja lambda:
828395 znaków / bajtówPodpis Lambda:
int[][] -> (void)
(tj.Consumer<int[][]>
)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. : /
źródło
Haskell,
5958 bajtówRozszerzony
źródło
++[last y]
w:(last y)
lub:last y
x : map f (…)
jest już typu[a]
ilast y
ma typa
, 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.k
Powiedzmy, ż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, czylif=
przez następne dwa bajty.Pyth, 18 bajtów
Wyjaśnienie
Tablice wejściowe są oddzielone znakami nowej linii
Wypróbuj tutaj
źródło
Groovy, 70 bajtów
To nie jest bardzo kreatywne, ale jest krótkie!
Wyjaśnienie
Zamknięcie z jednym argumentem
Iteruj po wewnętrznej tablicy, pomijając pierwszy i ostatni element
Iteruj po środkowych elementach w wewnętrznej tablicy
Ustaw elementy
0
i wróća
Testy
źródło
R,
716457 bajtówedytuj -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
źródło
C ++,
8079 bajtówOczekuje tablicy jak
int**
przy danych rozmiarachn
ik
:Alternatywa, która działa dla każdego typu, który ma
size()
ivalue_type & operator[](int)
(98 bajtów):Wersja rozszerzona
źródło
PHP,
82818071 bajtówUruchom tak:
count
, co jest zbyt długą nazwą dla codegolfźródło
for
jest bezpieczne, aby zawsze iterować,count($z[0])-1
aby zaoszczędzić 1 postać.APL,
17 bajtów15 bajtówJak 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.źródło
Perl, 34 + 2 = 36 bajtów
Wymaga
-p
flagi:Jak to działa:
źródło
Lua, 69 bajtów
Gdybym tylko miał kręcone szelki zamiast dos i końcówek ...
źródło
SmileBASIC,
6951 bajtówWypeł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).
źródło
APL (Dyalog Classic) , 12 bajtów
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źródło