Quanti stati confino?


20

Quando ero più giovane, avevo una grande mappa degli Stati Uniti appesa sul muro di fronte al mio letto. Quando mi annoiavo, fissavo quella mappa e pensavo alle cose. Roba simile al teorema dei quattro colori, o quale stato confinava con la maggior parte degli altri stati. Per risparmiarmi un po 'di potere cerebrale nel conteggio, inventerai una macchina del tempo e dimmi quanti stati confinano con l'input. Perché il tempo è pignolo, questo deve essere il più breve possibile.

L'obiettivo

Dato uno dei 50 stati degli Stati Uniti, con il suo nome completo o con la sua abbreviazione postale, come si trova in questa pagina ( mirror.org ), restituisce il numero di stati che confina. Di seguito è riportata una mappatura di tutti gli input per i nomi di stato completi sul numero di stati adiacenti, disponibili in questo sito Web .

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

Le regole

  • Il tuo programma può gestire il nome completo dello stato o il codice postale - non può usare una combinazione.
  • È possibile specificare il caso dell'input, ma non è possibile rimuovere gli spazi bianchi nell'input.
  • Non è necessario gestire Washington, DC o qualsiasi altra cosa che non sia uno dei 50 stati.
  • Il numero di stati confinati non include lo stato di input.
  • Questo è , quindi vince la risposta più breve in byte.

Mentre so che questo potrebbe essere solo chi ha la migliore compressione o trova il miglior modello regex per numero, se ottengo troppe di quelle risposte, assegnerò una taglia a una risposta che genera una mappa degli Stati Uniti e la usa per calcola il numero di stati confinanti.


11
inb4Mathematica integrata
DJMcMayhem

@DJMcMayhem uh oh (all'inizio suona bene, ma vedi l'aggiornamento ...)
Stephen

@StepHen Oh no, sono stato estromesso! Stavo lavorando sulla risposta proprio ora che incorpora questo ...;)
notjagan


Potremmo gestire DC / includerlo nei nostri conteggi se lo facciamo per favore?
notjagan,

Risposte:


17

Gelatina , 73 65 byte

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?

Provalo online!

Builtins? Chi ha bisogno di quelli? ( ʂÞiƬa terra con disgusto).

Accetta input come nome completo, ad esempio "Idaho".

Come funziona

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?
“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘                   The literal list of code-page index lists  [[85, 91], [154], [33, 28, 50], [8, 143, 133, 93, 83, 116, 143, 125, 75], [167, 20, 105, 152, 5, 46, 20, 114, 13, 117], [52, 30, 40, 128, 102, 87, 103, 63, 153, 100], [147, 6], [19, 98]]
                           €        On each sublist:
                         ¤            Evaluate the hash value:
                 ³                     Input
                   O                   Character values
                    S                  Sum.
                     %                 Modulus.
                      168              168
                i                     Does the sublist contain that nilad?
                            T       Get the sublist which does contain that nilad.
                                 ?  If
                                L     Length.
                                    Then
                             ’        Return the index - 1
                                    Else
                              6      Return 6

Quale processo hai usato per ottenere quell'elenco?
Scott Milner,

2
@ScottMilner Ho corso OS%168su ciascuno degli stati, che ha prodotto direttamente l'elenco. Ho trovato la costante 168 forzando brutalmente tutte le possibilità a meno di 250, controllando ognuna di esse per essere in grado di distinguere effettivamente tra diversi numeri di bordi. 168ha funzionato (tra pochi altri) e ha avuto l'ulteriore vantaggio di dover solo codificare i 48valori a causa delle collisioni.
fireflame241

18

Mathematica, 112 111 byte

-5 byte grazie a Mark S. e LegionMammal978 !

