实用高尔夫-美国[已关闭]


11

我一家经营电子商务。在我们自己的网站上,我们强迫人们在输入地址时从下拉菜单中选择状态,但通过我们使用的其他一些渠道,客户可以在框中输入他们想要的任何内容。

我妈妈喜欢我为她制作的发票模板,这些模板是自动生成的。但是,因为它们是如此的漂亮和平衡,所以当人们写下州名,或更糟糕的是写“新泽西”之类的东西时,她无法忍受。她说这毁了外观。

我爸爸喜欢代码轻巧。因此,他希望使用更精简的解决方案,而不是使用开关盒模块。

因此,面临的挑战是制作一个简短的函数,该函数接受可能的输入并返回两个字母的缩写(大写,对于妈妈)。我们将做出一个(错误的)假设,即我们的用户可以拼写并始终在名称中放置一个空格(需要时)或传递正确的缩写。范围是美国的50个州。

  • 纽约
  • 纽约
  • 纽约州
  • ny

是纽约所有可接受的输入,应输出NY。

如果传入类似New Yrok之类的函数,则该函数可以返回原始值。

您可以使用任何通用语言。这是一场人气比赛,因此在一周结束时获得最高票数的比赛将获胜。我认为这将有利于新颖性和实用性。

编辑:描述是故事的绒毛,但我正在做一个类似的项目,并认为必须有一个更有趣的方法。我可以自己做这个项目(已经做过),但是我认为这是一个进行更有趣挑战的好地方。通过“任何通用语言”,我排除了为此挑战设计的自定义语言/库-我试图寻找新颖的方法,而不是免费的代码帮助。我认为每个人都在某个时候做到了这一点,但是以一种不寻常的方式来做会很有趣。我发现最有趣的项目是您以新颖有趣的方式处理日常任务的项目,这就是为什么这是一次大众竞赛而不是高尔夫。


14
我不确定为什么这是一场人气竞赛,而不是代码高尔夫(特别是因为名称包含“高尔夫球”,而您父亲则喜欢短代码)。
Geobits,2014年

5
@Claudiu True,但此网站不适合生产代码使用……
Geobits,2014年

3
@Claudiu我诚实地认为这是通常伴随这些挑战的“故事绒毛”。无论哪种方式,当我说“此站点...”时,我的意思是PP&CG,因为这里的大多数代码显然都不打算用于生产。老实说,如果他正在寻找可在自己的网站上使用的实际代码,那么自己动手或将其外包更合乎道德;)
Geobits 2014年

8
@chilemagic you can use any code...因此,OP将重写其站点以使用您的APL / CJAM / GolfScript解决方案?这是一个基于真实故事的挑战。我投了赞成票
edc65

4
这是一项非常琐碎的任务,为什么在自己编写代码会更容易的情况下,OP会全力以赴键入问题?无论哪种方式,我都喜欢尝试一下。
詹姆斯·威廉姆斯

Answers:


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

花了相当长的时间才能找出适合所有州的巧妙模式。模式的顺序很重要-每个连续的模式都适用于与先前模式不匹配的其余状态:

所有带有两个单词的州都使用两个单词的首字母:

Ñ EW ħ ampshire,Ñ EW Ĵ ersey,Ñ EW 中号 exico,Ñ EW ÿ扫,Ñ ORTH Ç arolina,Ñ ORTH d akota,- [R HODE sland,小号 OUTH Ç arolina,小号 OUTH d akota,w ^ EST V irginia

以{ CDGHKLPV}中的任何字母开头的所有州都使用名称中的第一个和最后一个字母:

Ç aliforni 一个Ç olorad ÒÇ onnecticu d elawar êģ eorgi 一个ħ AWAI ķ小号ķ entuck ÿ大号 ouisian 一个P ennsylvani 一个V irgini 一个V ermon

在其余的州中,字母{ ZVX}是唯一的:

ž ONA,Ñ ë v ADA,Ť È X

以{ FNOUW} 开头的所有其余状态均使用前两个字母。

FL orida, braska,呵呵 IO, lahoma,或者埃贡,UT啊, shington,无线 sconsin,Wy的 oming

然后,{ DNR}作为第二个字母是唯一的:

AR堪萨斯州,戴安娜,标识 AHO

制作通用图案真的越来越困难,但是...

剩下的三个州仅使用double NL,并且州名中使用double字母:

牛逼ñ essee,中号ñ esota, inois

AO双追小号是独一无二的

中号的屁股 chusetts和中号空间站Ø URI

每当{ SNW}出现之前,在剩余的状态名称,字母其他字母之后他们在缩写:

拉斯ķ一个,中号 arylan d中号 AIN ê中号小号 issippi,中号 ANA, OW 一个

还有两个。这些使用前两个字母:

ABAMA, chigan


当然可以打高尔夫球:

Ruby 2 – 191165154 字符

通过稍微改正正则表达式再减少26个字符。此外,原来的正则表达式之一原来是多余的!

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

“目前不到Golfscript参赛作品的三分之一!” :P请记住,Golfscript不使用正则表达式。
Josiah Winslow 2014年

然后我改变了尺寸。:P
乔西亚·温斯洛

1
(@JosiahWinslow,哦,让它3.9575757575 ...:P)
daniero 2014年

6
大声笑的胸部正则表达式
无法

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
不错的解决方法!
Beta Decay

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

蟒蛇

决定只是将其作为代码高尔夫球挑战。在daniero和hsl的帮助下,将其降至906 713 694个字符:

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

您可以将第s一个大字符串作为一个大字符串来保存大约200个字符,然后将其分割为逗号(,);不需要所有的单引号。
daniero 2014年

@daniero不敢相信我没有想到这一点!现在会做。
詹姆斯·威廉姆斯

您可以删除华盛顿特区,因为它不是美国州。
NinjaBearMonkey 2014年

@hsl谢谢。我从网上找到的州列表中选取了该列表,但没有意识到华盛顿特区就在其中。
詹姆斯·威廉姆斯

0

bash + sed,291个字节

将Daniero的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 2014年

抱歉,巨魔条目。我知道这不是一个真正的条目。
乔西亚·温斯洛

好吧,考虑一下我当时被
巨魔了

@daniero嘿,至少我知道在Golfscript中可能有正则表达式!实际上,这就是我这样做的唯一原因:p
Josiah Winslow 2014年

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

Java脚本

我知道这不是代码高尔夫球,但是我还是想打高尔夫球。:)

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ürk2014年

@IngoBürk我不认为这属于标准漏洞...它从互联网上获取所需数据的方式与读取文件相同。
Beta Decay

2
这样eval(open('a.txt'))也有效吗?如果使用任何类型的文件,则还必须在字符计数中包括该文件及其文件名。(这不是代码高尔夫球,所以在这种情况下实际上并不重要。)
门把手

@Doorknob既然您提出了这不是代码高尔夫的观点,所以我不明白为什么我会投票不足...我没有违反任何流行利弊规则。
Beta Decay

2
没有理由不赞成
投票
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.