Pratik Golf - ABD Eyaletleri [kapalı]


11

Ailemin bir e-ticaret işi var. Kendi sitemizde, adreslerini girdiklerinde insanları açılır menüden durumlarını seçmeye zorlarız, ancak kullandığımız bazı diğer kanallar aracılığıyla müşteriler kutuya istedikleri her şeyi girebilir.

Annem, kendisi için yaptığım ve otomatik olarak oluşturulan fatura şablonlarını seviyor. Ama çok güzel ve dengeli oldukları için insanlar eyaletlerinin adlarını YAZDIRIRKEN ya da daha kötüsü "yeni mayo" gibi bir şey yazdığında buna dayanamaz. Görünüşü bozduğunu söylüyor.

Babam kodun hafif olmasını sever. Bu yüzden anahtar kutusu bloğu kullanmak yerine daha yalın bir çözüm istiyor.

Bu yüzden zorluk, olası girdileri alan ve iki harfli bir kısaltma (Annem için büyük harfle yazılmış) döndüren kısa bir işlev yapmaktır. Kullanıcılarımızın heceleyebileceği ve her zaman adında bir boşluk bırakabileceği (gerektiğinde) veya doğru kısaltmayı geçebileceği (hatalı) bir varsayım yapacağız. Kapsam 50 ABD eyaletidir.

  • New York
  • New York
  • NY
  • ny

hepsi New York için kabul edilebilir girdilerdir ve NY çıktısı almalıdır.

New Yrok gibi bir şey iletilirse, işlev orijinal değeri döndürebilir.

Herhangi bir ortak dili kullanabilirsiniz. Bu bir popülerlik yarışmasıdır, bu nedenle bir hafta sonunda en çok oy alan yarış kazanır. Bunun yenilik ve faydaya yardımcı olacağını varsayıyorum.

EDIT: Açıklama hikaye kabartmak, ama benzer bir proje üzerinde çalışıyordum ve bunu yapmak için daha ilginç bir yol olması gerektiğini düşündüm. Projeyi kendim yapabilirim (zaten yaptım) ama bunun daha ilginç bir meydan okuma için iyi bir yer olduğunu düşündüm. "Herhangi bir ortak dil" ile bu meydan okuma için tasarlanmış özel diller / kütüphaneler hariç - özgür kod yardım yerine, yeni yöntemler aramaya çalışıyordum. Herkesin bunu bir noktada yaptığını düşünüyorum, ama alışılmadık bir şekilde yapmak eğlenceli olurdu. En ilginç projelerin günlük görevleri yeni ve ilginç yollarla ele aldığınız projeler olduğunu düşünüyorum - bu yüzden golf yerine popülerlik yarışması.


14
Neden bu kod golf yerine bir popülerlik yarışması olduğundan emin değilim (özellikle adı 'golf' içerdiği ve babanız kısa kodu tercih ettiği için).
Geobits

5
@Claudiu Doğru, ancak bu site üretim kodu için tasarlanmamıştır ...
Geobits

3
@Claudiu Dürüst olmak gerekirse bunun genellikle bu zorluklarla başa çıkacak türden bir "hikaye havası" olduğunu varsaydım. Her iki durumda da, "bu site ..." dediğimde PP&CG'yi kastettim, çünkü buradaki kodların çoğu açıkça üretimde kullanılmak için tasarlanmamıştır. Dürüst olmak gerekirse, kendi sitesinde kullanmak için gerçek kodu arıyorsa, bunu yapmak veya sözleşme yapmak daha etik olacaktır;)
Geobits

8
@chilemagic you can use any code... OP, APL / CJAM / GolfScript çözümünüzü kullanmak için sitesini yeniden yazacak mı? Gerçek bir hikayeye dayanan bir meydan okuma. Oy verdim
edc65

4
Oldukça önemsiz bir görev, OP neden sadece kendi kodunu yazmanın daha kolay olacağı bir soru yazmanın tüm çabalarına gider? Her iki durumda da, ben bir gitmek vermek zevk.
James Williams

Yanıtlar:


27

Yakut

Herhangi bir isim veya kısaltmayı açıkça yazmadan devlet kısaltmalarını çıkarmanın ilginç olacağını düşündüm. Biz codegolf.SE burada böyle bir şey umurumda değil, çünkü bu bir, dikkate girişin yanlış yazılmış almaz 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

Tüm devletlerle eşleşmek için akıllı kalıplar bulmak oldukça zaman aldı. Paternlerin sırası önemlidir - her ardışık patern, önceki bir paternle eşleşmeyen kalan durumlar için geçerlidir:

İçinde iki kelimesi olan tüm durumlar iki sözcüğün ilk harflerini kullanır:

N ew H ampshire, N ew J Ersey, N ew M exico, N ew Y, ğ, N ort arolina, N ort D akota, R Hode I sland, S outh arolina, S outh D akota, B est V irginia

{ CDGHKLPV} İçindeki herhangi bir harfle başlayan tüm eyaletler, addaki ilk ve son harfleri kullanır:

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

Kalan durumlardan { ZVX} harfleri benzersizdir:

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

{ FNOUW} İle başlayan kalan tüm durumlar ilk iki harfi kullanır.

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

Ardından, { DNR} ikinci harfler olarak benzersizdir:

Ar kansas, In diana, Id aho

