Die Herausforderung
Ihr Ziel ist es, das kürzestmögliche Programm zu schreiben, das eine Liste von Ereignissen (z. B. Upvote, Downvote usw.) erstellt und den Ruf des Benutzers und die von ihm erworbenen Berechtigungen zurückgibt.
Was für Veranstaltungen?
Hier ist eine Übersicht der Ereignisse, geordnet nach verdienter Reputation:
-15 answer unaccepted
-10 answer unupvoted
-5 question unupvoted
-2 answer downvoted
-2 question downvoted
-2 unaccept answer
-1 downvote answer
+1 join website
+1 undownvote answer
+2 accept answer
+2 question undownvoted
+2 answer undownvoted
+5 question upvoted
+10 answer upvoted
+15 answer accepted
+100 association bonus
Welche Art von Privilegien?
Hier finden Sie eine Liste der Berechtigungen, geordnet nach dem gewünschten Ruf.
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
200 retag questions
250 view close votes
500 cast close and reopen votes
750 established user
1000 edit questions and answers
1000 create gallery chat rooms
1250 create tag synonyms
1500 approve tag wiki edits
2000 access to moderator tools
3500 protect questions
4000 trusted user
Eingang
Die Eingabe (bei STDIN) ist eine Liste von Ereignissen, eine pro Zeile, genau wie sie im ersten Diagramm angezeigt werden (mit Ausnahme der Reputationsmenge). Eine leere Zeile steht für das Ende der Eingabe. Hier ist ein Beispiel (am Ende sollte eine leere Zeile stehen):
join website
association bonus
answer upvoted
answer upvoted
question upvoted
answer accepted
answer upvoted
accept answer
unaccept answer
question unupvoted
accept answer
question upvoted
Ausgabe
In der ersten Ausgabezeile (zu STDOUT) sollte die Menge der akkumulierten Wiederholungen angegeben werden. In jeder Zeile danach sollte genau so, wie sie angezeigt werden, und in derselben Reihenfolge wie im zweiten Diagramm ein erworbenes Privileg aufgeführt sein. Die erwartete Ausgabe für die obige Eingabe:
153 reputation
1 create posts
5 participate in meta
10 remove new user restrictions
10 create wiki posts
15 vote up
15 flag posts
20 talk in chat
50 comment everywhere
75 set bounties
100 edit community wiki
100 create chat rooms
125 vote down
150 create tags
Regeln, Einschränkungen und Hinweise
Das ist Code Golf. Es gelten die Standard-Code-Golfregeln.
(BEARBEITEN: Da ich zwei Einträge hatte, die auf Dateien zugreifen, möchte ich darauf hinweisen, dass die Länge der Datei zur Codelänge als Teil der Standardregeln für Codegolf hinzugefügt werden muss.)
quelle
Antworten:
GolfScript (
569 568 475473 Zeichen)Hierbei werden nicht druckbare Zeichen zum Komprimieren der erforderlichen Zeichenfolgen verwendet, also im xxd-Format:
Modulo der String-Komprimierung ist das Programm
In den meisten Hinsichten ziemlich trivial, aber es gibt zwei interessante Punkte.
Die erste ist die Hash-Funktion für die Eingabezeichenfolgen. Ich war erstaunt darüber, wie einfach eine Hash-Funktion für jede der 9 (einmal
un
entfernten) unterschiedlichen Zeichenfolgen eindeutige Ergebnisse liefert. Als Bonus liefert sie auch ein anderes Ergebnis für die leere Zeichenfolge, wodurch das Entfernen der letzten Leerzeile aus der Eingang.Die Berechnung der Wiederholung für eine einzelne Zeile ist
Zunächst wird
un
die Zeichenfolge entfernt und notiert, ob sie gefunden wurde. Dann wendet es eine supereinfache Hash-Funktion anh(s) = ( sum over i: (-1)^i s[i] ) % 11
. (Sie können sehen, warum ich überrascht war, als ich es fand). Die Saiteist eine Nachschlagetabelle, die den Hash-Wert auf die Änderung in rep abbildet (subtrahiere 110 vom ASCII-Wert), und wenn sie
un
zu Beginn gefunden wird, negiert sie die Änderung.Der zweite interessante Punkt ist der Filter für die Berechtigungen. Ich habe es etwas einfacher versucht:
die die Zeile auswertet (undefinierte Wörter tun nichts), um ihre Punktzahl für den Vergleich mit der Reputation (gespeichert in
^
) zu erhalten. Es funktioniert fast . Das, was es kaputt macht, ist, dassand
es in einigen Strings vorkommt und eine vordefinierte Funktion ist. Lösung: Zerfleischen Sie die Leitungen so weit, dass sieand
nicht mehr vorkommen. (Es kann vorkommen, dass das Entfernen von Leerzeichen besser ist als das Entfernen des Buchstabensa
, die Länge ändert sich jedoch nicht).quelle
Ruby 1.9.3,
514467459 (507460452 + 7 für Flags)Laufen Sie mit
ruby -rzlib <program>
.Wenn die binären String-Literale nicht richtig eingefügt wurden (was sie wahrscheinlich nicht getan haben), ist hier ein Hex-Dump:
quelle
Haskell, 787 Zeichen
quelle
C #
127112081206quelle
C -
10831069Mir ist klar, dass ich etwas spät dran bin, aber C ist nicht vertreten, also dachte ich mir, ich würde es versuchen.
Hier ist eine etwas weniger golfene Version:
Ich denke, die Grundidee ähnelt den Ansätzen vieler anderer Leute. Ich benutze einen kleinen selbstgemachten Hash, um Eingaben zu erkennen. Der Hash gibt praktisch Null für eine leere Zeichenfolge, wodurch die Eingabe-Lese-Zeile sehr kompakt wird. Ich bin sicher, dass der Hash stark verbessert werden könnte. Einige gute Charakter-Einsparungen könnten erzielt werden, indem einige strategische Hash-Kollisionen für Dinge zugelassen werden, die den gleichen Ruf haben.
Ich hatte auch echt perversen Spaß beim Verstecken einesgoto
Makros (goto
ich bin stolz darauf sagen zu können, dass ich zum ersten Mal a verwendet habe).Der einzige Ort, an dem ich sicher viel Raum für Verbesserungen habe, ist der Ausgabebereich. Ich habe noch nicht einmal versucht, die eigentliche Drucklogik zu komprimieren, daher bin ich sicher, dass ich dort auch einige Zeichen speichern kann.
quelle
puts
anstelle von verwendenprintf
.goto E
mitreturn
(Beseitigung des Label) und entfernen Sie die!=0
in der Hash - Funktion (es ist redundant).C (
765737 Zeichen)Oder etwas besser lesbar mit zusätzlichen Zeilenumbrüchen und Einrückungen:
Die obigen Codes setzen eine einzelne Zeile am Ende der Datei voraus. Wenn es zwei gibt, muss man
s+=*l?e[…]:0
statt schreibens+=e[…]
, gegen einen Aufpreis von 5 Zeichen . Das Schreibenwhile(*gets(l))
würde kürzer sein, aber nicht funktionieren, da ich keine Header einbeziehe, so dass der Compiler davon ausgeht, dass diegets
Rückgabeint
nicht erfolgtchar*
.Der Hashing-Ausdruck
(l[11]%8^l[7])-97
wurde gefunden, indem alle Ausdrücke der folgenden Formen ausprobiert wurden, wobei nach der Form mit der kürzesten resultierenden Codelänge gesucht wurde:Eine geeignete druckbare ASCII-Zeichendarstellung wurde unter Verwendung einer ähnlichen Brute-Force-Suche gefunden.
Python 3 (
743715 Zeichen)Im gleichen Sinne wie oben. Dieser basiert jedoch auf einem zweiten Zeilenumbruch am Ende der Eingabe.
quelle
Java - 1519 Zeichen
Um die Reputation zu finden, werden alle Zeichen in der Eingabezeichenfolge hinzugefügt (Beispiel 'Join Website' wird zu Form 1219 hinzugefügt). Wenn b == 1219, ist r = r + 1.
quelle
c
eine tunif
Check , um zu entscheiden , ob eintrue
oderfalse
zurückgegeben werden soll , wo , wie diesboolean
von derif
direkt zu bringen , um die Größe bis auf 1470 zurückgeschickt werden ;) Ich habe eine Verbesserung für deine Antwort vorgeschlagen. Es wartet auf Peer Review :)Scala 1089
Fast von Grund auf neu geschrieben. Wenn ich die Daten einrechnen muss, ist es billiger (wenn auch hässlich), die Daten direkt einzuschließen.
Erster Ansatz, Lesen der Ereignispreise und der Registerkarte "Berechtigungen" aus den Dateien:
Daten aus Datei lesen: 405
quelle
J (704)
Das Programm besteht aus vier Teilen:
das folgende Decoder-Skript ( 277 Bytes)
eine binäre Wortdatei, genannt
w
, ebenfalls 277 Bytes ( hier herunterladen ).Das Dateiformat ist wie folgt: Jedes Wort wird als Gruppe von Fünf-Bit- "Bytes" codiert. Jede Gruppe von fünf Bits kann einen Wert von
1
bis zur27
Darstellung von Buchstaben oder0
als Trennzeichen haben. Jedes eindeutige Wort in der Beschreibung der Ereignisse und Berechtigungen wird hier gespeichert.Eine binäre Ereignisdatei, genannt
e
, die 54 Byte lang ist ( hier herunterladen ).Jedes Ereignis besteht aus einer 12-Byte-Reputation und einem oder mehreren 6-Byte-Wörtern. Beispielsweise
accept answer
wird wie folgt codiert:eine binären Privileg Datei mit dem Namen
p
, das ist 96 Bytes (Download hier ).Das Dateiformat ist dasselbe wie
e
z. B.access to moderator tools
wie folgt kodiert:quelle
Perl,
856849 Zeichenfüge einfach nach ein paar Semikolons Zeilenumbrüche hinzu, um die Lesbarkeit zu verbessern;):
quelle
Java (1470 Zeichen)
Hinweis: Es ist eine Modifikation von Aman ZeeK Vermas Antwort, aber da meine Bearbeitung nicht akzeptiert wurde und meine Antwort deutlich kürzer ist als seine, veröffentliche ich sie hier.
Lesbare Version:
Minimierte Version:
quelle
PHP: 676 Zeichen
Es wird keine Preise gewinnen, aber verdammt noch mal, ich kann einfach nicht herausfinden, wie ich es verkleinern kann, also werde ich es einfach posten:
Da der Teil, der die Wiederholung berechnet, sehr schwer zu lesen ist, erfolgt dies hier mit zusätzlicher Formatierung. Es missbraucht undefinierte Konstanten und verwendet @, um sie zu schließen:
quelle
APL (549)
Dieser packt die Daten in Unicode-Zeichen.
quelle
Python 3.x (801 Zeichen)
Das Beste, was ich bis jetzt tun kann, muss nur eine bessere Codierung als base64 herausfinden (Hinweis Hinweis: Kann mir jemand helfen?).
quelle