실용 골프-미국 [닫기]


11

우리 가족은 전자 상거래 사업을하고 있습니다. 자체 사이트에서는 사람들이 주소를 입력 할 때 드롭 다운 메뉴에서 상태를 선택하도록 강요하지만, 다른 채널을 통해 고객은 상자에 원하는 것을 입력 할 수 있습니다.

엄마는 내가 자동으로 생성 한 청구서 템플릿을 좋아합니다. 그러나 그들은 너무 예쁘고 균형이 좋기 때문에 사람들이 자신의 국가 이름을 쓰거나 "뉴저지"와 같은 것을 쓰면 그것을 견딜 수 없습니다. 그녀는 외모를 망치고 있다고 말합니다.

아빠는 가벼운 코드를 좋아합니다. 따라서 스위치 케이스 블록을 사용하는 대신 더 적은 솔루션을 원합니다.

따라서 가능한 입력을 받아 두 글자 약어를 반환하는 짧은 기능을 만드는 것이 좋습니다 (자본의 경우 대문자). 우리는 사용자가 철자하고 항상 이름에 공백을 넣거나 (필요한 경우) 올바른 약어를 전달할 수 있다고 가정합니다. 범위는 미국 50 개 주입니다.

  • 뉴욕
  • 뉴욕
  • 뉴욕
  • 뉴욕

뉴욕에 허용되는 모든 입력이며 NY를 출력해야합니다.

New Yrok과 같은 것이 전달되면 함수는 원래 값을 반환 할 수 있습니다.

모든 공용 언어를 사용할 수 있습니다. 이것은 인기 콘테스트이므로 일주일에 가장 많은 표를 얻은 사람이 승리합니다. 나는 이것이 참신함과 유용성을 선호 할 것이라고 생각한다.

편집 : 설명은 이야기 보풀이지만 비슷한 프로젝트를 진행하고 있으며 더 재미있는 방법이 있어야한다고 생각했습니다. 나는 프로젝트를 스스로 할 수 있지만 (이미 했음) 더 흥미로운 도전에 좋은 곳이라고 생각했다. "모든 공용 언어"를 통해이 과제를 위해 설계된 사용자 지정 언어 / 라이브러리를 제외했습니다. 무료 코드 도움말이 아닌 새로운 방법을 찾고있었습니다. 모든 사람이 특정 시점에서이 작업을 수행했다고 생각하지만, 비정상적인 방법으로하는 것이 재미있을 것입니다. 가장 흥미로운 프로젝트는 새롭고 흥미로운 방식으로 일상적인 작업을 처리하는 프로젝트라는 것을 알았습니다. 이것이 골프보다는 인기 콘테스트입니다.


14
이것이 왜 코드 골프 대신 인기 콘테스트인지 확실하지 않습니다 (특히 이름에 '골프'가 있고 아빠가 짧은 코드를 선호하기 때문에).
Geobits

5
@Claudiu True, 그러나이 사이트는 프로덕션 코드를위한 것이 아닙니다.
Geobits

3
@Claudiu 나는 솔직히 이러한 도전과 관련하여 일종의 "이야기 보풀"이라고 가정했다. 어느 쪽이든, "이 사이트 ..."라고 말했을 때 PP & CG를 의미했습니다. 여기에있는 대부분의 코드는 명시 적으로 프로덕션 용이 아닙니다. 솔직히 자신의 사이트에서 사용할 실제 코드를 찾고 있다면 직접 작성하거나 계약을 체결하는 것이 더 윤리적 일 것입니다.)
Geobits

8
@chilemagic you can use any code... 그래서 OP는 APL / CJAM / GolfScript 솔루션을 사용하기 위해 자신의 사이트를 다시 작성합니까? 실제 이야기를 기반으로하는 도전입니다. 내가
투표함

4
그것은 매우 사소한 작업입니다. OP가 직접 코드를 작성하는 것이 더 쉬울 때 OP가 질문을 입력하는 모든 노력을 기울이는 이유는 무엇입니까? 어느 쪽이든, 나는 그것을 즐기는 것을 즐겼습니다.
James Williams

답변:


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 H의 ampshire, N EW J의 ersey, N EW M의 exico, N EW Y의 오크, N 노스 C arolina, N 노스 D akota, R hode I sland, S OUTH C arolina, S OUTH D akota, W EST의 V의 irginia