Genel kalıplar yapmak gerçekten zor oluyor, ama ...

Geriye kalan üç durum çift Nveya Lçift ​​harf kullanır ve durum kısaltmasında çift harf kullanılır:

T en n essee, M es içinde n esota, I l l inois

Aveya Oçift sonra S özgüdür

M göt bir chusetts ve M iss o uri

{ SNW} Kalan durum adlarında diğer harflerden önce { } göründüğünde , bunlardan sonraki harfler kısaltmalarda kullanılır:

Bir las k bir, E Arylan d , E ain E , E bir s issippi, E ile t Ana, I ow bir

İki sol. Bunlar ilk iki harfi kullanır:

Al abama, Mi chigan


Tabii ki golf edilebilir:

Ruby 2 - 191 165 154 karakter

Bir başka 26 karakter daha biraz regex çirkin. Ayrıca, orijinal düzenli ifadelerden birinin gereksiz olduğu ortaya çıktı!

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

"Şu anda Golfscript giriş boyutunun üçte birinden daha az!" : P Unutmayın, Golfscript Regexes kullanmaz.
Josiah Winslow

Ve boyutunu değiştirdim. : P
Josiah Winslow

1
(@JosiahWinslow ve oh, 3.9575757575 ...: P) yapın
daniero

6
lol sıkıştırma
sıkışamadı

1
Bu yanıtı beğendim, ancak geçersiz girişi göremediğiniz için geçerli değil (dediğin gibi). Hatta belirli bir örnek varIf something like New Yrok is passed in, the function should return the original value.
edc65

4

C #

Durum dizesini kısaltmak için kısaltmalar için halihazırda eyaletlerde karakterler kullandım.

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
Güzel bir çözüm!
Beta Çürümesi

2

JavaScript (E6)

Burada toplu isimler listesi, biraz kısaltmak için camelCase hile kullanarak . Golf, 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

piton

Sadece bunu bir kod-golf meydan okuma olarak yapmaya karar verdi. Aşağı için Anladım 906 713 daniero ve HSL yardımıyla 694 chars:

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)

Ancak, modüllere izin verilirse ( us modülü gibi ), 130 karaktere düşürebilirim:

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

Ve eğer devlet mevcut olmadığında orijinal değeri geri döndürmek zorunda kalmazsanız, 50 karaktere düşebilirim:

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

sBüyük bir dize olmasına izin vererek kabaca 200 karakter kaydedebilir , ardından virgül ( ,) üzerine bölebilirsiniz ; Tüm tek tırnaklara gerek yok.
daniero

@daniero Bunu düşünmediğime inanamıyorum! Şimdi yapacağım.
James Williams

ABD eyaleti olmadığı için Washington, DC'yi kaldırabilirsiniz.
NinjaBearMonkey

@hsl Teşekkürler. Listeyi çevrimiçi bulduğum ülkeler listesinden aldım, Washington DC'nin orada olduğunu fark etmedim.
James Williams

0

bash + sed, 291 bayt

Daniero'nun Ruby çözümünün utanmaz dönüşümü 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

Toplu durum adları ve kısaltmalarıdır.

{.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

Açıklama:

{        }%                         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

Üzgünüm, ama tüm betiğimi alıp birkaç bayt kaynatıcıdan başka bir şey eklememe noktasını görmüyorum; Sadece hiçbir şey getirmez. Ama sanýrým krediler için teţekkürler ... Sevgiler, "öteki adam".
daniero

Üzgünüm, troll girişi. Bunun gerçek bir giriş olmadığını biliyorum.
Josiah Winslow

Peki, beni
trolled

@daniero Hey, en azından Golfscript'te normal ifadelere sahip olmanın mümkün olduğunu biliyorum! Aslında bunu yapmamın tek nedeni: p
Josiah Winslow

0

PHP

Umduğum kadar başarılı olmayan denemem, eyalet adından kısaltmayı ayıklamak için dize uzunluğunu ve belirli karakter yerleşimini kullanır. Muhtemelen isim tasfiyesinin daha iyi bir sekanslanması mümkündür.

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;
}

Tabii ki, golf edilebilir. Bu benim ilk golf girişimi, bu yüzden anlayış takdir. (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

Bu kod golf değil biliyorum, ama yine de golf istiyorum. :)

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)

Yeni şeyler için yay! (Yığın Parçacıkları)


3
Bu standart bir boşluktur ve standart boşluklar açıkça belirtilmeksizin uygulanır.
Ingo Bürk

@ IngoBürk Bunun standart boşlukların altına düştüğüne inanmıyorum ... İnternetten gerekli verileri fron dosyasını okumakla aynı şekilde alıyor.
Beta Çürümesi

2
Peki eval(open('a.txt'))de geçerli mi? Herhangi bir dosya kullanıyorsanız, karakter sayınıza bu dosyayı ve dosya adını da eklemeniz gerekir. (Bu kod golf değil, bu yüzden zaten bu durumda gerçekten önemli değil.)
Kapı tokmağı

@Doorknob Bu kod golf değil noktası yükseltmek beri, neden aşağı oy alıyorum anlamıyorum ... pop eksilerini herhangi bir kural ihlal etmedi.
Beta Çürümesi

2
Aşağı indirmek için bir neden yok, bu sorunun ruhunda mükemmel - yenilik ve fayda lehine - ve eğlence
edc65
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.