Quantos estados faço fronteira?

20

Quando eu era mais nova, tinha um grande mapa dos EUA pregado na minha parede em frente à minha cama. Quando estava entediado, olhava aquele mapa e pensava nas coisas. Coisas como o teorema das quatro cores, ou qual estado fazia fronteira com a maioria dos outros estados. Para economizar para mim mais jovem algum poder intelectual na contagem, você vai inventar uma máquina do tempo e me dizer quantos estados fazem fronteira com a entrada. Como o tempo é exigente, isso precisa ser o mais curto possível.

A tarefa

Dado um dos 50 estados dos EUA, pelo nome completo ou pela abreviação postal, conforme encontrado nesta página ( archive.org mirror ), retorne o número de estados com os quais faz fronteira. A seguir, é apresentado um mapeamento de todas as entradas para nomes completos de estados para o número de estados adjacentes, encontrado neste site .

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

As regras

  • Seu programa pode manipular o nome completo do estado ou o código postal - não pode usar uma combinação.
  • Você pode especificar o caso da entrada, mas não pode remover o espaço em branco na entrada.
  • Você não precisa lidar com Washington, DC ou qualquer coisa que não seja um dos 50 estados.
  • O número de estados limitados não inclui o estado de entrada.
  • Isso é , então a resposta mais curta em bytes vence.

Embora eu saiba que pode ser apenas quem tem a melhor compactação ou encontra o melhor padrão de regex por número, se eu receber muitas dessas respostas, concederei uma recompensa a uma resposta que gere um mapa dos EUA e o use para calcule o número de estados limítrofes.

Stephen
fonte
11
inb4Mathematica Embutido
DJMcMayhem
@DJMcMayhem uh oh (sons bom no início, mas ver a actualização ...)
Stephen
@StepHen Oh não, eu fui deposto! Eu estava trabalhando em resposta apenas agora que incorpora este ...;)
notjagan
Relacionados
geokavel
Podemos lidar com DC / incluí-lo em nossas contagens, se assim o desejarmos?
notjagan

Respostas:

17

Geléia , 73 65 bytes

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

Experimente online!

Builtins? Quem precisa disso? ( ʂÞiƬno chão com nojo).

Recebe a entrada como nome completo, como "Idaho".

Como funciona

“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
fireflame241
fonte
Qual processo você usou para obter essa lista?
22817 Scott Milner
2
@ScottMilner Corri OS%168em cada um dos estados, o que gerou diretamente a lista. Encontrei a constante 168 forçando brutalmente todas as possibilidades menores que 250, verificando cada uma delas para poder realmente diferenciar entre diferentes números de fronteiras. 168funcionou (entre alguns outros) e teve o benefício adicional de ter apenas de codificar 48valores por causa de colisões.
precisa saber é o seguinte
18

Mathematica, 112 111 bytes

-5 bytes graças a Mark S. e LegionMammal978 !

-22 bytes (e percebendo um problema com a saída) graças ao ngenisis !

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

Claro, há um Mathematica embutido para isso. Inclui DC na contagem.

