Die Herausforderung:
Drucken Sie jedes in Scrabble akzeptierte 2-Buchstaben-Wort mit möglichst wenigen Bytes. Ich habe eine Textdatei Liste erstellt hier . Siehe auch unten. Es gibt 101 Wörter. Kein Wort beginnt mit C oder V. Kreative Lösungen werden empfohlen, auch wenn sie nicht optimal sind.
AA
AB
AD
...
ZA
Regeln:
- Die ausgegebenen Wörter müssen irgendwie getrennt werden.
- Der Fall spielt keine Rolle, sollte aber konsistent sein.
- Leerzeichen und Zeilenumbrüche sind erlaubt. Es sollten keine anderen Zeichen ausgegeben werden.
- Das Programm sollte keine Eingaben machen. Externe Ressourcen (Wörterbücher) können nicht verwendet werden.
- Keine Standardlücken.
Wortliste:
AA AB AD AE AG AH AI AL AM AN AR AS AT AW AX AY
BA BE BI BO BY
DE DO
ED EF EH EL EM EN ER ES ET EX
FA FE
GO
HA HE HI HM HO
ID IF IN IS IT
JO
KA KI
LA LI LO
MA ME MI MM MO MU MY
NA NE NO NU
OD OE OF OH OI OM ON OP OR OS OW OX OY
PA PE PI
QI
RE
SH SI SO
TA TI TO
UH UM UN UP US UT
WE WO
XI XU
YA YE YO
ZA
Antworten:
Python 3,
194188 BytesAuf keinen Fall die kürzeste Methode, aber ich dachte, das wäre ein guter Anfang. Versuchen Sie, jedes Paar in Pfade zu packen, indem Sie so viel wie möglich überlappen (zB
"ODEX..."
=["OD", "DE", "EX", ...]
). Leerzeichen werden zum Trennen von Pfaden verwendet, und Paare mit Leerzeichen werden entfernt (das nachfolgende Leerzeichen soll verhindern,E
dass am Ende ein einzelnes Zeichen gedruckt wird).Ich habe auch versucht, Regex Golf zu spielen, aber es war länger.
quelle
AYAHOYOWOMUNUHAID
!CJam,
9694 BytesDas obige ist ein Hexdump, der mit umgekehrt werden kann
xxd -r -c 16 -g 1
.Probieren Sie es online im CJam-Interpreter aus .
Abhängig davon, was genau als getrennt gilt , könnte die Byteanzahl auf 93 oder sogar 92 gesenkt werden :
Wenn wir ersetzen
-55
mit59
, werden die Wörter durch geschützte Leerzeichen (0xA0) getrennt werden.Wenn wir ersetzen
-55
mitW
, werden die Worte von at-Zeichen getrennt werden (0x40).Idee
Wir können jedes Buchstabenpaar xy als (ord (x) - 65) × 25 + (ord (y) - 65) kodieren . 1
Anstatt die resultierenden Ganzzahlen zu speichern, speichern wir die Differenzen aller Paare, die zwei benachbarten Wörtern entsprechen (alphabetisch sortiert).
Die höchste Differenz ist 35 , also betrachten wir sie als Ziffern einer Ganzzahl zur Basis 36 und wandeln diese Ganzzahl in eine Bytefolge um.
Code
1 Da der zweite Buchstabe niemals ein Z ist , ist die Verwendung von 25 anstelle von 26 ausreichend.
quelle
PHP
224, 218, 210206Auf jeden Fall keine gute Punktzahl, aber ich mochte die Herausforderung.
Ich erstelle eine Tabelle der Optionen, erstelle ein bitweises System, um zu kennzeichnen, welche Optionen gültig sind.
Dann habe ich base-36 diese Optionen codiert, um die Zeichenfolge zu erhalten:
Beachten Sie, dass der dritte Eintrag in diesem String-Array keinen Wert hat, da C keine Optionen hat.
Um die Werte auszudrucken, konvertiere ich einfach die gültigen Optionen in Zeichen.
Es könnte etwas geben, das ich tun könnte, um das Erkennen zu reduzieren, dass es keine Wörter gibt, die auf C, J, K, Q, V oder Z enden, aber ich kann mir keine Methode vorstellen, um es atm zu reduzieren.
Durch das Transponieren der Tabelle entstehen mehr leere Elemente, und die Daten werden etwas kompakter codiert, wodurch einige Bytes eingespart werden. Das Array wird jetzt in einer anderen Reihenfolge gedruckt:
Danke an Ismael für die Explosion und die Loop-Hinweise.
Mit einem Update auf php5.6
pow(,)
können durch**
Speichern weiterer 4 Bytes ersetzt werden.quelle
","
, können Sieexplode(0,UB1YB0100CUP[...])
3
ich benutzen kann! Vielen Dank$e++;for($f=0;$f<26;$f++)
mitfor($e++,$f=0;$f<26;$f++)
, und jetzt können Sie die lästigen entfernen{}
. Und wenn Sie Zeichen in Kleinbuchstaben umwandeln möchten, verwenden Sie$e^' '
.Perl,
167164157 BytesSchrieb ein separates Skript, um die Buchstaben so kompakt wie möglich zu einer Zeichenfolge zusammenzufassen, die alle gültigen 2-Buchstaben-Wörter enthält. Dies iteriert dann über alle zwei Buchstabenwörter und gibt die gültigen aus, eines pro Zeile. Laufen Sie mit
perl -M5.10.1 script.pl
.quelle
-M5.10.1
, um dassay
in dieser Version hinzugefügte Schlüsselwort zu verwenden , oder fügen Sie esuse feature 'say';
im Hauptteil des Skripts hinzu.C 155 Bytes
Golf Version
Ausgabe
Ungolfed-Version
Die 51-Byte-Magic-Zeichenfolge in der Golfversion enthält viele Zeichen jenseits von ASCII 126, die mit ziemlicher Sicherheit in Unicode-Entsprechungen umgewandelt wurden. Die ungolfed-Version verwendet stattdessen hexadezimal und nicht als Literal, sondern als Konstante. Die ungolfed-Version trennt die Wörter außerdem mit einem Zeilenumbruch, was das Kopieren und Einfügen in Excel, das Ordnen der Liste und das Vergleichen mit der gewünschten erleichtert.
Erläuterung
Wenn wir die Definition des Vokals um die 8 Buchstaben AHMEIOUY erweitern, stellen wir fest, dass alle Wörter aus einem Vokal und einem anderen Buchstaben bestehen (der ein Vokal sein kann oder nicht). Daher gilt für alle Wörter, die mit einem Vokal enden, Folgendes: brauchen eine Tabelle von 26 Bytes, eines für jeden ersten Buchstaben, wobei die einzelnen Bits dem Vokal entsprechen. Wir benötigen eine ähnliche Tabelle für die Wörter, die mit einem Vokal beginnen, mit der Ausnahme, dass wir diesmal nur 25 Bytes benötigen, da es kein Wort gibt, das auf Z endet. Die beiden Tabellen werden zusammengefasst, um die endgültige Tabelle zu erstellen.
Um ASCII-Codes in der Region 0..31 zu vermeiden, werden die zwei am wenigsten gemeinsamen "Vokale" M und H dem 6. und 7. Bit zugewiesen, und die Codierung berücksichtigt 1 für ein ungültiges Wort und 0 für ein gültiges Wort. Da es keinen Konsonanten gibt, der sich mit M und H paart, kann sichergestellt werden, dass mindestens eines dieser Bits eine 1 ist.
Das achte Bit wird A zugewiesen, dem am häufigsten verwendeten Vokal, um die Nicht-ASCII-Zeichen einzugrenzen (es gibt immer noch ziemlich viele davon).
Die verwendeten Tabellen sind unten. Bei Wörtern, die 2 Vokale enthalten, wurde der erste Buchstabe als "Vokal" und der zweite Buchstabe als "Buchstabe" eingestuft. Eine Ausnahme bilden Wörter, die mit M beginnen, da hierdurch ein Konflikt zwischen MM und HM vermieden wird.
Hexadezimale Kodierung von Wörtern, die mit einem Vokal beginnen
Hexadezimale Kodierung von Wörtern, die mit einem Vokal enden
quelle
Java,
484448407391389 BytesMein erster Versuch
Formatiert:
Probieren Sie es online aus
quelle
\n
ein Leerzeichen ersetzen . Sie müssen nicht durch neue Zeilen getrennt werden."".format
ist schmerzhaft anzusehen, aber lustig.Ruby, 166 Bytes
Leihen Sie sich die saubere Methode von sp3000 aus , um die Wörter in eine kompakte Zeichenfolge zu kodieren. Der Kicker hier ist die kurze Methode zum Zurückdecodieren in die aus zwei Buchstaben bestehenden Wörter: Verwenden eines Vorgriffs in der Regex, die an die Scanmethode von String übergeben wurde, um überlappende Übereinstimmungen zu extrahieren, ohne Leerzeichen zu enthalten:
Rubin, 179 Bytes
Mein eigener Ansatz: Generiere alle aus zwei Buchstaben bestehenden Wörter zwischen
AA
undZA
und wähle die gültigen aus, indem du eine Base-36-codierte Bitmaske verwendest:quelle
Matlab, 177 Bytes
Generieren Sie eine binäre Matrix, die alle zulässigen Buchstabenpaare definiert, formen Sie sie um und codieren Sie sie mit Base-64. Die Base-64-codierte Zeichenfolge (
'CR+ ... % '
) wird als Daten im Programm verwendet. Das Programm kehrt die Operationen um, um die Matrix zu entpacken, und liest dann die zulässigen Paare:quelle
Malbolge , 2118 Bytes
Probieren Sie es online!
quelle
Bash, 179 Bytes
Es wird
sed
zum Ersetzen von Regex verwendet. Die erste Regex-Eingabe basiert auf der Idee von Sp3000, während die zweite Regex die allgemeine Eingabe ohne Leerzeichen verwendet.Erläuterung:
quelle
`grep -o ..
anstelle`sed -r 's/ / &/g'
eines Tricks aus meiner Antwort unten um sieben Bytes verkleinern .Da alle Wörter zwei Zeichen lang sind, können wir sie alle zusammenschlagen und sie dann mit einem einfachen regulären Ausdruck wieder auseinander reißen.
Jede regex-freundliche Sprache kann dies tun, manche effizienter als andere:
Grep (via Bash), 215 Bytes
Javascript, 224 Bytes
Perl, 225 Bytes
Python, 245 Bytes
Einige der Antworten hier sind länger als
echo
, was ich als Grundlinie betrachten würde:POSIX-Shell, 307 Byte
quelle
C -
228217 Bytes - GCCWird aktualisiert, wenn ich es kleiner bekommen kann, kompiliere es einfach mit gcc -w, ./a.out gibt es perfekt aus. Wenn Sie Interesse an einem ungolfed haben, lassen Sie es mich wissen.
Ich kann mir keine Möglichkeit vorstellen, es aus meinem Kopf heraus zu verkürzen (Sie können die Anführungszeichen in Puts technisch entfernen und Sie erhalten trotzdem eine korrekte Antwort, die Ausgabe sieht nur wie Müll aus), also lassen Sie es mich bitte wissen sowieso zu verkürzen
quelle
_;main(){char*z="AABDEGHILMNRSTWXY AEIOY EO DFHLMNRSTX AE O AEIMO DFNST O AI AIO AEIMOUY AEOU DEFHIMNPRSWXY AEI I E HIO AIO HMNPST EOU IEO A A ";for(;_++^26;)for(;*++z^32;printf("%c%c ",_+64,*z));}
Ich habe das Trennzeichen für die Ausgabe von einer neuen Zeile in ein Leerzeichen geändert, aber wenn Sie eine neue Zeile bevorzugen (eine) extra byte) ändere das printf Format"%c%c\n"
C #, 348 Bytes
Ich hatte einen Versuch:
Ungolfed:
quelle
Pyth , 140 Bytes
Probieren Sie es online!
Komprimierungsmethode: Da
Z
kein Wort an der zweiten Position steht, verwenden Sie das neu geordnete Alphabetbcdfghjklmnpqrstvwxyaeiou
, um die Gültigkeit jedes dieser Buchstaben als zweiten Buchstaben für jeden ersten Buchstaben zu kodieren (die ersten Buchstaben sind alphabetisch sortiert).Dies sind 25 Bits pro Buchstabe oder genau 5 Basis-32-Stellen. Da die meisten Konsonanten nur Vokale als zweiten Buchstaben verwenden, setze ich Vokale an das Ende, um meistens einstellige Zahlen für sie zu erhalten. Ich bin sicher, dass es insgesamt durch weitere Analyse und Neuordnung des Alphabets verbessert werden könnte, obwohl dann die Definition des neu geordneten Alphabets mehr Bytes in Anspruch nehmen würde.
Erläuterung
quelle
PHP:
211209204Sie müssen Warnungen ausschalten, sonst wird bezüglich der impliziten Erstellung von gedruckt
$b
Sehr lustig. Frühe Versuche lagen im 250er-Bereich, aber das ist mein bisher schlankster.
quelle
!
auf dem If herausgenommen. Sie brauchten das.CJam (99 Bytes)
Dies beinhaltet einige Sonderzeichen, daher ist es am sichersten, einen Hexdump zu erstellen. (Insbesondere das Zeichen mit dem Wert
0xa0
, das einem nicht unterbrechenden Leerzeichen entspricht, verursachte mir einige Probleme beim Einrichten der Online-Demo.)Online-Demo .
Der Ansatz ist die Differenzcodierung in Base-26.
quelle
65f+:c
mit'Af+
.md
ist eine großartige Verbesserung, aber ich hatte nicht bemerkt, wie nah meine Antwort an Ihrer ist.CJam,
10098 Bytes(Permalink)
Dies ist mein erster CJam-Eintrag, daher besteht wahrscheinlich das Potenzial für mehr Golf. Ich habe mir jedoch eine Möglichkeit ausgedacht, die Liste der Zeichen auf 63 Bytes zu komprimieren, was hoffentlich jemand anderes hilfreich finden wird.
Kompressionsverfahren
Bisher haben die meisten Methoden, die ich gesehen habe, beide Buchstaben jedes Wortes codiert. Wenn wir jedoch die Wörter in alphabetischer Reihenfolge eingeben, ändert sich der erste Buchstabe nicht sehr oft, sodass es verschwenderisch erscheint, ihn explizit zu codieren.
Ich codiere nur das letzte Zeichen jedes Wortes und füge ein spezielles Element ein, wenn das erste Zeichen erhöht werden soll. Die Zeichen werden als erstes Zeichen codiert, dann wird eine Liste mit Unterschieden angezeigt. Da es keine doppelten Wörter gibt, müssen die Unterschiede mindestens alle sein
1
. Somit kann ich0
als Trennelement verwenden. (Beachten Sie, dass ich dann den ersten Buchstaben jeder Untersequenz als einen Index speichern muss, da es sonst zu Verwechslungen zwischen 'Rollover First Character0
' und 'Start with A0
' kommen würde.)Da die Unterschiede in diesem Fall niemals größer als 15 sind, können wir base-16 verwenden und zwei (4-Bit-) Elemente in jedes (8-Bit-) Byte packen. (Im aktuellen Code habe ich von Base-260 anstatt Base-256 konvertiert, um Probleme mit nicht druckbaren Zeichen zu vermeiden.)
quelle
G
und verwenden undN
16 und einen Zeilenvorschub drücken.%-3<
mit/;;
oder sogar/&
. (Die zweite Option generiert eine Fehlermeldung. Konsens über Meta ist, dass es in Ordnung ist, dies zu tun.)Brainfuck , 1371 Bytes
Ziemlich golfen, aber ich habe nicht zu viel Mühe darauf verwendet.
Probieren Sie es online!
quelle
Zsh, 175 Bytes
Diese Lösung verwendet eine Zeichenfolge mit 125 Zeichen, wobei die Kleinbuchstaben als Begrenzer und der erste Buchstabe der folgenden Folge von Großbuchstaben dienen.
Wir durchlaufen die Buchstaben von
$L
. Wenn der aktuelle Buchstabe$X
im ASCII-Vergleich in Kleinbuchstaben geschrieben ist, setzen Sie ihn$W
auf$X
. Andernfalls drucken Sie$W
verkettet mit$X
, um das aktuelle Wort zu erstellen.Probieren Sie es online!
Edit: hängten
:l
zu Satz Kleinbuchstaben durchgängig, pro AnforderungEDIT2: -4 Bytes , die mit
$X
variablen und vereinfacht , wenn[[..]]
BedingungEdit3: -4 Bytes , die durch das Entfernen Anführungszeichen (
"
)Edit5: -5 - Bytes anstelle Array Umwandlung von iterieren
L
pro untenEdit4: alternativer Ansatz für 182 Bytes , die umkehrbare Zeichenfolgen in den ersten 33 Buchstaben ausnutzen,
$L
sind nur 107 Buchstabenquelle
Stax , 91 Bytes
Führen Sie es aus und debuggen Sie es
Der einzige nette Trick, den diese Antwort verwendet, ist die Verwendung des Tokens ",", um eine Änderung im ersten Buchstaben anzuzeigen, anstatt sie für jedes Wort zu speichern.
Vielen Dank an recursive für die Idee, den Operator m zu verwenden
quelle
M
anstelle von1/
und eine Kurzübersichtm
anstelle von foreach und print{ ... PF
. Dieser packt bis 89.Python 3, 224 Bytes
Verwendet Bitmasken variabler Länge, um zu kodieren, welche zweiten Buchstaben für jeden möglichen ersten Buchstaben existieren. Die Bitmasken können 0,1,3,7,15 oder 31 Bits lang sein. Bits werden Buchstaben mit zugeordnet
for d in 'AOIEHMUSTMNDFPYBCGJKLQRVWXZ':
, frühere Bits werden für häufigere Buchstaben verwendet, so dass die Bitmasken in den meisten Fällen kurz sein können (normalerweise 3 oder 7 Bits, da auf die meisten Konsonanten nur einer von 5 Vokalen oder YM oder H folgt). Leider macht der Code zum Dekodieren die Einsparungen im Vergleich zu einfacheren Methoden zunichte (die ursprüngliche Liste enthält nur 303 Bytes).quelle
Haskell, 192 Bytes
Für jedes durch Leerzeichen getrennte Wort in der Zeichenfolge setzen Sie den ersten Buchstaben vor alle anderen Buchstaben und fügen Sie ein Leerzeichen ein, z . B.
SHIO
->SH SI SO
.quelle
Java, 334 Bytes
Formatiert:
Separat habe ich die Wortliste in eine Länge von 26 x 26 = 676 BitSet codiert, sie in ein Byte-Array konvertiert und schließlich in Base 64. Diese Zeichenfolge ist in diesem Programm fest codiert, und die umgekehrte Prozedur wird verwendet, um das BitSet zu reproduzieren. und schließlich die Liste der Wörter ausdrucken
quelle
Java, 356 Bytes
Verwendet den Zufallszahlengenerator, um die folgenden Wörter zu erhalten:
Ungolfed:
Sie können es hier ausprobieren: http://ideone.com/Qni32q
quelle
Perl, 248 Bytes
Das erste Mal mit Perl (und das erste Mal mit Golfspielen), also gibt es definitiv Raum für Verbesserungen. Berücksichtigen Sie die Vokale und gruppieren Sie die verbleibenden Buchstaben basierend auf der Erstellung des resultierenden Wortes. Fügen Sie den Vokal zuerst, den letzten oder beide Vokale zuerst und den letzten hinzu, und erstellen Sie ein Wort in der Liste.
quelle
"MM "."MY "."BY "."HM "."SH "
könnte zu verkürzt werden"MM MY BY HM SH"
.Javascript (ES6), 214
Vielleicht nicht der kürzeste Weg, aber auf jeden Fall interessant.
Durchläuft jeden Buchstaben in der ersten Zeichenfolge und fügt ihn jedem Buchstaben in der entsprechenden Zeile der zweiten hinzu. Dies gibt die Wörter in der Reihenfolge ihres letzten Buchstabens wie folgt zurück:
Vorschläge willkommen!
quelle
Java,
255254 BytesEs wurde ein Weg gefunden, ein weiteres Byte daraus zu quetschen.
Oder (wenn auch nicht viel klarer):
quelle
'A'
in ändern65
.Haskell,
333308298 BytesNur zum Spaß!
Das Auswerten
s
gibt alle Wörter in einer seltsamen Reihenfolge aus - ich habe die Tatsache ausgenutzt, dass die meisten Kombinationen Vokalkonsonanten sind oder umgekehrt. Mit benutzerdefinierten Zeichen "Klassen" könnte wahrscheinlich eine noch stärkere Optimierung erzielt werden, wodurch die codierte Matrix (hierw
und hier) verkürzt wirdk
) .Kennt jemand eine kürzere Methode zum Drucken von Zeichenfolgen ohne Anführungszeichen und Klammern als meine monadische? Typenklassen sind, soweit ich das beurteilen kann, noch länger.
Es könnte auch einen kürzeren Weg geben
p
, seine Arbeit zu erledigen ...quelle
sequence_
dasselbe wievoid$sequence
? Dann können Sie auch das weglassenimport
.void
musste importiert werden. Wie auch immer, ich werde / muss mich daran erinnern.sequence_$map putStrLn
istmapM_ putStrLn
. Ersetzen Sie die(
,)
umconcat$...
mit einem anderen$
.05AB1E , 143 Bytes (nicht konkurrierend)
Probieren Sie es online!
quelle
PHP, 170 Bytes
kürzester Ansatz, den ich bisher finden konnte ...
Nervenzusammenbruch
Hinweis Die kürzeste Bit-Mapping-Version mit druckbarem ASCII kostet 190 Byte (113 Byte Daten + 77 Byte Dekodierung) bei 6 Bit = Basis 64, 174 Byte (97 Daten, 77 Bit Dekodierung) bei 7 Bit (Basis 128); möglicherweise noch etwas mehr für die Flucht.
Die Basis 224 (unter Verwendung von ASCII 32..255) benötigt 87 Bytes Daten (+ Escaping); aber ich vermute, die dekodierung kostet mehr als 10 bytes extra.
Das Ausschließen von C und V von der Karte würde 16/14/13 Bytes an Daten einsparen, aber viel bei der Decodierung kosten.
quelle