Die Aufgabe
Schreiben Sie ein Programm oder eine Funktion, deren Eingabe eine Liste / ein Array X von Ganzzahlen ist und deren Ausgabe eine Liste von Mengen von Ganzzahlen Y ist , so dass für jedes Element e in jeder Menge Y [ i ], X [ e ] = i und so dass die Gesamtzahl der Elemente in den Mengen in Y der Anzahl der Elemente in X entspricht .
(Dies ist im Grunde derselbe Vorgang wie das Umkehren einer Hash-Tabelle / eines Wörterbuchs, außer dass dies stattdessen auf Arrays angewendet wird.)
Beispiele
In diesen Beispielen wird eine 1-basierte Indizierung vorausgesetzt. Sie können jedoch auch eine 0-basierte Indizierung verwenden, wenn Sie dies vorziehen.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Klarstellungen
- Wenn Sie möchten, können Sie ein Set als Liste darstellen. In diesem Fall spielt die Reihenfolge der Elemente keine Rolle, Sie können jedoch möglicherweise keine Elemente wiederholen.
- Sie können jedes vernünftige, eindeutige E / A-Format verwenden. Sie können beispielsweise Elemente einer Menge durch Leerzeichen und die Mengen selbst durch Zeilenumbrüche trennen.
- Y sollte endlich lang sein und mindestens so lang, dass alle Elemente von X als Array-Indizes vorliegen. Es kann jedoch länger als das maximale Element von X sein (die zusätzlichen Elemente wären leere Mengen).
- Die Elemente von X sind alle gültige Array-Indizes, dh nicht negative Ganzzahlen, wenn Sie eine 0-basierte Indizierung verwenden, oder positive Ganzzahlen, wenn Sie eine 1-basierte Indizierung verwenden.
Siegbedingung
Als Code-Golf- Herausforderung ist kürzer besser.
[5,5,6,6]
und[6,6,5,5]
identisch sein können?[5,5,6,6]
und[6,6,5,5]
kann keine identische Ausgabe haben, aber die Ausgabe für[5,5,6,6]
könnte auch zB gewesen sein[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
eine gültige Ausgabe für[5,5,6,6]
?Antworten:
MATL , 8 Bytes
Die Eingabe ist ein Spaltenvektor mit einem
;
Trennzeichen (zum Beispiel[2;2;2]
). Die Ausgabe ist die Zeichenfolgendarstellung eines Zellenarrays von Zeilenvektoren (zum Beispiel{[]; [1 2 3]}
). Ein Zeilenvektor eines einzelnen Elements ist derselbe wie eine Zahl (wird also{1; 2; 3}
statt ausgegeben{[1]; [2]; [3]}
).Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
Die meiste Arbeit erledigt die Matlab-Funktion höherer Ordnung
accumarray
, die Elemente in der zweiten Eingabe nach übereinstimmenden Werten in der ersten gruppiert und für jede Gruppe eine bestimmte Funktion anwendet. In diesem Fall@(x){sort(x).'}
gibt die Funktion die sortierten Elemente in jeder Gruppe aus und bewirkt, dass die Ergebnisse für alle Gruppen in ein Zellenarray gepackt werden.quelle
Python, 69 Bytes
Verwendet eine 0-basierte Indizierung.
quelle
Gelee ,
75 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Mathematica, 36 Bytes
Erläuterung
Für jeden
n
in{1, 2, ..., Max@#}
, woMax@#
die größte ganze Zahl in der Eingabeliste wird, berechnet derPosition
s won
erscheint in der Eingabeliste#
. DaPosition[{6,6,5,5},5]
(zum Beispiel) zurückkehrt{{3},{4}}
, kehren wir dannApply
Join
zu allen Elementen auf der Ebene{1}
des Ergebnisses zurück.quelle
Haskell , 45 Bytes
s
Nimmt eine Liste von ganzen Zahlen und gibt eine Liste von Listen zurück. 1-indiziert, um die Eingaben des Testfalls unverändert zu lassen (obwohl die Ausgabe einige zusätzliche leere Listen enthält).Probieren Sie es online!
Dies sind ziemlich einfache, verschachtelte Listenverständnisse. Die einzige kleine Verbesserung besteht darin, die Option zu nutzen, eine längere Liste zu erstellen, indem
sum
statt verwendet wirdmaximum
.quelle
PHP, 55 Bytes
0-indiziert.
quelle
R
684947 BytesÜberraschenderweise viel einfacher als die längeren Lösungen. Nimmt einen Vektor
x
von STDIN, erstellt einen Vektor von1
bismax(x)
, generiert implizit eine Längenlistemax(x)
und prüft, in welchen Indizesx
mit denen in der neuen Liste übereinstimmen. Druckt implizit die Ausgabe.Ältere Version:
Etwas andere Herangehensweise an die andere R-Antwort. Führt einen Vektor zu STDIN und erstellt eine Liste mit der Länge des Maximalwerts in der Eingabe. Durchläuft die Eingabe und fügt den Index an der richtigen Stelle ein.
Verwendet 1-basierte Indizierung.
quelle
Python 2 ,
918685 BytesIch programmiere auf meinem Handy, aber diese Herausforderung hat mir sehr gut gefallen. Ich kann dies definitiv weiter Golf spielen.
Probieren Sie es online!
quelle
Gelee , 9 Bytes
1-indizierte, leere Mengen, dargestellt als
0
, Mengen eines Elements, dargestellt alsN
Mengen mehrerer Elemente, dargestellt als[M,N,...]
Probieren Sie es online!
Wie?
quelle
JavaScript (ES6),
6462 Byte2 Bytes gespart dank @SteveBennett
Nimmt 0-indizierte Eingaben an. Gibt eine durch Kommas getrennte Liste von Mengen zurück.
Testfälle
Code-Snippet anzeigen
Alternative Version, 53 Byte
Wenn eine vereinfachte Ausgabe wie
'||||3,2|1,0'
akzeptabel ist, können wir einfach Folgendes tun:quelle
`{${o.join`},{`}}`
legal ES2015 ist."{" + o.join("},{") + "}"
, wenn das alles klarer macht.join`
entsprichtjoin('
. Hatte keine Ahnung, dass du das machen könntest.array.join` `
. Super verwirrend hier, weil Sie das in eine Template-Zeichenfolge einbetten, und noch verwirrender ist, dass die Join-Zeichenfolge},{
zufällig wie ein Teil der Template-Zeichenfolge aussah ... und sowieso nur seltsam und hässlich ist. :)Bash , 109 Bytes
Schade, dass es keinen eingebauten Wert für das maximale Array gibt.
Probieren Sie es online!
quelle
Mathematica 62 Bytes
Ich werde es für dich laufen lassen
Probieren Sie es online aus (fügen Sie einfach den Code mit Strg-V ein und drücken Sie die Umschalttaste + Eingabetaste) und
vergessen Sie nicht, die Eingabeliste am Ende wie im obigen Beispiel einzufügen
quelle
AppendTo
. Könnte{j,1,Length[#1]}
auch nur{j,Length@#}
oder noch kürzer sein{j,Tr[1^#]}
.Tr[1^#]
ist ein ziemlich häufiger Trick , um ein Byte zu sparenLength
.Perl 6 ,
36 3229 BytesVersuch es
Versuch es
Versuch es
Erweitert:
Gibt nullbasierte Indizes zurück, um den 1-basierten use cross operator (
X
) in Kombination mit+
op zu erhalten . (33 Bytes)Um es zu erhalten zurückzukehren Set s nur Add
set
dort (insgesamt 37 Bytes)quelle
R
8072 Bytes1-indiziert, nimmt
X
von stdin. Gibt eine Liste von Vektoren der Indizes mitNULL
als leere Menge zurück.Probieren Sie es online!
alte Version:
Probieren Sie es online!
quelle
Y=list();
funktioniert genauso gutfew
mir gelungen05AB1E , 10 Bytes
Probieren Sie es online!
quelle
Röda , 51 Bytes
Es ist ein Hafen der Python-Antwort von Uriel .
Eine andere Version (88 Bytes):
Probieren Sie es online!
Beides eine 1-indizierte.
quelle
PowerShell, 81 Byte
Probieren Sie es online!
1-indiziert.
quelle
GNU Make ,
214213208204 BytesE / A: Array über Argumente eingeben, Ausgabe an stdout, eines pro Zeile, durch Leerzeichen getrennt.
Erläuterung
Die Reihenfolge der Indizes in Mengen ist umgekehrt, da
P
sich vor dem Aktualisieren rekursiv aufruftA$2
(Aufruf in der Auswertung der rechten Seite ausgeführt).quelle
make
es eine Möglichkeit, selbst zu rechnen? Das Aufrufen von externen Programmen zu diesem Zweck fühlt sich ein bisschen wie Schummeln an, da Sie wahrscheinlich viel mehr Algorithmus in diese Programme einbauen und ein kürzeres Programm erhalten könnten.bc
undgrep
. Ich könnte auchtest
und benutzen$?
.dc
hat eine engere Syntax, aber ehrlich gesagt fühlen sich alle gleich an.Common Lisp, 91 Bytes
1-basierte Indizierung, gibt die Mengen als Listen zurück.
Probieren Sie es online!
quelle
k , 13 Bytes
Dies ist 0-indiziert.
Probieren Sie es online!
quelle