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 é código-golfe , 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.
inb4
Mathematica EmbutidoRespostas:
Geléia ,
7365 bytesExperimente online!
Builtins? Quem precisa disso? (
ʂÞiƬ
no chão com nojo).Recebe a entrada como nome completo, como
"Idaho"
.Como funciona
fonte
OS%168
em 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.168
funcionou (entre alguns outros) e teve o benefício adicional de ter apenas de codificar48
valores por causa de colisões.Mathematica,
112111 bytes-5 bytes graças a Mark S. e LegionMammal978 !
-22 bytes (e percebendo um problema com a saída) graças ao ngenisis !
Claro, há um Mathematica embutido para isso. Inclui DC na contagem.
fonte
AdministrativeDivision
é tão incrivelmente longo que você salvaria um byte com Comprimento [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Dados"] ~ "BorderingStates"] &ToExpression
pode ser substituído porSymbol
, se bem me lembro.AdministrativeDivisionData
, apenas passe"BorderingStates"
como argumento para a entidade; por exemploEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
Tr[1^...]
no lugar deLength@...
para salvar outro byte.JavaScript (ES6),
115113 bytesEdit: 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.
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
Mostrar snippet de código
Versão hash, 115 bytes
Mesmo formato de entrada.
Demo
Mostrar snippet de código
fonte
Python 3 ,
168154153137 bytesExperimente 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 comoWVA
). 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.fonte
l
uma vez, para que você possa incorporá-lo.V , 143 bytes
Experimente online!
Hexdump:
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 procurarC
porque isso corresponde aColorado
eCalifornia
. (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. :)
fonte
JavaScript, 153 bytes
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.
fonte
AK
eHI
porque é0||6
avaliado em 6, que é uma saída incorreta.05AB1E ,
7872 bytesExperimente online!
Isso funciona SOMENTE porque a ordem das abreviações de estado permite que nenhum estado ocorra na sobreposição entre estados:
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
Experimente online!
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)Retina ,
106105 bytesExperimente online! Alguém disse regex? Editar: salvou 1 byte graças a @Arnauld.
fonte
JavaScript (ES6), 195 bytes
Uma série de expressões regulares, que funcionam com o nome completo do estado.
Casos de teste:
Mostrar snippet de código
fonte
Geléia ,
6159 bytesUm 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?
é uma lista de listas de índices da página de códigos:
e é mostrado como
“ ... ‘
abaixo:fonte
Excel VBA,
177154147 bytesFunção VBE anônima que recebe
String
do intervalo o tipo esperado que representa o código postal de um estado[A1]
e retorna umInteger
que representa o número de estados que fazem fronteira com esse estado.Versões prévias
154 bytes:
177 bytes:
Formatado para facilitar a leitura
fonte
Python 2,
363218 bytesVamos começar com a resposta codificada
simples,ligeiramente otimizada. Leva o código postal como entrada.-145 bytes graças a bfontaine.
fonte
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..
e fazendosplit()
(eu acho)dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3))
. Além disso, você provavelmente poderia deixar deint
fora isso se for permitido ter saída como uma string.dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3))
. Desculpe, estou um pouco indeciso: DPowerShell , 187 bytes
Experimente online!
Tenho certeza de que há uma maneira melhor de fazer isso, mas aqui está a abordagem que eu propus.
Recebe entrada
$a
e usa isso para obter.IndexOf
sua ocorrência na longa sequência de combinações de estado / borda. Armazena isso em$x
e a string em$b
no processo. Em seguida, entra em umaif
declaração que verifica se encontrou uma correspondência e, se sim, indexa o dígito e depoisexit
. Caso contrário, somos um dos6
estados orAK
ouHI
, portanto, executamos alguma lógica para ver se$a
é um dos0
estados e subtraímos, se necessário. De qualquer forma, isso é deixado no pipeline e a saída está implícita.fonte
Python 3, 729
733bytesRecebe 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-else
declarações, mas depois de todo esse tempo e esforço, tive que publicá-la: D.Acabei de perceber que tinha me dado ao luxo de um nome de variável de três letras - 4 bytes abaixo, faltando 400!
fonte