-22 byte (e notando un problema con l'output) grazie alla ngenisi !

Tr[1^Entity["AdministrativeDivision",#~StringDelete~" "]@"BorderingStates"]+Boole@StringMatchQ[#,"Il*"|"Mic*"]&

Certo, c'è un Mathematica integrato per questo. Include DC nel conteggio.


3
Sembra sporco, ma AdministrativeDivisionè così incredibilmente lungo che salveresti un byte con Lunghezza [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &
Mark S.

1
ToExpressionpuò essere sostituito con Symbol, se ricordo bene.
LegionMammal978,

1
Inoltre non è necessario utilizzare AdministrativeDivisionData, basta passare "BorderingStates"come argomento all'entità; ad es.Entity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisi,

1
@ngenisis Ho applicato una correzione al primo problema; fortunatamente, a causa dei tuoi suggerimenti, non ha aggiunto così tanti byte. Quest'ultimo problema che hai citato in merito a DC non è un problema poiché ho chiesto a OP se questo era valido e la risposta era sì.
notjagan,

1
@notjagan Puoi anche usare Tr[1^...]al posto di Length@...per salvare un altro byte.
ngenisi,

13

JavaScript (ES6), 115 113 byte

Modifica: salvato 2 byte prendendo in prestito altre 2 ottimizzazioni di stringa dalla risposta di Step Hen Python . Mi mancarono nel mio tentativo iniziale.

Accetta i codici postali come input.

s=>('7KYCO8MOTN0AKHI1ME2FLSCWA3CACTNDELANHNJRIVT4ALWINCKSMDMSMTXOR5GAZOHMANMIMNVWVA'.match('.\\D*'+s)||'6')[0][0]

Come?

Un argomento non RegExp passato al .match()metodo viene convertito implicitamente in un oggetto RegExp. Quindi, stiamo testando l'espressione regolare /.\D*{{input}}/sulla nostra stringa codificata. Ciò corrisponde a una cifra (1) , seguita da 0 a N caratteri non cifre, seguiti dall'input.

Ad esempio: se l'input è "NH"(New Hampshire), sarà la stringa corrispondente "3CACTNDELANH". Manteniamo semplicemente il primo carattere di questa stringa o ritorniamo "6"per impostazione predefinita se non c'è corrispondenza.

(1): In .realtà corrisponde a qualsiasi carattere, ma la stringa è costruita in modo tale che ciò che viene trovato prima di un gruppo di lettere sia sempre una cifra.

dimostrazione


Versione hash, 115 byte

Stesso formato di input.

s=>`04436303035050063062750600644408${6e7}503600300540410005207058036442600400000650035`[parseInt(s,33)%589%180%98]

dimostrazione


Puoi salvare molti byte eliminando quella stringa
Downgoat,

7

Python 3 , 168 154 153 137 byte

lambda s:[i for i,S in enumerate('AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN'.split())if s in S]or 6

Provalo online!

-4 byte grazie a isaacg

-10 byte grazie a ETHProductions

-1 byte grazie a notjagen

Salvati alcuni byte in più per impostazione predefinita a sei, come hanno fatto altre risposte.

TIO include test. Accetta input come codice postale. Genera un elenco dei nomi di stato come stringhe per ogni set, schiacciato insieme ove possibile (ad esempio, WVVAviene memorizzato come WVA). La funzione lambda ottiene l'indice nell'elenco la cui stringa contiene l'input. Potrebbe esserci un modo in cui non conosco il golf del corpo della funzione. Output come un elenco contenente un numero intero: aggiungere [0]alla fine del lambda per l'output come numero intero.


Inoltre, lo usi solo luna volta, quindi potresti anche inserirlo.
isaacg,

@ETHproductions sì, grazie
Stephen

@isaacg grazie, non so perché non l'ho visto
Stephen,

-1 byte riorganizzando la posizione del Texas.
notjagan,

@notjagan grazie, mi sono perso
Stephen

4

V , 143 byte

çourüee/C8
çdoüke/C7
çrküI„sn]üebüOkünnsüSDüUüwy/C6
çzüg„ot]üttüinnüvaüxiüOh/C5
çbüdiüKüMáû5}üNCüOüTüWi/C4
ç^[CDLNRV]/C3
ç[FSW]/C2
çM/C1
ñlS0

Provalo online!

hexdump:

00000000: e76f 7572 fc65 652f 4338 0ae7 646f fc6b  .our.ee/C8..do.k
00000010: 652f 4337 0ae7 726b fc49 8473 6e5d fc65  e/C7..rk.I.sn].e
00000020: 62fc 4f6b fc6e 6e73 fc53 8144 fc55 fc77  b.Ok.nns.S.D.U.w
00000030: 792f 4336 0ae7 7afc 6784 6f74 5dfc 7474  y/C6..z.g.ot].tt
00000040: fc69 6e6e fc76 61fc 7869 fc4f 682f 4335  .inn.va.xi.Oh/C5
00000050: 0ae7 62fc 6469 fc4b fc4d e1fb 357d fc4e  ..b.di.K.M..5}.N
00000060: 8143 fc4f fc54 fc57 692f 4334 0ae7 5e5b  .C.O.T.Wi/C4..^[
00000070: 4344 4c4e 5256 5d2f 4333 0ae7 5b46 5357  CDLNRV]/C3..[FSW
00000080: 5d2f 4332 0ae7 4d2f 4331 0af1 6c53 30    ]/C2..M/C1..lS0

