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


11

У моей семьи есть бизнес электронной коммерции. На нашем собственном сайте мы заставляем людей выбирать свое состояние из выпадающего меню, когда они вводят свой адрес, но через некоторые другие каналы, которые мы используем, клиенты могут вводить все, что они хотят, в поле.

Моя мама любит шаблоны счетов-фактур, которые я сделал для нее, которые генерируются автоматически. Но поскольку они такие красивые и уравновешенные, она не может этого вынести, когда люди ПИШУТ названия своих штатов или, что еще хуже, пишут что-то вроде «новой майки». Она говорит, что это портит внешний вид.

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

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

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

все приемлемые входные данные для Нью-Йорка, и должны выводить NY.

Если передается что-то вроде New Yrok, функция может вернуть исходное значение.

Вы можете использовать любой общий язык. Это конкурс популярности, поэтому побеждает тот, кто набрал наибольшее количество голосов в конце недели. Я предполагаю, что это будет способствовать новизне и полезности.

РЕДАКТИРОВАТЬ: описание является история пух, но я работал над аналогичным проектом и подумал, что должен быть более интересный способ сделать это. Я могу сделать проект сам (уже сделал), но я подумал, что это хорошее место для более интересной задачи. Под «любым общим языком» я исключал пользовательские языки / библиотеки, разработанные для этой задачи - я пытался искать новые методы, а не бесплатную помощь кода. Я полагаю, что все сделали это в какой-то момент, но было бы интересно сделать это необычным способом. Я считаю, что наиболее интересные проекты - это те, в которых вы решаете повседневные задачи новыми и интересными способами - вот почему это соревнование популярности, а не гольф.


14
Я не уверен, почему это состязание в популярности, а не в гольф-коде (тем более что название включает в себя «гольф», а ваш папа предпочитает короткий код).
Geobits

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

3
@Claudiu Я, честно говоря, предположил, что это был "исторический пух", который обычно связан с этими проблемами. В любом случае, когда я сказал «этот сайт ...», я имел в виду PP & CG, так как большая часть кода здесь явно не предназначена для использования в производстве. Честно говоря, если он ищет реальный код для использования на своем сайте, было бы более этичным сделать это сам или заключить контракт;)
Geobits

8
@chilemagic you can use any code... поэтому OP перепишет свой сайт, чтобы использовать ваше решение APL / CJAM / GolfScript? Это вызов, основанный на реальной истории. Я голосую
edc65

4
Это довольно тривиальная задача. Зачем OP предпринимать все усилия, чтобы набрать вопрос, если было бы проще просто написать его самому? В любом случае, я с удовольствием попробовал.
Джеймс Уильямс

Ответы:


27

Рубин

Я подумал, что было бы интересно извлечь сокращения штата без явного написания каких-либо имен или сокращений. Этот не принимает во внимание неправильное написание ввода, потому что нас это не заботит здесь, на codegolf.SE, не так ли ?

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}, используют первую и последнюю букву в имени:

С aliforni , С olorad о , C onnecticu т , Д elawar е , G eorgi , Н awai я , К ансу ы , К entuck у , л ouisian , Р ennsylvani , V irgini , V ermon т

Из остальных состояний буквы { ZVX} уникальны:

Ри г оны, Н е V Ada, Т е х , как

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

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

Тогда { DNR} уникальны как вторые буквы:

Ар Канзас, В Диане, Ид Ахо

На самом деле становится сложно создавать общие шаблоны, но ...

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

Т а н essee, М в п esota, я л л inois

Aили Oпосле двойного S является уникальным для

M задница а chusetts и М ISS о URI

Всякий раз, когда { SNW} появляются перед другими буквами в оставшихся именах состояний, буквы после них используются в сокращениях:

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

Два осталось. Они используют две первые буквы:

Аль Абама, Ми Чиган


Конечно, можно играть в гольф:

Рубин 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 не использует регулярные выражения.
Джозия Уинслоу

И я изменил размер. : P
Джозия Уинслоу

1
(@JosiahWinslow и ой, сделайте это 3.9575757575 ...: P)
Даниеро

6
LOL для регулярных выражений сиськи в объяснении, что не пережил сжатие
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 символов с помощью Даниеро и 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 Не могу поверить, что я не думал об этом! Сделаю сейчас.
Джеймс Уильямс

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

@hsl Спасибо. Я взял этот список из списка штатов, которые нашел в Интернете, но не знал, что там находится Вашингтон.
Джеймс Уильямс

0

bash + sed, 291 байт

Бесстыдное преобразование решения Даниеро в Ruby в 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

Основная часть находится в названиях и сокращениях штатов.

{.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 возможно иметь регулярные выражения! На самом деле, это единственная причина, по которой я сделал это, лол: р
Джозия Уинслоу

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)

Yay для новых вещей! (Стек фрагментов)


3
Это стандартная лазейка, и стандартные лазейки применяются без необходимости явного упоминания.
Инго Бюрк

@ IngoBürk Я не верю, что это подпадает под стандартные лазейки ... Он получает необходимые данные из Интернета так же, как читает файл.
бета-распад

2
Так что eval(open('a.txt'))же действительно? Если вы используете какой-либо файл, вы также должны включить этот файл и его имя в число символов. (Это не кодовый гольф, поэтому в любом случае это на самом деле не имеет значения.)
Дверная ручка

@ Doorknob Так как вы подняли вопрос, что это не кодовый гольф, я не понимаю, почему я получаю отрицательные отзывы ... Я не нарушал никаких правил поп-минусов.
бета-распад

2
Нет причин для отрицания, это совершенно в духе вопроса
одобрить
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.