Die Aufgabe
Diese Herausforderung ist sehr einfach. Ihre Eingabe ist ein rechteckiges 2D-Array von Ganzzahlen mit einer Größe von mindestens 1 × 1. Es kann in jedem vernünftigen Format aufgenommen werden. Ihre Ausgabe soll das Eingabearray sein, wobei jedoch nicht alle Einträge in der ersten oder letzten Zeile oder Spalte auf gesetzt sind 0
. Es muss dasselbe Format wie die Eingabe haben.
Zum Beispiel, wenn das Eingabearray ist
67 4 -8 5 13
9 13 42 4 -7
1 1 3 -9 29
16 99 8 77 0
dann ist die richtige Ausgabe
67 4 -8 5 13
9 0 0 0 -7
1 0 0 0 29
16 99 8 77 0
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben, und Funktionen können die Eingabe ändern, anstatt sie zurückzugeben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Diese werden als verschachtelte Listen formatiert, um das Einfügen von Kopien zu vereinfachen.
[[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]]
Bestenliste
Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren. Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
## Language Name, N bytes
Wenn Sie mehrere Zahlen einfügen möchten (z. B. weil Sie Ihre Punktzahl verbessert haben oder Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:
## Perl, <s>50</s> 43 + 2 (-p flag) = 45 bytes
Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:
## [><>](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 als vollständig benannte Funktion: 85
Sie könnten dies in Java 8 nach unten lambda, um ein paar Bytes zu entfernen, aber das mache ich nicht wirklich.
quelle
Arrays.fill(a[i],1,a[i].length-1,0);
? Es ist nur 36 Bytes anstelle von 37. =)for(int i=0,j;++i<a.length-1;)for(j=0;++j<a[i].length-1;)a[i][j]=0;
? Es werden keine Bytes gespeichert, aber es ist konsistenter, wenn beide Schleifen gleich sind. :)Jelly,
1817159 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Hintergrund
Dieser Ansatz basiert auf der Antwort von @ Sp3000 Jelly , insbesondere auf seiner Idee, vektorisierte Operationen zwischen Listen unterschiedlicher Länge zu nutzen.
Wir beginnen mit dem bitweisen UND von 0 und jeder ganzen Zahl in der ersten Zeile der Eingabe. Aufgrund der automatischen Vektorisierung kann dies erreicht werden, indem das bitweise UND von [0] und die Eingabe ohne die letzte Zeile verwendet werden. 0 wird mit der ersten Reihe gepaart, was zu einer Reihe von Nullen führt. Da die verbleibenden Zeilen kein Gegenstück in [0] haben , bleiben sie unberührt.
Jetzt transponieren wir das Ergebnis, wenden die obige Transformation erneut an (effektiv entfernen wir die letzte Spalte und setzen die erste auf Null) und transponieren erneut.
Für die Eingabe
das führt zu
Nun nehmen wir das bitweise XOR dieses Ergebnisses und die ursprüngliche Matrix. XOR-Verknüpfung einer Ganzzahl mit sich selbst ergibt 0 . Das XOR-Verknüpfen einer Ganzzahl mit 0 (oder das XOR-Verknüpfen überhaupt nicht) ergibt dieselbe Ganzzahl. Dadurch wird die Matrix ausgehöhlt.
Wie es funktioniert
quelle
Mathematica, 27 Bytes
quelle
-2
s steht für die vorletzte Spalte oder Zeile.R ,
3348 BytesIch weiß, R ist nicht zum Golfen gemacht. Aber es ist für die Positionsindizierung gemacht ... Laden Sie ein Beispiel hoch;
Ersetzen Sie den Wert an einer beliebigen Position, die sich nicht in der Randzeile oder -spalte befindet, durch 0:
Überprüfen Sie auch einen 2-Spalten-Test:
Nachwelt: vorheriger Versuch
Testen Sie alle Beispiele:
quelle
a
vorhanden ist. Um unseren Regeln zu entsprechen, können Sie eine Funktion festlegen, die eine Matrixfunction(a){a[-c(1,nrow(a)),-c(1,ncol(a))]=0;a}
für 47 Bytes annimmt .Mathematica
8176 BytesWie es funktioniert
Angenommen, das Eingabearray ist in gespeichert
m
. Die Maße vonm
sind {4,5} `Jede Zelle im folgenden Array
a
ist True, wenn sich die Zelle entweder in der ersten oder (||
) in der letzten Zeile oder in der ersten oder letzten Spalte befindet. sonst ist es falsch.Wenn Sie die Funktion
Boole
auf das Array anwenden, wird True in 1 und False in 0 konvertiert.Multiplizieren Sie die Matrix
m
mitb
. Dies multipliziert jede Zelle in m mit der entsprechenden Zelle in b.quelle
||
als OP ein paar Bytes speichern, und ich sehe ein paar andere Bytes, die Sie auch speichern können!GNU Sed, 31
Version 4.2.2 oder früher vor diesem Commit (Diskussion) .
Die Punktzahl enthält +1 für die
-r
Option.Eingabezeilen werden durch Zeilenvorschub getrennt. Elemente in jeder Zeile sind einzeilig getrennt.
Erläuterung
Probieren Sie es online aus.
quelle
1n;$n;:;s/ -?\w+ / : /;t;y/:/0/
.Oktave, 34 Bytes
Beachten Sie, dass für die Eingabe Semikolons zum Trennen von Arrayzeilen erforderlich sind:
Erläuterung:
Octave- (und MATLAB-) Array-Indizes basieren auf 1. Wenn Sie einen Bereich von angeben,
Array(1:end)
werden alle Elemente des (in diesem Beispiel eindimensionalen) Arrays angezeigt .Array(2:end-1)
gibt Ihnen alle Elemente außer dem ersten und dem letzten.Setzt auf
0
alle Elemente, die nicht in der ersten oder letzten Zeile oder Spalte enthalten sind:Wenn eine der Abmessungen kleiner als oder gleich 2, wobei der Bereich
end-1
ist weniger als 2 ist , damit das Ende des Bereichs(2:end-1)
geringer ist als am Anfang. In diesem Fall ignoriert Octave den Bereich und tut nichts. Dies ist analog zurfor
Schleife:Die Stoppbedingung ist bei der ersten Iteration wahr, sodass wir aus der Schleife herausfallen.
quelle
Gelee , 12 Bytes
Ich denke, das funktioniert, ich wickle meinen Kopf immer noch um Jelly. Probieren Sie es online!
(Danke an @Dennis für -2 Bytes)
Arbeitet durch Multiplizieren des Eingabearrays mit einem Array von 1s und 0s um jeweils eine Dimension kleiner. Zum Beispiel für
[[67,4,-8,5,13],[9,13,42,4,-7],[1,1,3,-9,29],[16,99,8,77,0]]
multiplizieren wir elementweise durchVollständige Erklärung
quelle
ES6,
524846 BytesBearbeiten: 4 Bytes dank @ user81655 gespeichert. Weitere 2 Bytes dank @ETHproductions eingespart.
quelle
g
den ein paar Bytes gespart werden:f=a=>a.map((b,i)=>i&&a[i+1]!=a.x?b.map?f(b):0:b)
f=
), aber du kannst es auf 46 bringen:f=a=>a.map((b,i)=>i&&a[i+1]+.5?b.map?f(b):0:b)
f=
. Ich bin auch ein wenig überrascht,+.5
aber ich sehe, dass es beim anderen Aufruf eine Zeichenfolge hinzufügt.Javascript,
625956 BytesDieser Ansatz erwartet einen String als Argument. Sie können hier sehen, was der Regex macht: https://regex101.com/r/kC6xA8/3
quelle
Mathematica, 55 Bytes
Testfall
Erläuterung
Die Hauptidee dieser Antwort ist die gleiche wie die von DavidC (erst eine Maskenmatrix konstruieren und dann mit der Originalmatrix multiplizieren), aber die Konstruktion der Maskenmatrix ist anders.
ArrayFilter[f,list,r]
Kartenf
auf jedes Elementlist
in einem Radius vonr
.Beachten Sie, dass Begrenzungselemente dupliziert werden, wenn nicht genügend Nachbarn vorhanden sind. Wenn
list
es sich um eine zweidimensionale Funktion handelt, funktioniert diese Funktion gut zusammenDet
, um das gewünschte Ergebnis zu erzielen, da doppelte Spalten oder Zeilen an vier Grenzen die Determinanten verschwinden lassen.Dabei wird
Power~Array~{4,4}
garantiert, dass die Determinanten für innere Positionen nicht Null sind. Undgibt die Maskenmatrix an.
quelle
Python, 50 Bytes
Akzeptiert eine Liste von Listen und ändert sie an Ort und Stelle. Pythons Slice-Syntax ist für diese Aufgabe nicht unpraktisch.
Ich habe gelernt, dass das Multiplizieren einer Liste mit einer negativen Zahl zu einer leeren Liste führt, die es dem obigen Code ermöglicht, mit kleinen Eingaben zu arbeiten.
quelle
Julia,
5035 BytesDies ist eine anonyme Funktion, die ein Array akzeptiert und an Ort und Stelle ändert. Um es aufzurufen, weisen Sie es einer Variablen zu.
Der Ansatz hier ist ganz einfach: Für das n × m- Eingangsarray A weisen wir A ij = 0 für alle i = 2, ..., n –1 und j = 2, ..., m –1 zu, indem wir Bereiche konstruieren von Indizes. Die Bereiche können leer sein, z. B. wenn n oder m = 1. In diesem Fall wird kein Austausch durchgeführt.
Probieren Sie es online aus
Dank Dennis 15 Bytes gespart!
quelle
C 62 Bytes
Hoffe, es ist in Ordnung, Länge / Breite des Arrays als Parameter zu übernehmen. Ich habe ein bisschen mit memset / bzero herumgespielt, aber mit multipliziert
sizeof(int)
die Codegröße drastisch erhöht.BEARBEITEN: 55 Bytes, wenn wir die Regeln weiter verbiegen und unser Array als Zeichen speichern können, da die Eingabe jeweils nur aus einer einzelnen Ziffer besteht.
EDIT: Danke Washington Guedes für den Tipp!
quelle
sizeof(int)
? Sie könnten4
stattdessen verwenden ...sizeof(int) != 4
auf meinem Computer: P-->
Operator aloof verwenden ;)Perl 6 , 28 Bytes
Dadurch wird die Eingabe direkt geändert
Verwendung
quelle
{.[1..*-2]»[1..*-2]X=0}
speichert 2 BytesJavaScript ES6,
696657 BytesWie es funktioniert
Diese Lösung bildet jeden y-Index
y
und x-Indexx
in der Eingabe ab und entscheidet anhand dieser beiden Indizes, ob sie verworfen werden sollen oder nicht. Es gibt vier Fälle, die wir aufbewahren müssen:x
ist 0y
ist 0x
ist gleich der Länge des inneren Arrays minus 1y
entspricht der Länge des äußeren Arrays minus 1Wir können uns mit ein wenig Multiplikation um die ersten beiden kümmern:
x*y
Gibt0
iff entwederx
odery
sind 0 und andernfalls eine positive ganze Zahl. Nun zum dritten: Wir könnten prüfen, obX.length>x+1
, aber das braucht eine Menge Bytes. Eine andere Möglichkeit, dies zu tun, besteht darin, zu überprüfen, ob der vorausliegende Artikel falsch ist, und zwar genau dann,undefined
wenn Sie versuchen, auf einen nicht vorhandenen Artikel zuzugreifen. Dies gilt jedoch auch0
für den Fall, dass das nächste Element ist . Wir addieren also 0,5, um sicherzustellen, dass dies nicht passiert:Zum Schluss der vierte Punkt: Da das äußere Array nur Arrays enthält und jedes Array wahr ist, können wir nur überprüfen
Y[y+1]
. Jetzt?0:N
konvertieren wir es zu,0
wenn sich alle oben genannten Tatsachen als wahr herausstellen.N
Andernfalls. Und das ist es!quelle
Netzhaut ,
31 24222 Bytes dank randomra gespeichert
Probieren Sie es online!
Es gibt wahrscheinlich einen besseren Weg, dies zu tun, da dies nur ein ziemlich einfacher Ersatz für mehrere Leitungen ist. Im Wesentlichen finden wir jede Zahl, der eine neue Zeile, eine bestimmte Anzahl von Zeichen und ein Leerzeichen vorangestellt sind, und unmittelbar gefolgt von einem Leerzeichen und dann und schließlich gefolgt von einer neuen Zeile. Diese Nummern werden dann alle durch ersetzt
0
.Dadurch wird der Spaltenabstand nicht beibehalten, aber ich denke nicht, dass dies ein Problem ist.
quelle
Java 8 als Lambda-Funktion:
828395 Zeichen / ByteLambda-Unterschrift:
int[][] -> (void)
(ieConsumer<int[][]>
)BEARBEITEN Einen Fehler gemacht, ich dachte, dass a [x, y] die x-te Zeile und die y-te Spalte ist. Natürlich sollte es ein [x] [y] sein!
BEARBEITEN Ich habe vergessen, den Code zu testen, und ich muss die Spalte jedes Mal innerhalb der Schleife auf Null zurücksetzen, +12 Bytes. : /
quelle
Haskell,
5958 BytesErweitert
quelle
++[last y]
in:(last y)
oder:last y
x : map f (…)
ist bereits vom Typ[a]
undlast y
hat Typa
, wohingegen(:) :: a -> [a] -> [a]
. Das Hinzufügen eines Elements am Ende einer Liste in Haskell ist ein Kinderspiel, da es sich bei diesen Listen um einfach verknüpfte Weiterleitungslisten handelt.k
in einen Infixoperator, sagen wir ,#
und die Argumente Flip ein Byte speichern:[x]#_=...
,(x:y)#f=...
,f=(#(# \_->0))
und Sie können den Namen Ihrer Hauptfunktion, dh fallenf=
für weitere zwei Bytes.Pyth, 18 Bytes
Erläuterung
Eingabearrays werden durch Zeilenumbrüche getrennt
Probieren Sie es hier aus
quelle
Groovy, 70 Bytes
Das ist nicht sehr kreativ, aber es ist kurz!
Erläuterung
Schluss mit einem arg
Iterieren Sie über das innere Array und überspringen Sie das erste und das letzte Element
Iterieren Sie über die mittleren Elemente im inneren Array
Setze die Elemente auf
0
und kehre zurücka
Tests
quelle
R,
716457 BytesBearbeiten Sie -7 Bytes, indem Sie sich explizit mit <2-Zeilen- oder <2-Spalten-Matrizen befassen. Bearbeiten Sie 2 -7 Bytes explizit, indem Sie Dimensionen der Matrix zuweisen, während Sie die Größe überprüfen
quelle
C ++,
8079 BytesErwartet das Array wie
int**
bei vorgegebenen Größenn
undk
:Eine Alternative, die für jeden Typ mit
size()
undvalue_type & operator[](int)
(98 Byte) funktioniert :Erweiterte Version
quelle
PHP,
82818071 BytesLaufen Sie wie folgt:
count
, was für Codegolf ein viel zu langer Name istquelle
for
ist es also sicher, immer zu iterierencount($z[0])-1
, um 1 Zeichen zu sparen .APL,
17 Bytes,15 BytesWie es funktioniert
⍳⍴⍵
generiert ein 2D-Array, in dem alle Zellen die Koordinaten aller Zellen des Arguments enthalten.1∊¨
Sucht in jeder dieser Zellen, wenn eine 1 vorhanden ist, und gibt eine 1 zurück, wenn dies der Fall ist, oder ansonsten eine 0. Dadurch wird eine Matrix erstellt, in der die erste Zeile und die erste Spalte 1 sind und alle anderen 0 sind.(⌽∨⊖)
kombiniert mit logischen "oder" zwei Versionen der Matrix, eine umgekehrt entlang der ersten und eine umgekehrt entlang der letzten Achse.⍵×
ist die Standardmultiplikation.quelle
Perl, 34 + 2 = 36 Bytes
Benötigt die
-p
Flagge:Wie es funktioniert:
quelle
Lua, 69 Bytes
Wenn ich statt Dos und Ends nur geschweifte Klammern hätte ...
quelle
SmileBASIC,
6951 BytesDas Ausfüllen eines 2D-Bereichs in einem Array erfordert normalerweise die Verwendung von FILL in einer Schleife. Es ist jedoch viel einfacher, mit 2D-Daten auf der Grafikseite zu arbeiten, sodass das Array zuerst dort kopiert wird.Oh, ich dachte, ich wäre so schlau beim Verwenden von Grafikbefehlen ... aber es stellt sich heraus, dass das Aufrufen von FILL ein paar Mal kürzer ist.
Wie auch immer, Funktionseingaben sind das Array und Breite / Höhe (Dies ist in Smilebasic Standard, da es keine Möglichkeit gibt, die Abmessungen eines Arrays zu überprüfen.)
quelle
APL (Dyalog Classic) , 12 Byte
Probieren Sie es online!
⍉⌽⍵
ist normalerweise Rotation (horizontal umkehren und transponieren)hier kombinieren wir es mit dem,
0⍪1↓⍵
was die erste Zeile durch Nullen ersetzt (eine Zeile fallen lassen, dann 0 oben verketten) in einen einzigen Zug:⍉0⍪1↓⌽
⍣4
wiederholt sich 4 mal⊢-
subtrahiert von der ursprünglichen Matrixquelle