Ho scritto questo prima di rendermi conto che potresti prendere l'input come codici postali. Non sono sicuro che sia effettivamente più breve o meno :shrug:. Questa risposta utilizza regex per cercare determinati stati e quindi modificare l'input con un determinato numero se corrisponde. Tuttavia, poiché il numero di stati su cui abbiamo testato aumenta, la ricerca più piccola che possiamo usare diminuisce. Quindi, ad esempio, non possiamo cercare Cperché corrisponderà Coloradoe California. (Oltre a Conneticut e The Carolinas) Tuttavia, una volta testati tutti gli stati con più di 3 confini, possiamo solo cercare le partenze con C perché non possono più corrispondere a una precedente.

Alcuni casi di test potrebbero essere errati poiché non ho il tempo di testarli tutti. Fammi sapere se trovi degli output errati. :)


3

JavaScript, 153 byte

MO=TN=8;CO=KY=7;AZ=GA=MA=MI=MN=NV=NM=OH=VA=WV=5;AL=IN=KS=MD=MS=MT=NC=OR=TX=WI=4;CT=DE=LA=NH=NJ=ND=RI=VT=3;FL=WA=2;ME=1;AK=HI="0";alert(self[prompt()]||6)

Concatenamento variabile. Sono sicuro che c'è un modo migliore per farlo.

Grazie a un suggerimento di qualcuno di Discord, l'output predefinito è 6, il numero più comune di stati confinati. 183 byte a 151 byte.

Un commentatore ha sottolineato che questo non riesce per AK e HI, quindi ho aggiunto due byte per risolvere il problema. Da 151 a 153 byte.


1
Sono abbastanza sicuro che questo non vada a buon fine AKe HIperché 0||6restituisce 6, che è un output errato.
kamoroso94,

@ kamoroso94 Ho aggiornato il mio codice, se pensi che ci sia una soluzione migliore fammi sapere.
Eli Richardson,

3

05AB1E , 78 72 byte

.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•s¡¬ð¢

Provalo online!


.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•
# Push the string: akhi me flscwa cactdelanhnjndrivt alinksmdmsncmtortxwi azgamamimnnvnmvaohwv idilianarenyokpnsdutwy kyco motn

s¡    # Split on input.
  ¬   # Get head.
   ð¢ # Count number of spaces.

Funziona SOLO perché l'ordine delle abbreviazioni di stato consente lo stato di NO nella sovrapposizione tra stati:

a[kh]i 
me 
f[ls][cw]a 
c[ac][td][el][an][hn][jn][dr][iv]t 
a[li][nk][sm][dm][sn][cm][to][rt][xw]i 
a[zg][am][am][im][nn][vn][mv][ao][hw]v 
i[di][li][an][ar][en][yo][kp][ns][du][tw]y 
k[yc]o 
m[ot]n

Ci è voluto un po 'per ottenere la disposizione giusta ... Quindi, dividendo l'input e contando gli spazi nella prima parte, otteniamo il risultato corretto.


Se rubo il "valore predefinito a 6" dalle altre risposte, ottengo 65 byte:

05AB1E , 65 byte

.•3θ0ÔÕ—ú^?D§:‚A†ǝλα“i›p‚ιCöΔƒñPŠ J€ŽãB»ΣUƤÆuhÃgЦ,Y²•s¡¬ð¢D9Qi6

Provalo online!


Took awhile to get the arrangement right-> oh, penso che avresti potuto copiarlo dalla mia risposta (se sto leggendo correttamente)
Stephen

@Stephen Beh, non ho avuto l'idea da nessun altro post, se guardi l'algoritmo di hashing sucky stavo scherzando con idee casuali per hashing per circa un'ora, poi ho pensato agli spazi, ho scoperto che non potevo battere questa implementazione, non importa quanto ci abbia provato.
Magic Octopus Urn il

@Stephen ora che ho letto il tuo, vorrei aver pensato anche di impostare un valore predefinito su 6 xD.
Magic Octopus Urn il