{ CDGHKLPV}의 문자로 시작하는 모든 주 에서는 이름의 첫 번째와 마지막 문자를 사용합니다.

C aliforni , C olorad O , C onnecticu t , D elawar E , G eorgi , H awai I , K 안사 S , K의 entuck의 Y , L ouisian , P ennsylvani , V irgini , V ermon t

나머지 상태 중에서 { ZVX} 문자 는 고유합니다.

RI 의 Z 오나, N 전자 브이 ADA, T E X 로서

{ FNOUW}로 시작하는 나머지 모든 상태 는 두 개의 첫 글자를 사용합니다.

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

그런 다음 { DNR}는 두 번째 문자로 고유합니다.

아르곤 캔자스, 에서 다이아나, 아이디 아호

일반적인 패턴을 만들기가 정말 어려워 지지만 ...

나머지 3 개의 상태 만 double N또는을 사용 L하고 이중 문자는 상태 약어에 사용됩니다.

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

A또는 O이중 S 가 고유 한 후

M 엉덩이 chusetts 및 M ISS O URI

나머지 상태 이름에서 { SNW}가 다른 문자 앞에 나타날 때마다 그 뒤에 나오는 문자 가 약어에서 사용됩니다.

라스가 k는 A, M arylan D를 , M은 아인 E , M은S issippi, Mt 아나 오우

두 개 남았습니다. 이들은 첫 두 글자를 사용합니다 :

abama, 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 항목 크기의 3 분의 1 미만입니다!" : P Golfscript는 정규식을 사용하지 않습니다.
Josiah Winslow

그리고 나는 크기를 바꿨다. : P
Josiah Winslow

1
(@JosiahWinslow and oh, make 3.9575757575 ... : P)
daniero

6
권자 가슴을 didnt 압축 생존하는 설명에서 정규식에 대한
masterX244

1
나는이 답변을 좋아하지만 유효하지 않은 입력을 발견 할 수 없으므로 유효하지 않습니다 (당신이 말했듯이). 심지어 특정 예제가있다If something like New Yrok is passed in, the function should return the original value.
edc65

4

씨#

약어에 대해 상태에 이미있는 문자를 사용하여 상태 문자열을 줄였습니다.

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

자바 스크립트 (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

@daniero 나는 그것을 생각하지 않았다 믿을 수 없어! 지금하겠습니다.
James Williams

미국이 아니기 때문에 Washington, DC를 제거 할 수 있습니다.
NinjaBearMonkey

@hsl 감사합니다. 온라인에서 찾은 주 목록에서 워싱턴 DC가 있다는 것을 몰랐습니다.
James Williams

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

미안, 트롤 입장 나는 그것이 실제 항목이 아니라는 것을 안다.
Josiah Winslow

글쎄, 그때 내가
트롤

@daniero Hey, 적어도 Golfscript에 정규식을 사용할 수 있다는 것을 알고 있습니다! 즉 실제로 내가 그 롤을했던 유일한 이유 : P
요시야 윈 슬로

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

자바 스크립트

나는 이것이 코드 골프가 아니라는 것을 알고 있지만 어쨌든 골프를 즐기고 싶다. :)

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
이것은 표준 허점이며 표준 허점은 명시 적으로 언급 할 필요없이 적용됩니다.
Ingo Bürk

@ IngoBürk 나는 이것이 표준 허점에 속한다고 생각하지 않습니다 ... 파일을 읽는 것과 같은 방식으로 인터넷에서 필요한 데이터를 얻고 있습니다.
Beta Decay

2
그래서이다 eval(open('a.txt'))유효한 또한? 모든 종류의 파일을 사용하는 경우 해당 파일과 파일 이름을 문자 수에 포함시켜야합니다. (이것은 코드 골프가 아니므로 실제로이 경우에는 실제로 중요하지 않습니다.)
Doorknob

@Doorknob 당신이 이것이 코드 골프가 아니라는 점을 높이기 때문에, 왜 내가 다운 투표를 받고 있는지 알지 못합니다 ... 나는 팝 콘 규칙을 위반하지 않았습니다.
Beta Decay

2
downvote 이유, 그것은 질문의 정신으로 완벽 없어 - 호의 참신 및 유틸리티 - 재미
edc65
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.