Einführung
Betrachten Sie zwei nicht leere Ganzzahl-Arrays: A = [0 3 2 2 8 4] und B = [7 8 7 2] . Um sie auszurichten , gehen wir wie folgt vor:
Wiederholen Sie jedes Array so oft, bis die Gesamtlänge lcm (Länge (A), Länge (B)) erreicht ist . Hier steht lcm für das niedrigste gemeinsame Vielfache.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Führen Sie eine elementweise Addition für die wiederholten Arrays durch und schneiden Sie das Ergebnis an jeder Position ab, an der eine der beiden Stellen eingeschnitten ist.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Dieses Array von Arrays ist Ihr Ergebnis.
Die Aufgabe
Ihre Eingaben sind zwei nicht leere Felder mit ganzen Zahlen, und Ihre Ausgabe ist das Ergebnis der oben definierten Ausrichtungsaddition. Die Ein- und Ausgaben können in jedem vernünftigen Format erfolgen. Sie müssen sich nicht um einen Ganzzahlüberlauf sorgen, wenn Sie die Addition durchführen.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt.
Testfälle
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
Antworten:
JavaScript (ES6),
101 bis99 ByteÜbernimmt die Eingabe als 2 Arrays. Gibt eine Zeichenfolge zurück.
Wie es funktioniert
Wir iterieren auf dem ersten Array
a
mit einem Zeiger,i
während wir einen anderen Zeigerj
auf das zweite Array aktualisierenb
. Die Summena[i] + b[j]
werden an die Ausgabezeichenfolge angehängts
. Ein Separator wird jedes Mal eingesetzti == 0
oderj == 0
. Wir wiederholen diesen Vorgang, bisj
er genau am Anfang undb
am Ende einer Iteration steht.Hinweis: Wenn der
|
Operator angewendet wird,a.map(...)
wird er entweder aufNaN
(wenn era
mehr als ein Element enthält) oder auf den aktuellen Wert vonj
(wenn era
genau ein Element enthält) erzwungen. Daher ista.map(...)|j == j
in allen Fällen und hier sicher zu bedienen.Testfälle
Code-Snippet anzeigen
quelle
Haskell,
8479 BytesMeine erste Version war dieselbe in besser lesbarem Layout:
Verwenden einer lokalen Definition, um
(%)
zusätzliche Argumente füra
und zu vermeidenb
. Erstaunlicherweise ist dies fast dieselbe Lösung, die fast zur selben Zeit wie bei @ nimi angegeben wurde, von der ich die Idee hatte, nur eine Zeile für die lokale Definition zu verwenden.Verwendungszweck:
quelle
!
.PHP,
126120 BytesProbieren Sie es hier aus!
Anonyme Funktion, die das resultierende Array von Arrays zurückgibt.
Im Wesentlichen durchlaufen wir den Inhalt unserer beiden Arrays und modifizieren unseren Iterator um die Länge des Arrays, um das "Kopieren" zu simulieren. Wir nehmen jeden der Werte aus den Arrays, addieren sie und fügen sie einem Array in hinzu
$c
. Wenn wir das Ende eines unserer Eingabearrays erreichen (eine Aufteilung in Bezug auf die Herausforderung), beginnen wir, in ein neues Array zuzuweisen$c
.Der Grund für die
do while
Schleife ist, dass unsere Bedingung auf basiert$i
, die bei beginnt0
. Wenn wir eine Schleife verwenden, in der die Bedingung zu Beginn geprüft wird, wird die Schleife nicht ausgeführtWir beenden die Summierung erst, wenn wir gleichzeitig das Ende beider Arrays erreicht haben, was den LCM implizieren würde.
quelle
$b[$i%$y]
? Sie können 3 Bytes einsparen, indem Sie$x=count($a)
zur ersten Verwendung von$x
wechseln. das gleiche für$y=count($b)
und ein Byte mit bitweise oder in derwhile
BedingungHaskell,
8784 BytesAnwendungsbeispiel:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Einfache Rekursion. Basisfall: Beide Listen sind leer. Wenn nur einer leer ist, starten Sie den Computer mit einer Vollversion neu und starten Sie einen neuen Cluster in der Ausgabe. Wenn keines leer ist, stellen Sie die Summe dem from-Element voran.
Schauen Sie sich auch die Antwort von Christian Sievers an , die fast identisch ist und einige Sekunden zuvor gepostet wurde.
quelle
Oktave, 113 Bytes
Diese Funktion kann direkt aufgerufen werden, um sie in Klammern zu setzen und als (@ (a, b) ...) aufzurufen. ([1 2 3 4], [6 4 5])
quelle
CJam , 30 Bytes
Probieren Sie es online!
Nimmt Eingaben als Listenpaar entgegen.
Erläuterung
Die Idee ist, einige Marker in die Eingabearrays einzufügen (in Form von kurzen Strings), die angeben, wo das ausgerichtete Array endet und wo die Unterbrechungen in den Arrays eingefügt werden müssen. Auf diese Weise können wir vermeiden, das LCM berechnen zu müssen.
quelle
Jelly ,
212018 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 3.5 - (
146137134130 + 12) = 142 BytesIch kann nicht herausfinden, wie man die ganze for-Schleife in eine Zeile setzt.
Bearbeitungen:
quelle
gcd
Funktion ist infractions
, nichtmath
.3.4.3
.l*k
undprint(r);r=[]
in der letzten Zeile haben.Python 2, 119 Bytes
Übernimmt die Eingabe von stdin als zwei durch Komma getrennte Tupel und gibt die resultierenden Listen an stdout aus. Beendet durch Auslösen der
ZeroDivisionError
Ausnahme, da dies zulässig zu sein scheint .Wenn die Eingabe beispielsweise lautet
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, wird das Programm gedrucktzu stdout und die ausnahme traceback zu stderr.
quelle
J ,
3432 BytesProbieren Sie es online!
Erläuterung
quelle
Haskell, 166 Bytes
Dies ist wahrscheinlich nicht der eleganteste Ansatz: Grundsätzlich erstellt die Funktion
?
eine Liste der benötigten Länge mit diesen Summen und%
schneidet diese Summe erneut auf.!
ist die letzte Funktion, die diese beiden verbindet.quelle
ind
durchk
oder etwas ersetzen , und es gibt einige unnötige Klammern umdrop i l
undmap(+(-i))ind
. Betrachten Sie auch zwei Fälle für%
, mit Mustervergleich aufl
.[PHP],
183152135 BytesSchöne Version:
Ausgabe:
quelle
$i=$j=$k=0;
ist unnötig, wenn du+$i
für die Array-Indizes in der anhängenden Zuweisung (-8 Bytes) etc. verwendest.$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, zweimal).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
braucht kein Leerzeichen (-1).$i=$j=0;
Teil entfernen, da die ersten Werte von Arrays nicht korrekt sind. Ich habe die Logik ein wenig modifiziert, damit ich nicht weiß, wie ich ternäre Operatoren in diesem Fall implementieren soll. Danke für++$i
Ratschläge.unset($i);$A[+$i]
. Der+
wirdnull
in eine Ganzzahl umgewandelt0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
->isset($A[++$i])?:$i=!++$k|!++$f;
spart noch jeweils 5 Bytes. Speichern Sie eine weitere mit$f<2
anstelle von$f!=2
. und zwei weitere mitwhile($f=$f<3){...}
stattwhile($f<2){$f=0;...}
(initialisiert und setzt$f
auf 1 zurück, es sei denn, es wird zweimal erhöht)PowerShell ,
147 -145 ByteProbieren Sie es online!
( Golf Vorschläge willkommen. Ich denke, es gibt wahrscheinlich weitere 10 bis 15 Bytes, die daraus herausgepresst werden können. )
Nimmt Eingaben als zwei explizite Arrays (mit der
@(...)
Syntax) als Befehlszeilenargumente. Gibt eine Hashtabelle der resultierenden Arrays zurück, da mehrdimensionale Arrays in PowerShell merkwürdig werden können und dies konsistenter ist. Setzt einige anfängliche Variablen und gibt dann einedo
/until
-Schleife erneut ein, wobei die Bedingung so lange gilt, bis$i
der lcm-Wert des Arrays erreicht ist .Bei jeder Schleifeniteration werden die entsprechenden Werte
$a
und addiert und$b
als Array behandelt,,(...)
bevor sie$o
an der entsprechenden Stelle in die Hash-Tabelle eingefügt werden$j
. Die Array-Kapselung ist erforderlich, um eine arithmetische Addition zu verhindern - dies erzwingt+=
stattdessen eine Überlastung der Array-Verkettung. Dann eine Bedingung an$x
und$y
(die Anzahl), um zu bestimmen, ob wir uns an einer Arraykante befinden - wenn ja, erhöhen wir diese$j
.Schließlich bleiben wir
$o
in der Pipeline und die Ausgabe ist implizit.(Hinweis: Aufgrund der Art und Weise, wie PowerShell Hashtabellen mit der Standardeinstellung auflistet
Write-Output
, wird diese tendenziell "rückwärts" ausgegeben. Wie in Beispiel 1 befindet sich das sich ergebende Array "0" am "unteren Rand" der Ausgabe Wird verwendet, wenn Sie diesen Code zB in eine Rückgabevariable gekapselt haben. Es sieht nur seltsam aus, wenn er gedruckt wird.)2 Bytes wurden gespart, indem $ x und $ y in die Array-Indizierung verschoben wurden, anstatt sie zu trennen (zwei Semikolons wurden gespeichert).
quelle
Python 2, 113 Bytes
quelle
not
s sein<1
?Python 3.5,
210176173169158 BytesNimmt zwei Listen als Eingabe und druckt alle Listen.
Es ist meine erste Antwort und ich weiß noch nicht, wie man Golf spielt. Die Grundidee, die ich verwendet habe, besteht darin, zwei Zähler für jede Liste zu haben, die einen Split und eine aktuelle Liste angeben, an die die hinzugefügten Werte angehängt werden. Sobald ein Split auftritt, wird die aktuelle Liste gedruckt und eine neue leere erstellt.
quelle
x=[];c=len(a);d=len(b);e=f=0
. Außerdemtrue
können sich1
, undx.append(a[e]+b[f])
kann werdenx+=a[e]+b[f],
.if
undwhile
Anweisungen benötigen keine Klammern.Schläger 373 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
Clojure,
280206 BytesNun, das macht viel mehr Sinn. Generieren der elementweisen Summe, Hinzufügen von Positionsmetadaten, Hinzufügen des Summenwerts zu jeder Partition.
Original: Ich hoffe, das zu verbessern, aber das ist das Sortierste, das ich derzeit habe.
Ungolfed und wortreich:
Beginnt mit dem "Zusammenführen" eines unendlichen Zyklus von Sammlungen
a
undb
fügt Metadaten zum Index jedes Elements in der Sammlung hinzu, bis beide Sequenzen wieder bei Index 0 beginnen.Diese Sammlung
c
wird dann mit Partitionsdaten (eine kumulative Summe von Einsen und Nullen) zusammengeführt, partitioniert und das letzte Element (die Summe von Elementen) wird ausgewählt.Ich denke, für signifikante Verbesserungen ist ein völlig anderer Ansatz erforderlich.
quelle
PHP,
150121119 BytesAnonyme Funktion nimmt Eingaben als Arrays entgegen.
Nervenzusammenbruch
quelle
C ++ 14, 206 Bytes
Als unnamed generic lambda, erfordern Eingang Behälter
P
,Q
und AusgangsbehälterR
zu sein wievector<vector<int>>
.Ungolfed und Nutzung:
quelle
Mathematica 112 Bytes
Dies könnte wahrscheinlich verbessert werden. Die Idee ist, ein 2D-Array mit dem zweiten Element zu erstellen, das verwendet wird, um den Lessor des Zählers zu verfolgen und die Länge jedes Eingangs-Arrays zu ändern.
Verwendungszweck
quelle
JavaScript (ES6), 131 Byte
Leicht ungolfed:
d
alse
auch Zahlen enthalten, wird die Summe der ersten Zahl angehängts
und die verbleibenden Elemente werden rekursiv verarbeitets
an das Ergebnis angehängtr
und das andere Array auf das ursprüngliche Array zurückgesetztLeider hat diese Lösung nicht die skrupellose Effizienz von @ Arnauld's, aber ich denke zumindest, dass es eine schöne Lösung ist.
quelle