Практичний гольф - США [закрито]


11

У моїй родині є електронна комерція. На нашому власному веб-сайті ми змушуємо людей вибирати свій стан із спадного меню, коли вони вводять свою адресу, але через деякі інші канали, якими ми користуємося, клієнти можуть вводити все поле у ​​вікно.

Моя мама любить шаблони рахунків-фактур, які я зробив для неї, які генеруються автоматично. Але оскільки вони такі гарні і врівноважені, вона не витримує, коли люди ПІСНЯЮТЬ назви своїх штатів, або, що ще гірше, пишуть щось на кшталт "нової майки". Каже, це руйнує вигляд.

Мій тато любить, щоб код був легким. Тому замість того, щоб використовувати блок комутатора, він хоче більш швидкого рішення.

Отже, завдання полягає в тому, щоб зробити коротку функцію, яка бере можливі введення та повертає двома літерами абревіатуру (з великої літери для мами). Ми будемо робити (несправне) припущення, що наші користувачі можуть писати написання та завжди проставляти пробіл у назві (де потрібно) або пропускати правильну абревіатуру. Сфера дії - 50 штатів США.

  • Нью-Йорк
  • Нью-Йорк
  • NY
  • ny

всі прийнятні вхідні дані для Нью-Йорка, і вони повинні виводити Нью-Йорк.

Якщо передано щось на зразок New Yrok, функція може повернути початкове значення.

Ви можете використовувати будь-яку загальну мову. Це конкурс на популярність, тому той, хто отримав найбільше голосів наприкінці тижня, виграє. Я припускаю, що це сприятиме новизні та корисності.

EDIT: Опис - це історія, але я працював над подібним проектом і вважав, що для цього повинен бути цікавіший спосіб. Я можу зробити проект сам (вже зробив), але я подумав, що це гарне місце для більш цікавого завдання. За допомогою "Будь-якої загальної мови" я виключав власні мови / бібліотеки, розроблені для цього завдання - я намагався шукати нові методи, а не безкоштовну допомогу в коді. Я вважаю, що кожен це зробив у якийсь момент, але було б весело робити це незвично. Я вважаю, що найцікавіші проекти - це ті, де ти вирішуєш повсякденні завдання новими та цікавими способами - саме тому це конкуренція популярності, а не гольф.


14
Я не впевнений, чому це конкурс на популярність замість коду для гольфу (тим більше, що назва містить «гольф», а ваш тато надає перевагу короткому коду).
Геобіць

5
@Claudiu Правда, але цей сайт не призначений для виробничого коду ...
Geobits

3
@Claudiu Я чесно припустив, що це "історія", яка зазвичай відповідає цим викликам. Так чи інакше, коли я сказав "цей сайт ...", я мав на увазі PP&CG, оскільки більшість кодів явно не призначені для використання у виробництві. Чесно кажучи, якщо він шукає фактичний код для використання на своєму сайті, було б
етичніше

8
@chilemagic you can use any code... тож ОП перепише свій сайт для використання вашого рішення APL / CJAM / GolfScript? Це виклик, заснований на справжній історії. Я голосую
edc65

4
Це досить тривіальне завдання, чому б ОП доклав усіх зусиль, щоб набрати питання, коли було б простіше просто кодувати його сам? У будь-якому випадку, мені сподобалося, що я йду.
Джеймс Вільямс

Відповіді:


27

Рубін

Думав, що було б цікавим витягнути абревіатури штату, не пишучи явно жодне з назв чи скорочень. Це один не приймає неправильне написання входу в розгляд, тому що ми не дбаємо про такі речі тут на 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

Знадобилося значний час, щоб з'ясувати розумні зразки, щоб відповідати всім штатам. Порядок шаблонів важливий - кожен наступний зразок застосовується до решти станів, які не відповідали попередньому шаблону:

Усі стани з двома словами в них використовують початкові літери двох слів:

N EW Н ampshire, N EW J ersey, N EW М exico, N EW Y орк, N Orth З arolina, N Orth D Akota, R hode я sland, S outh З arolina, S outh D Akota, Ш Поточна В irginia

Усі штати, що починаються з будь-якої літери в { CDGHKLPV}, використовують першу та останню букви в імені:

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

З решти станів літери { ZVX} унікальні:

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

Усі залишки, що починаються з { FNOUW}, використовують дві перші літери.

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

Тоді { DNR} є унікальними як другі літери:

Ar kansas, In diana, Id aho

Складати загальні зразки дуже важко, але ...

Лише три стани, що залишилися, використовують подвійний Nабо L, а подвійний лист використовується в абревіатурі:

T en n essee, M in n esota, I l l inois

