Códigos de estado de EE. UU. Más eficientes

20

¡Abrevia ese estado de EE. UU.! fue divertido, pero aprendimos que abreviar eficientemente los nombres de los estados de Estados Unidos es difícil con el sistema actual. Vamos a idear un esquema de código de estado alternativo para el golf eficiente.

Tu tarea:

Escriba una función (o programa) que, dado un nombre de estado estadounidense válido (solo se requieren los 50 estados normales), devuelva un código único de dos letras en mayúsculas para identificarlo. El código debe cumplir estos requisitos:

  • La primera letra debe ser la misma que la primera letra del estado.
  • La segunda letra debe ser una de las otras letras del estado (no un espacio).
  • Siempre debe dar la misma salida para la misma entrada, y nunca debe dar la misma salida para dos entradas válidas diferentes.

Por ejemplo, dado "Alabama", su función podría devolver "AL", "AA", "AB" o "AM", siempre que no devuelva ese valor para ninguno de Alaska, Arkansas, etc. ("AA "solo es posible porque" A "aparece más de una vez en el nombre del estado.)

Lagunas estándar prohibidas. La entrada / salida estándar está bien. Este es el código de golf, por lo que la solución más corta, en bytes, gana.

La lista completa de posibles entradas está aquí:

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
fuente
2
¿Debería la salida ser siempre dos letras mayúsculas, o está bien dar salida a mayúsculas y minúsculas? Si mezclado está bien, "Ab" debe considerarse diferente de "AB"; y la primera letra siempre debe estar en mayúscula?
Jonathan Allan
¿Se considera el carácter de espacio una letra válida?
Jonathan Allan
No. Las letras son letras.
Steve Bennett
La salida debe ser mayúscula. Lo siento, realmente debería haber especificado eso.
Steve Bennett
Gracias, seguí ambas decisiones ya que pensé que tenían más sentido.
Jonathan Allan

Respuestas:

7

Jalea ,  13  12 bytes

907ị;⁸Qḣ2ṢŒu

Un enlace monádico que toma y devuelve listas de personajes.

Pruébalo en línea! o ver un conjunto de pruebas

¿Cómo?

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

Indexing en Jelly es 1-indexado y modular, por lo que el 907 º índice de algo de longitud L es el (907-modulo-L) ésimo elemento. Por ejemplo, para "Alabama", la longitud es 7, por lo que el elemento en el índice 907 es el (907-módulo-7) th , y 907-módulo-7 es 4 (907 = 129 * 7 + 4 ), por lo que el elemento en el índice 907 es 'b'.

907 es el primer índice positivo en el que las abreviaturas de estado que usan el índice 1 y ese índice en todos los 50 estados se vuelven únicos.

Los nombres de los estados, incluidos sus espacios, tienen una longitud de 4 a 14 inclusive, y 907-módulo-6 es 1 (mientras que para todas las demás longitudes el valor no es 1). Esto significa que si tuviéramos que usar los caracteres primero y 907 para las abreviaturas de que Alaska, Hawái, Kansas, Nevada y Oregón serían AA, HH, KK, NN y OO respectivamente, esto no es aceptable para Hawái, Kansas, o Nevada; entonces se necesita hacer un ajuste; Esta es la razón de la concatenación, desduplicación, ir al índice 2 y ordenar, esto hace que Alaska, Hawai, Kansas, Nevada y Oregón se conviertan en AL, HA, KA, NA y OR respectivamente y no colisionen con las abreviaturas estatales existentes .

Jonathan Allan
fuente
@LevelRiverSt debería estar bien ahora, aunque probablemente haya una solución más corta que este parche para mi defecto original.
Jonathan Allan
¿Puedes por favor agregar una breve explicación?
user1502040
@ user1502040 Lo estaba haciendo, debería estar claro ahora, avíseme si no entiende nada.
Jonathan Allan
¿Cómo se te ocurrió esto?
user1502040
@ user1502040 Sabía que necesitábamos crear los códigos a partir de las letras en la entrada, y que la indexación de Jelly era modular, así que solo busqué un índice que proporcionara 50 códigos únicos (acabo de escribir un código de Python para encontrar dichos índices, también encontré -341 y -773 dentro del rango de -1000 a 1000). Originalmente omití el requisito de "otro", así que parcheé el problema (como se describe). (Todavía no he encontrado nada más corto, aunque no me sorprendería si lo hubiera).
Jonathan Allan
3

Ruby, 34 bytes

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

Comencé con s[0]+s*99999[x].upcasey encontré muchos valores de x hasta x = 100000 que devolvieron códigos únicos para los 50 estados. Desafortunadamente, todos tenían casos en los que la segunda letra de la abreviatura era la primera letra del estado duplicada, lo que no está permitido (a menos que la letra aparezca dos veces en el nombre del estado). Así que decidí usar la expresión s[0]+s[1,8]*999[x]y encontré el valor más pequeño de x que funcionó fue 445.

Comentado en el programa de prueba y salida

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
fuente
1
¿Dónde vio la regla de que la segunda letra no podría ser la misma que la primera? El ejemplo incluso tenía "AA" para Alabama.
Paŭlo Ebermann
3
The second letter must be one of the other letters of the state. AA para Alabama está bien porque Alabama tiene dos A's. KK está bien para Kentucky, pero no para Kansas, por ejemplo.
Level River St
2

JavaScript (ES6), 46 bytes

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

Manifestación

Arnauld
fuente
1

Retina , 49 46 bytes

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

T`l`L
!`^..

Pruébalo en línea! Si el estado contiene una segunda letra mayúscula, o una de las letras flmpxz, entonces esa se convierte en la segunda letra del código. De lo contrario, si contiene una de las letras hru, entonces se convierte en la segunda letra del código; de lo contrario, solo use las dos primeras letras del estado.

Neil
fuente
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
fuente
2
Hawaii, Kansas y Nevada ahora tienen abreviaturas inválidas. (La segunda letra debe ser una de las otras letras del estado). Resolví este problema exacto en mi solución Jelly.
Jonathan Allan
¡Ah, qué complicado! Tendré que volver a mi primera respuesta, bueno que lo guardé.
darrylyeo