Golf pratico - Stati Uniti [chiuso]


11

La mia famiglia ha un'attività di e-commerce. Sul nostro sito, forziamo le persone a scegliere il loro stato da un menu a discesa quando inseriscono il loro indirizzo, ma attraverso alcuni altri canali che utilizziamo, i clienti possono inserire tutto ciò che vogliono nella casella.

Mia mamma adora i modelli di fattura che le ho fatto, generati automagicamente. Ma poiché sono così carini ed equilibrati, non può sopportarlo quando le persone SCRIVONO i nomi dei loro stati, o peggio, scrivono qualcosa come "New Jersey". Dice che rovina lo sguardo.

A mio padre piace che il codice sia leggero. Quindi, piuttosto che utilizzare un blocco switch-case, vuole una soluzione più snella.

Quindi la sfida è quella di creare una breve funzione che accetta i possibili input e restituisce un'abbreviazione di due lettere (in maiuscolo, per la mamma). Faremo un'ipotesi (errata) che i nostri utenti possano scrivere e inserire sempre uno spazio nel nome (dove necessario) o passare la sigla corretta. Lo scopo sono i 50 stati degli Stati Uniti.

  • New York
  • New York
  • NY
  • NY

sono tutti input accettabili per New York e dovrebbero produrre NY.

Se viene passato qualcosa come New Yrok, la funzione può restituire il valore originale.

Puoi usare qualsiasi linguaggio comune. Questo è un concorso di popolarità, quindi vince quello con il maggior numero di voti alla fine di una settimana. Presumo che ciò favorirà la novità e l'utilità.

EDIT: La descrizione è storia, ma stavo lavorando a un progetto simile e ho pensato che ci doveva essere un modo più interessante per farlo. Posso fare il progetto da solo (già fatto) ma ho pensato che fosse un buon posto per una sfida più interessante. Con "Qualsiasi linguaggio comune" stavo escludendo le lingue / le librerie personalizzate progettate per questa sfida - stavo cercando di cercare metodi nuovi, piuttosto che un aiuto in codice gratuito. Immagino che tutti lo abbiano fatto ad un certo punto, ma sarebbe divertente farlo in un modo insolito. Trovo che i progetti più interessanti siano quelli in cui affronti le attività quotidiane in modi nuovi e interessanti - ecco perché si tratta di una gara di popolarità piuttosto che di golf.


14
Non sono sicuro del motivo per cui si tratta di una gara di popolarità invece del codice golf (soprattutto perché il nome include "golf" e tuo padre preferisce il codice corto).
Geobits,

5
@Claudiu Vero, ma questo sito non è destinato al codice di produzione ...
Geobits,

3
@Claudiu Ho onestamente supposto che si trattasse di "lanugine della storia" del tipo che solitamente si accompagna a queste sfide. Ad ogni modo, quando ho detto "questo sito ..." intendevo PP&CG, poiché la maggior parte del codice qui non è esplicitamente destinata all'uso nella produzione. Onestamente, se sta cercando un codice reale da utilizzare sul suo sito, sarebbe più etico farlo da solo o
contrarlo

8
@chilemagic you can use any code... quindi OP riscriverà il suo sito per usare la tua soluzione APL / CJAM / GolfScript? È una sfida basata su una storia vera. Voto a favore
edc65,

4
È un compito abbastanza banale, perché OP dovrebbe fare tutto lo sforzo di scrivere una domanda quando sarebbe più semplice codificarlo da solo? Ad ogni modo, mi è piaciuto provarlo.
James Williams,

Risposte:


27

Rubino

Ho pensato che sarebbe interessante estrarre le abbreviazioni di stato senza scrivere esplicitamente alcun nome o abbreviazione. Questo non prende in considerazione l'ortografia errata dell'input, perché non ci interessa nulla di simile qui su codegolf.SE, rihgt ?

