Stack Exchange erkennt automatisch serielle Abstimmungen (wenn ein Benutzer viele Beiträge eines anderen Benutzers positiv oder negativ bewertet) und kehrt diese um. In dieser Herausforderung implementieren Sie einen sehr, sehr einfachen "Serienwahl" -Detektor.
Eingang
Die Eingabe ist eine Zeichenfolge, die eine Liste von Stimmen darstellt. Jede Gruppe von zwei Zeichen stellt eine Abstimmung dar - die erste ist der Wähler und die zweite ist der Benutzer, über den abgestimmt wird. Zum Beispiel die folgende Eingabe
ababbccd
Kann analysiert werden als ab
ab
bc
cd
und repräsentiert a
die b
zweifache,
b
die c
einmalige und c
die d
einmalige Abstimmung .
Die Eingabe besteht nur aus Kleinbuchstaben und hat immer eine gerade Länge> 0. Sie können auch nicht über sich selbst abstimmen (also nein aa
oder hh
).
Ausgabe
Für die Zwecke dieser Herausforderung wird die Serienabstimmung als ein beliebiger Benutzer definiert, der dreimal oder öfter über einen anderen Benutzer abstimmt.
Die Ausgabe ist, wie viele Stimmen für jeden Benutzer umgekehrt werden sollen (das heißt, wie viele Stimmen für jeden Benutzer wurden umgekehrt, nicht wie viele Stimmen, die sie abgegeben haben, wurden umgekehrt), und zwar im Format [user][votes][user2][votes2]...
. Zum Beispiel kann ein Eingang abababab
( a
Abstimmung über b
sollten viermal) -Ausgang
b4
(vier Stimmen wurden von umgekehrt a
zu b
).
Die Ausgabe kann in einer beliebigen Reihenfolge erfolgen, aber sowohl die Eingabe als auch die Ausgabe müssen einzelne Zeichenfolgen sein, wie oben beschrieben.
Testfälle
In Out
---------------------------------------------------------------------------
abababcbcbcbcbbababa b7a3
edfdgdhdfgfgfgih g3
jkkjjkkjjkkjljljljmlmlnmnmnm j6k3m3
opqrstuv <none>
vwvwwvwv <none>
xyxyxyxyxyxyxyzyzyzyxzxzxz y10z3
nanananananananabatman a8
banana <none>
nanananananananabatman
Testfall.Antworten:
Pyth, 22 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
Beispiel:
quelle
Unleserlich ,
18301796179117711762174517361727162616061577 BytesDie Ausgabe erfolgt in umgekehrter alphabetischer Reihenfolge (
z
bisa
), jedoch nach Ihren Regeln, die als zulässig erscheinen.Erläuterung
Um einen Eindruck davon zu bekommen, was Unreadable kann, ist hier die grundlegende Operation:
write(x, inc(read(x)))
.Dieses Programm verwendet das Band wie folgt. Die Variablennamen werden später im Pseudocode verwendet. Auch dies dokumentiert die erste Version (die 1830 Bytes war); In den Änderungen am unteren Rand sehen Sie, was sich seitdem geändert hat.
q
a
,p
,ch
hash
,v
b
,r
aa
,l
a
(96) bisz
(121) abgezogen werden sollen ( der ASCII-Code des Buchstabens minus eins).0
= noch nicht gesehen,-1
= einmal gesehen,-2
= zweimal gesehen,-3
= beliebig oft mehr als 2 gesehen.Der Algorithmus geht im Wesentlichen wie folgt vor:
a
undb
. Berechnen Sie den Hash-Wert(a-2)*(a-1)+b-1
, der für jede Buchstabenkombination von a – z eindeutig ist.*hash
). Wenn dies-3
der Fall ist, ist der Benutzer bereits zum Entfernen von Stimmen berechtigt*(b-1)
. Ansonsten dekrementieren*hash
. Wenn dies jetzt-3
der Fall ist, kann der Benutzer nach drei Vorkommnissen nur noch Stimmen entfernen, also inkrementieren Sie*(b-1)
um3
.z
bisa
) und geben Sie die Zeichen aus, für die Stimmen abgezogen werden müssen. Dies erfordert eine manuelle Ganzzahldivision durch 10, um die Zahl in Dezimalstellen zu übersetzen.Nach alledem sieht das Programm wie folgt aus:
Edit 1, 1830 → 1796: Es wurde erkannt, dass ich den Rückgabewert einer while-Schleife an einer Stelle wiederverwenden kann.
Edit 2, 1796 → 1791: Es stellt sich heraus, dass das Programm etwas kleiner ist, wenn ich anstelle der Zellen 6–95 die Dezimalstellen in den negativ nummerierten Zellen speichere (ab –1). Als zusätzlichen Bonus ist das Programm nicht mehr auf 10⁹⁰ Stimmen beschränkt!
Bearbeiten 3, 1791 → 1771: Statt das Ergebnis der Zuordnung
*(ch = l + 95)
zuv
, ich jetzt weisen Sie ihnq
und dann die Zuordnung bewegenv = q
in die während Zustand, wobei der Code auf 1777 Bytes. Tauschen Sie dann die Position vonq
undv
auf dem Band aus, da sieq
jetzt 1 häufiger ist alsv
.Edit 4, 1771 → 1762: Duh. Die Initialisierung
hash
auf 1 anstelle von 0 ist 9 Byte kürzer. Der Hash-Code ist jetzt 1 mehr, was keine Rolle spielt.Edit 5, 1762 → 1745: Wenn ich initialisiere
q
undr
auf 1 anstatt auf 0, muss ich ein paar-1
s streuen , um es richtig zu machen, und alles scheint sich abzubrechen - mit der Ausnahme, dass diewhile v { --v; [...] }
Schleife jetzt eine Iteration weniger ausführen muss. was ich sagen kannwhile --v { [...] }
, was 26 Zeichen kürzer ist.Edit 6, 1745 → 1736: Anstelle von
{ r = 1; ++q }
können wir schreibenq = *((r = 1)+1)+1
. Diesq
hängt von der Tatsache ab, dass sich die Variable in Steckplatz 2 befindet. Wenn es auf Position 1 wäre, wäre dies noch kürzer, aber dann wäre das gesamte Programm insgesamt länger.Edit 7, 1745 → 1727: Edit 6 wurde rückgängig gemacht und stattdessen wurde das Speichern erreicht, indem die innerste while-Schleife in den Ausdruck eingefügt wurde, der den stelligen ASCII-Code berechnet, der ebenfalls bei 1736 Byte endet ... aber dann eine Dekrementierungsanweisung (9 Byte) gespeichert hat ) durch Ändern
((++r) - 11) ? r :
auf(r - 10) ? ++r :
.Edit 8, 1727 → 1626: Die Hash-Berechnung wurde überarbeitet. Es wird jetzt eine while-Schleife weniger verwendet. Die Zellenpositionen haben jetzt ihre tatsächlichen ASCII-Codes (nicht mehr um 1 deaktiviert). Variablen an verschiedenen Stellen auf dem Band neu gemischt, da sie jetzt mit unterschiedlicher Häufigkeit auftreten.
Edit 9, 1626 → 1606: Verrückteres Inlining. Der Body der ersten while-Schleife sieht jetzt ungefähr so aus:
und die variablenzuordnung hat sich nun fast vollständig geändert.
Bearbeiten 10, 1606 → 1577: Ich beobachtete , dass
a
unda2
beide erniedrige auf 0 in While - Schleifen, also wenn ich paaren könntep
entweder mit denjenigen, aber nicht mitch
, ich zu initialisieren würde nicht brauchen ,p
um0
(die 29 Byte Kosten). Es stellte sich heraus, dass ich das durch Tauschenp
und Tauschen tun kannr
. Die neuesten Variablenzuweisungen (und ihre Häufigkeit im Code) lauten jetzt:quelle
CJam, 23 Bytes
Run-Length Party!
oder
Führen Sie alle Testfälle aus
Erläuterung
Die andere Version beginnt durch die Paare Umkehren, die an anderer Stelle zwei Bytes speichert: a) in jeder Kette das erste Zeichen der Auswahl ist nur
:c
statt ,Wf=
um die zweite Auswahl. b) Wir müssen vor der zweiten RLE nicht erneut sortieren, da die Paare bereits primär nach dem verbleibenden Zeichen sortiert wurden.quelle
Q
in Ihrer zweiten Antwort sollteq
für Nicht-Test-Wrapper-Zwecke sein.3
in eine Liste für den Vergleich ist ein netter Trick. Ich habe es nur zu meiner eigenen Unterhaltung gelöst und dort ein Byte verloren, weil ich es benutzt habe0=2>
. Ansonsten hatte ich fast die gleiche Lösung wie bei Ihrer ersten Lösung, nur dass ich sie für den letzten Schritt::\
anstelle von verwendet habeWf%
.Bash,
95948581 BytesEine elegante, aber lange erste Lösung für den Anfang ...
Dank User112638726 für ein Byte mit dem Speichern
sed
, DigitalTrauma zum Speichern 9 mitfold
, und Rainer P. zum Speichern von 4 mehr mitawk
‚ssubstr
!Um zu sehen, wie es funktioniert, nehmen wir die Eingabe
abababcbcbcbcbbababa
.Nach
fold -2
(Zeilenumbruch auf eine Breite von 2) haben wirNach
sort | uniq -c
(-c
gibt ein sehr geschicktes Flag aus,uniq
das angibt, wie oft jede Zeile in der Eingabe erscheint), erhalten wirUntersuchen wir nun den letzten
awk
Befehl:$1>2
: Nur Material ausgeben, wenn Datensatz 1 (auch bekannt als die Anzahl identischer Stimmen) größer als 2 ist (d. H. ≥ 3). Mit anderen Worten, ignorieren Sie alle Zeilen, die mit einer Zahl ≤ 2 beginnen.{c[substr($2,2)]+=$1}
: Wenn die Zahl größer als 2 ist, fügen Sie diese Zahl derc
Hash-Tabelle hinzu, wobei Sie das zweite Zeichen von Datensatz 2 (auch bekannt als Voting-ee) als Schlüssel verwenden. (Wir müssen nicht alles auf Null initialisieren;awk
tut das für uns.)END{...}
: Dies bedeutet nur, dass nach der Verarbeitung der gesamten Datei Folgendes zu tun ist.for(x in c)printf x c[x]
: Ziemlich selbsterklärend. Drucken Sie jeden Schlüssel und seinen entsprechenden Wert.quelle
&
entspricht\0
in sedsed -r 's/.(.)/\1\n/g'|awk '{a[$1]++}END{for(i in a)printf (a[i]>2)?i a[i]:y}
bacada
.JavaScript,
114113110Testfälle:
Code-Snippet anzeigen
Auf einer hohen Ebene füllt dieser Code ein Objekt mit Schlüssel-Wert-Paaren, die die Stimmenempfänger der Anzahl der Stimmen zuordnen
{ b:7, a:3 }
und sie dann zu einer Zeichenfolge in einerfor
Schleife zusammenfügen. Der Code ist in einemeval
Ausdruck der Verwendung zu ermöglichen ,for
innerhalb eines Pfeils Funktion , ohne Ausgaben Bytes auf{ }
und;return r
.( Wenden Sie sich an user81655, um drei Bytes zu sparen!)
Erklärung des
eval
Codes:quelle
Haskell, 103 Bytes
Anwendungsbeispiel:
f "jkkjjkkjjkkjljljljmlmlnmnmnm"
->"k3j6m3"
Wie es funktioniert:
quelle
JavaScript (ES6),
195174169167158 BytePrüfung
Code-Snippet anzeigen
quelle
var
s entfernen . Wer kümmert sich darum, den globalen Anwendungsbereich des Codegolfs zu verschmutzen? ;)/(\w{2})/g
kann einfach sein/../g
- wir bereits wissen , dass die Eingabe nur Buchstaben sind, und Wiederholen einer (oder zwei) Zeichen kürzer als{2}
. Wenn Sie interessiert sind, können Sie sich meine JavaScript-Antwort auf diese Herausforderung ansehen (und Fragen dazu kommentieren). Willkommen bei PGCC!Mathematica,
11010099 Bytesquelle
Perl,
868483 BytesDas sind 82 Bytes plus 1 für das
-p
Kommandozeilenargument:Etwas ungolfed:
${$'}
anstelle von verwenden$g{$'}
. Funktioniert leider$$'
nicht.quelle
Pure Bash, 151
Länger als ich gehofft hatte, aber hier ist es.
Verwendet die assoziative Array-Indizierung, um die erforderliche Zählung durchzuführen. Benötigt Bash-Version 4.0 oder höher.
quelle
PHP 247 Zeichen
(Autsch)
Erklärt
Habe dies getan, ohne auf andere Antworten zu schauen. Dies ist das schwierigste Codegolf, das ich bisher angegangen bin. Ich begrüße alle Optimierungen.
quelle
R, 221 Bytes
Code
ungolfed
Hier gibt es viel Raum für Verbesserungen.
quelle