notjagan
fonte
3
Isso parece sujo, mas AdministrativeDivisioné tão incrivelmente longo que você salvaria um byte com Comprimento [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Dados"] ~ "BorderingStates"] &
Mark S.
1
ToExpressionpode ser substituído por Symbol, se bem me lembro.
LegionMammal978
1
Além disso, você não precisa usar AdministrativeDivisionData, apenas passe "BorderingStates"como argumento para a entidade; por exemploEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisis 21/08
1
@ngenisis Apliquei uma correção no primeiro problema; felizmente, devido às suas sugestões, ele não adicionou muitos bytes. O último problema que você mencionou em relação à DC não é um problema, pois perguntei à OP se isso era válido e a resposta foi sim.
precisa saber é o seguinte
1
@notjagan Você também pode usar Tr[1^...]no lugar de Length@...para salvar outro byte.
Ngenisis
13

JavaScript (ES6), 115 113 bytes

Edit: economizou 2 bytes emprestando mais 2 otimizações de string da resposta Step Hen Python . Eu senti falta deles na minha tentativa inicial.

Toma códigos postais como entrada.

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

Quão?

Um argumento não RegExp passado para o .match()método é implicitamente convertido em um objeto RegExp. Então, estamos testando a expressão regular /.\D*{{input}}/em nossa string codificada. Isso corresponde a um dígito (1) , seguido de 0 a N caracteres não digitados, seguido pela entrada.

Por exemplo: se a entrada for "NH"(New Hampshire), a sequência correspondente será "3CACTNDELANH". Simplesmente mantemos o primeiro caractere dessa string ou retornamos "6"por padrão, se não houver correspondência.

(1): Na .verdade, ele corresponde a qualquer caractere, mas a string é criada de tal maneira que o que é encontrado antes de um grupo de letras é sempre um dígito.

Demo


Versão hash, 115 bytes

Mesmo formato de entrada.

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

Demo

Arnauld
fonte
Você pode salvar um monte de bytes por btoaing que Cordas
Downgoat
7

Python 3 , 168 154 153 137 bytes

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

Experimente online!

-4 bytes graças a isaacg

-10 bytes graças ao ETHProductions

-1 byte graças a notjagen

Economizou mais alguns bytes por padrão, para seis, como outras respostas.

O TIO inclui testes. Recebe a entrada como código postal. Gera uma lista dos nomes de estado como seqüências de caracteres para cada conjunto, agrupados sempre que possível (por exemplo, WVVAé armazenado como WVA). A função lambda obtém o índice na lista cuja sequência contém a entrada. Pode haver uma maneira que eu não conheça sobre o golfe, o corpo da função. Saídas como uma lista que contém um número inteiro - adicione [0]no final do lambda a saída como número inteiro.

Stephen
fonte
Além disso, você usa apenas luma vez, para que você possa incorporá-lo.
Isaacg
@ETHproductions Sim, graças
Stephen
@isaacg graças, não sei por que eu não vi que
Stephen
-1 byte , reorganizando a posição do Texas.
precisa saber é
graças @notjagan, perdidas que
Stephen
4

V , 143 bytes

ç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

Experimente 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

Escrevi isso antes de perceber que você poderia usar a entrada como códigos postais. Não tenho certeza se isso é realmente mais curto ou não :shrug:. Esta resposta usa regex para procurar determinados estados e, em seguida, altere a entrada para um determinado número, se corresponder. No entanto, conforme o número de estados contra os quais testamos aumenta, a menor pesquisa que podemos usar diminui. Por exemplo, não podemos procurar Cporque isso corresponde a Coloradoe California. (Assim como Conneticut e The Carolinas) No entanto, uma vez testados para todos os estados que têm mais de três limites, podemos apenas procurar por C com início, porque ele não pode mais corresponder ao anterior.

Alguns casos de teste podem estar errados, pois não tenho tempo para testar todos eles. Deixe-me saber se você encontrar alguma saída incorreta. :)

DJMcMayhem
fonte
3

JavaScript, 153 bytes

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)

Encadeamento variável. Tenho certeza de que existe uma maneira melhor de fazer isso.

Graças a uma sugestão de alguém do Discord, o padrão de saída é 6, o número mais comum de estados com fronteiras. 183 bytes a 151 bytes.

Um comentarista apontou que isso falhou para AK e HI, então adicionei dois bytes para corrigir o problema. 151 a 153 bytes.

Eli Richardson
fonte
1
Tenho certeza de que isso falha AKe HIporque é 0||6avaliado em 6, que é uma saída incorreta.
kamoroso94
@ kamoroso94 Atualizei meu código, se você acha que há uma solução melhor, me avise.
Eli Richardson
3

05AB1E , 78 72 bytes

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

Experimente 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.

Isso funciona SOMENTE porque a ordem das abreviações de estado permite que nenhum estado ocorra na sobreposição entre estados:

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

Demorou um pouco para acertar o arranjo ... Então, dividindo a entrada e contando os espaços na primeira parte, obtemos o resultado correto.


Se eu roubar o "padrão para 6" das outras respostas, recebo 65 bytes:

05AB1E , 65 bytes

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

Experimente online!