def f(s)
  [
    /(.).* (.)/,              # two words
    /^([CDGHKLPV]).*(.)$/,    # first and last letter
    /^(.).*([ZVX])/,          # unique letter
    /^([NFOUW])(.)/,          # two first letters
    /^(.)([DNR])/,            # unique second letter
    /^(.).*(L|N)\2/,          # double letters
    /^(.).SS(A|O)/,           # double S before the one used
    /^(.).*?[SNW](.)/,        # identified by the letters before them
    /(.)(.)/                  # two first letters

  ].find { |r| r =~ s.upcase }
  $1+$2
end

Ci è voluto un tempo conciso per capire schemi intelligenti che corrispondessero a tutti gli stati. L'ordine dei motivi è importante: ogni motivo consecutivo si applica agli stati rimanenti che non sono stati abbinati a un modello precedente:

Tutti gli stati con due parole in essi usano le lettere iniziali delle due parole:

N ew H ampshire, N ew J ersey, N ew M exico, N ew Y ork, N orth C arolina, N orth D Akota, R hode I sland, S outh C arolina, S outh D Akota, W est V irginia

Tutti gli stati che iniziano con qualsiasi lettera in { CDGHKLPV} utilizzano la prima e l'ultima lettera nel nome:

C aliforni a , C olorad o , C onnecticu t , D elawar e , G eorgi a , H awai i , K ansa s , K entuck y , L ouisian a , P ennsylvani a , V irgini a , V ermon t

Degli altri stati, le lettere { ZVX} sono uniche:

A ri z ona, N e v ada, T e x as

Tutti gli stati rimanenti che iniziano con { FNOUW} utilizzano le due prime lettere.

Fl orida, Ne braska, Oh io, Ok lahoma, Or egon, Ut ah, Wa shington, Wi sconsin, Wy oming

Quindi, { DNR} sono unici come seconde lettere:

Ar kansas, In Diana, Id aho

Sta diventando davvero difficile creare schemi generali, ma ...

Solo tre stati rimanenti usano il doppio No L, e la doppia lettera è usata nell'abbreviazione dello stato:

T en n essee, M a n esota, ho l l inois

Ao Odopo che la doppia S è unica per

M ass a chusetts e M iss o uri

Ogni volta che { SNW} appare prima di altre lettere nei nomi di stato rimanenti, le lettere che seguono sono usate nelle abbreviazioni:

A las k a, M arylan d , M ain e , M is s issippi, M on t ana, I do a

Ne rimangono due. Questi usano le due prime lettere:

Al Abama, Mi Chigan


Ovviamente può essere giocato a golf:

Rubino 2 - 191 165 154 caratteri

Altri 26 personaggi si offuscano un po 'le regex. Inoltre, una delle regex originali si è rivelata ridondante!

gets;[/.* (.)/,/^[CDGHKLPV].*(.)$/,/.*([ZVX])/,/^[NFOUW](.)/,/^.([DNR])/,/.*(L|N)\1/,
/.*SS(A|O)/,/.*?[SNW](.)/,/.(.)/].find{|r|$_.upcase=~r}
puts $&[0]+$1

"Attualmente meno di un terzo della dimensione della voce Golfscript!" : P Tieni presente che Golfscript non utilizza Regexes.
Josiah Winslow,

E ho cambiato la dimensione. : P
Josiah Winslow,

1
(@JosiahWinslow e oh, rendilo 3.9575757575 ...: P)
daniero,

6
lol per il regex tette nella spiegazione che non è sopravvissuto alla compressione
masterX244

1
Mi piace questa risposta, ma non è valida in quanto non è in grado di individuare input non validi (come dici tu). C'è anche un esempio specificoIf something like New Yrok is passed in, the function should return the original value.
edc65,

4

C #

Ho usato caratteri già negli stati per le abbreviazioni per abbreviare la stringa di stato.

