Ihre Aufgabe ist es, zu bestimmen, ob eine bestimmte Zeichenfolge die richtige Länge hat und mit Scrabble-Kacheln dargestellt werden kann, und in diesem Fall die Summe der Punkte jedes Buchstabens auszugeben.
Wenn Sie nicht wissen, wie man Scrabble spielt: Sie haben 100 Kacheln mit verschiedenen Buchstaben von A bis Z sowie zwei Platzhalter, die für jeden Buchstaben stehen können. Jeder Buchstabe hat eine bestimmte Anzahl von Punkten, und jedes Plättchen (aber nicht unbedingt ein Wort) kann nur einmal verwendet werden. Wenn ein Wort gespielt wird, wird der Punktewert jedes verwendeten Plättchens addiert, was zur Punktzahl wird. Da nur eine begrenzte Anzahl von Buchstaben verfügbar ist, kann ein Wort nur so oft einen bestimmten Buchstaben haben, wie der Buchstabe Kacheln + nicht verwendete Platzhalter enthält. Die Scrabble-Tafel besteht aus 15 × 15 Zellen, daher muss das Wort zwischen 2 und 15 Zeichen lang sein.
Eine Liste der Anzahl und Punktzahl der einzelnen Buchstaben in der englischen Version finden Sie unten oder unter http://boardgames.about.com/od/scrabble/a/tile_distribute.htm ( Archiv ).
Buchstabenanzahl Punkte Buchstabenanzahl Punkte ------------------- ------------------- A 9 1 O 8 1 B 2 3 P 2 3 C 2 3 Q 1 10 D 4 2 R 6 1 E 12 1 S 4 1 F 2 4 T 6 1 G 3 2 U 4 1 H 2 4 V 2 4 I 9 1 W 2 4 J 1 8 X 1 8 K 1 5 Y 2 4 L 4 1 Z 1 10 M 2 3 [wild] 2 0 N 6 1
Weitere Regeln
- Das Programm soll eine einzelne Folge von Eingaben von STDIN oder dergleichen annehmen.
- Die Eingabe enthält immer nur Großbuchstaben.
- Wenn die Zeichenfolge mehr Kopien eines Buchstabens enthält, als Platzhalter oder Kacheln für diesen Buchstaben nicht verwendet wurden, ODER wenn die Länge der Zeichenfolge nicht zwischen 2 und 15 einschließlich liegt, sollte das Programm eine Ausgabe durchführen
Invalid
. - Andernfalls sollte die Punktzahl mit den Daten aus der obigen Tabelle addiert und ausgegeben werden.
- Verwenden Sie keine Platzhalter, es sei denn, dies ist erforderlich.
- Sorgen Sie sich nicht um Boni wie doppelte Wortwerte oder ob die Zeichenfolge ein echtes Wort ist.
- Das Programm soll das Ergebnis über STDOUT oder dergleichen ausgeben.
- Lücken, die standardmäßig verboten sind, sind nicht erlaubt.
- Die Verwendung einer externen Quelle wie einer Website sowie von Bibliotheken, APIs, Funktionen oder Ähnlichem, die Scrabble-Scores oder geeignete Mengen berechnen, ist nicht zulässig.
- Das ist Code-Golf , also gewinnen die wenigsten Bytes.
Komplettlösung
Input: CODEGOLF
C -> 3, O -> 1, D -> 2, E -> 1, G -> 2, O -> 1, L -> 1, F -> 4
3 + 1 + 2 + 1 + 2 + 1 + 1 + 4 = 15
Output: 15
Testfälle
Input-Output ------------------------ SCRABBLE 14 JAZZ 19 STACKEXCHANGE 32 XYWFHQYVZVJKHFW 81 PIZZAZZ Ungültig KIXOKEJAJAX Ungültig MISUNDERSTANDING Ungültig
quelle
-1
?Invalid
.Antworten:
Perl 5
228 205 186 184 178 177 153 150 149 142 137135Führen Sie mit Perl -E.
Golf gespielt:
Bei dieser Lösung werden einige nicht druckbare Zeichen verwendet, sodass nachfolgend ein Hexdump bereitgestellt wird:
Alternativ können Sie auch Strg + Taste verwenden:
Ungolfed + kommentierte:
quelle
-M5.010
(Strafe von 0, da es eine zu verwendende Sprachversion angibt) anstatt mit-e
(Strafe von 1)? Möglicherweise können Sie ein Byte in den Argumenten speichern.C, Rev. 2,
151 145138Inspiriert durch den 159-Byte-Code in @ bebes Kommentar, habe ich weitere
8 1421 Zeichen herausgedrückt:4 Bytes werden durch Umstellen des Längenzählers eingespart
i
. Dies wird auf 1 initialisiert (vorausgesetzt, das Programm akzeptiert keine Argumente) und dann bei jedem Lesen eines Buchstabens mit 4 multipliziert. Es läuft auf Null über, wenn die Wortlänge größer als 15 ist. Um zu überprüfen, ob die Wortlänge schlecht ist, überprüfen wir einfach, obi<5
i<9
Um (ich setze es so , dass es für Ein-Buchstaben-Wörter immer noch ungültig ist, wenn der Benutzer versehentlich durch Setzeni
auf 2 initialisiert ein einzelnes Argument in der Kommandozeile.)4 Bytes gespart, indem der Schleifenbedingungstest auf einfach geändert wird
&31
. Dies erfordert, dass das Wort mit einem Leerzeichen (ASCII 32) oder einem Nullzeichen (ASCII 0) abgeschlossen wird. Normalerweise wird die Tastatureingabe durch eine neue Zeile (ASCII 10) abgeschlossen, sodass die Verwendung des Programms etwas umständlich ist, da Sie das eingeben müssen Leerzeichen und dann die Eingabetaste drücken, damit der Computer den Puffer liest. Bei Strings mit Zeilenende könnte ich mithalten, aber nicht mithalten, wie ich es tue.613 Bytes, die durch Ändern der Kodierung auf - (Anzahl der Kacheln für jeden Buchstaben) - (Punktzahl für diesen Buchstaben-1) * 13 gespeichert wurden . Dies erfordert jetzt einen Bereich von -4 für L, S, U bis -118 für Q, Z. Der Grund für die Verwendung negativer Zahlen ist die Vermeidung des nicht druckbaren ASCII-Bereichs 0 bis 31. Stattdessen wird der Bereich verwendet, der das Zweierkomplement der negativen Zahlen 256-4 = 252 bis 256-118 = 138 ist. Dies sind druckbare, erweiterte ASCII-Zeichen. Es gibt Probleme beim Kopieren und Einfügen dieser in Unicode (die Art und Weise, wie die Rückkehr zu ASCII vereinfacht wird, hängt von der installierten Codepage ab, was zu unvorhersehbaren Ergebnissen führen kann). Ich habe daher die richtigen ASCII-Codes in den Programmkommentar aufgenommen.Der Vorteil dieser Kodierung ist die Eliminierung der Variablen,
r
da die Anzahl der Kacheln immer um 1 verringert wird (da sie als negative Zahl gespeichert wird, tun wir dast[x]++
. Zusätzlich bedeutet der Postfix-Operator, dass wir diese Inkrementierung gleichzeitig mit ausführen können Hinzufügen der Partitur zus
.C,
184Rev 1 173 (oder 172 mit Compiler-Option)Ich verwende GCC und mit der Compiler-Option
-std=c99
kann ichchar t[]="...."
in die Initialisierung derfor
Schleife einsteigen, um ein zusätzliches Semikolon zu speichern. Aus Gründen der Lesbarkeit habe ich das Programm ohne diese Änderung und mit Leerzeichen angezeigt.Der Trick liegt in der Datentabelle. Für jeden Buchstaben wird ein ASCII-Code der Form (Gesamtpunktzahl der Kacheln für diesen Buchstaben) * 10 + (Punktzahl einer Kachel-1) in der Tabelle gespeichert
t[]
. Zur Laufzeit werden diese Gesamtpunktzahlen reduziert, wenn die Kacheln aufgebraucht sind.Die Gesamtpunktzahl aller Kacheln für jeden Buchstaben reicht von 12 für E bis 4 für L, S, U. Diese Form der Codierung ermöglicht nur die Verwendung von druckbaren ASCII-Zeichen (ASCII 120
x
für E bis ASCII 40(
für L, S, U). Die Verwendung der Anzahl der Kacheln würde einen Bereich von 120 bis 10 erfordern, weshalb ich vermieden es.Dank eines
#define
MakrosT
wird im Hauptprogramm ein einzelnes Symbol verwendet, um den Buchstabenindexi
aus dem ersten Befehlszeilenargument abzurufen , ASCIIA
= 65 davon zu subtrahieren , um einen Index zu erhalten, und in der Tabelle T: nachzuschlagent[x[1][i]-65]
.Die
for
Schleife wird eher wie einewhile
Schleife verwendet: Die Schleife endet, wenn in der Eingabezeichenfolge ein Null-Byte (Zeichenfolgen-Abschlusszeichen) angetroffen wird.Wenn die Kacheln dieses Buchstabens nicht erschöpft sind (
T/10
ungleich Null sind),s
wird sie um die Kachelpunktzahl erhöhtT%10+1
, um eine Gesamtpunktzahl zu erhalten. Gleichzeitig wird die Kachelbewertung in gespeichertr
, so dass der Wert in der durch dargestellten KachelT
um dekrementiert werden kann,r*10
um anzuzeigen, dass eine Kachel verwendet wurde. Wenn die Kacheln erschöpft sind, wird der Platzhalter- / Leerzählerb
erhöht.Die
printf
Aussage ist ziemlich selbsterklärend. Wenn die Wortlänge außerhalb der Grenzen liegt oder die Anzahl der Leerzeichen zu hoch ist, drucken Sie,Invalid
andernfalls drucken Sie die Partiturs
.quelle
?
und gibt:
. Ihr anderer Punkt ist überholt, da ich die Codierung vollständig geändert habe, sodass keine besondere Behandlung von Q und Z erforderlich ist. Jetzt bis 173/172 mit Ihrer Hilfe.getchar()
159:l,w,f;main(t,i){for(char b[]="Z>>QxS=SZW6(><P>m<(<(SSWSm";(i=getchar()-65)>=0;l++)b[i]/10?f+=t=b[i]%10+1,b[i]-=t*10:w++;printf(l<2|l>15|w>2?"Invalid":"%d",f);}
obwohl ich immer noch nicht verstehe, warum eschar*foo=<string>
abstürzt. es könnten 2 Zeichen gespart werden.char*foo="string"
ist ein String-Literal und sein Inhalt darf nicht geändert werden. Auf der anderen Seitechar foo[]="string"
wird ein Array von Zeichen erstellt, auf das initialisiert wirdstring\0
und das dann geändert werden kann.getchar().
Ich habe Ihre Verbesserungen am Code (mit meinen Variablennamen für die Konsistenz mit dem Rest meiner Antwort) sowie eine Verbesserung der Wortlängen-Gültigkeitsprüfung und eine freche Verbesserung der Schleifenbedingung verwendet Test (ich habe versucht , sie zu verkürzen, kann aber nicht so mit der gleichen Funktionalität tun.) ich habe auch versucht ,getche()
undgetch()
aber mein Compiler (gcc auf cygwin) würde sie nicht automatisch verknüpfen.JavaScript (ES6) -
241230199182Bearbeiten - hat die Art und Weise geändert, wie ich die Mengen / Punktzahlen codiert habe, um die Größe zu verringern und nicht-ASCII-Variablen zu entfernen
Edit 2 - Ändert die Anzahl / Punktzahl-Codierungen in Ganzzahlen anstelle von Zeichenfolgen
Edit 3 - auf
%13
(danke @ edc65) umgestellt, die Codierung invertiert, die Werte direkt geändert und ein paar kleinere Verbesserungen vorgenommenGetestet in der Firefox-Konsole.
quelle
f[c]=1+f[c]||1
->f[c]=-~f[c]
, 2. warum nicht% 13%13
ist ein Geniestreich. Ich dachte nicht, ich müsse die Dinge in Ziffern speichern, aber Mathe kümmert sich nicht um den Unterschied zwischen base10 und base13.SyntaxError: Unexpected token >
.)f=s=>{...}
Notation nicht).Python 3,
217201Ungolfed:
Edit: Danke an @BeetDemGuise für einen Tipp, der mich letztendlich zu weit mehr als einer 1-Zeichen-Reduzierung geführt hat! Originalcode unten:
quelle
int('1332142418513113a11114484a'[o],16)
:)BEFUNGE 93 - 210 Bytes.
Das 15-Buchstaben-Limit wird jedoch nicht überprüft.
quelle
C 197
Angenommen, die Zeichenfolge wird als Befehlszeilenargument bereitgestellt, z
./scrabble STACKEXCHANGE
quelle
JavaScript -
232201z
speichert Wort. Ausgänge als Alarm.Bearbeiten: Verbessert gemäß den folgenden Empfehlungen.
quelle
s
wird nur einmal verwendet, so dass Sie es nicht zu einer Variablen machen müssen; Sie können diese Erklärung entfernen und ersetzenr+=s[x]
mitr+=-~"02210313074020029000033739"[x]
. Außerdem benötigen Sie(w>2|y<2|y>15)
in der Warnung keine runden Klammern .Haskell - 538
Speichern Sie es als scrabble.hs und kompilieren Sie es dann mit
Geben Sie dann Ihr Wort als Eingabe ein und drücken Sie die Eingabetaste
quelle
"ABCDEFG"
kann geschrieben werden als['A'..'G']
,[1,2,3]
kann geschrieben werden als[1..3]
Python 2.7 - 263
Ich konnte nicht annähernd an DLoscs Antwort herankommen , aber dies behandelt jeden Buchstaben als eine "Tasche", aus der Sie ziehen, bis er leer ist, und dann ziehen Sie Leerzeichen, und wenn das leer ist, macht es Fehler.
quelle
raw_input
wenn es Python2 ist (eine Sache, die ich an Python3 mag). Die Eingabe erfolgt garantiert in Großbuchstaben. Entfernen Sie sie.lower()
und ändern Sie sie97+i
in65+i
. Die Eingabe von weniger als 2 Zeichen muss ebenfalls ungültig sein. Sie können den Nullteilungsfehler ohne eineif
Aussage erhöhen : Teilen Sie Ihre Gesamtpunktzahl durch(1<len(S)<16)
. Ein paar andere Optimierungen, wie das Setzen desprint
s in die gleiche Zeile wie die Blocküberschriften und das Löschen des Leerzeichens davor,"Invalid"
bringen es nach meiner Zählung auf 250 herunter. :)Haskell,
290283So weit ich konnte:
Dieser Code hält sich strikt an die Regeln. Übergeben Sie also keine zusätzlichen Zeichen (z. B. Zeilenende). Verwenden Sie wie folgt:
echo -n "JAZZ" | runghc scrabble.hs
.Erläuterung
Das Muster
(_:_:_)
stellt sicher, dass nur Zeichenfolgen mit mindestens zwei Zeichen berücksichtigt werden, alles andere ergibt sich"Invalid"
(Fallback-Muster_
). Die Kacheltabelle wird11*nTiles+value
mit einem Versatz in ASCII konvertiert, der es dem Lookup-Modulo 11 ermöglicht, zu arbeiten, wobei die BuchstabenAEIO
dupliziert werden, da sie mehr als sechsmal vorkommen. Der Fliesenpool wird dann mit erstelltreplicate
, aus dem die Zeichen im Wort entfernt werden, sobald sie auftreten (Listendifferenz,\\
). Der Pool enthält 98 Kacheln. Wenn also die Gesamtlänge des Wortes und der verbleibende Teil des Pools größer als 100 sind, haben wir zu viele Platzhalter verwendet. Außerdem wird das Wort abzüglich der ersten 15 Buchstaben dreimal zur Längenberechnung hinzugefügt, sodass jedes Wort, das länger als 15 Buchstaben ist, automatisch drei Platzhalterzeichen belegt und daher ungültig ist. Die Wertung erfolgt für den verbleibenden Pool, der ursprünglich 187 Punkte hatte, von denen wir einfach subtrahieren. Beachten Sie , dass 65 die ASCII-Nummer von ist , da sich das Duplikat am Anfang des Pools befindet. Der Rest ist nur Boilerplate.f 61
stattdessenf 65
'A'
"AEIO"
quelle
Python3 - 197
Lassen Sie uns die Bignums verwenden: D (Es behandelt derzeit keine Platzhalter, ich habe das Lesen dieser Regel ganz ausgelassen, verdammt)
quelle
Rubin - 195
Ich gehe davon aus, dass die Ausgabe von
"Invalid"
in Ordnung ist, wenn ich das nicht tun$><<(-b<1&&w.size<16?s:'Invalid')
müsste, würde es auf 198 ansteigenClojure - 325
Ich habe seit einiger Zeit keine Clojure mehr durchgeführt, daher gibt es sicher verschiedene Möglichkeiten, um meine Lösung zu verbessern
Einige was Ungolfenes
quelle
ES6: 184 (nicht streng)
w
Es wird davon ausgegangen, dass das Wort bereits enthalten ist.r
ist die Ausgabezeichenfolge.Hier ist es erklärt und ein bisschen weniger Golf:
quelle
Dart - 201
Dies erfordert Bignums, sodass keine Kompilierung mit JavaScript möglich ist.
Mit mehr Leerzeichen:
quelle
PHP,
180170168 BytesYay! JS schlagen!
Nervenzusammenbruch
Ich bin so froh, dass es keinen Buchstaben gibt, der größer als 10 ist.
quelle