Wenn einer der 50 US- Bundesstaatennamen links als Eingabe angegeben ist, geben Sie die zweistellige Postleitzahl wie rechts gezeigt aus:
Alabama AL
Alaska AK
Arizona AZ
Arkansas AR
California CA
Colorado CO
Connecticut CT
Delaware DE
Florida FL
Georgia GA
Hawaii HI
Idaho ID
Illinois IL
Indiana IN
Iowa IA
Kansas KS
Kentucky KY
Louisiana LA
Maine ME
Maryland MD
Massachusetts MA
Michigan MI
Minnesota MN
Mississippi MS
Missouri MO
Montana MT
Nebraska NE
Nevada NV
New Hampshire NH
New Jersey NJ
New Mexico NM
New York NY
North Carolina NC
North Dakota ND
Ohio OH
Oklahoma OK
Oregon OR
Pennsylvania PA
Rhode Island RI
South Carolina SC
South Dakota SD
Tennessee TN
Texas TX
Utah UT
Vermont VT
Virginia VA
Washington WA
West Virginia WV
Wisconsin WI
Wyoming WY
Regeln
- Eingabe und Ausgabe unterscheiden zwischen Groß- und Kleinschreibung. Du hast viele nicht ausgegeben zB
Al
fürAlabama
. - Sie können davon ausgehen, dass es sich bei der Eingabe um einen der 50 oben gezeigten Statusnamen handelt.
- Sie dürfen nicht auf das Internet zugreifen oder eingebaute Zustandsdaten verwenden (Sie betrachten Mathematica).
Separate Listen mit Ein- und Ausgängen finden Sie in diesem Snippet (bitte nicht ausführen, nur zum Komprimieren des Posts):
(Nicht-Scoring) Brownie-Punkte, wenn Sie auch District of Columbia
als Input nehmen und produzieren können DC
, Virgin Islands, etc. etc.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes in jeder Sprache .
(Ursprünglich vorgeschlagen von ETHProductions)
code-golf
string
kolmogorov-complexity
state-abbreviation
Steve Bennett
quelle
quelle
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
Bytes speichern :Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Antworten:
Javascript,
124117 Bytes(7 Bytes gespart dank hvd)
Erläuterung:
quelle
[A-Z]
ist nicht erforderlich, da bekannt ist, dass die Eingabe gültig ist. Der Iowa-Sonderfall kann so verkürzt werden, dass[AFIOUW][^o]
er ausgeschlossen wird und für das Finale verbleibt.+
.s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()
Können wir auf 100 kommen? :)Javascript,
13713513413211311010810199949392 BytesDies basiert auf der HP Williams-Lösung mit einigen Verbesserungen außerhalb des regulären Ausdrucks und ein paar Verbesserungen darin.
(Zeilenumbrüche nur zur besseren Lesbarkeit)
Kommentar für den Regex:
Sinnloser alternativer regulärer Ausdruck (gleiche Länge):
Geschichte
94
99
101
108
110
113
132
134
135
137
quelle
...s.s?
zufällig entdeckt ( erfasst Mississippi, Missouri, Massachussetts und Alaska). Ich war.*sk
gerade dabei, das Fragment an einen anderen Ort zu verschieben, und die Tests liefen einfach und bestanden, während das Fragment nirgendwo vorhanden war. Einfachster 5 Charakter Gewinn aller Zeiten!...s.s?
das auch versehentlich zu Kansas passt und wie durch ein Wunder immer noch das richtige Ergebnis liefert.M[onti]+
. So seltsam: Wenn der Zustand mit M beginnt, ist der zweite Buchstabe der letzte in einer Folge von mindestens einem o, n, t oder i. Eine sehr seltsame Art, Michican, Minnesota oder Montana einzufangen.JavaScript (ES6),
156136 ByteDemo
Code-Snippet anzeigen
quelle
X MOD[50-1000] MOD[50-1000] MOD[50-100]
. Aber das.slice(1)
war ein Fehler. Zur Zeit läuft wieder die ganze Saite.Jelly , 75 Bytes
Probieren Sie es online!
... oder sehen Sie sich eine Testsuite an - Beachten Sie, dass eine kleine Änderung vorgenommen werden musste, um das gesamte Programm für mehrere Eingaben auf einmal auszuführen (ich habe das Programm-Eingabe-Atom ausgetauscht
³
, für einen Rückruf aus dem Register®
, eins und das Register gesetzt) zu jedem Zustandsnamen der Reihe nach).Wie?
Berechnet den Index für das zweite Zeichen der Postleitzahl, hängt ihn an das erste Zeichen an und setzt das Ergebnis in Großbuchstaben.
Findet zuerst den Index eines Leerzeichens (oder 0, wenn nicht gefunden);
Andernfalls wird geprüft, ob es sich um Alaska oder Missouri handelt (mit 5 für
k
odero
).Andernfalls wird der Index des Eingabezustands in der Liste gefunden
Arizona Minnesota Mississippi Nevada Montana Texas Tennessee
(oder 0, falls nicht gefunden). In diesem Fall wird der Index Mod 2 plus 3 (fürz n s v t x n
) verwendet.Andernfalls wird die Zeichenfolge in Ordnungszahlen konvertiert, die von der Basis 256 konvertiert, der Rest nach der Division durch 29487 ermittelt, der Rest nach der Division durch 14 ermittelt und mit diesem Wert in die Binärdarstellung von 9620 indexiert und das Ergebnis verdoppelt - es ergibt sich 0 für Staaten, die ihren letzten Buchstaben und 2 für diejenigen, die ihren zweiten Buchstaben verwenden.
Alle bis auf den allerersten Fall werden inkrementiert, und der resultierende Wert wird dekrementiert (wobei der um eins gefundene Raumindex erhöht wird).
quelle
Python 2 , 191 Bytes
Probieren Sie es online!
Verwendet eine einfache Hash-Funktion, um das zweite Zeichen der Abkürzung zu finden.
quelle
Python 2,
9490 BytesProbieren Sie es online aus
(Nur Python 2, da Python 3-Hashes nicht stabil sind und Sie auch keinen String hashen können, ohne ihn in Bytes umzuwandeln.)
Funktioniert mit allen 50 Bundesstaaten sowie als Bonus District of Columbia und Puerto Rico.
Es wäre möglich , ein Byte zu speichern , indem die Zahl in der Basis-36 zu schreiben:
int("5clu7x0aixb0pelmpugv5iiibphrpf",36)
.Ich bin gespannt, ob mir eine kreativere Lösung einfällt.Aktualisieren:
Da der Hash 12 nicht verwendete Ziffernpositionen enthält, gibt es 2 36 mögliche Zahlen, die funktionieren. Es schien vernünftig zu glauben, dass einer von ihnen einen Primfaktor mit einem großen Exponenten haben würde. Für jede gegebene Primzahl und jeden gegebenen Exponenten ist es ziemlich schnell, einen Wert zu finden. Es gelang mir, einen Ausdruck mit dem Faktor 19 9 zu finden , wodurch die Größe des Ausdrucks, der für die Darstellung der Zahl benötigt wird, um vier Bytes verringert wurde.
Dies ist im Grunde das gleiche Verfahren wie bei meiner C-Antwort, jedoch mit Python. Da die Basis-Hash-Funktion unterschiedlich ist, musste ich eine andere Reduktionsfunktion finden, die sich als Mod 52 anstelle von Mod 54 herausstellt. Die größten Einsparungen gegenüber C ergeben sich jedoch aus der Möglichkeit, Bignums zum Codieren des Vektors zu verwenden, und natürlich Die Tatsache, dass der Standard für Python zu sein scheint, dass es in Ordnung ist, ein Lambda-Literal anstelle eines vollständigen Programms zu verwenden.
quelle
Retina ,
1138180777068 BytesProbieren Sie es online! Beinhaltet alle 51 Testfälle. 32 Bytes gespart durch Aneignung von @ JörgHülsermanns Regex, der den zweiten Buchstaben findet (mit einem Tweak zur Unterstützung von DC; edit: 1 Byte gespart dank @ JörgHülsermann). 3 Bytes gespart, indem er von seinem Kommentar zu @ HPWilliams Antwort zu @ SteveBennetts Regex gewechselt hat. Gespeichert
79 Bytes Dank nochmals an @SteveBennett. Die anderen Buchstaben werden dann gelöscht und die Zeichenfolge groß geschrieben.quelle
e
war wirklich am problematischsten.d
. (Möglicherweise möchten Sie automatische Tests verwenden - ich habe ein Skript, das ständig alle 50 Fälle überprüft.)PHP> = 7.1, 113 Bytes
Online Version
Die Treffer werden durch ein früheres Anfangsspiel zuvor ausgeglichen
([vxz])
Streichhölzer Arizona, Nevada,New Mexico,Pennsylvania,Texas,(.)
(ein Leerzeichen zuvor) entspricht New Hampshire, New Jersey, New Mexiko, New York, North Carolina, North Dakota, Rhode Island, South Carolina, South Dakota, West Virginia[CGHKLPV].*(.)
Streichhölzer Kalifornien, Colorado, Connecticut, Georgia, Hawaii, Kansas, Kentucky, Louisiana,New Hampshire,North Carolina,Pennsylvania,South Carolina, Vermont, Virginia,West Virginiaow(a)
Spiel Iowalas(k)
Spiel Alaskassi?(.)
Stimmt mit Massachusetts, Mississippi, Missouri,Tennesseeübereinn(n|t|[de]$)
StreichhölzerConnecticut,Kentucky,Maine, Maryland, Minnesota, Montana,Pennsylvania,Rhode Island,Tennessee,VermontKeine Übereinstimmung für diese Staaten, daher nehmen wir die ersten beiden Buchstaben Alabama, Arkansas, Delaware, Florida, Idaho, Illinois, Indiana, Michigan, Nebraska, Ohio, Oklahoma, Oregon, Utah, Washington, Wisconsin, Wyoming
Wenn ich diesen Regex-Subpatter
?|
zum ersten Mal verwende, können die Rückverweise in einem gespeichert werden.Unterstützen Sie den District of Columbia
Ersetzen Sie
(.)
mit([^o])
+3 BytesProbieren Sie es online!
PHP, 150 Bytes
Probieren Sie es online! Testfälle
quelle
n|t|
ein Byte nicht kürzer als[nt]|
?PHP,
887854 BytesProbieren Sie es online!
Erster Timer, Hurra!
quelle
$argv[1]
wird ersetzt durch$argn
sandbox.onlinephpfunctions.com/code/…php
!C
945937718711660616 Bytes219 Bytes nur dank ASCII gespart.
Zeilenumbruch nicht erforderlich, nur für Anzeigezwecke. Übernimmt den Zustand als Eingabe. Probieren Sie es online!
Wie es funktioniert:
struct{int*a,b;}m[]=...
Deklariert eine Mapm
mit zwei Werten - einer 4-Byte-Zeichenfolge und einem Zeichen. Dies wird in der Vergleichsschleife verwendet, die den zweiten bis fünften Index mit demchar*a
in der Karte vergleicht.gets(b)
liest eine Zeichenfolgeb
. Dies ist der abzukürzende Zustand.putchar(*b)
Gibt das erste Zeichen dieser Zeichenfolge aus, da jede Abkürzung mit dem ersten Buchstaben des Status beginnt.for(;m[i].a;i++)
durchläuft jeden Wert der Karte. (Dies kann möglicherweise gekürzt werden.)if(!strncmp(m[i].a,b+1,4))
vergleicht den aktuellen Kartenwert mit dem zweiten bis fünften Zeichen vonb
(dem abzukürzenden Zustand). Dies liegt daran, dass sich nur die ersten fünf Zeichen unterscheiden, das erste Zeichen jedoch bereits gedruckt wurde.puts(&m[i].b);
druckt den zweiten Buchstaben der Abkürzung (wenn der Statusname mit dem aktuellen Kartenwert übereinstimmt) und eine neue Zeile.quelle
C
148141 Bytes*(int*)(s+1)
betrachtet das zweite bis fünfte Zeichen der Eingabe als Ganzzahl; Diese ganze Zahl wird dann mit dem Hash auf 0-56 gehashti%663694%57
. Der Hash-Wert wird dann in einem Vektor von Offsets nachgeschlagen, die den Ort des zweiten Buchstabens der Abkürzung darstellen. Ich habe diese speziellen vier Bytes ausgewählt, weil (1) Missouri und Mississippi sich zuerst im fünften Zeichen unterscheiden und (2) einige Zustände nur vier Zeichen haben. In C können Sie das NUL-Abschlussbyte verwenden, aber nichts darüber hinaus ist zuverlässig. (Dadurch werden beide Norden und beide Süden auf den gleichen Wert gehasht. Dies spielt jedoch keine Rolle, da der zugehörige Versatz für alle diese Werte 6 beträgt.)Zufälligerweise ergibt dieser bestimmte Hash die richtige Position für die zweiten Buchstaben der Abkürzungen von District of Columbia, Puerto Rico und "Virgin Islands" (so geschrieben, nicht als "US Virgin Islands", da der Algorithmus darauf besteht, dass der erste die richtige Position ergibt Zeichen der Abkürzung das erste Zeichen des Namens sein).
Die Konstanten 663694 und 57 wurden mit einem automatisierten Test gefunden; 57 war der kleinste Hash-Bereich, den ich gefunden habe. (Die erste Version verwendete 380085 und 63, aber als ich den Testbereich erweiterte, fand ich den neuen.) Es scheint, dass ein etwas kleinerer Hash existiert, wenn ein Code für "das letzte Zeichen im Namen verwenden" hinzugefügt wird; Leider ist die C-Syntax für die Auswahl des letzten Zeichens zu wortreich, um dies hilfreich zu machen.
Es gibt nur 8 verschiedene Offsets. Sie könnten also in einer 171-Bit-Nachschlagetabelle (3 * 57) mit drei Bits pro Eintrag gespeichert sein. Aber ich konnte mir keine Möglichkeit vorstellen, diese Bits effizient in das Programm einzufügen. Hex-Codierung würde ungefähr ein Zeichen pro vier Bits plus die
0x
Präfixe erfordern . Ich könnte es nicht besser machen als 151 Bytes, was viel länger ist als die String-Version. Wenn die 171 Bits irgendwie als rohe Oktette eingefügt werden könnten, würden sie 22 Bytes belegen, daher könnte es eine Lösung geben, aber das Lesen einer Datei ist klobig.quelle
Eigentlich 181 Bytes
Diese Lösung erwartet eine Eingabe in Anführungszeichen.
Probieren Sie es online!
Erläuterung
Diese Lösung verwendet dieselbe Hashing-Strategie wie meine Python 3-Lösung . Der Kürze halber werde ich die Erklärung weglassen, wie der Hash berechnet wird und warum er ausgewählt wurde (lesen Sie die andere Antwort, wenn Sie dieses Bit möchten).
Auch der Kürze halber werde ich den Inhalt der sehr langen Zeichenketten weglassen, da sonst die Erklärung unlesbar wäre.
quelle
Python 3 , 230 Bytes
Probieren Sie es online!
Die Eingabe wird als Byte-Objekt erwartet (eine Byte-Zeichenfolge anstelle einer Unicode-Zeichenfolge).
Vielen Dank an Johnathon Allan für eine absurde Menge an Bytes
Erläuterung
Jeder Zustandsname wird
a
durch Anwenden des Hashesa = sum(o*5**i) % 236
(wobeio
die ASCII-Ordnungszahl eines Zeichens undi
sein Index in der Zeichenfolge ist, beginnend mit dem Ende) zu einer Ganzzahl gehasht . Das Modul236
wurde gewählt, weil es das kleinste Modul ist, bei dem alle Hash-Werte für die 50 US-Bundesstaatsnamen unterschiedlich sind. Diese Hashes werden dann den Zustandsabkürzungen zugeordnet, und das resultierende Wörterbuch (komprimiert durch Zeichenfolgensubstitution) wird verwendet, um die Abkürzung unter Angabe eines Zustandsnamens nachzuschlagen (Hashing, um den entsprechenden Schlüssel zu erhalten).quelle
lambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Ruby,
106103 BytesWenn die Eingabe ein Leerzeichen enthält, ist der zweite Ausgabebuchstabe der nach dem Leerzeichen. Sonst...
Hash die Summe aller Zeichen in der Eingabe, um ein Zeichen zu erhalten, dessen Index in der magischen Zeichenfolge den Index des zweiten Ausgangsbuchstabens in der Eingabezeichenfolge gemäß der Formel angibt
j>8?j/4:-1
(-1 bedeutet das Ende.). Wenn der Hash ein Zeichen enthält, das nicht in der magischen Zeichenfolge enthalten ist, ist der zweite Buchstabe der zweite eingegebene Buchstabe.Zur Erläuterung der magischen Zeichenfolge sind die Hash-Zeichen und die von ihnen kodierten Buchstabenindizes unten aufgeführt. Beachten Sie, dass Delaware angezeigt wird, obwohl der zweite Buchstabe dies tun würde. Dies liegt daran, dass der Hash-Code mit Kentucky kollidiert. Zum Glück ist der letzte Brief von Delaware der gleiche wie der zweite.
Ungolfed im Testprogramm
quelle
/// ,
619608 BytesProbieren Sie es online!
Da es keine andere Möglichkeit gibt, Eingaben in /// vorzunehmen, erfolgt die Eingabe am Ende des Programms. Hängen Sie einfach die gewünschte Eingabe an das Programm an.
Durch mehr Ersetzungen wurden 11 Byte gespart, wie von @SteveBennett empfohlen
quelle
Python 2 ,
131125 BytesProbieren Sie es online!
quelle
TAESGL , 386 Bytes
Dolmetscher
Sehr einfache Komprimierung der Statusnamen, hinzugefügt in ein Array mit den Abkürzungen.
quelle
Japt, 383 Bytes
Die Komprimierung der ersten Saite kann durch Experimentieren mit der Reihenfolge der Buchstaben verbessert werden.
Probieren Sie es online aus
quelle
Mathematica,
138140134 Bytes+2 Bytes - Fehler gefunden (benötigter Array-Offset von 1, nicht 0)
-6 Bytes - einen besseren Hash gefunden
#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&
Ähnlich wie bei anderen nimmt es den Namen und den ersten Buchstaben. Dann wendet es den Standard - Mathematica - Hash an, dann "
Hash@#~Mod~89866736~Mod~73
" wendet es zwei Module an , um eine eindeutige Zahl für jeden Zustand zu erhalten. Dieser Wert wird dann in einer Zeichenfolge nachgeschlagen, um den zweiten Buchstaben zu generieren.Kann wahrscheinlich mehr Golf gespielt werden, aber der Suchraum ist riesig für Mathematica zu finden. Doppelte zweite Buchstaben wurden bei der Hash-Suche nicht berücksichtigt.
_
Zeichen stehen für verschwendete Werte in der Zeichenfolge. Theoretisch könnte man die Zeichenfolge auf nur 19 Zeichen reduzieren, aber es wäre ein Albtraum, den zu produzierenden benutzerdefinierten Hash zu finden.quelle
Perl 5,
150148 Bytes (147 + 1)Das ist keineswegs optimal, aber es macht seinen Job. Benötigt
-n
Befehlszeilen-Flag.quelle
Python 2 , 152 Bytes
Probieren Sie es online!
Ein Hafen von Arnauld's Antwort .
quelle