public string GetAbbr(string state)
            {

                var states =
                    new[] {
                        "AlasKa", "ALabama", "AriZona", "ARkansas", "CAlifornia", "COlorado", "ConnecticuT",
                        "DElaware", "FLorida", "GeorgiA", "HawaiI", "IDaho", "ILlinois", "INdiana", "IowA", "KansaS",
                        "KentuckY", "LouisianA", "MainE", "MarylanD", "MAssachusetts", "MIchigan", "MinNnesota",
                        "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", "washington D.C.", "West Virginia", "WIsconsin", "WYoming"
                    };
                var all = states.ToDictionary(st => string.Concat(st.Where(char.IsUpper)));

                var wanted = all.FirstOrDefault(pair => state.ToUpper().Equals(pair.Value.ToUpper()) || state.ToUpper().Equals(pair.Key));

                return wanted.Key ?? state;
            }

1
Bella soluzione!
Decadimento beta

2

JavaScript (E6)

Qui la maggior parte è la lista dei nomi, usando il trucco camelCase per accorciare un po '. Golfato, 617 byte.

F=i=>
  "AkAlAzArCaCoCtDeFlGaHiIdIlInIaKsKyLaMeMdMaMiMnMsMoMtNeNvNhNjNmNyNcNdOhOkOrPaRiScSdTnTxUtVtVaWaWvWiWyAlaskaAlabamaArizonaArkansasCaliforniaColoradoConnecticutDelawareFloridaGeorgiaHawaiiIdahoIllinoisIndianaIowaKansasKentuckyLouisianaMaineMarylandMassachusettsMichiganMinnesotaMississippiMissouriMontanaNebraskaNevadaNew hampshireNew jerseyNew mexicoNew yorkNorth carolinaNorth dakotaOhioOklahomaOregonPennsylvaniaRhode islandSouth carolinaSouth dakotaTennesseeTexasUtahVermontVirginiaWashingtonWest virginiaWisconsinWyoming"
  .match(/.[^A-Z]*/g).map((w,q)=>U(w,U(w)==U(i)?p=q%50:p),U=s=>s.toUpperCase(),p=-1)[p]||i

0

Pitone

Ho deciso di fare questo come una sfida di code-golf. Sono arrivato a 906 713 694 caratteri con l'aiuto di daniero e hsl:

s='AK,AL,AZ,AR,CA,CO,CT,DE,FL,GA,HI,ID,IL,IN,IA,KS,KY,LA,ME,MD,MA,MI,MN,MS,MO,MT,NE,NV,NH,NJ,NM,NY,NC,ND,OH,OK,OR,PA,RI,SC,SD,TN,TX,UT,VT,VA,WA,WV,WI,WY,ALASKA,ALABAMA,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(",")
x=input().upper()
print(s[s.index(x)%50]if x in s else x)

Tuttavia, se i moduli sono consentiti (come il modulo US ), posso ottenere fino a 130 caratteri:

import us
i=raw_input()
x=us.states.lookup(i)
print x.abbr if x else i

E se non fosse necessario restituire il valore originale quando lo stato non esiste, è possibile ridurlo a 50 caratteri:

import us
print us.states.lookup(raw_input()).abbr

Puoi salvare circa 200 caratteri sul primo lasciando suna stringa grande, quindi dividerla in virgole ( ,); Non c'è bisogno di tutte le virgolette singole.
daniero,

@daniero Non riesco a credere che non ci abbia pensato! Lo farà ora.
James Williams,

Puoi rimuovere Washington, DC, poiché non è uno stato americano.
NinjaBearMonkey,

@hsl Grazie. Ho preso la lista da un elenco di stati che ho trovato online, non avevo capito che Washington DC era lì.
James Williams,

0

bash + sed, 291 byte

Conversione spudorata della soluzione Ruby di Daniero in sed:

