Codici di stato USA più efficienti


20

Abbrevia lo stato americano! è stato divertente, ma abbiamo appreso che abbreviare in modo efficiente i nomi degli Stati Uniti è difficile con il sistema attuale. Facciamo uno schema di codice statale alternativo per un golf efficiente.

Il tuo compito:

Scrivi una funzione (o programma) che, dato un nome di stato USA valido (solo i 50 stati normali richiesti), restituisce un codice univoco di due lettere in maiuscolo identificandolo. Il codice deve soddisfare questi requisiti:

  • La prima lettera deve essere uguale alla prima lettera dello stato.
  • La seconda lettera deve essere una delle altre lettere dello stato (non uno spazio).
  • Deve sempre fornire lo stesso output per lo stesso input e non deve mai fornire lo stesso output per due input validi diversi.

Ad esempio, dato "Alabama", la tua funzione potrebbe restituire "AL", "AA", "AB" o "AM" - purché non restituisca quel valore per nessuno di Alaska, Arkansas, ecc. ("AA "è possibile solo perché" A "appare più di una volta nel nome dello stato.)

Scappatoie standard vietate. Gli input / output standard sono ok. Questo è il golf del codice, quindi la soluzione più breve, in byte, vince.

L'elenco completo dei possibili input è qui:

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
L'output deve sempre essere composto da due lettere maiuscole o è corretto generare caratteri misti? Se miscelato è OK, "Ab" deve essere considerato diverso da "AB"; e la prima lettera deve sempre essere maiuscola?
Jonathan Allan il

Il carattere spaziale è considerato una lettera valida?
Jonathan Allan il

No. Le lettere sono lettere.
Steve Bennett,

L'output deve essere maiuscolo. Mi dispiace, avrei dovuto specificarlo.
Steve Bennett,

Grazie, ho seguito entrambe le sentenze poiché pensavo che avessero più senso.
Jonathan Allan,

Risposte:


7

Gelatina ,  13  12 byte

907ị;⁸Qḣ2ṢŒu

Un collegamento monadico che prende e restituisce elenchi di personaggi.

Provalo online! o vedere una suite di test

Come?

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

Indicizzazione in gelatina è 1-indicizzato e modulare, in modo che il 907 ° indice qualcosa di lunghezza L è il (907-modulo-L) esimo elemento. Ad esempio per "Alabama" la lunghezza è 7, quindi l'articolo all'indice 907 è il (907-modulo-7) th , e 907-modulo-7 è 4 (907 = 129 * 7 + 4 ), quindi l'articolo all'indice 907 è 'b'.

907 è il primo indice positivo in cui le abbreviazioni di stato che utilizzano l'indice 1 e quell'indice su tutti i 50 stati diventano uniche.

I nomi degli stati, compresi i loro spazi, sono di lunghezza compresa tra 4 e 14 inclusi e 907-modulo-6 è 1 (mentre per tutte le altre lunghezze il valore non è 1). Ciò significa che se dovessimo usare il 1 ° e il 907 ° carattere per le abbreviazioni che Alaska, Hawaii, Kansas, Nevada e Oregon sarebbero AA, HH, KK, NN e OO rispettivamente - questo non è accettabile per Hawaii, Kansas, o Nevada; quindi è necessario un adeguamento; questo è il motivo della concatenazione, della deduplicazione, vai all'indice 2 e ordina, questo rende l'Alaska, le Hawaii, il Kansas, il Nevada e l'Oregon che diventano rispettivamente AL, HA, KA, NA e OR e non si scontrano con le abbreviazioni di stato esistenti .


@LevelRiverSt dovrebbe essere OK ora, anche se probabilmente c'è una soluzione più breve di questa patch alla mia difettosa originale.
Jonathan Allan il

Potete per favore aggiungere una breve spiegazione?
user1502040

@ user1502040 Lo stavo facendo, dovrebbe essere chiaro ora, fammi sapere se non capisci niente.
Jonathan Allan il

Come ti è venuto in mente questo?
user1502040

@ user1502040 Sapevo che dovevamo creare i codici dalle lettere nell'input e che l'indicizzazione Jelly era modulare, quindi ho appena cercato un indice che fornisse 50 codici univoci (ho appena scritto del codice Python per trovare tali indici - trovando anche -341 e -773 nell'intervallo da -1000 a 1000). Inizialmente avevo perso il requisito di "altro", quindi ho risolto il problema (come descritto). (Non ho ancora trovato niente di più breve, anche se non sarei sorpreso se ci fosse).
Jonathan Allan il

3

Rubino, 34 byte

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

Ho iniziato con s[0]+s*99999[x].upcasee ho trovato molti valori di x fino a x = 100000 che ha restituito codici univoci per tutti i 50 stati. Sfortunatamente avevano tutti casi in cui la seconda lettera dell'abbreviazione era la prima lettera dello stato duplicata, il che non è consentito (a meno che la lettera non compaia due volte nel nome dello stato.) Quindi ho deciso di usare l'espressione s[0]+s[1,8]*999[x]e ho trovato il valore più piccolo di x che ha funzionato era 445.

Commentato nel programma di test e output

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
Dove hai visto la regola secondo cui la seconda lettera non poteva essere uguale alla prima? L'esempio aveva persino "AA" per l'Alabama.
Paŭlo Ebermann,

3
The second letter must be one of the other letters of the state. AA per l'Alabama va bene perché l'Alabama ha due A. KK va bene per il Kentucky ma non per il Kansas per esempio.
Level River St


2

JavaScript (ES6), 46 byte

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

dimostrazione


1

Retina , 49 46 byte

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

T`l`L
!`^..

Provalo online! Se lo stato contiene una seconda lettera maiuscola o una delle lettere flmpxz, questa diventa la seconda lettera del codice. Altrimenti, se contiene una delle lettere hru, questa diventa la seconda lettera del codice, altrimenti usa solo le prime due lettere dello stato.


0

JavaScript (ES6), 52 byte

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


JavaScript (ES6), 52 byte

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


2
Hawaii, Kansas e Nevada hanno ora abbreviazioni non valide. (La seconda lettera deve essere una delle altre lettere dello stato.) Ho risolto questo problema esatto nella mia soluzione Jelly.
Jonathan Allan il

Ah, che schifo! Dovrò tornare alla mia prima risposta, buona cosa l'ho salvata.
darrylyeo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.