Skróć ten stan USA!

50

Biorąc pod uwagę jedną z 50 nazw stanów USA po lewej stronie, wprowadź dwuliterowy kod pocztowy, jak pokazano po prawej stronie:

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

Zasady

  • W danych wejściowych i wyjściowych rozróżniana jest wielkość liter. Wielu nie wyprowadza np . AlDla Alabama.
  • Możesz założyć, że wejście jest jedną z 50 nazw stanów pokazanych powyżej.
  • Nie możesz uzyskać dostępu do Internetu ani korzystać z wbudowanych danych stanu (patrząc na ciebie, Mathematica).

Oddzielne listy wejść i wyjść można znaleźć w tym fragmencie (proszę go nie uruchamiać, służy tylko do kompresji postu):

(Brak punktów) Punkty Brownie, jeśli możesz również wziąć District of Columbiajako wkład i produkcję DC, Wyspy Dziewicze itp.

Punktacja

To jest , więc wygrywa najkrótszy kod w bajtach w każdym języku .

(Pierwotnie zaproponowany przez ETHProductions)

Steve Bennett
źródło
11
Dla tych, którzy chcą poznać podejście Mathematiki:Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
DavidC
12
@BetaDecay Pytania zamknięte jako nie na temat nie są użytecznymi celami dupe.
Mego
7
@DavidC Możesz zapisać 20bajty: Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&:)
ngenisis
2
Zaoferuj dodatkowy kredyt za umieszczenie pozostałych 12 dwuznakowych kodów na pełnej oficjalnej liście amerykańskich skrótów pocztowych: AA (ARMED FORCES AMERICAS), AE (ARMED FORCES EUROPE), AP (ARMED FORCES PACIFIC), AS (AMERICAN SAMOA), DC (DYSTRYKT KOLUMBII), FM (FEDEROWANE STANY MIKRONEZJI), GU (GUAM), MH (WYSPY MARSHALLA), MP (PÓŁNOCNE WYSPY MARIANY), PR (PUERTO RICO), PW (PALAU), VI (WYSPY WIRTINI).
Joe Snyder
2
Tak, to nie jest dupek.
Christopher

Odpowiedzi:

25

JavaScript, 124 117 bajtów

(zapisane 7 bajtów dzięki hvd)

x=>/.+[A-Z]|A..[sz]k?|M.ss.s?|M[io]n?t?|Nev?|[AFIOUW][^o]|T..|.+/.exec(x)[0].replace(/(.).*(.)/,'$1$2').toUpperCase()

Wyjaśnienie:

  • Wyrażenie regularne znajduje dopasowanie z pierwszą i ostatnią literą dwiema literami skrótu
  • Pierwsza część pasuje do stanów zawierających więcej niż dwa słowa (w tym Dystrykt Kolumbii)
  • Druga część pasuje do Alaski i Arizony
  • Trzecia część odpowiada Massachusets, Mississippi i Missouri
  • Czwarta część odpowiada Michigan, Minnesocie i Montanie
  • Piąta część pasuje do Nebraski i Nevady
  • Szósta część pasuje do wszystkich pozostałych stanów skróconych do ich pierwszych dwóch liter, ze specjalnym przypadkiem wykluczającym Iowa
  • Siódma część pasuje do wszystkich pozostałych stanów w skrócie do ich pierwszej i trzeciej litery
  • Ósma część odpowiada wszystkim pozostałym, które są skrócone do ich pierwszej i ostatniej litery
  • Zatem jest to tylko kwestia rozebrania tych liter i wielkich liter
  • Pasuje również do Puerto Rico i Samoa Amerykańskiego, ale nie do Guam, wysp Marianów ani Wysp Dziewiczych Stanów Zjednoczonych
HP Williams
źródło
Wow, to świetnie! +1!
NoOneIsHere
3
Miły! Więcej możliwości: inicjał [A-Z]nie jest konieczny, ponieważ wiadomo, że dane wejściowe są prawidłowe. Przypadek specjalny Iowa można skrócić, aby [AFIOUW][^o]go wykluczyć, pozostawiając go do finału .+.
hvd
1
Twoja maszyneria regex jest tak wydajna w porównaniu do mojej ... szkoda, że ​​nie było sposobu, aby działała z moim krótszym regexem. Ale są zbudowane na tak różnych zasadach.
Steve Bennett
1
Cóż, jest wiele dziwnych na swój sposób. Istnieje niezła kolekcja, która pasuje zarówno do zasad „pierwsza i ostatnia”, jak i „dwie pierwsze” (Kolorado, Delaware, Kalifornia ...), ale potem Mississippi (MS) ją niszczy.
Steve Bennett
1
101: s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()Czy możemy dostać się do 100? :)
Steve Bennett
22