echo $*|tr a-z A-Z|sed -e\
"/\(.\).* \(.\).*/b1;/^\([CDGHKLPV]\).*\(.\)$/b1;/^\(.\).*\([ZVX]\).*/b1;\
/^\([NFOUW]\)\(.\).*/b1;/^\(.\)\([DNR]\).*/b1;/^\(.\).*\([LN]\)[LN].*/b1;\
/^\(.\).*SS\([AO]\).*/b1;/^\(.\).*\([ED])\)$/b1;/^\(.\).*[SNW]\(.\).*/b1;\
/\(.\)\(.\).*/b1;:1 s//\1\2/"

0

Golfscript - 750 653

La maggior parte è nei nomi e nelle abbreviazioni dello stato.

{.96>32*-}%.,2>{"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"","/.@?)=}{}if

Spiegazione:

{        }%                         Map this to every character in the input string:
 .96>32*-                             Subtract 32 from the ASCII value if it's from "a" onwards.
                                      This turns every lowercase letter into an uppercase letter.
           .,2>                     Check if the input length is greater than 2.
               {              }     If it is, they inputted the full name.
                "..."                 Our string is in the form "STATE NAME,STATE ABBREVIATION".
                     ","/             We split the string at every comma to turn it into an array.
                         .@?          Then we see where the input string is in the array...
                            )=        ...then we return the value right next to it.
                               {}   If not, they inputted the abbreviation.
                                      ...do nothing.
                                 if EndIf
                                    (implied) Print the abbreviation

Mi dispiace, ma non vedo il punto di prendere l'intero mio script e aggiungere solo pochi byte di boilerplate; Semplicemente non porta nulla. Ma grazie per i titoli di coda immagino ... Distinti saluti, "l'altro ragazzo".
daniero,

Siamo spiacenti, entrata al troll. So che non è una vera voce.
Josiah Winslow,

Bene, allora considerami
troll

@daniero Ehi, almeno so che è possibile avere regex in Golfscript! Questa è in realtà l'unica ragione per cui ho fatto questo lol: p
Josiah Winslow il

0

PHP

Il mio tentativo, che non ebbe il successo sperato, utilizza la lunghezza della stringa e un posizionamento specifico del carattere per estrarre l'abbreviazione dal nome dello stato. Probabilmente è possibile un migliore sequenziamento dell'eliminazione del nome.

function findAbb ($state) {
    $first = substr($state, 0, 1);
    $last = substr($state, -2,1);
    $state = strtolower($state);
    if (strlen($state) < 4) {
        return strtoupper($state);
    }
    if (strpos($state, ' ')) { //if it's a space, return the first letter of each word.
        $space_index = strpos($state, ' ');
        $state = explode(' ', $state);
        return strtoupper(substr($state[0], 0, 1) . substr($state[1], 0, 1));
    }
    if (startsWith($state, 'io')) { //iowa is annoying, get rid of it.
        return strtoupper($first . $last);
    }
    if (startsWith($state, 'w,i')) { //if it starts with a W, return the first 2.
        return strtoupper(substr($state, 0, 2));
    }
    if (strlen($state) < 7 && strpos($state, 'm')===false) { //matches texas, ohio, and utah.
        return strtoupper($first . substr($state, -4,1));
    }
    if (strlen($state) < 7 && substr($state, 0, 1) > 'j' && substr($state, 0, 1) < 'n') { //matches maine, kansas, and hawaii
        return strtoupper($first . $last);
    }
    if (startsWith($state, 'c,d,k,l,p,v,g,h')) { //some unique states
        return strtoupper($first . $last);
    }
    if (strpos($state, 'sk')) {
        return strtoupper ('ak');
    }
    if (startsWith($state, 'k,l', 1)) {
        return strtoupper(substr($state, 0, 2));
    }
    if (startsWith($state, 'n')) {
        return strtoupper($first . substr($state, 2, 1));
    }
    if (startsWith($state, 'n', 2) || startsWith($state, 'z', 3)) { //montana, tennessee, minnesota, and arizona
        return strtoupper($first . substr($state, 3, 1));
    }
    if (startsWith($state, 'm') && ($last == 's') || ($last == 'n')) {
        return strtoupper(substr($state, 0, 2));
    }
    if (strpos($state,'o')) {
        return strtoupper($first . 'o');
    }
    if (strpos($state,'y')) {
        return strtoupper($first . 'd');
    }
    if (strpos($state,'r')) {
        return strtoupper($first . 'r');
    }
    if (strpos($state,'ss')) {
        return strtoupper($first . 's');
    }

    return $state; //otherwise return the name of the state (it was mispelled).
}

