Das Hauptsystem ist eine mnemonic Vorrichtung zur Umwandlung von Zahlen in Worte zu fassen , so dass sie leichter gespeichert werden.
Es basiert darauf, wie Wörter phonetisch klingen, aber um die Dinge für die Herausforderung einfach zu halten, werden wir uns nur damit befassen, wie Wörter geschrieben werden. Dies bedeutet, dass es einige falsche Conversions geben wird, aber das ist in Ordnung.
So konvertieren Sie eine Zahl mit unserem vereinfachten Hauptsystem in ein Wort:
- Ersetzen Sie jedes
0
durchs
oderz
. (Manche könntens
und manche könnten seinz
. Dasselbe gilt weiter unten.)- Ersetzen Sie jedes
1
durcht
oderd
oderth
.- Ersetzen Sie jeweils
2
durchn
.- Ersetzen Sie jeweils
3
durchm
.- Ersetzen Sie jeweils
4
durchr
.- Ersetzen Sie jeweils
5
durchl
.- Ersetzen Sie jedes
6
durchj
odersh
oderch
.- Ersetzen Sie jedes
7
durchk
oderc
oderg
oderq
.- Ersetzen Sie jedes
8
durchf
oderv
.- Ersetzen Sie jedes
9
durchp
oderb
.- Fügen Sie die Buchstaben
aehiouwxy
an beliebiger Stelle hinzu, um nach Möglichkeit ein echtes englisches Wort zu erhalten .
Die einzige Ausnahme ist, dassh
nicht nach einems
oder eingefügt werden darfc
.Die Zahl kann tatsächlich eine beliebige Folge der Ziffern 0-9 sein (keine Dezimalstellen, Kommas oder Zeichen).
Das Wort darf nur die Kleinbuchstaben az enthalten.
Beispiele
Die Zahl 32
muss wie folgt konvertiert werden ?m?n?
: Dabei handelt es sich ?
um eine beliebige endliche Zeichenfolge aus den Buchstaben aehiouwxy
(eine Zeichenfolge aus dem freien Monoid, wenn Sie dies vorziehen). Es gibt viele Möglichkeiten , dies zu einem echten englischen Wort gemacht werden könnte: mane
, moon
, yeoman
etc.
Die Nummer 05
könnte als ?s?l?
oder konvertiert werden ?z?l?
. Einige Möglichkeiten sind easily
, hassle
und hazel
. Das Wort shawl
ist nicht erlaubt, da es h
möglicherweise nicht nachgestellt wird s
. es würde falsch als gelesen 65
.
Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die eine Zeichenfolge mit den Ziffern 0-9 enthält und alle Wörter findet, in die es mithilfe der vereinfachten Hauptsystem-Mnemonik konvertiert werden könnte.
Ihr Programm hat Zugriff auf eine Wortlistentextdatei, die definiert, was alle "echten" englischen Wörter sind. In jeder Zeile dieser Datei befindet sich ein z-Wort in Kleinbuchstaben, und Sie können optional davon ausgehen, dass es eine nachgestellte neue Zeile enthält. Hier ist eine Liste von echten Wörtern, die Sie zum Testen verwenden können. Sie können davon ausgehen, dass diese Wortlistendatei aufgerufen wird f
(oder etwas länger ist) und sich in einem beliebigen Verzeichnis befindet.
Für eine 35-Byte-Strafe (addiere 35 zu deiner Punktzahl) kannst du annehmen, dass die Wortliste bereits als eine Liste von Zeichenfolgen in eine Variable geladen ist. Dies gilt hauptsächlich für Sprachen, die keine Dateien lesen können.
Ihr Programm muss alle Wörter in der Wortliste ausgeben, in die die eingegebene Nummer konvertiert werden kann. Sie sollten auf stdout (oder ähnlich) gedruckt werden, eine pro Zeile (mit einem optionalen abschließenden Zeilenumbruch), oder sie können als Liste von Zeichenfolgen zurückgegeben werden, wenn Sie eine Funktion schreiben möchten. Die Wortliste muss nicht unbedingt alphabetisch sein und die Ausgabe muss auch nicht so sein.
Wenn es keine möglichen Wörter gibt, ist die Ausgabe (oder die Liste) leer. Die Ausgabe ist auch leer, wenn die leere Zeichenfolge eingegeben wird.
Übernehmen Sie die Eingabe über stdin, die Befehlszeile oder als Zeichenfolgenargument für eine Funktion. Die Wortliste oder ihr Dateiname sollte nicht Teil der Eingabe sein, sondern nur die Ziffernfolge.
Sie stimmen nur mit einzelnen Wörtern in der Wortliste überein, nicht mit Wortfolgen. Das Wort noon
wäre wahrscheinlich eines der Ergebnisse für 22
, aber die Wortfolge no one
würde es nicht.
Testfälle
Angenommen, dies ist die Wortliste:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
Die Eingabe 0123456789
sollte alle langen Wörter außer zdnmrlshchvb
und enthalten shthnmrlchgvb
:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
Die Eingabe 99
sollte geben:
bob
pop
bop
bopy
(Die Ausgabewörter können in beliebiger Reihenfolge sein.)
Wertung
Die kürzeste Übermittlung in Bytes gewinnt. Tiebreaker geht zu dem Beitrag, der zuerst veröffentlicht wurde.
Nifty verwandte Seite: numzi.com .
Antworten:
Perl,
8784Übernimmt die Eingabe als Befehlszeilenparameter:
Kann etwas kürzer gemacht werden, wenn die Wortliste in der Standardeingabe erlaubt wäre:
quelle
A
bedeutet inopen A,f
?<A>
).Python 2,
215208 BytesDiese Python-Lösung erstellt einen regulären Ausdruck aus Teilen, die durch das Befehlszeilenargument indiziert werden, und testet dann jedes Wort mit diesem (ziemlich großen) regulären Ausdruck.
Originalquelle vor dem Minifier:
Der reguläre Ausdruck für den Test
99
lautet beispielsweise:Das
(?<![sc])h
Bit ist eine Komponente, die "hinter negative Behauptungen schaut" und sicherstellt, dass ah
nicht einems
oderc
in den allgemeinen Füllerteilen folgt .Vielen Dank, Calvin. Diese Herausforderung hat mich motiviert, meine rostigen Regex-Fähigkeiten aufzufrischen.
quelle
b=c='((?<![sc])h|[aeiouwxy])*'
spart zwei Bytes.t|th -> th?
speichert ein BytePython 3, 170
Lesbare Version:
Der Code macht sich die Tatsache
th
zunutze , dass er redundant ist (da er der gleichen Nummer wie zugeordnett
ist undh
ein Füllzeichen ist).Die statische
maketrans
Funktion erstellt eine Tabelle, in der die Zeichen des ersten Arguments denen des zweiten Arguments und die Zeichen des dritten ArgumentsNone
denen des dritten Arguments zugeordnet werden (wodurch diese Zeichen gelöscht werden).Der endgültige Code könnte ein paar Bytes kürzer gemacht werden, indem die Tabelle als direktes Argument von erstellt wird
translate
.quelle
input()
verwendet werden kann, weil sie in einer Schleife aufgerufen wird. Außerdem hat der von Ihnen vorgeschlagene reguläre Ausdruck dieselbe Länge wie der, den ich bereits verwende (5 Byte).sed, paste, grep, cut - 109
Nimmt eine Datei "w", konvertiert jedes Wort in seine Nummer, fügt es wieder in das Original ein, sucht nach der Nummer und gibt das gefundene Wort zurück. Beachten Sie, dass das Leerzeichen nach dem Anführungszeichen nach grep ein Tabulator ist, der Standardbegrenzer für das Einfügen.
Ich weiß, Perl ist weit vorne, wollte nur eine bessere Shell-Version als Beispiel.
Oh ja, der $ 1-Teil bedeutet, dass dies von einem Shell-Skript ausgeführt werden soll (die meisten Shells sollten funktionieren), daher ist ein Befehlszeilenargument erforderlich.
quelle
sed
, um Perls Offenheit und@ARGV
Overhead zu vermeiden , aber das Fehlen von Bereichen und Löschfunktionen machty///
es kaputt. Obwohl es keine Variablen gibt, können Sie die Logik selbst überraschenderweise direkt in ausdrückensed
. Hier ist meine Lösung 92:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
Bash + Coreutils, 216
w
sed
ersetzt Ziffern durch ihre möglichen Ersetzungeneval printf
verwendet Shell-Klammer-Erweiterungen, um alle möglichen Substitutionen zu erweiternsed
Zeile in der ersten Zeile entferntaeiouwxy
undh
(wenn nicht vorangestellt[sc]
) aus der Wortlisteaeiouwxy
undh
aus der Wortliste, die letztensed
zu Drehungen die Ergebnisse von grep (Zeilennummern jedes Spiel) einen anderensed
Ausdruck, der durch die äußerste verarbeitet wird ,sed
alle möglichen Wörter aus der Wortliste zu offenbaren.Ausgabe:
Die Wortlistendatei wird als Befehlszeilenargument angegeben, gefolgt von der zu mnemonisierenden Zahl:
quelle
tr, sed, grep, xargs, sh, 77
Erwartet, dass die Nummer in stdin und die Wortliste in der Datei gespeichert werden
f
.Verwendet nicht alle Ersetzungen (1 wird immer z sein, 7 wird immer k sein), so dass es eine träge Lösung genannt werden kann, aber es findet mindestens eine Mnemonik für 95 Zahlen in [1-100].
quelle
1
immer seinz
oder7
immer machenk
. Dies ist ungültig.