Herausforderung
Ihre Aufgabe für diese Frage besteht darin, ein Eingabearray von Ganzzahlen beim zweiten Auftreten jeder Ganzzahl in diesem Array aufzuteilen.
Nicht klar genug? Hier ist ein Beispiel, um zu helfen
Eingangsarray:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5]
Ausgabe:
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Erläuterung:
Hier ist das Array, in dem nur das zweite Element fett hervorgehoben ist:
[2 1 1 2 3 2 2 4 5 6 7 3 7 0 5 ]
Nun setzen wir die aufteilenden Array-Blöcke um diese fetten zweiten Vorkommen:
[2 1] 1 [] 2 [3 2 2 4 5 6 7] 3 [] 7 [0] 5 []
und wickeln Sie diese aufgeteilten Arrays in ein Array, um das endgültige zu erhalten
[[2 1] [] [3 2 2 4 5 6 7] [] [0] []]
Beachten Sie, dass beim Auftreten benachbarter zweiter Vorkommen leere Arrays vorhanden sind.
Regeln
Wie üblich müssen Sie ein vollständiges Programm oder eine Funktion schreiben, die das Eingabearray über STDIN, ARGV oder Funktionsargument übernimmt.
Eingang
Die Eingabe besteht aus einem beliebigen geeigneten Array (oder Array-ähnlichen) Format von Ganzzahlen.
Beispielsweise wäre Folgendes akzeptabel:
2 1 1 1 4 5 6
[2 1 1 1 4 5 6]
[2, 1, 1, 1, 4, 5, 6]
Ausgabe
Bei der Ausgabe an STDOUT kann Ihr Array auch in einem beliebigen (verschachtelten) Array-Format gedruckt werden, z
[[2 1] [1 4 5 6]]
[[2, 1], [1, 4, 5, 6]]
{{2, 1}, {1, 4, 5, 6}}
(Dies ist normalerweise die native Zeichenfolgendarstellung von Arrays in Ihrer Sprache.)
Beachten Sie auch, dass nachgestellte leere Arrays als Teil des Arrays gedruckt werden sollten.
Wertung
Dies ist Code-Golf, also gewinnen Sie den kürzesten Code in Bytes!
quelle
""
als leeres Array? Dies riecht nach Favourismus gegenüber einer bestimmten Golfsprache.2 1, 1 4 5 6
?Antworten:
APL 25
Beispiel:
Altes:
Dies ist eine schöne Frage für den Key Operator (⌸), der mit Dyalog APL v14 eingeführt wurde. Es verwendet die linke Argumentfunktion ({1 ↑ 1 ↓ ⍵}) und gibt für jedes eindeutige Argument die Indizes im Vektor für dieses Argument an. Hier nehme ich den zweiten Index, überprüfe dann, welcher der Indizes in dieser Liste vorhanden ist ((() ∊) und verwende den resultierenden Booleschen Wert zum Teilen des ursprünglichen Vektors.
Kann hier online ausprobiert werden:
http://tryapl.org
quelle
1↓¨{1,∨⌿<\2=+\∘.=⍨⍵}⊂1∘,
APL (Dyalog 14) (31)
Dies ist eine Funktion, die ein Array annimmt und ein verschachteltes Array zurückgibt.
Prüfung:
Erläuterung:
0,⍵
: Fügen Sie zur einfacheren Verarbeitung ein0
an der Vorderseite von hinzu⍵
. (Es zählt nicht als Vorkommen.)(
...)⊂
: Teilen Sie das Array gemäß der angegebenen Bitmaske auf. In1
der Bitmaske beginnt jeweils eine neue Gruppe .+\∘.=⍨⍵
:⍵
Finden Sie für jeden Wert in (das Original) alle Vorkommen in⍵
. Machen Sie dann eine laufende Summe für jeden Wert und geben Sie eine quadratische Matrix an, die für jede Position angibt,⍵
wie viele von jedem Wert bereits aufgetreten sind.↓
: Teilen Sie die Matrix durch ihre Zeilen und geben Sie für jeden Wert ein Array an, das die Häufigkeit angibt, mit der die einzelnen Positionen aufgetreten sind.2⍳⍨¨
: Suchen Sie in jedem dieser Arrays den Index des ersten Arrays2
.(⍳⍴⍵)∊
: Prüfen Sie für jeden möglichen Index in⍵
, ob er in der Liste der Indizes des zweiten Vorkommens enthalten ist. (Diese starten jede Gruppe mit Ausnahme der ersten.)1,
: Fügen Sie1
vorne ein hinzu, um den Anfang der ersten Gruppe zu markieren.1↓¨
: Entfernen Sie das erste Element aus jeder Gruppe. (Dies sind die addierten0
und die zweiten Vorkommen der einzelnen Werte.)quelle
J
28,24 charBesonderer Dank geht an randomra .
Das funktioniert so. Über alle Präfixe (
\
) des Eingabearrays wird angezeigt, wie viele (+/@
) Elemente des Präfixes dem letzten Element (={:
) dieses Präfixes entsprechen. Wenn diese Zahl 2 ist, wissen wir, dass dies das zweite Vorkommen dieses Elements im Array ist, also teilen wir das Array dort mit auf<;._1
.Alte Sache mit Art Tricks:
(1&,<;._1~1,1=i.~(]-{)/:@/:)
.quelle
(1&,<;._1~1,2=+/@(={:)\)
ist 4 Bytes kürzer und viel einfacher. (/:@/:
Mathematica,
585149 BytesDies ist eine unbenannte Funktion, die eine Liste wie folgt annimmt
und gibt eine verschachtelte Liste wie
Wie es funktioniert
Dies nutzt etwas ziemlich dunkle Magie mit
SplitBy
.Ich verfolge die Vorkommen jeder Zahl in einer Funktion
f
. In Mathematica können Sie den Wert einer Funktion für jede Eingabe separat definieren, und Sie müssen den Wert nicht für alle möglichen Eingaben angeben (es ist eher eine Hash-Tabelle für Steroide).Ich beginne mit der Initialisierung
f
auf 0 für Werte, die in der Eingabe mit vorhanden sind(f@#=0;#)&/@
.Nun
SplitBy
nimmt eine Liste und eine Funktion und „Splits Liste in Unterlisten von Läufen von aufeinanderfolgenden Elementen besteht, die den gleichen Wert zu geben , wennf
angewendet wird“ (Anmerkung , dieSplitBy
nicht der Fall ist entfernen alle Elemente). Aber der (undokumentierte) Haken ist, dass jedes Element zweimalf
aufgerufen wird - wenn man es mit seinem Vorgänger und seinem Nachfolger vergleicht. Also wenn wir das tunWir bekommen nicht nur eine Nummer, sondern diese wird gedruckt
Das sind 6 Aufrufe für 3 Vergleiche.
Wir können die Liste vor jedem zweiten Vorkommen teilen , wenn wir eine Funktion schreiben, die immer zurückgibt,
False
aber zurückgibt,True
wenn ein zweites Vorkommen mit dem Element davor verglichen wird. Dies ist die dritte Überprüfung dieses Elements (zwei Überprüfungen beim ersten Auftreten plus die erste Überprüfung beim zweiten Auftreten). Daher verwenden wir++f[#]==3&
. Das Schöne ist, dass dies bereitsFalse
bei der zweiten Überprüfung des zweiten Auftretens wieder auftritt, so dass ichTrue
für aufeinanderfolgende zweite Vorkommen zurückkehren kann, aber immer noch zwischen diesen aufgeteilt bin . Ebenso dies wird nicht geteilt , nachdem zweite Vorkommen, weil die Funktion bereits kehrtFalse
wieder auf die zweite Prüfung.Jetzt möchte die Frage, dass wir auch diese zweiten Vorkommen entfernen, sodass wir das erste Element aus jeder Liste mit entfernen
Rest/@
. Aber natürlich wollen wir nicht das allererste Element in der Eingabe entfernen, also fangen wir tatsächlich an, indem wir ein Elementa
an den Anfang der Liste mit einfügen{a}~Join~#
.a
ist eine undefinierte Variable, die Mathematica nur als unbekannt behandelt, so dass sie keine anderen Werte von beeinflusstf
. Dies stellt auch sicher, dass das erste tatsächliche Element in der Eingabe wie jedes andere Element seine zwei Prüfungen erhält.quelle
Boole
dort eigentlich auch nicht .Python, 148 Bytes
Ziemlich schreckliche Lösung. Es muss einen besseren Weg geben ...
Mit anrufen
s([2, 1, 1, 1, 4, 5, 6])
.Ungolfed-Version
quelle
Haskell,
11511310688Dies speichert die Menge jedes Elements, die bisher als Funktion von Elementen erschienen ist, zu ihrer jeweiligen Menge, was ein interessanter Trick ist.
Dies funktioniert mit
%
einer Funktion, die mit einer Funktion f und einem Argument versehen ist. Diese Funktionx
gibt eine neue Funktion zurück,f
die auf das Argument angewendet wird, wenn es anders ist alsx
und1 + f x
ansonsten.Zum Beispiel
3 % const 0
ist es eine Funktion, die für jedes Argument 0 zurückgibt, mit Ausnahme von 3, für das 1 zurückgegeben wird. update: fused thefoldl
, um ein viel kleineres Programm zu erhalten.quelle
Ruby 66 Demo
Ruby Stabby Lambda, das ein Array als Parameter verwendet und ein Array von Arrays zurückgibt.
quelle
Python: 100 Byte
Einfache Lösung. Ich durchlaufe die Liste, zähle, wie oft ein Zeichen zuvor aufgetaucht ist, und hänge den Teil seit der letzten Prüfung an die Ausgabeliste an.
quelle
Rubin, 66
Erläuterung
e
ist ein Hash der Anzahl der Vorkommen für jedes Element,r
ist ein Array, in dem das Ergebnis gespeichert wird.1
.2
, müssen wir uns aufteilen. Fügen SieArray
dem Ergebnis ein Leerzeichen hinzu .Array
Ergebnis hinzu.quelle
CJam,
2524 BytesNimmt Eingaben von STDIN wie
und Ausgänge wie
Im Grunde iteriere ich über alle Elemente des Arrays, eins nach dem anderen, indem ich sie in ein anderes Array lege. Dann erhalte ich die Anzahl des aktuellen Elements im anderen Array. Wenn es 2 ist, starte ich ein anderes Array von diesem Ort. Diese Art des zufälligen Array-Starts kann nur in einer Stack-basierten Sprache erreicht werden.
Code-Erweiterung :
Probieren Sie es hier online aus
1 Byte aus Martins Tipp im Chat gespeichert
quelle
Ruby, 64 Bytes
quelle
Perl 5: 36
Nicht sicher, ob dies akzeptabel ist, da hier keine tatsächliche Aufteilung stattfindet.
Beispiel:
quelle
-pa
als zwei zusätzliche Bytes zu zählen (weil es nur zwei Bytes "kostet", da Sie es als-pae
anstatt schreiben können-e
). Das wäre also 38, nicht 36.CJam, 28 Bytes
Nimmt Eingaben auf STDIN wie
und druckt die Ausgabe auf STDOUT wie
Beachten Sie, dass leere Zeichenfolgen und leere Arrays in CJam dasselbe sind und
""
standardmäßig angezeigt werden (dies ist die native Darstellung von leeren Arrays).(Bevor die Herausforderung veröffentlicht wurde, habe ich angefangen, daran zu arbeiten, weil wir darüber diskutierten, wie schwierig die Herausforderung sein würde.)
Erläuterung
Grundsätzlich dupliziere ich jedes Element im Array, es sei denn, es ist das zweite Vorkommen. In diesem Fall ersetze ich die erste Kopie durch ein Leerzeichen. Aus Golfgründen ist diese modifizierte Anordnung umgekehrt aufgebaut. So
[2 1 1 2 3 2 3]
wird esDann wähle ich jedes zweite Element vom Ende aus, das das ursprüngliche Array ist, wobei jedoch das zweite Vorkommen durch Leerzeichen ersetzt wird, d. H
Schließlich teile ich das Array einfach nach Leerzeichen auf. Hier ist eine Aufschlüsselung des Codes:
quelle
""
in der ersten Überarbeitung der Frage ausdrücklich erlaubt ist. In der aktuellen Version heißt es: "Jedes geeignete Format ... normalerweise native Zeichenfolgenwiederholung von Arrays".Unix-Tools, 100 Bytes
Schließt die Eingabe über stdin aus. Es ersetzt im Grunde nur jedes zweite Vorkommen durch
"] ["
. Funktioniert nicht mit leeren Strings,[]
gibt einen leeren String aus, was meiner Meinung nach eine praktische Darstellung eines leeren Arrays ist :)quelle
11
? wird es konvertiert1][
?APL, 42 Zeichen
Beispiel:
Ausgabe:
Hier getestet.
Wenn ich eine Zeichenfolge ausgeben muss, die genau als die richtige Struktur in APL interpretiert wird ... 49 Zeichen
quelle
1↓1
schien, als würde das Problem durch das Vorbereiten von behoben , aber das sieht zu seltsam aus.Java, 223
Dies funktioniert nur unter Oracle oder OpenJDK JRE, da ich diese Besonderheit bei der Implementierung von Quantifier und Length Check in Look- Behind ausnutze, um Look-Behind mit variabler Länge zu implementieren.
Die meiste Arbeit wird in der Regex erledigt, die unten in roher Form gezeigt wird:
Bevor wir den obigen regulären Ausdruck betrachten, wollen wir uns den äquivalenten regulären Ausdruck in .NET ansehen, der einfacher ist, da er einen Look-Behind mit variabler Länge direkt unterstützt (der Look-Behind in .NET wird höchstwahrscheinlich im Rechts-Links-Modus durchgeführt). :
*\b(\d+)\b
und*
am Ende entspricht eine Zahl und den umgebenden Räumen (falls vorhanden). Die gebundenen Überprüfungen sollen verhindern, dass eine Teilnummer abgeglichen wird, da Leerzeichen auf beiden Seiten optional sind. Außerdem wird die Nummer erfasst, um zu überprüfen, ob es sich um das zweite Auftreten im Array handelt.(?<=(.*\b\1\b){2})
Überprüft, ob 2 Instanzen der oben erfassten Nummer gefunden wurden.(?<!(.*\b\1\b){3})
Überprüft, ob 3 Instanzen der erfassten Nummer gefunden wurden. In beiden Bedingungen wird zusammengenommen davon ausgegangen, dass es bisher nur zwei Instanzen der Zahl gibt. Die gebundenen Prüfungen dienen dazu, sicherzustellen, dass die gesamte Zahl getestet wird.Zurück zur Java-Version. Um einen Look Behind mit variabler Länge zu implementieren, transformieren wir
zu
Ich bin ein bisschen von Hand
.
bewegt, was die Tatsache betrifft , dass Zeilentrenner nicht enthalten sind, aber es kann leicht behoben werden und ich möchte die Syntax nicht weiter verkomplizieren.Das Look-Ahead hat immer eine Länge von 0, und die Längenprüfung wird aufgrund der Implementierung des
*
Quantifizierers bestanden.Das
^
ist nicht notwendig, damit es funktioniert, aber es ist da, damit der fehlerhafte Fall schneller fehlschlägt. In der Oracle / OpenJDK-Implementierung wird ein Rückblick durchgeführt, indem die minimale Länge des Musters zurückgenommen, dann abgeglichen, dann gespült und wiederholt wird, indem die Länge erhöht wird, bis eine Übereinstimmung gefunden wird, oder im schlimmsten Fall auf die maximale Länge des Musters . Mit^
stelle ich sicher, dass die Präfixzeichenfolge nur einmal übereinstimmt.Die Vorausschau innerhalb des Rückblicks ist jedoch nicht durch die rechte Begrenzung des Rückblicks begrenzt, sodass sie bis zum Ende der Zeichenfolge passen kann. Um die Grenze zu bestätigen, fange ich den Rest der Zeichenfolge in einer Vorschau in einer anderen Erfassungsgruppe ein und benutze sie, um die Herrschaft des Musters mit variabler Länge zu begrenzen.
Da mein Muster bereits mit beginnt
.*
, muss ich kein weiteres.*
voranstellen.quelle
Perl 108
In Aktion:
Hinweis: Die beiden ersten Zeilen
$Data::...
dienen nur der besseren Darstellung und die dritte Zeile@a=@b=@e=();
dient dazu, das Werkzeug für mehrere Zeilen zu verwenden.quelle
R 76
Ausgabe für das Beispiel: Eine Liste von fünf Elementen, einschließlich drei leerer Vektoren. (
numeric(0)
).Übrigens: Der Code generiert eine Warnmeldung, die ignoriert werden kann.
quelle
awk 29
Dies lässt sich mit den Eingabe- und Ausgabeformaten ein wenig frei. Eingabe "Array" ist vertikal, eine Zahl pro Zeile. Die Ausgabe erfolgt ebenfalls vertikal (eine Zahl pro Zeile), wobei die Arrays durch Striche getrennt sind.
Eingang:
Ausgabe:
quelle
Pyth 30
32Ich experimentiere zum ersten Mal mit Pyth. Es ist die gleiche Lösung wie in meiner Python-Lösung.
Sie können es online ausprobieren: Pyth Compiler / Executor
ZB die Eingabe
wird gedruckt
Erläuterung:
quelle
=Y+Y...
?~Y...
Python 2, 84
Die Liste
l
ist die bisherige Ausgabe. Wir iterieren über die Elemente. Wenn es sich bei der aktuellen Version um die zweite handelt, wird eine neue leere Unterliste erstellt. Andernfalls fügen wir es der neuesten Unterliste hinzu. Die Liste der bisher angezeigten Elemente wird in gespeichertp
. Seltsamerweise scheint die Rekonstruktion der Liste kürzer zu sein als das Aufteilen der Eingabe.quelle
Pure Bash
1119481 nur zum Teilen:
Die zweite Zeile
declare -p c
nur die Variable ausgegebenStichprobe:
Hinweis: Die Zeile
local b c d i
wird nur zum mehrmaligen Ausführen der Funktion benötigt.Für die sexieste Präsentation (+26)
Wird ungefähr so aussehen:
quelle
Scala,
122,111Nimm die Charaktersammlung, drucke in Form von
[21][][3224567][][0][]
,122111:... oder nimm eine Charaktersammlung und gib verschachtelte Listen zurück,
135129:Ich bin sicher, es gibt einige Einsparungen, die ich erzielen könnte, ich habe nicht zu genau nachgesehen.
quelle
Python 220 Bytes
Das Folgende sind 220 Bytes, was im Vergleich zu vielen anderen nicht großartig ist, aber mit größeren ganzen Zahlen schnell genug läuft!
quelle
=
, ändernxlist
undresult
zu kürzeren Namen und Leerzeichen entfernen um==
,;
und:
. Wenn Sie weitere Hilfe benötigen, geben Sie einfach@NoOneIsHere
(oder einen beliebigen Benutzernamen) ein und ich / der Benutzer wird versuchen zu helfen.Java: 563 Bytes
Beachten Sie, dass dies Java 8 verwendet. Vor JDK8 wären aufgrund von foreach einige Bytes länger.
quelle
Integer.MAX_VALUE
in2147483647
? Es ist der gleiche Wert mit weniger Bytes. AuchIndexOutOfBoundsException
zu verkürzen zu könnenException