Códigos estaduais dos EUA mais eficientes

20

Abrevie esse estado dos EUA! foi divertido, mas aprendemos que abreviar com eficiência nomes de estados dos EUA é difícil com o sistema atual. Vamos criar um esquema de código de estado alternativo para um golfe eficiente.

Sua tarefa:

Escreva uma função (ou programa) que, dado um nome de estado válido nos EUA (somente os 50 estados normais necessários), retorne um código exclusivo de duas letras em maiúscula para identificá-lo. O código deve atender a estes requisitos:

  • A primeira letra deve ser igual à primeira letra do estado.
  • A segunda letra deve ser uma das outras letras do estado (não um espaço).
  • Ele sempre deve fornecer a mesma saída para a mesma entrada e nunca deve fornecer a mesma saída para duas entradas válidas diferentes.

Por exemplo, dado "Alabama", sua função pode retornar "AL", "AA", "AB" ou "AM" - contanto que não retorne esse valor para qualquer Alasca, Arkansas etc. ("AA "só é possível porque" A "aparece mais de uma vez no nome do estado.)

Falhas padrão proibidas. Entrada / saída padrão estão ok. Este é o código golf, a solução mais curta, em bytes, vence.

A lista completa de possíveis entradas está aqui:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming
Steve Bennett
fonte
2
A saída deve sempre ter duas letras maiúsculas ou é correto gerar letras maiúsculas e minúsculas? Se misto estiver OK, "Ab" deve ser considerado diferente de "AB"; e a primeira letra deve sempre ser maiúscula?
Jonathan Allan
O caractere de espaço é considerado uma letra válida?
Jonathan Allan
Não. Letras são letras.
9788 Steve Jobs,
A saída deve estar em maiúsculas. Desculpe, eu realmente deveria ter especificado isso.
Steve Bennett
Obrigado, eu segui as duas decisões, pois achei que elas faziam mais sentido.
Jonathan Allan

Respostas:

7

Geléia ,  13  12 bytes

907ị;⁸Qḣ2ṢŒu

Um link monádico que recebe e retorna listas de caracteres.

Experimente online! ou veja uma suíte de testes

Quão?

907ị;⁸Qḣ2ṢŒu - Monadic link: list of characters, state    e.g. Alabama   or   Kansas
907          - literal 907
   ị         - index into state                                b              K
     ⁸       - link's left argument, state
    ;        - concatenate                                     bAlabama       KKansas
      Q      - de-duplicate (unique by 1st appearance)         bAlam          Kans
       ḣ2    - head to index 2                                 bA             Ka
         Ṣ   - sort                                            Ab             Ka
          Œu - convert to uppercase                            AB             KA

Indexação in Jelly é 1-indexados e modular, de modo que o 907 º índice de algo de comprimento L é o (907-modulo-L) th item. Por exemplo, para "Alabama", o comprimento é 7; portanto, o item no índice 907 é o (907-módulo-7) th e 907-módulo-7 é 4 (907 = 129 * 7 + 4 ), portanto, o item no índice 907 é 'b'.

907 é o primeiro índice positivo no qual as abreviações de estado usando o índice 1 e esse índice em todos os 50 estados se tornam únicos.

Os nomes de estado, incluindo seus espaços, têm comprimento de 4 a 14, inclusive, e 907-modulo-6 é 1 (enquanto que para todos os outros comprimentos o valor não é 1). Isso significa que, se usarmos o primeiro e o 907º caracteres para as abreviações de que Alasca, Havaí, Kansas, Nevada e Oregon seriam AA, HH, KK, NN e OO, respectivamente - isso não é aceitável para o Havaí, Kansas, ou Nevada; portanto, é necessário fazer um ajuste; esse é o motivo da concatenação, deduplicação, vá para o índice 2 e classifique, isso faz com que o Alasca, Havaí, Kansas, Nevada e Oregon se tornem AL, HA, KA, NA e OR, respectivamente, e não colide com as abreviações de estado existentes. .

Jonathan Allan
fonte
O @LevelRiverSt deve estar bom agora, embora exista provavelmente uma solução mais curta do que esse patch para o meu original com defeito.
Jonathan Allan
Você pode adicionar uma breve explicação?
precisa saber é o seguinte
@ user1502040 Eu estava fazendo isso, deve ficar claro agora, avise-me se você não entender nada.
Jonathan Allan
Como você chegou a isso?
user1502040
@ user1502040 Eu sabia que precisávamos criar os códigos a partir das letras na entrada e que a indexação do Jelly era modular, então apenas procurei um índice com 50 códigos exclusivos (acabei de escrever um código Python para encontrar esses índices - também encontrei -341 e -773 no intervalo de -1000 a 1000). Originalmente, perdi o requisito de "outro", então resolvi o problema (conforme descrito). (Também não encontrei nada mais curto, embora não me surpreendesse se houvesse).
Jonathan Allan
3

