Dado um dos 50 nomes de estados dos EUA à esquerda como entrada, imprima seu código postal de duas letras conforme mostrado à direita:
Alabama AL
Alaska AK
Arizona AZ
Arkansas AR
California CA
Colorado CO
Connecticut CT
Delaware DE
Florida FL
Georgia GA
Hawaii HI
Idaho ID
Illinois IL
Indiana IN
Iowa IA
Kansas KS
Kentucky KY
Louisiana LA
Maine ME
Maryland MD
Massachusetts MA
Michigan MI
Minnesota MN
Mississippi MS
Missouri MO
Montana MT
Nebraska NE
Nevada NV
New Hampshire NH
New Jersey NJ
New Mexico NM
New York NY
North Carolina NC
North Dakota ND
Ohio OH
Oklahoma OK
Oregon OR
Pennsylvania PA
Rhode Island RI
South Carolina SC
South Dakota SD
Tennessee TN
Texas TX
Utah UT
Vermont VT
Virginia VA
Washington WA
West Virginia WV
Wisconsin WI
Wyoming WY
Regras
- A entrada e a saída diferenciam maiúsculas de minúsculas. Você não produz muitos, por exemplo,
Al
paraAlabama
. - Você pode assumir que a entrada é um dos 50 nomes de estados mostrados acima.
- Você não pode acessar a Internet ou usar dados de estado integrados (olhando para você, Mathematica).
Listas de entradas e saídas separadas podem ser encontradas neste snippet (por favor, não execute, é apenas para comprimir a postagem):
Brownie (sem pontuação) aponta se você também pode usar District of Columbia
como entrada e produção DC
, Ilhas Virgens, etc.
Pontuação
Isso é código-golfe , então o código mais curto em bytes em cada idioma vence .
(Originalmente proposto por ETHProductions)
code-golf
string
kolmogorov-complexity
state-abbreviation
Steve Bennett
fonte
fonte
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
bytes:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Respostas:
Javascript,
124117 bytes(economizou 7 bytes graças ao hvd)
Explicação:
fonte
[A-Z]
não é necessária, pois se sabe que a entrada é válida. O caso especial de Iowa pode ser reduzido[AFIOUW][^o]
para excluí-lo, deixando-o para a final.+
.s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()
Podemos chegar a 100? :)Javascript,
13713513413211311010810199949392 bytesIsso é baseado na solução HP Williams, com algumas melhorias fora do regex e alguns ajustes nele.
(Quebras de linha apenas para legibilidade)
Comentário para a regex:
Regex alternativo inútil (mesmo comprimento):
História
94
99
101
108
110
113
132
134
135
137
fonte
...s.s?
captura Mississippi, Missouri, Massachussetts e Alasca) por acidente. Na verdade, eu estava no processo de mover o.*sk
fragmento para outro lugar, e os testes foram executados e aprovados, enquanto o fragmento não estava presente em nenhum lugar. O ganho de 5 caracteres mais fácil de todos os tempos!...s.s?
também combina inadvertidamente com o Kansas e, por milagre, ainda está dando o resultado certo.M[onti]+
. Tão estranho: se o estado começa com M, a segunda letra é a última de uma sequência de pelo menos um o, n, t ou i. Uma maneira muito estranha de capturar Michican, Minnesota ou Montana.JavaScript (ES6),
156136 bytesDemo
Mostrar snippet de código
fonte
X MOD[50-1000] MOD[50-1000] MOD[50-100]
. Mas isso.slice(1)
foi um erro. Atualmente sendo executado novamente em toda a cadeia.Geléia , 75 bytes
Experimente online!
... ou veja uma suíte de testes - Observe que uma pequena alteração teve que ser feita para executar o programa completo para várias entradas de uma só vez (troquei o átomo de entrada do programa
³
, para um recall do registro®
, um e defini o registro para cada nome de estado).Quão?
Calcula o índice a ser usado para o segundo caractere do código postal, anexa-o ao primeiro caractere e coloca o resultado em maiúsculas.
Primeiro localiza o índice de um caractere de espaço (ou 0, se não encontrado);
Senão verifica se é o Alasca ou o Missouri (produzindo 5 para
k
ouo
);Senão encontra o índice do estado de entrada na lista
Arizona Minnesota Mississippi Nevada Montana Texas Tennessee
(ou 0, se não for encontrado) - nesse caso, é necessário que o índice mod 2 mais 3 (paraz n s v t x n
);Senão converte a sequência em ordinais, converte a partir da base 256, encontra o restante depois de dividir por 29487, localiza o restante depois de dividir por 14 e usa isso para indexar na representação binária de 9620 e dobra o resultado - produzindo 0 para estados que usam sua letra final e 2 para aqueles que usam sua segunda letra.
Todos os casos, exceto o primeiro, são incrementados e o valor resultante é diminuído (aumentando o índice de espaço encontrado por um).
fonte
Python 2 , 191 bytes
Experimente online!
Usa uma função simples de hash para encontrar o segundo caractere da abreviação.
fonte
Python 2,
9490 bytesExperimente online
(Somente Python 2 porque os hashes do Python 3 não são estáveis e você também não pode fazer hash de uma string sem transformá-la em bytes.)
Funciona com todos os 50 estados, além de bônus como Distrito de Columbia e Porto Rico.
Seria possível salvar um byte escrevendo o número na base-36:
int("5clu7x0aixb0pelmpugv5iiibphrpf",36)
.Estou esperando para ver se consigo pensar em uma solução mais criativa.Atualizar:
Como existem 12 posições de dígitos não utilizadas no hash, existem 2 36 números possíveis que funcionarão. Parecia razoável acreditar que um deles teria um fator primordial com um grande expoente. Para qualquer primo e expoente, encontrar um valor é bastante rápido; Eu consegui encontrar um com um fator de 19 9 , a redução do tamanho da expressão necessária para representar o número de quatro bytes.
Este é basicamente o mesmo procedimento que minha resposta C, mas usando Python. Como a função hash base é diferente, eu tive que encontrar uma função de redução diferente, que acaba sendo o mod 52, em vez do 54. Mas as maiores economias em relação a C vêm da possibilidade de usar bignums para codificar o vetor e, é claro, o fato de que o padrão para Python parece ser aceitável usar um literal lambda em vez de um programa completo.
fonte
Retina ,
1138180777068 bytesExperimente online! Inclui todos os 51 casos de teste. Economizou 32 bytes apropriando-se da regex de @ JörgHülsermann que encontra a segunda letra (com um ajuste para dar suporte ao DC; edite: economizou 1 byte graças a @ JörgHülsermann). Economizou 3 bytes mudando para a expressão regular de @ SteveBennett de seu comentário para a resposta de @ HPWilliam. Salvo
79 bytes, agradeço novamente a @SteveBennett. As outras letras são excluídas e a seqüência em maiúsculas.fonte
e
foi o mais problemático, na verdade.d
. (Você pode querer usar o teste automático - Eu tenho um script que verifica constantemente todos os 50 casos.)PHP> = 7.1, 113 bytes
Versão Online
Os ataques são correspondidos através de uma partida inicial anterior
([vxz])
corresponde ao Arizona, Nevada,Novo México,Pensilvânia,Texas,(.)
(um espaço antes) corresponde a New Hampshire, Nova Jersey, Novo México, Nova York, Carolina do Norte, Dakota do Norte, Rhode Island, Carolina do Sul, Dakota do Sul, Virgínia Ocidental[CGHKLPV].*(.)
corresponde a Califórnia, Colorado, Connecticut, Geórgia, Havaí, Kansas, Kentucky, Louisiana,New Hampshire,Carolina do Norte,Pensilvânia,Carolina do Sul, Vermont, Virgínia,Virgínia Ocidentalow(a)
jogo Iowalas(k)
coincidir com o Alascassi?(.)
corresponde a Massachusetts, Mississippi, Missouri,Tennesseen(n|t|[de]$)
corresponde aConnecticut,Kentucky,Maine, Maryland, Minnesota, Montana,Pensilvânia,Rhode Island,Tennessee,VermontComo não há correspondência para esses estados, tomamos as duas primeiras letras Alabama, Arkansas, Delaware, Flórida, Idaho, Illinois, Indiana, Michigan, Nebraska, Ohio, Oklahoma, Oregon, Utah, Washington, Wisconsin, Wyoming
A primeira vez que utilizo este subpatro Regex
?|
permite armazenar as referências anteriores em uma.Apoie o Distrito de Columbia
Substitua
(.)
por([^o])
+3 bytesExperimente online!
PHP, 150 bytes
Experimente online! Casos de teste
fonte
n|t|
Um byte não é menor que[nt]|
?PHP,
887854 bytesExperimente online!
Primeiro temporizador, viva!
fonte
$argv[1]
é substituído por$argn
sandbox.onlinephpfunctions.com/code/…php
!C,
945937718711660616 bytesEconomizou 219 bytes graças ao ASCII-only.
Nova linha desnecessária, apenas para fins de exibição. Toma o estado como entrada. Experimente online!
Como funciona:
struct{int*a,b;}m[]=...
declara um mapam
com dois valores - uma sequência de quatro bytes e um caractere. Isso é usado no loop de comparação, que compara os índices de segundo a quinto comchar*a
o mapa.gets(b)
lê uma stringb
. Este será o estado a abreviar.putchar(*b)
imprime o primeiro caractere dessa sequência, pois cada abreviação começa com a primeira letra do estado.for(;m[i].a;i++)
percorre cada valor do mapa. (Isso pode ser reduzido.)if(!strncmp(m[i].a,b+1,4))
compara o valor atual do mapa com o segundo ao quinto caracteres deb
(o estado a abreviar). Isso ocorre porque as únicas diferenças estão nos cinco primeiros caracteres, mas já imprimimos o primeiro caractere.puts(&m[i].b);
imprime a segunda letra da abreviação (se o nome do estado corresponder ao valor atual do mapa) e uma nova linha.fonte
C,
148141 bytes*(int*)(s+1)
considera que o segundo ao quinto caractere da entrada é um número inteiro; esse número inteiro é então dividido entre 0 e 56 usando o hashi%663694%57
. O valor do hash é então pesquisado em um vetor de deslocamentos que representam a localização da segunda letra da abreviação. Eu escolhi esses quatro bytes específicos porque (1) Missouri e Mississippi diferem primeiro no quinto caractere e (2) alguns estados têm apenas quatro caracteres Em C, você pode usar o byte terminador NUL, mas nada além disso é confiável. (Isso divide os dois nortes no mesmo valor, assim como os dois suls. Mas isso não importa, porque o deslocamento associado é 6 para todos eles.)Por acaso, esse hash específico produz a posição correta para as segundas letras das abreviações de District of Columbia, Porto Rico e "Ilhas Virgens" (digitadas dessa maneira, não como "Ilhas Virgens Americanas", porque o algoritmo insiste em que a primeira caractere da abreviação seja o primeiro caractere do nome).
As constantes 663694 e 57 foram encontradas com um teste automatizado; 57 foi o menor intervalo de hash que encontrei. (A primeira versão usou 380085 e 63, mas quando estendi o intervalo de teste, encontrei o novo.) Parece que existe um hash um pouco menor se um código for adicionado para "use o último caractere no nome"; infelizmente, a sintaxe C para selecionar o último caractere é muito prolixo para tornar isso útil.
Existem apenas oito deslocamentos diferentes, portanto eles poderiam ter sido armazenados em uma tabela de pesquisa de 171 bits (3 * 57) com três bits por entrada. Mas não consegui pensar em uma maneira de inserir esses bits eficientemente no programa. A codificação hex exigiria cerca de um caractere por quatro bits, além dos
0x
prefixos. Eu não poderia fazer melhor do que 151 bytes, que é muito maior que a versão da string. Se os 171 bits pudessem, de alguma forma, ser inseridos como octetos brutos, eles ocupariam 22 bytes, portanto poderia haver uma solução, mas a leitura de um arquivo é desajeitada.fonte
Na verdade , 181 bytes
Esta solução espera entrada como uma string entre aspas.
Experimente online!
Explicação
Esta solução utiliza a mesma estratégia de hash da minha solução Python 3 . Por uma questão de brevidade, vou omitir a explicação de como o hash é calculado e por que foi escolhido (leia a outra resposta, se você quiser esse bit).
Também por questões de brevidade, deixarei de fora o conteúdo das seqüências muito longas, pois caso contrário a explicação seria ilegível.
fonte
Python 3 , 230 bytes
Experimente online!
A entrada é esperada como um objeto de bytes (uma sequência de bytes, em vez de uma sequência Unicode).
Agradecimentos a Johnathon Allan por uma quantidade absurda de bytes
Explicação
Cada nome de estado é hash para um número inteiro
a
aplicando o hasha = sum(o*5**i) % 236
(ondeo
é o ordinal ASCII de um caractere ei
é o seu índice na string, contando desde o final). O módulo236
foi escolhido porque é o menor módulo que faz com que todos os valores de hash sejam distintos para os 50 nomes de estados dos EUA. Esses hashes são mapeados para as abreviações de estado e o dicionário resultante (compactado usando substituição de cadeia) é usado para procurar a abreviação com o nome de um estado (usando o hash para obter a chave apropriada).fonte
lambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Ruby,
106103 bytesSe a entrada contiver um espaço, a segunda letra de saída será aquela após o espaço. Outro...
Hash a soma de todos os caracteres na entrada para obter um caractere cujo índice na string mágica indica o índice da segunda letra de saída na string de entrada, de acordo com a fórmula
j>8?j/4:-1
(-1 significa o final). Se o hash fornecer um caractere que não esteja na sequência mágica, a segunda letra será a segunda letra de entrada.Como explicação da sequência mágica, os caracteres de hash e os índices de letras que eles codificam estão abaixo. Observe que Delaware aparece mesmo que a segunda letra seja exibida - isso ocorre porque seu código de hash entra em conflito com o Kentucky. Felizmente, a última carta de Delaware é a mesma que a segunda.
Ungolfed in program program
fonte
/// ,
619608 bytesExperimente online!
Como não há outra maneira de obter informações em ///, isso ocorre no final do programa. Basta acrescentar a entrada desejada ao programa.
Economizou 11 bytes fazendo mais substituições, conforme recomendado por @SteveBennett
fonte
Python 2 ,
131125 bytesExperimente online!
fonte
TAESGL , 386 bytes
Intérprete
Compressão muito simples dos nomes dos estados, adicionada a uma matriz com as abreviações.
fonte
Japonês, 383 bytes
A compactação da primeira corda pode ser improvável experimentando a ordem das letras.
Experimente online
fonte
Mathematica,
138140134 Bytes+2 bytes - encontrou um erro (deslocamento de matriz necessário de 1 e não 0)
-6 bytes - encontrou um hash melhor
#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&
Semelhante a outros, leva o nome e leva a primeira letra. Em seguida, aplica o hash padrão do Mathematica e, em seguida, aplica dois módulos a ele "
Hash@#~Mod~89866736~Mod~73
" para obter um número exclusivo para cada estado. Esse valor é pesquisado em uma seqüência de caracteres para gerar a segunda letra.Provavelmente é possível jogar mais, mas o espaço de pesquisa é enorme para o Mathematica encontrar. As segundas letras duplicadas não foram consideradas na pesquisa de hash.
_
caracteres representam valores desperdiçados na sequência. Em teoria, você poderia reduzir o número de caracteres para apenas 19 caracteres, mas encontrar o hash personalizado a ser produzido seria um pesadelo.fonte
Perl 5,
150148 bytes (147 + 1)Isso não é o ideal, mas faz o seu trabalho. Precisa de
-n
sinalizador de linha de comando.fonte
Python 2 , 152 bytes
Experimente online!
Um porto da resposta de Arnauld .
fonte