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 .
Al
DlaAlabama
. - 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 Columbia
jako wkład i produkcję DC
, Wyspy Dziewicze itp.
Punktacja
To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach w każdym języku .
(Pierwotnie zaproponowany przez ETHProductions)
code-golf
string
kolmogorov-complexity
state-abbreviation
Steve Bennett
źródło
źródło
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
bajty:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Odpowiedzi:
JavaScript,
124117 bajtów(zapisane 7 bajtów dzięki hvd)
Wyjaśnienie:
źródło
[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.+
.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? :)JavaScript,
13713513413211311010810199949392 bajtyJest to oparte na rozwiązaniu HP Williams, z pewnymi ulepszeniami poza wyrażeniem regularnym i kilkoma poprawkami.
(Podziały linii tylko dla czytelności)
Komentarz do wyrażenia regularnego:
Bezcelowy alternatywny regex (ta sama długość):
Historia
94
99
101
108
110
113
132
134
135
137
źródło
...s.s?
przechwytuje Mississippi, Missouri, Massachussetts i Alaskę) przez przypadek. Właściwie byłem w trakcie przenoszenia.*sk
fragmentu 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!...s.s?
również przypadkowo pasuje do Kansas i, cudem, nadal daje właściwy wynik.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.JavaScript (ES6),
156136 bajtówPróbny
Pokaż fragment kodu
źródło
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.Galaretka , 75 bajtów
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
k
lubo
);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 (dlaz 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).
źródło
Python 2 , 191 bajtów
Wypróbuj online!
Używa prostej funkcji skrótu, aby znaleźć drugi znak skrótu.
źródło
Python 2,
9490 bajtówWypró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.
źródło
Siatkówka ,
1138180777068 bajtówWypró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
79 bajtów dzięki @SteveBennett. Pozostałe litery są następnie usuwane, a ciąg wielkich liter.źródło
e
było naprawdę najbardziej kłopotliwe.d
. (Możesz chcieć skorzystać z automatycznego testowania - mam skrypt, który stale sprawdza wszystkie 50 przypadków.)PHP> = 7,1, 113 bajtów
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 Zachodniaow(a)
mecz Iowalas(k)
dopasuj Alaskęssi?(.)
mecze Massachusetts, Mississippi, Missouri,Tennesseen(n|t|[de]$)
meczeConnecticut,Kentucky,Maine, Maryland, Minnesota, Montana,Pennsylvania,Rhode Island,Tennessee,VermontNie 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 BytesWypróbuj online!
PHP, 150 bajtów
Wypróbuj online! Przypadki testowe
źródło
n|t|
bajt nie jest krótszy niż[nt]|
?PHP,
887854 bajtówWypróbuj online!
Pierwszy raz, hura!
źródło
$argv[1]
jest zastąpiony przez$argn
sandbox.onlinephpfunctions.com/code/…php
!C,
945937718711660616 bajtówZaoszczędzono 219 bajtów dzięki tylko ASCII.
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ęm
z 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 zchar*a
mapą.gets(b)
czyta ciąg znakówb
. 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 znakub
(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ę.źródło
C,
148141 bajtów*(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ótui%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
0x
prefiksy. 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.źródło
Właściwie 181 bajtów
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.
źródło
Python 3 , 230 bajtów
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ą
a
przez zastosowanie skrótua = sum(o*5**i) % 236
(gdzieo
jest liczbą porządkową ASCII znaku ii
jest jego indeksem w ciągu znaków, odliczając od końca). Moduł236
został 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).źródło
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]
Rubinowy,
106103 bajtówJeś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.
Niegolfowany w programie testowym
źródło
/// ,
619608 bajtówWypró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
źródło
Python 2 ,
131125 bajtówWypróbuj online!
źródło
TAESGL , 386 bajtów
Interpretator
Bardzo prosta kompresja nazw stanów, dodana do tablicy ze skrótami.
źródło
Japt, 383 bajty
Kompresję pierwszego ciągu można poprawić, eksperymentując z kolejnością liter.
Wypróbuj online
źródło
Mathematica,
138140134 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~73
aby 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.źródło
Perl 5,
150148 bajtów (147 + 1)Nie jest to bynajmniej optymalne, ale spełnia swoje zadanie. Potrzebuje
-n
flagi wiersza polecenia.źródło
Python 2 , 152 bajty
Wypróbuj online!
Port odpowiedzi Arnaulda .
źródło