JavaScript, 137 135 134 132 113 110 108 101 99 94 93 92 bajty

Jest to oparte na rozwiązaniu HP Williams, z pewnymi ulepszeniami poza wyrażeniem regularnym i kilkoma poprawkami.

s=>s[0]+
/.*( .|z)|...s.s?|T..|M[i-t]+|[AFINOUW][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

(Podziały linii tylko dla czytelności)

Komentarz do wyrażenia regularnego:

.*( .|z)|      // Two-or-three word states, plus Arizona
...s.s?|       // Mississippi, Missouri, Massachussetts, Alaska, and (non-harmfully) Kansas
M[i-t]+|       // Montana, Minnesota, Michigan
[AFINOUW][^o]v?|  // All the other first-two-letter states, avoiding Iowa, plus Nevada
T‌​..|           // Tennessee, Texas
.+             // Everything else is first-and-last

Bezcelowy alternatywny regex (ta sama długość):

/...(a$|z|s.s?|.* .)|M[i-t]+|T..|[AFINOUW].v?|.*/  

Historia

94

s=>s[0]+/.*( .|z)|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*/
.exec(s)[0].slice(-1).toUpperCase()

99

s=>s[0]+/.*( .|z|l.*k)|T..|M.ss.s?|M[io]n?t?|[AFIOUWN][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

101

s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|T‌​e.|.+/
.exec(s)[0].sl‌​ice(-1).toUpperCase(‌​)

108

 s=>s[0]+/MI(N|SSO|S)|[CDGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|D$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

110

s=>s[0]+/MI(N|SSO|S)|[CGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

113

s=>s[0]+/^MI(N|SSO|S)|^[CGHKLPV].*|.*?( .|[XZV])|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

132

s=>(S=s.toUpperCase(),' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_[ED]$_WA_Z_X_..'
.split`_`.some(p=>s=S.match(p)),S[0]+s[0].slice(-1))

134

s=>' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_E$_D$_WA_Z_X_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

135

s=>' ._SSO_^MI[NS]_LASK_^[CGHKLPV].*_NT_EN_[DE]$_WA_.[XVZ]_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

137

s=>' ._OWA_SSO_ONT_^MI[NS]_LASK_^[CGHKLPV].*_EN_[DE]$_.[XVZ]_..'.split`_`.
map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s
Steve Bennett
źródło
To jest po prostu szalone, chciałbym móc ponownie głosować.
ETHproductions
Nie patrz teraz! 99!
Steve Bennett
94. Całkowicie szalony. Odkryłem tę optymalizację ( ...s.s?przechwytuje Mississippi, Missouri, Massachussetts i Alaskę) przez przypadek. Właściwie byłem w trakcie przenoszenia .*skfragmentu w inne miejsce, a testy zdarzyły się i przeszły, a fragmentu nigdzie nie było. Najłatwiejszy jak dotąd zysk 5 postaci!
Steve Bennett
Wow, i właśnie zdałem sobie sprawę, że ...s.s?również przypadkowo pasuje do Kansas i, cudem, nadal daje właściwy wynik.
Steve Bennett
I jeszcze jedna postać z M[onti]+. Tak dziwne: jeśli stan zaczyna się od M, to druga litera jest ostatnią w sekwencji co najmniej jednego o, n, t lub i. Bardzo dziwny sposób na schwytanie Michican, Minnesota lub Montana.
Steve Bennett
20

JavaScript (ES6), 156 136 bajtów

s=>s[0]+'.KT..N.VEA.XVL.H.TZ.AA..I.EADATO.JTISRDIYOI.DALA.Y.KE.C.D.R.YAS.NM...C.L...N'[parseInt(s.split` `.join``,36)%359%248*8%99*3%83]

Próbny

Arnauld
źródło
1
Czy przy użyciu tej metody jest to brutalne?
Tylko ASCII
2
@ Tylko ASCII Jest to brutalne na zakresach arbitrażowych, więc jest gwarantowane, że jest optymalne X MOD[50-1000] MOD[50-1000] MOD[50-100]. Ale to .slice(1)był błąd. Obecnie działa ponownie na całym łańcuchu.
Arnauld
2
Czy mógłbyś wyjaśnić nowemu, co to robi?
Hankrecords
1
@Hankrecords Pewnie, zrobi. (Ale jestem teraz w pociągu z ograniczonym dostępem do Internetu.)
Arnauld
1
teraz mój ma 135 lat!
Steve Bennett
17

Galaretka , 75 bajtów

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸?
e“\B“½ƈN»ȧ5ȯÇ’
i⁶ȯÇ‘ịṭḢŒu

Wypróbuj online!

... lub zobacz pakiet testowy - Uwaga: trzeba było wprowadzić niewielką zmianę, aby uruchomić pełny program dla wielu wejść za jednym razem (wymieniłem atom wejściowy programu ³, dla odwołania z rejestru ®, jeden i ustawiłem rejestr do każdej nazwy stanu z kolei).

W jaki sposób?

Oblicza indeks, który ma być użyty dla drugiego znaku kodu pocztowego, dołącza go do pierwszego znaku i wielkie litery wyniku.

Najpierw znajduje indeks znaku spacji (lub 0, jeśli nie znaleziono);

W przeciwnym razie sprawdza, czy jest to Alaska czy Missouri (daje 5 za klub o);

W przeciwnym razie znajdzie indeks stanu wejściowego na liście Arizona Minnesota Mississippi Nevada Montana Texas Tennessee(lub 0, jeśli nie zostanie znaleziony) - jeśli tak, bierze ten indeks mod 2 plus 3 (dla z n s v t x n);

W przeciwnym razie ciąg przekształca ciąg na liczby porządkowe, konwertuje to z podstawy 256, znajduje resztę po podzieleniu przez 29487, znajduje resztę po podzieleniu przez 14 i używa tego do indeksowania do reprezentacji binarnej 9620 i podwaja wynik - dając 0 dla stanów, które używają ostatniej litery i 2 dla tych, które używają drugiej litery.

Wszystkie oprócz pierwszego przypadku są zwiększane, a wynikowa wartość jest zmniejszana (zwiększając indeks przestrzeni znaleziony o jeden).

i⁶ȯÇ‘ịṭḢŒu - Main link: state string
 ⁶         - space character
i          - first index (of a space character in the state) or 0 if not found  (n-1 or 0)
   Ç       - call link 3 as a monad  (get n-1 in other cases)
  ȯ        - logical or  (yielding n-1)
    ‘      - increment   (yielding n)
     ị     - index into the state string (get the nth character)
       Ḣ   - head the state string (get the first character)
      ṭ    - tack
        Œu - convert to uppercase
           - implicit print

e“\B“½ƈN»ȧ5ȯÇ’ - Link 3: n-5 or ... : state string
 “\B“½ƈN»      - ["Alaska","Missouri"]
e              - exists in? (1 if so, 0 if not)
          5    - 5
         ȧ     - logical and
            Ç  - call link 2 as a monad
           ȯ   - logical or
             ’ - decrement

“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸? - Link 2: n = 3 or n = 4 or ... : state string
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»           - "Arizona Minnesota Mississippi Nevada Montana Texas Tennessee"
                    Ḳ          - split at spaces
                     i         - first index of state string in that list or 0
                      µ        - monadic chain separation (call that i)
                             ? - if: 
                            ⁸  -   link's left argument, i
                               - then:
                       %2      -   mod 2
                         +3    -   plus 3  - odd entries to 4: AriZona, MisSissippi, MonTana, TenNessee
                               -            even entries to 3: MiNnesota, NeVada, TeXas
                               - else:
                           ¢   -   call link 1 as a nilad

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ - Link 1 ...n=2 or n=0: no arguments
³                  - program's 1st input    e.g. Iowa          or Ohio
 O                 - cast to ordinals            [73,111,119,97]  [79, 104, 105, 111]
   ⁹               - 256
  ḅ                - convert from base           1232041825       1332242799
     ⁽qġ           - 29487
    %              - modulo                      15991            20139
        %14        - modulo 14                   3                7
                ¤  - nilad followed by link(s) as a nilad:
            ⁽"w    -   9620                     V       V
               B   -   convert to binary = [1,0,0,1,0,1,1,0,0,1,0,1,0,0]
           ị       - index into                  0                1
                 Ḥ - double                      0                2
                   -   ...0th index of Iowa is 'a', 2nd of Ohio is 'h'
Jonathan Allan
źródło
1
To najdłuższa galaretka, jaką kiedykolwiek widziałem =)
caird coinheringaahing
11

Python 2 , 191 bajtów

lambda s:s[0]+("KZD"*5+"HNTD"*5+"AYY"*4+"__L_O_VTA_I__A_T_RS_KA__S_"+"MOO"*5+"I_C_"+"AE"*6+"_I_D__A_"+"EDL"*5+"HV_A"+"IR"*7+"XC"*6+"E____N__YJ_YT___L")[reduce(lambda a,x:a+ord(x)^24,s,0)%174]

Wypróbuj online!

Używa prostej funkcji skrótu, aby znaleźć drugi znak skrótu.

Tylko ASCII
źródło
11

Python 2, 94 90 bajtów

lambda s:s[0]+s[(19**9*0x4710b8f6019c1b61deca10eef13b1>>hash(s)%8199472%52*3&7)+1].upper()

Wypróbuj online

(Tylko Python 2, ponieważ skróty Python 3 nie są stabilne, a także nie można haszować łańcucha bez przekształcenia go w bajty.)

Współpracuje ze wszystkimi 50 stanami, a także jako bonus Dystrykt Kolumbii i Portoryko.

Byłoby to możliwe, aby zapisać jeden bajt pisząc numer w base-36: int("5clu7x0aixb0pelmpugv5iiibphrpf",36). Czekam, czy mogę wymyślić bardziej kreatywne rozwiązanie.

Aktualizacja:

Ponieważ w haszu znajduje się 12 nieużywanych pozycji cyfr, istnieją 2 36 możliwych liczb, które będą działać. Wydawało się rozsądne sądzić, że jeden z nich miałby czynnik główny z dużym wykładnikiem. Dla każdej liczby pierwszej i wykładnika znalezienie wartości jest dość szybkie; Udało mi się znaleźć jeden ze współczynnikiem 19 9 , zmniejszając rozmiar wyrażenia potrzebnego do przedstawienia liczby o cztery bajty.

Jest to w zasadzie taka sama procedura jak w mojej odpowiedzi C, ale przy użyciu Pythona. Ponieważ podstawowa funkcja skrótu jest inna, musiałem znaleźć inną funkcję redukcji, która okazuje się być modem 52 zamiast modem 54. Ale największe oszczędności w porównaniu do C wynikają z możliwości użycia bignum do kodowania wektora i oczywiście faktem jest, że standardem dla Pythona jest to, że można używać literału lambda zamiast pełnego programu.

rici
źródło
9

Siatkówka , 113 81 80 77 70 68 bajtów

M1!`.+[A-Zz]|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*
\B.*(?=.)

T`l`L

Wypróbuj online! Obejmuje wszystkie 51 przypadków testowych. Zaoszczędzono 32 bajty, przywłaszczając wyrażenie regularne @ JörgHülsermann, które znajduje drugą literę (z poprawką do obsługi DC; edycja: zapisano 1 bajt dzięki @ JörgHülsermann). Zaoszczędzono 3 bajty, przechodząc do wyrażenia regularnego @ SteveBennett z jego komentarza do odpowiedzi @ HPWilliam. Zaoszczędzono 7 9 bajtów dzięki @SteveBennett. Pozostałe litery są następnie usuwane, a ciąg wielkich liter.

Neil
źródło
Bardzo fajnie, nie pomyślałbym, że możesz dostać zestaw całkowicie usuwalnych sznurków.
colsw
@ConnorLSW ebyło naprawdę najbardziej kłopotliwe.
Neil
@ JörgHülsermann Dzięki za przysługę!
Neil
@ JörgHülsermann Och, więc będę mógł zapisać kolejny bajt?
Neil
1
Czekaj, Indiana ma stać ID. Prawdopodobnie możesz to naprawić, dodając $ po d. (Możesz chcieć skorzystać z automatycznego testowania - mam skrypt, który stale sprawdza wszystkie 50 przypadków.)
Steve Bennett
8

PHP> = 7,1, 113 bajtów

<?=($a=$argn)[0],ucfirst(preg_match('#[vxz]| .|owa|lask|[CGHKLPV].*|ssi?.|n(n|t|[de]$)#',$a,$t)?$t[0][-1]:$a[1]);

Wersja online

Strajki są dopasowywane przez wcześniejszy mecz rozpoczynający się wcześniej

([vxz])mecze Arizona, Nevada, Nowy Meksyk, Pensylwania, Teksas,

(.) (jedno miejsce wcześniej) odpowiada New Hampshire, New Jersey, Nowy Meksyk, Nowy Jork, Karolina Północna, Dakota Północna, Rhode Island, Karolina Południowa, Dakota Południowa, Wirginia Zachodnia

[CGHKLPV].*(.)mecze Kalifornia, Kolorado, Connecticut, Georgia, Hawaje, Kansas, Kentucky, Luizjana, New Hampshire , Karolina Północna, Pensylwania, Karolina Południowa , Vermont, Wirginia, Wirginia Zachodnia

ow(a) mecz Iowa

las(k) dopasuj Alaskę

ssi?(.)mecze Massachusetts, Mississippi, Missouri, Tennessee

n(n|t|[de]$)mecze Connecticut, Kentucky, Maine, Maryland, Minnesota, Montana, Pennsylvania, Rhode Island, Tennessee, Vermont

Nie pasujemy do tych stanów, więc bierzemy pierwsze dwie litery Alabama, Arkansas, Delaware, Floryda, Idaho, Illinois, Indiana, Michigan, Nebraska, Ohio, Oklahoma, Oregon, Utah, Waszyngton, Wisconsin, Wyoming

Za pierwszym razem, gdy używam tego Regex Subpatter, ?| pozwala on na przechowywanie odnośników w jednym.

Wspieraj Dystrykt Kolumbii

Wymienić (.)z ([^o])+3 Bytes

Wypróbuj online!

PHP, 150 bajtów

<?=($t=preg_replace("#.\K\w+ |las|ri|nec|eorgi|awa|ow|[aio]ni?|e(?=n|v|x)|ntuck|ouisi|a?in|arylan|issi?|nnsylv|erm|irg#","",$argn))[0],ucfirst($t[1]);

Wypróbuj online! Przypadki testowe

Jörg Hülsermann
źródło
3
Czy n|t|bajt nie jest krótszy niż [nt]|?
Neil
@Neil Tak to jest. Nie zdawałem sobie z tego sprawy. Dziękuję
Jörg Hülsermann
7

PHP, 887 854 bajtów

<?=array_combine(['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'],['AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VT','VA','WA','WV','WI','WY'])[$argv[1]];

Wypróbuj online!

Pierwszy raz, hura!

Ivanka Todorova
źródło
1
W ten sposób trochę golfem w tablicy są wartości ze spacją lub miejsce, w którym poprawna jest druga litera. I $argv[1]jest zastąpiony przez $argn sandbox.onlinephpfunctions.com/code/…
Jörg Hülsermann
@ JörgHülsermann dziękuję bardzo! Naprawdę podobają mi się twoje odpowiedzi tutaj na codegolf w php!
Ivanka Todorova
Jestem tylko trochę światła przeciwko innym ludziom tutaj. Wysiłek związany z nauką jest dobry, jeśli ktoś znajdzie poprawę. Mam nadzieję, że odpowiesz na więcej pytań w przyszłości
Jörg Hülsermann
7

C, 945 937 718 711 660 616 bajtów

Zaoszczędzono 219 bajtów dzięki tylko ASCII.

struct{int*a,b;}m[]={"laba",76,"lask",75,"rizo",90,"rkan",82,"alif",65,"olor",79,"onne",84,"elaw",69,"lori",76,"eorg",65,"awai",73,"daho",68,"llin",76,"ndia",78,"owa",65,"ansa",83,"entu",89,"ouis",65,"aine",69,"aryl",68,"assa",65,"ichi",73,"inne",78,"issi",83,"isso",79,"onta",84,"ebra",69,"evad",86,"ew H",72,"ew J",74,"ew M",77,"ew Y",89,"orth",67,"orth",68,"hio",72,"klah",75,"rego",82,"enns",65,"hode",73,"outh",67,"outh",68,"enne",78,"exas",88,"tah",84,"ermo",84,"irgi",65,"ashi",65,"est ",86,"isco",73,"yomi",89};
i;char b[99];main(){gets(b);putchar(*b);for(;m[i].a;i++)if(!strncmp(m[i].a,b+1,4))puts(&m[i].b);}

Nowy wiersz jest niepotrzebny, tylko do celów wyświetlania. Przyjmuje stan jako dane wejściowe. Wypróbuj online!

Jak to działa:

  • struct{int*a,b;}m[]=...deklaruje mapę mz dwiema wartościami - czterobajtowym łańcuchem i jednym znakiem. Jest to używane w pętli porównawczej, która porównuje indeksy od drugiego do piątego z char*amapą.
  • gets(b)czyta ciąg znaków b. To będzie stan skrótu.
  • putchar(*b) wypisuje pierwszy znak tego ciągu, ponieważ każdy skrót zaczyna się od pierwszej litery stanu.
  • for(;m[i].a;i++)zapętla każdą wartość mapy. (Można to skrócić.)
  • if(!strncmp(m[i].a,b+1,4))porównuje bieżącą wartość mapy z od drugiego do piątego znaku b(stan skrócony). Wynika to z tego, że jedyne różnice dotyczą pierwszych pięciu znaków, ale już wydrukowaliśmy pierwszą postać.
  • puts(&m[i].b); wypisuje drugą literę skrótu (jeśli nazwa stanu pasuje do bieżącej wartości mapy) i nową linię.
MD XF
źródło
Wydaje się, że powoduje to nieprawidłowe wyniki dla stanów Północ * / Południe *.
Felix Dombek
6

C, 148 141 bajtów

main(){char s[99];gets(s);printf("%c%c\n",*s,s["-2-1--561-1-62--642138364---4142--1416--67-7131-111-7-246"[*(int*)(s+1)%663694%57]-48]&95);}

*(int*)(s+1)uważa, że ​​dane wejściowe od drugiego do piątego są liczbą całkowitą; ta liczba całkowita jest następnie mieszana do 0-56 za pomocą skrótu i%663694%57. Wartość haszowana jest następnie sprawdzana w wektorze przesunięć, które reprezentują położenie drugiej litery skrótu. Wybrałem te cztery bajty, ponieważ (1) Missouri i Mississippi różnią się najpierw piątym znakiem i (2) niektóre stany mają tylko cztery znaki W C możesz użyć bajtu terminatora NUL, ale nic poza tym nie jest wiarygodne. (W ten sposób zarówno Północy mają tę samą wartość, jak i oba Południa. Ale to nie ma znaczenia, ponieważ związane z nimi przesunięcie wynosi 6 dla wszystkich z nich.)

Tak się składa, że ​​ten konkretny skrót daje poprawną pozycję dla drugich liter skrótów Dystryktu Kolumbii, Puerto Rico i „Wysp Dziewiczych” (wpisanych w ten sposób, a nie jako „Wyspy Dziewicze Stanów Zjednoczonych”, ponieważ algorytm nalega, aby pierwsza znak skrótu będzie pierwszym znakiem nazwy).

Stałe 663694 i 57 znaleziono za pomocą testu automatycznego; 57 był najmniejszym zakresem mieszania, jaki znalazłem. (W pierwszej wersji użyto 380085 i 63, ale kiedy rozszerzyłem zakres testowy, znalazłem nowy). Wygląda na to, że istnieje nieco mniejszy skrót, jeśli zostanie dodany kod „użyj ostatniego znaku w nazwie”; niestety, składnia C do wybierania ostatniego znaku jest zbyt skomplikowana, aby była pomocna.

Istnieje tylko 8 różnych przesunięć, więc mogły być zapisane w 171-bitowej (3 * 57) tabeli odnośników z trzema bitami na wpis. Ale nie mogłem wymyślić sposobu na skuteczne wstawienie tych bitów do programu. Kodowanie heksadecymalne wymagałoby około jednego znaku na cztery bity plus 0xprefiksy. Nie mogłem zrobić lepiej niż 151 bajtów, co jest znacznie dłuższe niż wersja łańcuchowa. Jeśli 171 bitów można by jakoś wstawić jako nieprzetworzone oktety, zajmowaliby 22 bajty, więc może istnieć rozwiązanie, ale czytanie pliku jest nieporęczne.

rici
źródło
4

Właściwie 181 bajtów

2"OHCALAGAMAWVFLNVILMNMOMIRINCDEMTMEINWANYTXORNEOKIDAZNMUTNDMDVAKYSDPAARWYNHIAMSALNJAKTNHIKSVTWICOSCCT"╪"âäà♠îÉæô↨→←∟♣áíå*,▓/12│┤94▼╛?DE╞G╚╠╬ST╒WXßb;Θoq╙|⌂"♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└

To rozwiązanie oczekuje danych wejściowych w postaci ciągu cytowanego.

Wypróbuj online!

Wyjaśnienie

To rozwiązanie wykorzystuje tę samą strategię mieszania, co moje rozwiązanie Python 3 . Dla zwięzłości pomijam wyjaśnienie, w jaki sposób obliczany jest skrót i dlaczego został wybrany (przeczytaj inną odpowiedź, jeśli chcesz tego fragmentu).

Również dla zwięzłości będę pomijać treść bardzo długich ciągów, ponieważ w przeciwnym razie wyjaśnienie byłoby nieczytelne.

2"..."╪"..."♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└
2"..."╪                                state abbreviations (push the long string, split into length-2 chunks)
       "..."♂┘                         hash values for the state names (a string of CP437-encoded characters, converted to their CP437 ordinals)
              Z                        zip the two lists
               ⌠i≈┐⌡M                  for each pair:
                i                        flatten the pair
                 ≈                       convert hash value to int
                  ┐                      store abbreviation at the register numbered by the hash value
                     X                 discard the now-empty list
                      O                convert input string to list of ASCII ordinals
                       ;rR             range(len(ordinal_list)), reversed
                          5♀ⁿ          5**i mapped over that range
                             *         dot product of powers of 5 and ordinal list
                              :236@%   mod by 236
                                    └  push value in that register
Mego
źródło
3

Python 3 , 230 bajtów

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('%','$$').r‌​eplace('$','!!').rep‌​lace('!','..')[sum(c‌​*5**i for i,c in enumerate(s[::-1]))%236-5]

Wypróbuj online!

Dane wejściowe są oczekiwane jako obiekt bajtów (ciąg bajtów, a nie ciąg Unicode).

Podziękowania dla Johnathona Allana za absurdalną ilość bajtów

Wyjaśnienie

Każda nazwa stanu jest haszowana na liczbę całkowitą aprzez zastosowanie skrótu a = sum(o*5**i) % 236(gdzie ojest liczbą porządkową ASCII znaku i ijest jego indeksem w ciągu znaków, odliczając od końca). Moduł 236został wybrany, ponieważ jest to najmniejszy moduł, który powoduje, że wszystkie wartości skrótu są różne dla 50 nazw stanów w USA. Te skróty są następnie odwzorowywane na skróty stanu, a wynikowy słownik (skompresowany przy użyciu podstawiania ciągów) jest używany do wyszukiwania skrótu o nazwie stanu (mieszanie go w celu uzyskania odpowiedniego klucza).

Mego
źródło
Zaoszczędź 179 bajtów zlambda 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]
Jonathan Allan
... i kolejne 51 dodatkowolambda 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]
Jonathan Allan
Dziwię się, że odliczanie wstecz kosztuje mniej bajtów niż funkcja skrótu, która liczy się do przodu - ale nie mogę znaleźć takiej z małą grą
Chris H
1
@ChrisH Myślałem, że znalazłem jeden, ale skompresowany ciąg jest droższy.
Mego
2

Rubinowy, 106 103 bajtów

->s{s[0]+(s=~/ /?$'[0]:s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?j>7?j/4:-1:1]).upcase}

Jeśli wejście zawiera spację, druga litera wyjściowa to jedna po spacji. Jeszcze...

Hash suma wszystkich znaków na wejściu, aby uzyskać znak, którego indeks w magicznym ciągu wskazuje indeks drugiej litery wyjściowej w ciągu wejściowym, zgodnie ze wzorem j>8?j/4:-1(-1 oznacza koniec.). Jeśli skrót daje znak, którego nie ma w magicznym ciągu, druga litera jest drugą literą wejścia.

Jako wyjaśnienie magicznego ciągu znaków znaki skrótu i ​​indeksy liter, które kodują, znajdują się poniżej. Zauważ, że Delaware pojawia się, mimo że zrobiłaby to druga litera - dzieje się tak, ponieważ jego kod skrótu koliduje z Kentucky. Na szczęście ostatnia litera Delaware jest taka sama jak druga.

Letter(index)
Last  (-1)  (-MD    )-VA    6-GA-LA  >-DE-KY    P-PA    _-CT    a-KS    c-VT
3rd    (2)  ;-TN    ?-MN    .-TX     O-NV
4th    (3)  }-MS    A-IA    F-MT     L-AZ
5th    (4)  K-MO    M-AK    r-ME     S-HI 

Niegolfowany w programie testowym

a="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($/)

f=->s{                                                            #String argument s.
  s[0]+(                                                          #Return character s[0] +
    s=~/ /?$'[0]:                                                 #if s contains a space, 1st character after space, ELSE
      s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?  #if (sum of ascii codes, mod 136 mod 95 +32).chr in the magic string
        j>7?j/4:-1:                                                 #return s[j/4] if j>7 else return s[-1] ELSE
      1]                                                          #if not in the magic string, return s[1].
  ).upcase                                                        #Convert the second character to uppercase if needed.
}


a.map{|i|p [i,f[i]]}
Level River St
źródło
2

/// , 619 608 bajtów

/2/~M//@/~South //1/~North //!/~New //~/\/\///Alabama/AL~Alaska/AK~Arizona/AZ~Arkansas/AR~California/CA~Connecticut/CT~Delaware/DE~Florida/FL~Georgia/GA~Hawaii/HI~Idaho/ID~Illinois/IL~Indiana/IN~Iowa/IA~Kansas/KS~Kentucky/KY~Louisiana/LA2aine/ME2aryland/MD2assachusetts/MA2ichigan/MI2innesota/MN2ississippi/MS2issouri/MO2ontana/MT~Nebraska/NE~Nevada/NV!Hampshire/NH!Jersey/NJ!Mexico/NM!York/NY1Carolina/NC1Dakota/ND~Ohio/OH~Oklahoma/OK~Oregon/OR~Pennsylvania/PA~Rhode Island/RI@Carolina/SC@Dakota/SD~Tennessee/TN~Texas/TX~Utah/UT~Vermont/VT~Virginia/VA~Washington/WA~West Virginia/WV~Wisconsin/WI~Wyoming/WY/

Wypróbuj online!

Ponieważ nie ma innego sposobu przyjmowania danych wejściowych w ///, jest ono dostępne na końcu programu. Wystarczy dołączyć żądane dane wejściowe do programu.

Zaoszczędzono 11 bajtów dzięki większej liczbie zamienników, zgodnie z zaleceniami @SteveBennett

Towarzyszu SparklePony
źródło
Prawdopodobnie istnieją pewne wzorce, które można zastąpić wiele razy na raz, takie jak „Nowy” i „Akota”. Irytujące, że nie można zrobić o wiele mądrzejszego, jak usuwanie części nazw stanów, ponieważ konwersja pozostałych znaków na wielkie litery jest tak droga ...
Steve Bennett
@SteveBennett Edytowane, dzięki!
Towarzysz SparklePony
2

Python 2 , 131 125 bajtów

lambda s:s[0]+'CLLKARADEZVAK.T..DETTH.NSAHY...ID.D..O..Y.IRE.X..NALINC.VJM.SY.T..AAOI'[int(s[0]+s[-2:],36)%386%334%181%98%70]

Wypróbuj online!

ovs
źródło
1

TAESGL , 386 bajtów

B=«ōďā,AL,ņćđ,AK,ķċđ,AZ,ćōē,AR,ďċđ,CA,ĭāď,CO,ŕĭ,CT,ćđēą,DE,ĕŕ,FL,īĭ,GA,ńāē,HI,ćĉďą,ID,ĭċď,IL,ľđā,ţ,ńĕĕ,IA,ķő,KS,ŏĝ,KY,ŏĕĕ,LA,ŏđć,ME,ņāē,MD,ńđā,MA,īđą,MI,ļēď,MN,ŕğ,MS,ňė,MO,ććĕĉ,MT,ćċćĉ,NE,ŕēď,NV,ň ćŋā,NH,ň ĩēđ,NJ,ň ğĕċ,NM,ň ĉĝ,NY,ćņ ġĉă,NC,ćņ ńċą,ND,ĩēą,OH,ŋĺ,OK,ļķ,OR,ĺđď,PA,ĉĉğ đēā,RI,ōċ ġĉă,SC,ōċ ńċą,SD,ňďą,TN,ċĕď,TX,ōđą,UT,ćđāā,VT,ğğ,VA,ďĉē,WA,ĉĉć ğğ,WV,ľēđ,WI,ĉĩĕ,WY»Ĵ",";B[BĪA)+1

Interpretator

Bardzo prosta kompresja nazw stanów, dodana do tablicy ze skrótami.

Tomek
źródło
1

Japt, 383 bajty

Kompresję pierwszego ciągu można poprawić, eksperymentując z kolejnością liter.

g +`lkzÇUaidlnyaÀÍ¥evhjmycdhkÎödnxttaaviy`g`alabaµ
Ã2ka
iza
kÂ6s
Öâfnia
åªv
¬nש
Ü.Ø
fÓQ»
gegia
°ii
i»
ÅJno
Äa
Å0
kÂ6s
kÀ_cky
lia
Úpe
æ¯À
ÚUaÖ³etts
Úòig
·nÌta
æ«7ppi
æ¬
Úa
ßka
va»
w mp¢i
w jÀ y
w ´xi¬
w yk
Íh ÖÚ¦na
Íh »kota
oo
oklaÊá
eg
pnsylvia
r¸ Ó
Ñh ÖÚ¦na
Ñh »kota
âÊte
x
©ah
vÚ
virgia
Øgn
ØÙ virgia
æÈ;n
wyÇg`·bUv) u

Wypróbuj online

Kudłaty
źródło
1

Mathematica, 138 140 134 bajtów

+2 bajty - znaleziono błąd (potrzebne przesunięcie tablicy o 1 nie 0)

-6 bajtów - znaleziono lepszy skrót

#~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}&

Podobnie jak inne, bierze nazwę i bierze pierwszą literę. Następnie stosuje domyślny skrót Mathematica, a następnie stosuje do niego dwa moduły, Hash@#~Mod~89866736~Mod~73aby uzyskać unikalny numer dla każdego stanu. Ta wartość jest następnie sprawdzana w ciągu, aby wygenerować drugą literę.

Prawdopodobnie można grać w golfa więcej, ale Mathematica ma ogromną przestrzeń do wyszukiwania. Powtórzone drugie litery nie były brane pod uwagę przy wyszukiwaniu skrótów. _znaki reprezentują zmarnowane wartości w ciągu. Teoretycznie możesz sprowadzić ciąg znaków do zaledwie 19 znaków, ale znalezienie niestandardowego skrótu do wytworzenia byłoby koszmarem.

Ian Miller
źródło
1

Perl 5, 150 148 bajtów (147 + 1)

Nie jest to bynajmniej optymalne, ale spełnia swoje zadanie. Potrzebuje -nflagi wiersza polecenia.

s/las//;s/ai?n//;s/[oie]n|ri//;s/e([vx])/$1/;s/issi?//;s/(.).+ /\1/;/(.)(.)/;/^([^W]).*(?:[cogavn][wiku]|[ir][ys][li]|rm)([adyti])$/;print uc"$1$2"
Silvio Mayolo
źródło
0

Python 2 , 152 bajty

lambda s:s[0]+'.NY.SDS...O.DT..RT.AAYJZE.K.I.X.TI.EL.CMI..E.NA..L....TH.......O....DAAC..VNH.YAI.RVDA..L....A'[int(s.replace(' ','')[1:],36)%358%235%95]

Wypróbuj online!

Port odpowiedzi Arnaulda .

Tylko ASCII
źródło