Aабо Oпісля подвійного S є унікальним для

M дупа а chusetts і М ISS про URI

Щоразу, коли { SNW} з'являються перед іншими літерами в решті назв держав, літери після них вживаються у скороченнях:

Лас - K а, М Arylan д , М айн е , М є з issippi, М на т ана, я вл

Два зліва. Вони використовують дві перші літери:

Al Abama, Mi chigan


Це, звичайно, можна в гольф:

Рубін 2 - 191 165 154 символів

Ще 26 символів вимкнено, трохи зменшивши регулярні вирази. Також один із оригінальних регексів виявився зайвим!

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

"Наразі менше третини розміру записи Golfscript!" : P Майте на увазі, Golfscript не використовує Regexes.
Джосія Уінслоу

І я змінив розмір. : P
Джосія Уінслоу

1
(@JosiahWinslow та о, зробіть це 3.9575757575 ...: P)
daniero

6
LOL для сиськи rhex в поясненні, що не пережив стиснення
masterX244

1
Мені подобається ця відповідь, але вона не вірна, оскільки не може визначити недійсний вхід (як ви говорите). Є навіть конкретний прикладIf something like New Yrok is passed in, the function should return the original value.
edc65

4

C #

Я використовував символи, які вже знаходяться в станах, для скорочень, щоб скоротити рядок стану.

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
Приємного подолання!
бета-розпад

2

JavaScript (E6)

Тут основна частина - це список імен, використовуючи трюк camelCase, щоб трохи скоротити. Гольф, 617 байт.

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

Пітон

Вирішили просто зробити це як завдання з гольф-кодом. Знизили його до 906 713 694 символів за допомогою daniero та 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)

Однак, якщо дозволені модулі (наприклад , модуль us ), я можу скоротити її до 130 символів:

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

І якщо вам не довелося повертати початкове значення, коли стан не існує, я міг би його знизити до 50 символів:

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

Ви можете зберегти приблизно 200 символів на першому, розмістивши sодин великий рядок, а потім розділити його на коми ( ,); Немає необхідності в усіх одноцитатах.
daniero

@daniero Не можу повірити, що я про це не думав! Зробимо зараз.
Джеймс Вільямс

Ви можете видалити Вашингтон, округ Колумбія, оскільки це не штат США.
NinjaBearMonkey

@hsl Дякую Я взяв цей список зі списку штатів, які я знайшов в Інтернеті, не зрозумів, що Вашингтон там є.
Джеймс Вільямс

0

bash + sed, 291 байт

Безсоромне перетворення розчину Ruby Daniero в 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

Гольфскрипт - 750 653

Основна частина - у державних назвах та абревіатурах.

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

Пояснення:

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

Вибачте, але я просто не бачу сенсу брати весь сценарій і нічого не додавати, окрім кількох байтів котла; Він просто нічого не приносить. Але, дякую за кредити, я здогадуюсь ... З повагою, "інший хлопець".
daniero

Вибачте, запис тролів. Я знаю, що це не справжній запис.
Джосія Уінслоу

Ну, вважайте, я тоді
пропрацював

@daniero Ей, принаймні, я знаю, що в Golfscript можна мати регулярні виразки! Це насправді єдина причина, що я зробив це lol: p
Josiah Winslow

0

PHP

Моя спроба, яка виявилася не такою успішною, як я сподівався, використовує довжину рядка та певне розміщення символів для вилучення абревіатури з назви держави. Можливо, можливе краще впорядкування усунення імен.

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

Звичайно, це може бути гольф. Це моя перша спроба в гольф, так що розуміння було оцінено. (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

Я знаю, що це не код гольфу, але я все одно хочу гольфувати його. :)

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)

Так, для нових речей! (Стек фрагменти)


3
Це стандартна лазівка, і стандартні лазівки застосовуються без явного згадування.
Інго Бюрк

@ IngoBürk Я не вірю, що це підпадає під стандартні лазівки ... Це отримання необхідних даних з Інтернету так само, як і читання файлів із фронту.
Бета-розпад

2
Так чи eval(open('a.txt'))дійсно? Якщо ви використовуєте файл будь-якого типу, ви також повинні включити цей файл та його ім'я до числа символів. (Це не код гольфу, тому насправді в цьому випадку це насправді не має значення.)
Doorknob

@Doorknob Оскільки ви підкреслюєте, що це не код гольфу, я не бачу, чому я отримую скоромовки ... Я не порушив жодних правил поп-мінусів.
Бета-розпад

2
Немає підстав для того, щоб заперечувати, це ідеально в дусі питання - підтримуйте новизну та корисність - і забаву
edc65
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.