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.


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


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

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.


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


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.


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. :)


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.


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!


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.


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:


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

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

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.


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.


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!


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ý
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.