Codes d'État américains plus efficaces


20

Abréger cet état américain! était amusant, mais nous avons appris que l'abréviation efficace des noms d'états américains est difficile avec le système actuel. Imaginons un autre schéma de code d'état pour un golf efficace.

Ta tâche:

Écrivez une fonction (ou un programme) qui, étant donné un nom d'état américain valide (seulement les 50 états normaux requis), retourne un code unique à deux lettres en majuscule l'identifiant. Le code doit répondre à ces exigences:

  • La première lettre doit être la même que la première lettre de l'État.
  • La deuxième lettre doit être l'une des autres lettres de l'État (pas un espace).
  • Il doit toujours donner la même sortie pour la même entrée et ne doit jamais donner la même sortie pour deux entrées valides différentes.

Par exemple, étant donné "Alabama", votre fonction peut retourner "AL", "AA", "AB" ou "AM" - tant qu'elle ne renvoie pas cette valeur pour l'Alaska, l'Arkansas, etc. ("AA "n'est possible que parce que" A "apparaît plusieurs fois dans le nom de l'état.)

Failles standard interdites. L'entrée / sortie standard est correcte. C'est le golf de code, donc la solution la plus courte, en octets, gagne.

La liste complète des entrées possibles est ici:

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

2
La sortie doit-elle toujours être composée de deux lettres majuscules, ou est-il correct de sortir une casse mixte? Si le mélange est OK, "Ab" doit être considéré comme différent de "AB"; et la première lettre doit-elle toujours être en majuscule?
Jonathan Allan

Le caractère espace est-il considéré comme une lettre valide?
Jonathan Allan

Les lettres sont des lettres.
Steve Bennett

La sortie doit être en majuscule. Désolé, j'aurais vraiment dû le préciser.
Steve Bennett

Merci, je suis allé avec ces deux décisions car je pensais qu'elles avaient le plus de sens.
Jonathan Allan

Réponses:


7

Gelée ,  13  12 octets

907ị;⁸Qḣ2ṢŒu

Un lien monadique prenant et renvoyant des listes de personnages.

Essayez-le en ligne! ou voir une suite de tests

Comment?

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

L'indexation dans Jelly est 1-indexée et modulaire, donc le 907 ème index de quelque chose de longueur L est le (907-modulo-L) ème item. Par exemple, pour "Alabama", la longueur est de 7, donc l'élément à l'index 907 est le (907-modulo-7) e , et 907-modulo-7 est 4 (907 = 129 * 7 + 4 ), donc l'élément à l'index 907 est «b».

907 est le premier indice positif auquel les abréviations d'état utilisant l'index 1 et cet indice sur l'ensemble des 50 états deviennent uniques.

Les noms d'états, y compris leurs espaces, sont de longueur 4 à 14 inclus, et 907-modulo-6 est 1 (tandis que pour toutes les autres longueurs, la valeur n'est pas 1). Cela signifie que si nous devions utiliser les 1er et 907e caractères pour les abréviations que l'Alaska, Hawaï, le Kansas, le Nevada et l'Oregon seraient respectivement AA, HH, KK, NN et OO - ce n'est pas acceptable pour Hawaï, Kansas, ou Nevada; un ajustement doit donc être fait; c'est la raison de la concaténation, de la déduplication, de la tête vers l'index 2 et le tri, ce qui fait que l'Alaska, Hawaï, le Kansas, le Nevada et l'Oregon deviennent respectivement AL, HA, KA, NA et OR et ne se heurtent pas aux abréviations d'état existantes .


@LevelRiverSt devrait être OK maintenant, bien qu'il existe probablement une solution plus courte que ce correctif à mon correctif d'origine.
Jonathan Allan

Pouvez-vous ajouter une brève explication?
user1502040

@ user1502040 Je le faisais, devrait être clair maintenant, faites-moi savoir si vous ne comprenez rien.
Jonathan Allan

Comment avez-vous trouvé ça?
user1502040

@ user1502040 Je savais que nous devions créer les codes à partir des lettres en entrée et que l'indexation Jelly était modulaire, alors j'ai juste cherché un index qui donnait 50 codes uniques (je viens d'écrire du code Python pour trouver de tels index - trouver aussi -341 et -773 dans la plage de -1000 à 1000). À l'origine, j'ai manqué l'exigence pour «autre», donc j'ai corrigé le problème (comme décrit). (Je n'ai encore rien trouvé de plus court, même si je ne serais pas surpris s'il y en avait).
Jonathan Allan

3

Rubis, 34 octets

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

J'ai commencé avec s[0]+s*99999[x].upcaseet trouvé de nombreuses valeurs de x jusqu'à x = 100000 qui renvoyaient des codes uniques pour les 50 états. Malheureusement, ils ont tous eu des cas où la deuxième lettre de l'abréviation était la première lettre de l'état dupliqué, ce qui n'est pas autorisé (sauf si la lettre apparaît deux fois dans le nom de l'État). J'ai donc décidé d'utiliser l'expression s[0]+s[1,8]*999[x]et trouvé la plus petite valeur de x qui a fonctionné était 445.

Commenté dans le programme de test et la sortie

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

1
Où avez-vous vu la règle selon laquelle la deuxième lettre ne pouvait pas être la même que la première? L'exemple avait même "AA" pour l'Alabama.
Paŭlo Ebermann

3
The second letter must be one of the other letters of the state. AA pour l'Alabama est bien parce que l'Alabama a deux A. KK est bien pour le Kentucky mais pas pour le Kansas par exemple.
Level River St


2

JavaScript (ES6), 46 octets

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

Démo


1

Rétine , 49 46 octets

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

T`l`L
!`^..

Essayez-le en ligne! Si l'état contient une deuxième lettre majuscule ou l'une des lettres flmpxz, cela devient la deuxième lettre du code. Sinon, s'il contient l'une des lettres hru, cela devient la deuxième lettre du code, sinon utilisez simplement les deux premières lettres de l'état.


0

JavaScript (ES6), 52 octets

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


JavaScript (ES6), 52 octets

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


2
Hawaï, Kansas et Nevada ont maintenant des abréviations invalides. (La deuxième lettre doit être l'une des autres lettres de l'État.) J'ai résolu ce problème exact dans ma solution Jelly.
Jonathan Allan

Ah, comme c'est délicat! Je vais devoir revenir à ma première réponse, heureusement que je l'ai enregistrée.
darrylyeo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.