Golf Praktis - Amerika Serikat [ditutup]

11

Keluarga saya memiliki bisnis e-commerce. Di situs kami sendiri, kami memaksa orang untuk memilih negara mereka dari menu dropdown ketika mereka memasukkan alamat mereka, tetapi melalui beberapa saluran lain yang kami gunakan, pelanggan dapat memasukkan apa pun yang mereka inginkan ke dalam kotak.

Ibuku suka templat faktur yang kubuat untuknya, yang dibuat secara otomatis. Tetapi karena mereka sangat cantik dan seimbang, dia tidak tahan ketika orang MENULIS nama negara bagian mereka, atau lebih buruk, menulis sesuatu seperti "baju baru." Dia mengatakan itu merusak tampilan.

Ayah saya suka kode menjadi ringan. Jadi, daripada menggunakan switch-case block, dia menginginkan solusi yang lebih ramping.

Jadi tantangannya adalah membuat fungsi pendek yang mengambil input yang mungkin dan mengembalikan singkatan dua huruf (ditulis dengan huruf besar, untuk Mom). Kami akan membuat asumsi (salah) bahwa pengguna kami dapat mengeja dan selalu memberi spasi pada nama (jika diperlukan) atau memberikan singkatan yang benar. Cakupannya adalah 50 negara bagian AS.

  • New York
  • new york
  • NY
  • ny

semua input yang dapat diterima untuk New York, dan harus menampilkan NY.

Jika sesuatu seperti New Yrok diteruskan, fungsinya dapat mengembalikan nilai asli.

Anda dapat menggunakan bahasa umum apa saja. Ini adalah kontes popularitas, jadi yang memiliki suara terbanyak di akhir minggu menang. Saya berasumsi bahwa ini akan mendukung hal baru dan utilitas.

EDIT: Deskripsi adalah cerita bulu, tetapi saya sedang mengerjakan proyek serupa dan berpikir bahwa pasti ada cara yang lebih menarik untuk melakukannya. Saya dapat mengerjakan proyek sendiri (sudah melakukannya) tetapi saya pikir ini adalah tempat yang bagus untuk tantangan yang lebih menarik. Dengan "Bahasa apa pun" Saya mengecualikan bahasa khusus / perpustakaan yang dirancang untuk tantangan ini - saya mencoba mencari metode baru, daripada bantuan kode gratis. Saya pikir semua orang telah melakukan ini di beberapa titik, tetapi akan menyenangkan untuk melakukannya dengan cara yang tidak biasa. Saya menemukan bahwa proyek yang paling menarik adalah proyek di mana Anda menangani tugas sehari-hari dengan cara baru dan menarik - itulah sebabnya ini adalah kontes popularitas daripada golf.

Josiah
sumber
14
Saya tidak yakin mengapa ini adalah kontes popularitas alih-alih golf kode (terutama karena namanya termasuk 'golf' dan ayah Anda menyukai kode pendek).
Geobits
5
@Claudiu Benar, tetapi situs ini tidak dimaksudkan untuk kode produksi ...
Geobits
3
@Claudiu Jujur saya berasumsi bahwa itu adalah "cerita bulu" dari jenis yang biasanya terjadi dengan tantangan ini. Bagaimanapun, ketika saya mengatakan "situs ini ..." yang saya maksud adalah PP&CG, karena sebagian besar kode di sini secara eksplisit tidak dimaksudkan untuk digunakan dalam produksi. Jujur, jika dia mencari kode aktual untuk digunakan di situsnya, akan lebih etis untuk melakukannya sendiri atau mengontrakkannya;)
Geobits
8
@chememagic you can use any code... jadi OP akan menulis ulang situsnya untuk menggunakan solusi APL / CJAM / GolfScript Anda? Ini tantangan berdasarkan kisah nyata. Saya memilih
edc65
4
Ini adalah tugas yang cukup sepele, mengapa OP akan melakukan semua upaya mengetik pertanyaan ketika akan lebih mudah hanya dengan kode itu sendiri? Either way, saya menikmati mencobanya.
James Williams

Jawaban:

27

Rubi

Kupikir akan menarik untuk mengekstrak singkatan negara tanpa menulis nama atau singkatan apa pun secara eksplisit. Yang ini tidak mengambil salah mengeja input menjadi pertimbangan, karena kami tidak peduli tentang hal seperti itu di 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

Butuh waktu yang cukup lama untuk menemukan pola yang pintar untuk mencocokkan semua negara bagian. Urutan pola penting - setiap pola berurutan berlaku untuk status yang tersisa yang tidak cocok dengan pola sebelumnya:

Semua negara dengan dua kata di dalamnya menggunakan huruf awal dari dua kata:

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 saya sland, S elatan C arolina, S elatan D Akota, W est V irginia

Semua negara bagian yang memulai dengan huruf apa pun di { CDGHKLPV} menggunakan huruf pertama dan terakhir dalam nama:

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

Dari status yang tersisa, huruf { ZVX} unik:

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

Semua status tersisa yang diawali dengan { FNOUW} menggunakan dua huruf pertama.

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

Kemudian, { DNR} unik sebagai huruf kedua:

Ar kansas, In diana, Id aho

Sangat sulit membuat pola umum, tapi ...

Hanya tiga negara yang tersisa menggunakan double Natau L, dan double letter digunakan dalam singkatan negara:

T en n essee, M di n esota, saya l l inois

Aatau Osetelah double S adalah unik untuk

M ass a chusetts dan M iss o uri