1
Non ci ho pensato, l'ho visto prima in questa risposta , quindi sentiti libero di prenderlo: P
Stephen

2

Retina , 106 105 byte

MO|TN
8
CO|KY
7
AK|HI
0
ME
1
FL|WA
2
[CDLR].|N[HJD]|VT
3
.[CSX]|AL|IN|MD|MT|OR|WI
4
[GMV].|.[HMVZ]
5
..
6

Provalo online! Qualcuno ha detto regex? Modifica: salvato 1 byte grazie a @Arnauld.


2

JavaScript (ES6), 195 byte

s=>/las|ii/[t='test'](s)?0:/ai/[t](s)?1:/Fl|Wa|S.*C/[t](s)?2:/fo|ct|de|ui|mp|er|^N.+ak/i[t](s)?3:/do|ck/[t](s)?7:/ur|ee/[t](s)?8:/iz|gi|ch|ev|xi|hi|es/[t](s)?5:/rk|ah|oi|ow|br|om|lv|ak/[t](s)?6:4

Una serie di espressioni regolari, che lavorano sul nome completo dello stato.

Casi test:


2

Gelatina ,  61  59 byte

OP%⁽/r%101eЀ“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘Tȯ7’

Un programma completo che prende il nome completo dello stato e stampa il risultato (come collegamento monadico restituisce un elenco contenente un singolo numero o il numero 6).

Provalo online! o vedere una suite di test .

Come?

“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘

è un elenco di elenchi di indici di code page:

[[11,61],[31],[40,55],[0,5,24,29,44,48,64,76],[12,23,28,60,67,77,90,97],[18,33,41,53,72,78,86],[],[49,94],[4,43]]

ed è mostrato come “ ... ‘, di seguito:

OP%⁽/r%101eЀ“ ... ‘Tȯ7’ - Main link: list of characters, stateName  e.g. Ohio
O                        - cast to ordinals                   [79,104,105,111]
 P                       - product                                    95757480
   ⁽/r                   - base 250 literal                              12865
  %                      - modulo by 12865                                3285
      %101               - modulo by 101                                    53
             “ ... ‘     - list of lists of code-page indices
          eЀ            - map: exists in?                 [0,0,0,0,0,1,0,0,0]
                    T    - truthy indices (if none yields an empty list)   [6]
                     ȯ7  - logical or with 7 (replace empty list with 7)   [6]
                       ’ - decrement                                       [5]
                         - implicit print (Jelly's representation of a list of
                         -                 one item is just that item)       5

1

Excel VBA, 177 154 147 byte

Funzione VBE anonima che accetta input, del tipo previsto che Stringrappresenta il codice postale di uno stato, dall'intervallo [A1]e restituisce un valore Integerche rappresenta il numero di stati che confinano con quello stato.

For i=0To 8:r=r+IIf(Instr(1,Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")(i),[A1]),i,0):Next:?IIf(r,r,6)

Versione precedente

154 byte:

For Each s in Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN"):r=r+IIf(Instr(1,s,[A1]),i,0):i=i+1:Next:?IIf(r,r,6)

177 byte:

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN"):[3:3]="=IfError(If(Find($A1,A2),Column(A3)),"""")":[B1]="=Sum(3:3)":?[If(B1,B1,6)]

Formattato per leggibilità

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")
[3:3]="=IfError(If(Find($A1,A2),Column(A3)-1),"""")"
[B1]="=Sum(3:3)"
?[If(B1,B1,6)]

1

Python 2, 363 218 byte

lambda a:dict(WA=2,WI=4,WV=5,FL=2,NH=3,NJ=3,NM=5,NC=4,ND=3,RI=3,NV=5,CO=7,CA=3,GA=5,CT=3,OH=5,KS=4,SC=2,KY=7,OR=4,DE=3,HI=0,TX=4,LA=3,TN=8,VA=5,AK=0,AL=4,VT=3,IN=4,AZ=5,ME=1,MD=4,MA=5,MO=8,MN=5,MI=5,MT=4,MS=4).get(a,6)

Cominciamo con il semplice risposta hardcoded leggermente ottimizzata. Accetta il codice postale come input.

-145 byte grazie a bfontaine.


4
È possibile salvare quasi 100 byte utilizzando dict(MO=8,TN=8,...)invece di {'MO':8,'TN':8,...}. È quindi possibile salvare quasi 50 byte utilizzando .get(a,6)e rimuovendo quegli stati che confinano con altri 6 stati. Sono riuscito a scendere al 219 con quei due trucchi.
bfontaine,

@Mitch risparmia ancora un po 'usando lo spazio anziché .e facendo split()(penso)
Stephen

@Mitch ti servono anche i punti? Esiste un metodo per dividere un elenco in gruppi di 2?
Magic Octopus Urn,

Credo che tu possa risparmiare qualche altro byte usando dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3)). Inoltre potresti probabilmente lasciarlo intfuori se è permesso avere un output come stringa.
Izaak van Dongen,

In realtà se usi il disimballaggio potresti farlo dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3)). Scusa, sono un po 'indeciso: D
Izaak van Dongen,

