Effizientere US-Bundesstaatencodes

20

Kürzen Sie diesen US-Bundesstaat! hat Spaß gemacht, aber wir haben gelernt, dass es mit dem aktuellen System schwierig ist, US-Bundesstaaten effizient abzukürzen. Lassen Sie uns ein alternatives Code-Schema für effizientes Golfen entwickeln.

Deine Aufgabe:

Schreiben Sie eine Funktion (oder ein Programm), die unter Angabe eines gültigen US-Bundesstaatsnamens (nur die 50 erforderlichen Normalzustände) einen eindeutigen, aus zwei Buchstaben bestehenden Code in Großbuchstaben zurückgibt. Der Code muss diese Anforderungen erfüllen:

  • Der erste Buchstabe muss mit dem ersten Buchstaben des Staates identisch sein.
  • Der zweite Buchstabe muss einer der anderen Buchstaben des Staates sein (kein Leerzeichen).
  • Es muss immer dieselbe Ausgabe für dieselbe Eingabe geben und darf niemals dieselbe Ausgabe für zwei verschiedene gültige Eingaben geben.

Bei "Alabama" könnte Ihre Funktion beispielsweise "AL", "AA", "AB" oder "AM" zurückgeben - sofern dieser Wert für Alaska, Arkansas usw. nicht zurückgegeben wird ("AA") "ist nur möglich, weil" A "im Statusnamen mehrmals vorkommt.)

Standardlücken verboten. Standardeingang / -ausgang sind ok. Dies ist Codegolf, daher gewinnt die kürzeste Lösung in Byte.

Die vollständige Liste der möglichen Eingaben finden Sie hier:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming
Steve Bennett
quelle
2
Sollte die Ausgabe immer aus zwei Großbuchstaben bestehen, oder ist es in Ordnung, gemischte Groß- und Kleinschreibung auszugeben? Wenn gemischt in Ordnung ist, sollte "Ab" als von "AB" verschieden betrachtet werden. und muss der erste buchstabe immer groß geschrieben werden?
Jonathan Allan
Ist das Leerzeichen ein gültiger Buchstabe?
Jonathan Allan
Buchstaben sind Buchstaben.
Steve Bennett
Die Ausgabe muss in Großbuchstaben erfolgen. Entschuldigung, das hätte ich wirklich spezifizieren sollen.
Steve Bennett
Danke, ich habe diese beiden Entscheidungen befolgt, da ich dachte, dass sie am sinnvollsten sind.
Jonathan Allan

Antworten:

7

Jelly ,  13  12 Bytes

907ị;⁸Qḣ2ṢŒu

Eine monadische Verknüpfung, die Listen von Zeichen aufnimmt und zurückgibt.

Probieren Sie es online! oder sehen Sie sich eine Testsuite an

Wie?

907ị;⁸Qḣ2ṢŒu - Monadic link: list of characters, state    e.g. Alabama   or   Kansas
907          - literal 907
   ị         - index into state                                b              K
     ⁸       - link's left argument, state
    ;        - concatenate                                     bAlabama       KKansas
      Q      - de-duplicate (unique by 1st appearance)         bAlam          Kans
       ḣ2    - head to index 2                                 bA             Ka
         Ṣ   - sort                                            Ab             Ka
          Œu - convert to uppercase                            AB             KA

Indizierung in Jelly 1-indiziert und modular, so die 907 - ten Index des etwas mit der Länge L ist die (907-Modulo-L) ten Punkt. Zum Beispiel für "Alabama" ist die Länge 7, so dass das Element bei Index 907 das (907-Modulo-7) -te und 907-Modulo-7 4 ist (907 = 129 * 7 + 4 ), so dass das Element bei Index ist 907 ist 'b'.

907 ist der erste positive Index, bei dem die Zustandsabkürzungen mit Index 1 und dieser Index für alle 50 Zustände eindeutig werden.

Zustandsnamen einschließlich ihrer Leerzeichen haben die Länge 4 bis einschließlich 14, und 907-modulo-6 ist 1 (während für alle anderen Längen der Wert nicht 1 ist). Dies bedeutet, dass wenn wir das 1. und das 907. Zeichen als Abkürzungen für Alaska, Hawaii, Kansas, Nevada und Oregon verwenden würden, AA, HH, KK, NN bzw. OO - dies ist für Hawaii, Kansas nicht akzeptabel. oder Nevada; Daher muss eine Anpassung vorgenommen werden. Dies ist der Grund für die Verkettung, Deduplizierung, weiter zu Index 2 und Sortieren. Dadurch werden Alaska, Hawaii, Kansas, Nevada und Oregon zu AL, HA, KA, NA bzw. OR und kollidieren nicht mit den vorhandenen staatlichen Abkürzungen .