Urna de polvo mágico
fonte
Took awhile to get the arrangement right-> oh, eu acho que você poderia ter algo copiado de minha resposta (se eu estou lendo isso corretamente)
Stephen
@ Stephen Bem, eu não entendi a idéia de nenhum outro post, se você olhar para o "algoritmo de hash ruim" eu estava brincando com idéias aleatórias para hash por uma hora e depois pensei nos espaços, achei que não podia superar essa implementação, não importa o quanto eu tentei.
Magic Octopus Urn
@ Stephen agora que li o seu, eu gostaria de ter pensado também no padrão de 6 xD.
Magic Octopus Urn
1
Eu não penso nisso, eu vi na esta resposta primeiro, então sinta-se livre para levá-lo: P
Stephen
2

Retina , 106 105 bytes

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

Experimente online! Alguém disse regex? Editar: salvou 1 byte graças a @Arnauld.

Neil
fonte
2

JavaScript (ES6), 195 bytes

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

Uma série de expressões regulares, que funcionam com o nome completo do estado.

Casos de teste:

Rick Hitchcock
fonte
2

Geléia ,  61  59 bytes

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

Um programa completo, pegando o nome completo do estado e imprimindo o resultado (como um link monádico, ele retorna uma lista contendo um único número ou o número 6).

Experimente online! ou veja uma suíte de testes .

Quão?

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

é uma lista de listas de índices da página de códigos:

[[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]]

e é mostrado como “ ... ‘abaixo:

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
Jonathan Allan
fonte
1

Excel VBA, 177 154 147 bytes

Função VBE anônima que recebe Stringdo intervalo o tipo esperado que representa o código postal de um estado [A1]e retorna um Integerque representa o número de estados que fazem fronteira com esse estado.

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)

Versões prévias

154 bytes:

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 bytes:

[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)]

Formatado para facilitar a leitura

[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)]
Taylor Scott
fonte
1

Python 2, 363 218 bytes

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)

Vamos começar com a resposta codificada simples, ligeiramente otimizada. Leva o código postal como entrada.

-145 bytes graças a bfontaine.

pppery
fonte
4
Você pode salvar quase 100 bytes usando em dict(MO=8,TN=8,...)vez de {'MO':8,'TN':8,...}. Você pode salvar quase 50 bytes usando .get(a,6)e removendo os estados que fazem fronteira com outros 6 estados. Eu sou capaz de chegar ao 219 com esses dois truques.
precisa saber é o seguinte
@ Mitch salvar um pouco mais usando o espaço em vez de .e fazendo split()(eu acho)
Stephen
@ Mitch você ainda precisa dos períodos? Existe um método para dividir uma lista em grupos de 2?
Magic Octopus Urn
Eu acredito que você pode salvar mais alguns bytes usando dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3)). Além disso, você provavelmente poderia deixar de intfora isso se for permitido ter saída como uma string.
Izaak van Dongen
Na verdade, se você usar a descompactação, poderá fazer dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3)). Desculpe, estou um pouco indeciso: D
Izaak van Dongen
1

PowerShell , 187 bytes

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

Experimente online!

Tenho certeza de que há uma maneira melhor de fazer isso, mas aqui está a abordagem que eu propus.

Recebe entrada $ae usa isso para obter .IndexOfsua ocorrência na longa sequência de combinações de estado / borda. Armazena isso em $xe a string em $bno processo. Em seguida, entra em uma ifdeclaração que verifica se encontrou uma correspondência e, se sim, indexa o dígito e depois exit. Caso contrário, somos um dos 6estados or AKou HI, portanto, executamos alguma lógica para ver se $aé um dos 0estados e subtraímos, se necessário. De qualquer forma, isso é deixado no pipeline e a saída está implícita.

AdmBorkBork
fonte
1

Python 3, 729 733 bytes

Recebe entrada como uma abreviação postal. Esta é a minha primeira tentativa de um desafio de golfe, e essa é a mais curta que eu acho que posso conseguir com essa abordagem infernal. Eu sei que é enorme - pense bem, eu provavelmente teria ficado melhor com if-elsedeclarações, mas depois de todo esse tempo e esforço, tive que publicá-la: 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

Acabei de perceber que tinha me dado ao luxo de um nome de variável de três letras - 4 bytes abaixo, faltando 400!

Izaak van Dongen
fonte
Bem-vindo ao PPCG! Às vezes, soluções mais simples são mais curtas, como mostra as outras respostas do Python: P
Stephen
Sim, eu amo todo o esforço que você faz para isso, considerando que seu prazer culposo é "tornar seu código tão conciso que é ilegível", você se encaixa bem.
Zacharý