Gehen Sie anhand einer Liste mit streng positiven ganzen Zahlen jede einzelne Zahl durch und ersetzen Sie alle Vorkommen durch aufeinanderfolgende Indizes (null oder eins basierend) einer neuen Reihe.
Beispiele
[]
→ []
/[]
[42]
→ [0]
/[1]
[7,7,7]
→ [0,1,2]
/[1,2,3]
[10,20,30]
→ [0,0,0]
/[1,1,1]
[5,12,10,12,12,10]
→ [0,0,0,1,2,1]
/[1,1,1,2,3,2]
[2,7,1,8,2,8,1,8,2,8]
→ [0,0,0,0,1,1,1,2,2,3]
/[1,1,1,1,2,2,2,3,3,4]
[3,1,4,1,5,9,2,6,5,3,5,9]
→ [0,0,0,1,0,0,0,0,1,1,2,1]
/[1,1,1,2,1,1,1,1,2,2,3,2]
Antworten:
JavaScript (ES6), 26 Byte
1-indiziert.
Probieren Sie es online!
Kommentiert
quelle
-~
- das ist ein absolutes Juwel.a
die Werte zu speichern, aber es ist erforderlich , um-
/~
der Index , so dass kein Byte gespeichert wird.-~
ist tatsächlich eine häufig verwendete Alternative zu+1
(da es unterschiedliche Priorität hat) in vielen SprachenR , 27 Bytes
Probieren Sie es online!
Erklärung:
ave(x,x,FUN=seq)
teilt Vektorx
in Untervektoren unter Verwendung von Wertenx
als Gruppierungsschlüssel auf. Dannseq
wird für jede Gruppe eine Funktion aufgerufen und jedes Ergebnis wird an der ursprünglichen Gruppenposition neu angeordnet.Besser ein Beispiel sehen:
Hinweis :
seq(y)
Funktion gibt eine Sequenz für1:length(y)
den Fally
hatlength(y) > 1
, aber gibt eine Sequenz aus ,1:y[1]
wenny
enthält nur ein Element.Dies ist zum Glück kein Problem, denn in diesem Fall wählt R - mit vielen Warnungen beklagend - nur den ersten Wert aus, der übrigens das ist, was wir wollen :)
quelle
ave
zuvor gesehen .MATL , 4 Bytes
Diese Lösung basiert auf 1
Probieren Sie es bei MATL Online aus !
Erläuterung
Verwendet
[1,2,3,2]
als Beispielquelle
APL (Dyalog Unicode) , 7 Bytes
Vielen, vielen Dank an H.PWiz, Adám und dzaima für ihre Hilfe beim Debuggen und Korrigieren.
Probieren Sie es online!
Erläuterung
Die nicht stillschweigende 10-Byte-Version wird zunächst einfacher zu erklären sein
Die implizite Version macht drei Dinge
⍵
used in,\⍵
as,\
on the right von sich aus und kann implizit herausfinden, dass es auf das richtige Argument angewendet werden soll.⍵=
ersetzen wir das⍵
mit⊢
, was für das richtige Argument steht⍵
), die geschweiften Klammern entfernen,{}
da implizite Funktionen sie nicht verwendenquelle
AWK , 14
Probieren Sie es online!
Das Obige führt eine einseitige Indizierung durch. Wenn Sie eine auf Null basierende Indizierung bevorzugen, ist dies ein zusätzliches Byte:
Probieren Sie es online!
quelle
{print++a[$1]}
ohne dass Speicherplatz zu funktionieren scheintJ , 7 Bytes
Probieren Sie es online!
1-indiziert.
Erläuterung:
K (OK) ,
1110 Bytes-1 Byte danke an ngn!
Probieren Sie es online!
quelle
='
->=
Python 2 , 48 Bytes
Probieren Sie es online!
quelle
05AB1E , 4 Bytes
Probieren Sie es online! oder als Testsuite
Erläuterung
quelle
C # (Visual C # Interactive Compiler) , 44 Byte
Probieren Sie es online!
quelle
[7,7,7]
sollte ausgegeben werden[0,1,2]
, und nicht[0,0,0]
.Python 2 ,
4743 BytesProbieren Sie es online!
Eine rekursive "One-Based" -Lösung.
quelle
Gelee , 4 Bytes
Probieren Sie es online!
Für jedes Präfix der Eingabeliste wird die Anzahl der Vorkommen des letzten Elements in sich gezählt.
quelle
;\ċ"
auch 4.R , 41 Bytes
Probieren Sie es online!
Seltsamerweise ist die Rückgabe eines auf Null basierenden Index in R kürzer.
quelle
Ruby, 35 Bytes
Es ist leider ziemlich banal - erstelle einen Hash, der die Gesamtsumme für jeden bisher angetroffenen Eintrag speichert.
Einige andere, lustige Optionen, die leider nicht kurz genug waren:
quelle
R ,
6243 Bytes-19 Bytes dank Giuseppe, durch Entfernen von which und table und nur geringfügigen Änderungen an der Implementierung
Original
Ich kann mit Giuseppes Wissen nicht mithalten, daher ist meine Einreichung etwas länger als seine, aber mit meinem Grundwissen fand ich diese Lösung ziemlich genial.
r<-table(x)
zählt, wie oft jede Zahl erscheint und speichert sie in r, um später darauf zurückgreifen zu könnennames()
Ruft die Werte jedes eindeutigen Eintrags in der Tabelle ab und wir iterieren über diese Namen mit einer for-Schleife.Der verbleibende Teil prüft, welche Einträge den Iterationen entsprechen, und speichert eine Folge von Werten (von 1 bis zur Anzahl der Einträge der Iteration).
Probieren Sie es online!
quelle
which()
, um 7 Bytes zu sparen.1:r[i]
gab mir die Idee, nurtable()
vollständig zu entfernen :x=z=scan();for(i in x)z[y]=1:sum(y<-x==i);z
ist 43 Bytes! Das ist ein schöner Ansatz!Haskell , 44 Bytes
Probieren Sie es online!
Erläuterung
Durchläuft die Liste von links nach rechts und behält zunächst die Liste
x
der besuchten Elemente bei[]
:Für jede Begegnung
y
zählen alle gleichen Elemente in der Listex
.quelle
(#(0*));(x:r)#g=g x:r# \y->0^abs(y-x)+g y;e#g=e
Probieren Sie es online aus!Perl 6 , 15 Bytes
Probieren Sie es online!
Sie können das Feld
++
vor das Feld%
für einen einseitigen Index verschieben.Erläuterung:
quelle
Haskell ,
4746 BytesProbieren Sie es online!
Ein anderer Ansatz als die Antwort von BMO, die sich als etwas länger herausstellte. (Und leiht freundlicherweise ihren schönen Testanzug aus.)
Die Idee ist, über die Eingabeliste zu iterieren und zu verfolgen, wie oft jedes Element aufgetreten ist, indem eine Funktion aktualisiert wird
g
. Ungolfed:Es ergaben sich zwei interessante Golfmöglichkeiten. Zuerst für den Anfangswert von
g
, eine konstante Funktion, die ihr Argument ignoriert und zurückgibt0
:Und zweitens ein Ausdruck über Variablen
x
undy
welche Erträge ,1
wennx
equalsy
und0
sonst:Es könnte noch kürzere Wege geben. Hat jemand eine Idee?
quelle
0^(x-y)^2
.Java (JDK) , 76 Byte
Probieren Sie es online!
Credits
quelle
for(c=0,i=l;i-->0;)c+=a[l]==a[i]?1:0;
auffor(c=i=0;i<l;)c+=a[l]==a[i++]?1:0;
.Ruby , 34 Bytes
Probieren Sie es online!
quelle
->a{i=-1;a.map{|v|a[0..i+=1].count v}}
und nicht daran gedacht habe, nur ein neues Array zu bauen, lol. Gute Arbeit.Bash,
3724 BytesTIO
Wenn gültig, gibt es auch diese Variante, wie von DigitalTrauma vorgeschlagen
TIO
quelle
Perl 5, 11 Bytes
TIO
Erläuterungen nach Kommentar
$_
Perls spezielle Variable, die die aktuelle Zeile enthält, wenn ein Loop über einen Eingang (-p
oder-n
Schalter) läuft$h{$_}++
Autoviviert die Karte%h
und erstellt einen Eintrag mit Schlüssel$_
und Inkrementen und gibt den Wert vor dem Inkrement-p
switch-l
ausgegeben. switch entfernt das Zeilenende bei der Eingabe und fügt das Zeilenende bei der Ausgabe hinzuquelle
Pari / GP , 32 Bytes
Dask -te Element in der Antwort ist der Koeffizient der xeink Begriff im Polynom ∑ki = 1xeinich .
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) , 33 Byte
Dask -te Element in der Antwort ist der Koeffizient der xeink Begriff im Polynom ∑ki = 1xeinich .
Probieren Sie es online!
quelle
Attache , 23 Bytes
Probieren Sie es online!
Erläuterung
quelle
C (gcc) ,
6562 BytesProbieren Sie es online!
-2 Bytes nur dank ASCII
Das fühlte sich zu einfach an, aber ich konnte mit einem anderen Ansatz nicht kürzer werden.
quelle
K (ngn / k) , 18 Bytes
Probieren Sie es online!
ALTER ANSATZ
K (NGN / k) ,
27 2322 BytesProbieren Sie es online!
Das ist keine schöne ... schnelle und schmutzige Lösung, ich werde sie später verfeinern, wenn ich die Chance bekomme, über einen besseren Ansatz nachzudenken
Erläuterung:
=x
Gibt ein Dikt zurück, in dem Schlüssel Elemente von x und Werte ihre Indizes sind (3 1 4 5 9 2 6!(0 9;1 3;,2;4 8 10;5 11;,6;,7)
)i:
diktiereni
#:'
Zählwerte für jeden Schlüssel (3 1 4 5 9 2 6!2 2 1 3 2 1 1
)!:'
jeden Wert aufzählen (3 1 4 5 9 2 6!(0 1;0 1;,0;0 1 2;0 1;,0;,0)
),/.:
Werte extrahieren und Liste reduzieren (0 1 0 1 0 0 1 2 0 1 0 0
)x[,/.:i]:
extrahieren Sie die Indizes aus i, reduzieren Sie sie und weisen Sie jeden Wert aus der Liste auf der rechten Seite diesen Indizes zuärgerlicherweise wird die Liste aktualisiert, aber durch die Zuweisung wird ein Nullwert zurückgegeben, sodass ich die Liste nach dem Semikolon zurückgeben muss (
;x
) zurückgeben mussbearbeiten: entfernte überflüssige Doppelpunkte
edit2: unnötige Zuordnung entfernt
quelle
Retina 0.8.2 , 30 Bytes
Probieren Sie es online! Link enthält Testfälle. 1-indiziert. Erläuterung: Der erste Teil des regulären Ausdrucks entspricht der Reihe nach jeder Ganzzahl in der Liste. Die Gruppe des Lookbehinds entspricht jedem Vorkommen dieser Ganzzahl in dieser Zeile bis einschließlich der aktuellen Ganzzahl. Die ganze Zahl wird dann durch die Anzahl der Übereinstimmungen ersetzt.
quelle
Batch, 61 Bytes
1-indiziert. Da die Variablensubstitution vor dem Parsen erfolgt,
set/a
erhöht der Befehl den angegebenen Variablennamen, indem der Buchstabec
mit der Ganzzahl aus der Liste verkettet wird (numerische Variablen werden in Batch standardmäßig auf Null gesetzt). Das Ergebnis wird dann zur Vereinfachung der Ausgabe in eine andere Ganzzahl kopiert (genauer gesagt, es wird ein Byte gespeichert).quelle
Tcl , 48 Bytes
Probieren Sie es online!
quelle
Japt, 8 Bytes
Probieren Sie es hier aus
quelle