Setiap kali { SNW} muncul di depan huruf-huruf lain dengan nama negara yang tersisa, huruf-huruf sesudahnya digunakan dalam singkatan:

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

Tinggal dua. Ini menggunakan dua huruf pertama:

Al abama, Mi chigan


Tentu saja bisa bermain golf:

Ruby 2 - 191 165 154 karakter

Lain 26 karakter off dengan memberi tanda regex sedikit. Juga, salah satu regex asli ternyata mubazir!

gets;[/.* (.)/,/^[CDGHKLPV].*(.)$/,/.*([ZVX])/,/^[NFOUW](.)/,/^.([DNR])/,/.*(L|N)\1/,
/.*SS(A|O)/,/.*?[SNW](.)/,/.(.)/].find{|r|$_.upcase=~r}
puts $&[0]+$1
daniero
sumber
"Saat ini kurang dari sepertiga ukuran entri Golfscript!" : P Perlu diingat, Golfscript tidak menggunakan Regex.
Josiah Winslow
Dan saya mengubah ukurannya. : P
Josiah Winslow
1
(@JosiahWinslow dan oh, buat itu 3,9575757575 ...: P)
daniero
6
lol untuk regex payudara dalam penjelasan yang tidak selamat dari kompresi
masterX244
1
Saya suka jawaban ini, tetapi tidak valid karena tidak dapat menemukan input yang tidak valid (seperti yang Anda katakan). Bahkan ada contoh khususIf something like New Yrok is passed in, the function should return the original value.
edc65
4

C #

Saya menggunakan karakter yang sudah ada di negara bagian untuk singkatan untuk mempersingkat string negara.

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;
            }
Brandon
sumber
1
Penanganan yang bagus!
Beta Decay
2

JavaScript (E6)

Di sini sebagian besar adalah daftar nama, menggunakan trik camelCase untuk mempersingkat sedikit. 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
edc65
sumber
0

Python

Memutuskan untuk melakukan ini sebagai tantangan kode-golf. Dapatkan hingga 906 713 694 karakter dengan bantuan daniero dan 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)

Namun, jika modul diizinkan (seperti modul us ), saya bisa mendapatkannya hingga 130 karakter:

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

Dan jika Anda tidak harus mengembalikan nilai asli ketika negara tidak ada, saya bisa menurunkannya menjadi 50 karakter:

import us
print us.states.lookup(raw_input()).abbr
James Williams
sumber
Anda dapat menyimpan sekitar 200 karakter pada karakter pertama dengan membiarkan smenjadi satu string besar, lalu membaginya menjadi koma ( ,); Tidak perlu untuk semua tanda kutip tunggal.
daniero
@daniero Tidak percaya saya tidak memikirkan itu! Akan lakukan sekarang.
James Williams
Anda dapat menghapus Washington, DC, karena itu bukan negara bagian AS.
NinjaBearMonkey
@ hsl Terima kasih. Saya mengambil daftar dari daftar negara bagian yang saya temukan online, tidak menyadari Washington DC ada di sana.
James Williams
0

bash + sed, 291 byte

Konversi memalukan dari solusi Ruby Daniero ke 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/"
Glenn Randers-Pehrson
sumber
0

Golfscript - 750 653

Sebagian besar dalam nama negara bagian dan singkatan.

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

Penjelasan:

{        }%                         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
Josiah Winslow
sumber
Maaf, tapi saya tidak melihat gunanya mengambil seluruh skrip saya dan menambahkan apa-apa selain beberapa byte boilerplate; Itu tidak membawa apa-apa. Tapi terima kasih untuk kreditnya kurasa ... Hormat, "orang lain".
daniero
Maaf, masuk troll. Saya tahu itu bukan entri nyata.
Josiah Winslow
Nah, anggap saja aku
dikendalikan
@daniero Hei, setidaknya saya tahu itu mungkin untuk memiliki regex di Golfscript! Itu sebenarnya satu-satunya alasan saya melakukan itu lol: p
Josiah Winslow
0

PHP

Upaya saya, yang tidak sesukses yang saya harapkan, menggunakan panjang string dan beberapa penempatan karakter khusus untuk mengekstrak singkatan dari nama negara. Mungkin beberapa urutan penghapusan nama yang lebih baik adalah mungkin.

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

Tentu saja, bisa bermain golf. Ini adalah upaya golf pertama saya, jadi wawasan sangat dihargai. (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);}
Josiah
sumber
0

Javascript

Saya tahu ini bukan kode golf, tapi saya tetap ingin 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 untuk hal-hal baru! (Potongan Stack)

Peluruhan Beta
sumber
3
Ini adalah celah standar dan celah standar berlaku tanpa harus disebutkan secara eksplisit.
Ingo Bürk
@ IngoBürk Saya tidak percaya ini berada di bawah celah standar ... Ini mendapatkan data yang diperlukan dari internet dengan cara yang sama seperti membaca fron file.
Beta Decay
2
Jadi eval(open('a.txt'))juga valid? Jika Anda menggunakan file apa pun, Anda juga harus memasukkan file itu dan nama file-nya dalam jumlah karakter Anda. (Ini bukan kode golf, jadi sebenarnya tidak terlalu penting dalam kasus ini.)
Gagang Pintu
@ Doorknob Karena Anda menyampaikan maksudnya bahwa ini bukan kode golf, saya tidak melihat mengapa saya mendapatkan downvotes ... Saya belum melanggar aturan apa pun dari kontra pop.
Beta Decay
2
Tidak ada alasan untuk mengalah, itu sempurna dalam semangat pertanyaan - mendukung hal baru dan utilitas - dan menyenangkan
edc65