Kiedy byłam młodsza, miałam naklejoną na ścianie dużą mapę Stanów Zjednoczonych naprzeciwko mojego łóżka. Kiedy się nudziłem, gapiłem się na tę mapę i myślałem o różnych rzeczach. Rzeczy takie jak twierdzenie o czterech kolorach lub który stan graniczy z większością innych stanów. Aby zaoszczędzić młodszemu trochę siły mózgowej w liczeniu, wymyślisz wehikuł czasu i powiesz mi, ile stanów ogranicza dane wejściowe. Ponieważ czas jest trudny, musi to być jak najkrótsze.
Zadanie
Biorąc pod uwagę jeden z 50 stanów USA, czy to pełną nazwą, czy też skrótem pocztowym, jak można znaleźć na tej stronie ( mirror.org ), zwróć liczbę stanów, które graniczy. Poniżej znajduje się mapowanie wszystkich danych wejściowych dla pełnych nazw stanów na liczbę stanów sąsiadujących, znalezionych na tej stronie .
Missouri, Tennessee -> 8
Colorado, Kentucky -> 7
Arkansas, Idaho, Illinois, Iowa, Nebraska, New York, Oklahoma, Pennsylvania, South Dakota, Utah, Wyoming -> 6
Arizona, Georgia, Massachusetts, Michigan, Minnesota, Nevada, New Mexico, Ohio, Virginia, West Virginia -> 5
Alabama, Indiana, Kansas, Maryland, Mississippi, Montana, North Carolina, Oregon, Texas, Wisconsin -> 4
California, Connecticut, Delaware, Louisiana, New Hampshire, New Jersey, North Dakota, Rhode Island, Vermont -> 3
Florida, South Carolina, Washington -> 2
Maine -> 1
Alaska, Hawaii -> 0
Zasady
- Twój program może obsłużyć pełną nazwę stanu lub kod pocztowy - nie może używać kombinacji.
- Możesz określić wielkość liter na wejściu, ale nie możesz usunąć białych znaków na wejściu.
- Nie musisz zajmować się Waszyngtonem ani niczym innym, niż jednym z 50 stanów.
- Liczba stanów granicznych nie obejmuje stanu wejściowego.
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Chociaż wiem, że może to być ktoś, kto ma najlepszą kompresję lub znajdzie najlepszy wzorzec wyrażenia regularnego na liczbę, jeśli otrzymam zbyt wiele z tych odpowiedzi, przyznam nagrodę za odpowiedź, która generuje mapę Stanów Zjednoczonych i wykorzystuje ją do obliczyć liczbę stanów granicznych.
inb4
Wbudowana matematykaOdpowiedzi:
Galaretka ,
7365 bajtówWypróbuj online!
Wbudowane? Kto tego potrzebuje? (
ʂÞiƬ
na ziemi z obrzydzeniem).Pobiera dane wejściowe jako pełną nazwę, na przykład
"Idaho"
.Jak to działa
źródło
OS%168
każdy ze stanów, który bezpośrednio dał listę. Znalazłem stałą 168, brutalnie wymuszając wszystkie możliwości poniżej 250, sprawdzając każdą z nich pod kątem możliwości rozróżnienia różnych liczb granic.168
działał (między innymi) i miał tę dodatkową zaletę, że musiał tylko wpisywać48
wartości z powodu kolizji.Mathematica,
112111 bajtów-5 bajtów dzięki Mark S. i LegionMammal978 !
-22 bajty (i zauważenie problemu z wyjściem) dzięki ngenisis !
Oczywiście jest do tego wbudowana Mathematica. Uwzględnia DC w liczbie.
źródło
AdministrativeDivision
jest tak niesamowicie długi, że można zapisać bajt o długości [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &ToExpression
można zastąpićSymbol
, jeśli dobrze pamiętam.AdministrativeDivisionData
, wystarczy przekazać"BorderingStates"
jako argument do encji; np.Entity["AdministrativeDivision","Alaska"]["BorderingStates"]
Tr[1^...]
zamiastLength@...
innego bajtu.JavaScript (ES6),
115113 bajtówEdycja: zapisano 2 bajty, pożyczając 2 kolejne optymalizacje ciągów z odpowiedzi Step Hen Python . Tęskniłem za nimi przy pierwszej próbie.
Przyjmuje kody pocztowe jako dane wejściowe.
W jaki sposób?
Argument inny niż RegExp przekazany do
.match()
metody jest domyślnie konwertowany na obiekt RegExp. Testujemy więc wyrażenie regularne/.\D*{{input}}/
na naszym zakodowanym ciągu. Odpowiada to cyfrze (1) , po której następuje od 0 do N znaków innych niż cyfry, po których następuje wprowadzanie.Na przykład: jeśli dane wejściowe to
"NH"
(New Hampshire), dopasowanym ciągiem będzie"3CACTNDELANH"
. Po prostu zachowujemy pierwszy znak tego ciągu lub zwracamy"6"
domyślnie, jeśli nie było dopasowania.(1):
.
Właściwie pasuje do dowolnego znaku, ale ciąg znaków jest zbudowany w taki sposób, że to, co znajduje się przed grupą liter, jest zawsze cyfrą.Próbny
Pokaż fragment kodu
Wersja mieszająca, 115 bajtów
Ten sam format wejściowy.
Próbny
Pokaż fragment kodu
źródło
Python 3 ,
168154153137 bajtówWypróbuj online!
-4 bajty dzięki isaacg
-10 bajtów dzięki ETHProductions
-1 bajt dzięki notjagen
Zapisano więcej bajtów domyślnie na sześć, podobnie jak inne odpowiedzi.
TIO obejmuje testy. Pobiera dane wejściowe jako kod pocztowy. Generuje listę nazw stanów w postaci ciągów znaków dla każdego zestawu, ułożonych razem tam, gdzie to możliwe (na przykład
WVVA
jest przechowywana jakoWVA
). Funkcja lambda pobiera indeks z listy, której ciąg zawiera dane wejściowe. Może istnieć sposób, że nie wiem o golfie ciała funkcji. Wyprowadza jako listę zawierającą liczbę całkowitą - dodaje[0]
na końcu lambda, aby wyświetlać jako liczbę całkowitą.źródło
l
raz, więc równie dobrze możesz go wstawić.V , 143 bajty
Wypróbuj online!
Hexdump:
Napisałem to, zanim zdałem sobie sprawę, że możesz wziąć dane wejściowe jako kody pocztowe. Nie jestem pewien, czy to faktycznie jest krótsze, czy nie
:shrug:
. Ta odpowiedź używa wyrażenia regularnego do wyszukiwania określonych stanów, a następnie zmienia dane wejściowe na określoną liczbę, jeśli jest zgodna. Jednak wraz ze wzrostem liczby stanów, w których testowaliśmy, maleje najmniejsze wyszukiwanie, jakie możemy zastosować. Na przykład nie możemy wyszukiwać,C
ponieważ będzie to pasowaćColorado
iCalifornia
. (Podobnie jak Conneticut i The Carolinas) Jednak po przetestowaniu dla każdego stanu, który ma więcej niż 3 granice, możemy po prostu zacząć od C, ponieważ nie może on już pasować do poprzedniego.Kilka przypadków testowych może być błędnych, ponieważ nie mam czasu na przetestowanie ich wszystkich. Daj mi znać, jeśli znajdziesz jakieś nieprawidłowe dane wyjściowe. :)
źródło
JavaScript, 153 bajty
Zmienne łańcuchy. Jestem pewien, że jest na to lepszy sposób.
Dzięki sugestii kogoś z Discord wyjście przyjmuje wartość domyślną 6, najczęstszą liczbę stanów granicznych. 183 bajtów na 151 bajtów.
Komentator zwrócił uwagę, że to nie działa w przypadku AK i HI, więc dodałem dwa bajty, aby rozwiązać problem. 151 do 153 bajtów.
źródło
AK
iHI
ponieważ0||6
ocenia na 6, co jest niepoprawnym wyjściem.05AB1E ,
7872 bajtówWypróbuj online!
Działa to TYLKO, ponieważ kolejność skrótów stanów pozwala na pojawienie się stanu NO w nakładaniu się stanów:
Chwilę zajęło prawidłowe ustawienie ... Następnie, dzieląc dane wejściowe i licząc spacje w pierwszej części, otrzymujemy poprawny wynik.
Jeśli ukradnę „domyślnie 6” z innych odpowiedzi, otrzymam 65 bajtów:
05AB1E , 65 bajtów
Wypróbuj online!
źródło
Took awhile to get the arrangement right
-> och, myślę, że mogłeś skopiować to z mojej odpowiedzi (jeśli czytam to poprawnie)Siatkówka ,
106105 bajtówWypróbuj online! Czy ktoś powiedział regex? Edycja: Zapisano 1 bajt dzięki @Arnauld.
źródło
JavaScript (ES6), 195 bajtów
Seria wyrażeń regularnych, które działają na pełną nazwę państwa.
Przypadki testowe:
Pokaż fragment kodu
źródło
Galaretka ,
6159 bajtówPełny program przyjmujący pełną nazwę stanu i wypisujący wynik (jako łącze monadyczne zwraca albo listę zawierającą pojedynczy numer, albo liczbę 6).
Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
to lista list indeksów stron kodowych:
i pokazano
“ ... ‘
poniżej:źródło
Excel VBA,
177154147 bajtówAnonimowa funkcja VBE, która pobiera dane wejściowe oczekiwanego typu
String
reprezentującego kod pocztowy stanu z zakresu[A1]
i zwraca wartośćInteger
reprezentującą liczbę stanów graniczących z tym stanem.Poprzednie wersje
154 bajtów:
177 bajtów:
Sformatowany dla czytelności
źródło
Python 2,
363218 bajtówZacznijmy od
prostej,lekko zoptymalizowanej, zakodowanej odpowiedzi. Pobiera kod pocztowy jako dane wejściowe.-145 bajtów dzięki bfontaine.
źródło
dict(MO=8,TN=8,...)
zamiast{'MO':8,'TN':8,...}
. Następnie można zapisać prawie 50 bajtów, używając.get(a,6)
i usuwając stany graniczące z 6 innymi stanami. Jestem w stanie przejść do 219 dzięki tym dwóm sztuczkom..
i robiącsplit()
(myślę)dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3))
. Prawdopodobnie możesz pominąć tęint
kwestię, jeśli pozwala na wyświetlanie danych wyjściowych w postaci łańcucha.dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3))
. Przepraszam, jestem trochę niezdecydowany: DPowerShell , 187 bajtów
Wypróbuj online!
Jestem pewien, że jest lepszy sposób, aby to zrobić, ale oto moje podejście.
Pobiera dane wejściowe
$a
i wykorzystuje je, aby uzyskać.IndexOf
jego wystąpienie w długim ciągu kombinacji stanu / granicy. Przechowuje to$x
i ciąg$b
w procesie. Następnie przechodzi doif
instrukcji, która sprawdza, czy znalazła dopasowanie, a jeśli tak, to indeks do cyfry i wtedyexit
. W przeciwnym razie, jesteśmy jednym z6
państw lubAK
lubHI
, więc wykonać jakąś logikę, aby zobaczyć, czy$a
jest jedno z0
państw, i odejmować w razie potrzeby. W każdym razie pozostaje to w potoku, a dane wyjściowe są niejawne.źródło
Python 3, 729
733bajtówPobiera dane wejściowe jako skrót pocztowy. To moja pierwsza próba gry w golfa i jest to najkrótsza próba, jaką mogę osiągnąć dzięki temu piekielnemu podejściu. Wiem, że to jest ogromne - pomyśl o tym, pewnie lepiej by mi było ze
if-else
stwierdzeniami, ale po całym tym czasie i wysiłku musiałem to opublikować: D.Właśnie zdałem sobie sprawę, że wybrałem luksus trzyliterowej nazwy zmiennej - 4 bajty w dół, 400 na start!
źródło