Jonathan Allan
quelle
@LevelRiverSt sollte jetzt OK sein, obwohl es wahrscheinlich eine kürzere Lösung als diesen Patch für meinen fehlerhaften Original gibt.
Jonathan Allan
Können Sie bitte eine kurze Erklärung hinzufügen?
user1502040
@ user1502040 Ich war dabei, sollte jetzt klar sein, lass es mich wissen, wenn du nichts verstehst.
Jonathan Allan
Wie bist du darauf gekommen?
user1502040
@ user1502040 Ich wusste, dass wir die Codes aus den Buchstaben in der Eingabe erstellen mussten, und dass die Jelly-Indizierung modular war. Deshalb habe ich nach einem Index gesucht, der 50 eindeutige Codes enthielt (ich habe gerade Python-Code geschrieben, um solche Indizes zu finden - auch nach -341 und -773 im Bereich von -1000 bis 1000). Ich habe ursprünglich die Anforderung für "other" verpasst, also das Problem behoben (wie beschrieben). (Ich habe auch noch nichts Kürzeres gefunden, obwohl ich mich nicht wundern würde, wenn es das gäbe).
Jonathan Allan
3

Ruby, 34 Bytes

->s{s[0]+(s[1,8]*999)[445].upcase}

Ich begann mit s[0]+s*99999[x].upcaseund fand viele Werte von x bis zu x = 100000, die eindeutige Codes für alle 50 Zustände zurückgaben. Leider hatten alle Fälle, in denen der zweite Buchstabe der Abkürzung der erste Buchstabe des Staates war, was nicht erlaubt ist (es sei denn, der Buchstabe erscheint zweimal im Namen des Staates.) Also habe ich mich für den Ausdruck entschieden s[0]+s[1,8]*999[x]und den kleinsten Wert von gefunden x, das funktionierte, war 445.

Kommentiert im Testprogramm und ausgegeben

f=->s{s[0]+            #Return character 0 of the input. Then..
(s[1,8]*999)[          #Concatenate 999 copies of the 8 characters starting at character 1 (or till end of name if state has less than 9 characters) 
   445].upcase         #Return character 445 of the result, converted to uppercase. 
}                     
"Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming".split($/).map{|i|p [f[i],i]}

["AA", "Alabama"]
["AL", "Alaska"]
["AI", "Arizona"]
["AS", "Arkansas"]
["CR", "California"]
["CA", "Colorado"]
["CT", "Connecticut"]
["DA", "Delaware"]
["FO", "Florida"]
["GO", "Georgia"]
["HA", "Hawaii"]
["IA", "Idaho"]
["IO", "Illinois"]
["ID", "Indiana"]
["IW", "Iowa"]
["KA", "Kansas"]
["KC", "Kentucky"]
["LA", "Louisiana"]
["MI", "Maine"]
["MA", "Maryland"]
["MH", "Massachusetts"]
["MG", "Michigan"]
["MO", "Minnesota"]
["MS", "Mississippi"]
["MU", "Missouri"]
["MN", "Montana"]
["NS", "Nebraska"]
["NE", "Nevada"]
["NM", "New Hampshire"]
["NR", "New Jersey"]
["NX", "New Mexico"]
["NO", "New York"]
["NC", "North Carolina"]
["ND", "North Dakota"]
["OI", "Ohio"]
["OO", "Oklahoma"]
["OR", "Oregon"]
["PL", "Pennsylvania"]
["RI", "Rhode Island"]
["SC", "South Carolina"]
["SD", "South Dakota"]
["TS", "Tennessee"]
["TX", "Texas"]
["UA", "Utah"]
["VR", "Vermont"]
["VN", "Virginia"]
["WG", "Washington"]
["WI", "West Virginia"]
["WS", "Wisconsin"]
["WO", "Wyoming"]
Level River St
quelle
1
Wo haben Sie die Regel gesehen, dass der zweite Buchstabe nicht mit dem ersten übereinstimmen kann? Das Beispiel hatte sogar "AA" für Alabama.
Paŭlo Ebermann
3
The second letter must be one of the other letters of the state. AA für Alabama ist in Ordnung, weil Alabama zwei As hat. KK ist gut für Kentucky, aber nicht für Kansas zum Beispiel.
Level River St
2

JavaScript (ES6), 46 Byte

s=>s[0]+s[(s>'M')+1153%s.length].toUpperCase()

Demo

Arnauld
quelle
1

Retina , 49 46 Bytes

\B.*(?=[A-Zflmpxz])|\B.*(?=[hru])

T`l`L
!`^..

Probieren Sie es online! Wenn der Bundesstaat einen zweiten Großbuchstaben oder einen der Buchstaben enthält flmpxz, wird dieser zum zweiten Buchstaben des Codes. Andernfalls, wenn es einen der Buchstaben enthält hru, wird dieser zum zweiten Buchstaben des Codes. Andernfalls verwenden Sie einfach die ersten beiden Buchstaben des Bundesstaates.

Neil
quelle
0

JavaScript (ES6), 52 Byte

s=>s[0]+(s=s.slice(2,9))[146%s.length].toUpperCase()


JavaScript (ES6), 52 Byte

s=>s[0]+(s[8]||s[s[1]=='o'?5:4]||s[2]).toUpperCase()

darrylyeo
quelle
2
Hawaii, Kansas und Nevada haben jetzt ungültige Abkürzungen. (Der zweite Buchstabe muss einer der anderen Buchstaben des Staates sein.) Ich habe genau dieses Problem in meiner Jelly-Lösung gelöst.
Jonathan Allan
Ah, wie schwierig! Ich muss auf meine erste Antwort zurückgreifen, gut, dass ich sie gespeichert habe.
darrylyeo