Ruby, 34 bytes

->s{s[0]+(s[1,8]*999)[445].upcase}

Comecei com s[0]+s*99999[x].upcasee encontrei muitos valores de x até x = 100000, que retornavam códigos exclusivos para todos os 50 estados. Infelizmente, todos eles tiveram casos em que a segunda letra da abreviação era a primeira letra do estado duplicado, o que não é permitido (a menos que a letra apareça duas vezes no nome do estado). Então, decidi usar a expressão s[0]+s[1,8]*999[x]e encontrei o menor valor de x que funcionou foi 445.

Comentado no programa de teste e saída

f=->s{s[0]+            #Return character 0 of the input. Then..
(s[1,8]*999)[          #Concatenate 999 copies of the 8 characters starting at character 1 (or till end of name if state has less than 9 characters) 
   445].upcase         #Return character 445 of the result, converted to uppercase. 
}                     
"Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming".split($/).map{|i|p [f[i],i]}

["AA", "Alabama"]
["AL", "Alaska"]
["AI", "Arizona"]
["AS", "Arkansas"]
["CR", "California"]
["CA", "Colorado"]
["CT", "Connecticut"]
["DA", "Delaware"]
["FO", "Florida"]
["GO", "Georgia"]
["HA", "Hawaii"]
["IA", "Idaho"]
["IO", "Illinois"]
["ID", "Indiana"]
["IW", "Iowa"]
["KA", "Kansas"]
["KC", "Kentucky"]
["LA", "Louisiana"]
["MI", "Maine"]
["MA", "Maryland"]
["MH", "Massachusetts"]
["MG", "Michigan"]
["MO", "Minnesota"]
["MS", "Mississippi"]
["MU", "Missouri"]
["MN", "Montana"]
["NS", "Nebraska"]
["NE", "Nevada"]
["NM", "New Hampshire"]
["NR", "New Jersey"]
["NX", "New Mexico"]
["NO", "New York"]
["NC", "North Carolina"]
["ND", "North Dakota"]
["OI", "Ohio"]
["OO", "Oklahoma"]
["OR", "Oregon"]
["PL", "Pennsylvania"]
["RI", "Rhode Island"]
["SC", "South Carolina"]
["SD", "South Dakota"]
["TS", "Tennessee"]
["TX", "Texas"]
["UA", "Utah"]
["VR", "Vermont"]
["VN", "Virginia"]
["WG", "Washington"]
["WI", "West Virginia"]
["WS", "Wisconsin"]
["WO", "Wyoming"]
Level River St
fonte
1
Onde você viu a regra de que a segunda letra não poderia ser a mesma que a primeira? O exemplo ainda tinha "AA" para o Alabama.
Paŭlo Ebermann 4/17
3
The second letter must be one of the other letters of the state. AA para o Alabama é bom porque o Alabama tem dois A's. KK é bom para Kentucky, mas não para Kansas, por exemplo.
Nível do rio St
2

JavaScript (ES6), 46 bytes

s=>s[0]+s[(s>'M')+1153%s.length].toUpperCase()

Demo

Arnauld
fonte
1

Retina , 49 46 bytes

\B.*(?=[A-Zflmpxz])|\B.*(?=[hru])

T`l`L
!`^..

Experimente online! Se o estado contiver uma segunda letra maiúscula ou uma das letras flmpxz, ela se tornará a segunda letra do código. Caso contrário, se contiver uma das letras hru, ela se tornará a segunda letra do código; caso contrário, use as duas primeiras letras do estado.

Neil
fonte
0

JavaScript (ES6), 52 bytes

s=>s[0]+(s=s.slice(2,9))[146%s.length].toUpperCase()


JavaScript (ES6), 52 bytes

s=>s[0]+(s[8]||s[s[1]=='o'?5:4]||s[2]).toUpperCase()

darrylyeo
fonte
2
Havaí, Kansas e Nevada agora têm abreviações inválidas. (A segunda letra deve ser uma das outras letras do estado.) Resolvi esse problema exato em minha solução Jelly.
Jonathan Allan
Ah, que complicado! Vou ter que voltar à minha primeira resposta, que bom que eu salvei.
darrylyeo