1

PowerShell , 187 byte

param($a)$x=($b=" MO8TN8CO7KY7AZ5GA5MA5MI5MN5NV5NM5OH5VA5WV5AL4IN4KS4MD4MS4MT4NC4OR4TX4WI4CA3CT3DE3LA3NH3NJ3ND3RI3VT3FL2SC2WA2ME1").IndexOf($a);if($x+1){$b[$x+2];exit}6-6*($a-in'AK','HI')

Provalo online!

Sono sicuro che c'è un modo migliore per farlo, ma ecco l'approccio che mi è venuto in mente.

Prende input $ae lo utilizza per ottenere la .IndexOfsua occorrenza nella lunga serie di combinazioni stato / bordo. Memorizza quello in $xe la stringa in $bnel processo. Quindi passa a ifun'istruzione che verifica se ha trovato una corrispondenza e, in tal caso, indicizza la cifra e quindi exit. Altrimenti, siamo uno degli 6stati o AKo HI, quindi eseguiamo una logica per vedere se $auno degli 0stati e sottrarre, se necessario. In ogni caso, rimane sulla pipeline e l'output è implicito.


1

Python 3, 729 733 byte

Accetta input come abbreviazione postale. Questo è il mio primo tentativo di una sfida del golf, e questo è il più breve che penso di poter ottenere con questo approccio infernale. So che è enorme - vieni a pensarci che probabilmente avrei fatto meglio con le if-elsedichiarazioni, ma dopo tutto quel tempo e fatica ho dovuto postarlo: D.

lambda s:sum((i-32)*96**j for j,i in enumerate(b'`*g$<#?wP\\.=)kuDbk$yvv\\D:Nh:cd/Pj, e*[_yXGz6lR<$jMo0qUU*7(Dua3-ThO}iX6VWRYDv=<K$8mVbYK9ld);TFB/m\'NE3ow4./pUsI5yJrwYrM4@e6\\kHJ%q8NA3>fb!~-rtwsRW=RBni}Y7T^gD\\IoxzJf.%|1.&4*"$%Q+).|8p(vcJ]cLRGUyC2eF:<Q4!_)y\\<`tr2A[z7re6OaR["2PRv\x7f,bRE [XrvtA<R<UlS23on?Byym&uy{XuB\x7fIMfh<y&waHElg-vk:4*on\x7f@?Ai5=2swfZSBF.PjkL{,|=,M<Bw"w,e@f`aKnmh\'xgg1#b4En\x7f+*\'g_ZRoeN*Q]mX\'>RoGc~ZP~e&{Hwo6bd<](hV)=l9#[f<Gj,#Ea!nJnL=9k"M,`bP2PsP6(eJoGEU>GA?,BpS}"RzzdMRtL[cre;\\tld^xT\':pry\'Nu_*R}eYg_U!Ld{p7<f:95lD]OBMX(r"Jg\'|%Cq"`Qy9g0aNrtYP9dnPRRr3\'yT(CE~\\&@5#tMLZ+a:V5NNXVp+Uy61s9$=Vb99(!ga7f7x}#=*]q.\x7f0R+f[*m:i^qe#D 8M&W\x7faGmCNCU9"~1Pj!]2r5 H>rYPqwfg4cFG*3-(z'))>>(5*int(s,36)-1850)&15

Mi sono appena reso conto di aver preso il lusso di un nome di variabile di tre lettere: 4 byte in meno, 400 per andare!


Benvenuti in PPCG! A volte le soluzioni più semplici sono più brevi, come mostrato dalle altre risposte di Python: P
Stephen

Sì, amo tutto lo sforzo che ci metti, considerando che il tuo piacere colpevole è "rendere il tuo codice così conciso che è illeggibile", ti inserirai perfettamente.
Zacharý
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.