Bardziej wydajne kody stanów USA

20

Skróć ten stan USA! było fajnie, ale dowiedzieliśmy się, że skuteczne skracanie nazw stanów USA jest trudne w obecnym systemie. Wymyślmy alternatywny schemat kodu stanu dla wydajnego grania w golfa.

Twoje zadanie:

Napisz funkcję (lub program), która podając prawidłową nazwę stanu USA (wymagane tylko 50 stanów normalnych), zwraca unikalny dwuliterowy kod identyfikujący go wielkimi literami. Kod musi spełniać następujące wymagania:

  • Pierwsza litera musi być taka sama jak pierwsza litera państwa.
  • Druga litera musi być jedną z pozostałych liter państwa (nie może być spacją).
  • Zawsze musi dawać to samo wyjście dla tego samego wejścia i nigdy nie może dawać tego samego wyjścia dla dwóch różnych ważnych wejść.

Na przykład, biorąc pod uwagę „Alabama”, twoja funkcja może zwrócić „AL”, „AA”, „AB” lub „AM” - pod warunkiem, że nie zwróci tej wartości dla żadnej z Alaski, Arkansas itp. („AA „jest możliwe tylko dlatego, że„ A ”pojawia się więcej niż jeden raz w nazwie stanu).

Standardowe luki zabronione. Standardowe wejścia / wyjścia są w porządku. To jest kod golfowy, więc wygrywa najkrótsze rozwiązanie w bajtach.

Pełna lista możliwych danych wejściowych znajduje się tutaj:

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
źródło
2
Czy dane wyjściowe powinny zawsze składać się z dwóch wielkich liter, czy jest w porządku, aby wyświetlać małe i wielkie litery? Jeśli zmieszane jest OK, „Ab” należy traktować inaczej niż „AB”; i czy pierwsza litera zawsze musi być wielka?
Jonathan Allan
Czy znak spacji jest uważany za prawidłową literę?
Jonathan Allan
Nie. Litery to litery.
Steve Bennett
Dane wyjściowe muszą być pisane wielkimi literami. Przepraszam, naprawdę powinienem to określić.
Steve Bennett
Dzięki, poszedłem za tymi dwoma orzeczeniami, ponieważ uważałem, że mają one jak najbardziej sens.
Jonathan Allan

Odpowiedzi:

7

Galaretka ,  13  12 bajtów

907ị;⁸Qḣ2ṢŒu

Monadyczny link pobierający i zwracający listy znaków.

Wypróbuj online! lub zobacz zestaw testowy

W jaki sposób?

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

Indeksowanie w galarecie jest 1-indeksowane i modułowy, więc 907 th indeks czegoś o długości L jest (907-modulo-L) th poz. Na przykład dla „Alabama” długość wynosi 7, więc pozycja o indeksie 907 to (907-modulo-7) th , a 907-modulo-7 to 4 (907 = 129 * 7 + 4 ), więc pozycja o indeksie 907 to „b”.

907 jest pierwszym dodatnim indeksem, w którym skróty stanu używające indeksu 1 i tego indeksu we wszystkich 50 stanach stają się unikalne.

Nazwy stanów, w tym ich spacje, mają długość od 4 do 14 włącznie, a 907-modulo-6 wynosi 1 (podczas gdy dla wszystkich innych długości wartość nie wynosi 1). Oznacza to, że gdybyśmy użyli 1 i 907. znaków dla skrótów, które Alaska, Hawaje, Kansas, Nevada i Oregon byłyby odpowiednio AA, HH, KK, NN i OO - nie jest to dopuszczalne w przypadku Hawajów, Kansas, lub Nevada; więc należy dokonać korekty; jest to powód połączenia, dublowania, przejścia do indeksu 2 i sortowania, dzięki czemu Alaska, Hawaje, Kansas, Nevada i Oregon stają się odpowiednio AL, HA, KA, NA i OR i nie kolidują z istniejącymi skrótami państwowymi .

Jonathan Allan
źródło
@LevelRiverSt powinien być teraz OK, chociaż prawdopodobnie istnieje krótsze rozwiązanie niż ta łatka do mojego oryginalnego wadliwego.
Jonathan Allan
Czy możesz dodać krótkie wyjaśnienie?
user1502040
@ user1502040 Robiłem to, teraz powinno być jasne, daj mi znać, jeśli nic nie rozumiesz.
Jonathan Allan
Jak to wymyśliłeś?
user1502040
@ user1502040 Wiedziałem, że musimy utworzyć kody z liter na wejściu, i że indeksowanie Jelly było modularne, więc po prostu szukałem indeksu, który dałby 50 unikalnych kodów (właśnie napisałem trochę kodu Pythona, aby znaleźć takie indeksy - również znalezienie -341 i -773 w zakresie od -1000 do 1000). Pierwotnie brakowało mi wymogu „inne”, więc załatałem problem (jak opisano). (Nie znalazłem też nic krótszego, choć nie byłbym zaskoczony, gdyby tak było).
Jonathan Allan
3

Rubinowy, 34 bajty

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

Zacząłem od s[0]+s*99999[x].upcasei znalazłem wiele wartości od x do x = 100000, które zwróciły unikalne kody dla wszystkich 50 stanów. Niestety wszyscy mieli przypadki, w których druga litera skrótu była pierwszą literą stanu powielonego, co jest niedozwolone (chyba że litera pojawia się dwukrotnie w nazwie stanu). Postanowiłem więc użyć wyrażenia s[0]+s[1,8]*999[x]i znalazłem najmniejszą wartość x, który zadziałał, wynosił 445.

Skomentowane w programie testowym i na wyjściu

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
źródło
1
Gdzie widziałeś zasadę, że druga litera nie może być taka sama jak pierwsza? Przykład miał nawet „AA” dla Alabamy.
Paŭlo Ebermann
3
The second letter must be one of the other letters of the state. AA dla Alabamy jest w porządku, ponieważ Alabama ma dwa A. KK jest w porządku dla Kentucky, ale nie na przykład dla Kansas.
Level River St
2

JavaScript (ES6), 46 bajtów

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

Próbny

Arnauld
źródło
1

Siatkówka , 49 46 bajtów

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

T`l`L
!`^..

Wypróbuj online! Jeśli stan zawiera drugą wielką literę lub jedną z liter flmpxz, staje się to drugą literą kodu. W przeciwnym razie, jeśli zawiera jedną z liter hru, staje się drugą literą kodu, w przeciwnym razie wystarczy użyć pierwszych dwóch liter stanu.

Neil
źródło
0

JavaScript (ES6), 52 bajty

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


JavaScript (ES6), 52 bajty

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

darrylyeo
źródło
2
Hawaje, Kansas i Nevada mają teraz nieprawidłowe skróty. (Druga litera musi być jedną z pozostałych liter stanu). Rozwiązałem ten dokładnie problem w moim rozwiązaniu Jelly.
Jonathan Allan
Ach, jakie to trudne! Muszę wrócić do mojej pierwszej odpowiedzi, dobrze, że ją uratowałem.
darrylyeo