function startsWith ($state, $letters, $index = 0) { //takes a comma separated array and finds contents.
    $letters = split(',',$letters);
    for ($q = 0; $q<count($letters); $q++) {
        if (strpos($state,$letters[$q]) === $index) {
            return true;
        }
    }
    return false;
}

Certo, può essere giocato a golf. Questo è il mio primo tentativo di golf, quindi approfondimento apprezzato. (911)

function t($s){$s=u($s);$f=b($s,0,1);$l=b($s,-2,1);
if(strlen($s)<4)return $s;if(strpos($s,' '))$s=split(' ',$s);
return b($s[0],0,1).b($s[1],0,1);
if(w($s,'IO'))return $f.$l;
if(w($s,'W,I'))return b($s,0,2);
if(strlen($s)<7 && strpos($s,'M')===false)return $f.b($s,-4,1);
if(strlen($s)<7 && b($s,0,1)>'I' && b($s,0,1)<'N')return $f.$l;
if(w($s,'C,D,K,L,P,V,G,H'))return $f.$l;if(strpos($s, 'SK'))return 'AK';
if(w($s,'K,L',1))return b($s,0,2);if(w($s,'N'))return $f.b($s,2,1);
if(w($s,'N',2) || w($s,'Z',3))return $f.b($s,3,1);
if(w($s,'M') && ($l=='S') || ($l=='N'))return b($s,0,2);
if(strpos($s,'O'))return $f.'O';
if(strpos($s,'Y'))return $f.'D';if(strpos($s,'R'))return $f.'R';
if(strpos($s,'SS'))return $f.'S';return $s;}function w($s,$l,$i=0){$l=split(',',$l);
for($q=0;$q<count($l);$q++)if(strpos($s,$l[$q])===$i)return 1;return 0;}
function u($z){return strtoupper($z);}
function b($v,$x,$y){return substr($v,$x,$y);}

0

Javascript

So che questo non è il golf del codice, ma voglio comunque giocare a golf. :)

var r=new XMLHttpRequest
r.open("GET","https://gist.githubusercontent.com/mshafrir/2646763/raw/f2a89b57193e71010386a73976df92d32221d7ba/states_hash.json",0)
r.send()
var o=r.responseText,m=prompt(),a=m
o=JSON.parse(o)
for(var i in o)if(o[i].toLowerCase()==m.toLowerCase())a=i
alert(a)

Yay per cose nuove! (Stack Snippet)


3
Si tratta di una scappatoia standard e si applicano scappatoie standard senza che sia necessario menzionarle esplicitamente.
Ingo Bürk,

@ IngoBürk Non credo che questo rientri nelle scappatoie standard ... Sta ottenendo i dati richiesti da Internet allo stesso modo della lettura da un file.
Decadimento beta

2
Quindi è eval(open('a.txt'))valido anche? Se usi un file di qualsiasi tipo, devi anche includere quel file e il suo nome nel conteggio dei personaggi. (Non si tratta di code golf, quindi in questo caso in realtà non importa in questo caso.)
Maniglia della porta

@Doorknob Dato che sollevi il punto che questo non è un codice golf, non vedo perché sto ricevendo i voti negativi ... Non ho violato alcuna regola dei contro.
Decadimento beta

2
Non c'è motivo di sottovalutare, è perfettamente nello spirito della domanda - favorisce la novità e l'utilità - e il divertimento
edc65
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.