実用的なゴルフ-米国[終了]


11

私の家族は電子商取引を営んでいます。私たちのサイトでは、住所を入力するときにドロップダウンメニューから状態を選択するように人々に強制しますが、私たちが使用する他のチャネルを通じて、顧客はボックスに好きなものを入力できます。

お母さんは、自動で生成される請求書テンプレートを気に入っています。しかし、彼らはとてもきれいでバランスが取れているので、人々が州の名前を書き上げたり、さらに悪いことに「ニュージャージー」のようなものを書いたりするとき、彼女は我慢できません。彼女はそれが外観を台無しにするという。

父はコードが軽量であることを好みます。そのため、スイッチケースブロックを使用するのではなく、よりスリムなソリューションを求めています。

そのため、課題は、可能な入力を取り、2文字の略語を返す短い関数を作成することです(ママの場合は大文字)。ユーザーが名前にスペルを入れて常にスペースを入れる(必要な場合)か、正しい省略形を渡すことができるという(誤った)仮定を行います。スコープは米国50州です。

  • ニューヨーク
  • ニューヨーク
  • NY
  • ny

ニューヨークの入力はすべて受け入れ可能で、NYを出力する必要があります。

New Yrokのようなものが渡されると、関数は元の値を返すことができます。

任意の共通言語を使用できます。これは人気コンテストなので、1週間の終わりに最も投票数の多いものが勝ちます。私はこれが目新しさと実用性を支持すると思います。

編集:説明は物語の綿毛ですが、私は同様のプロジェクトで働いていたので、もっと面白い方法が必要だと思いました。私は自分でプロジェクトを実行できます(すでに実行しました)が、これはより興味深い挑戦のための良い場所だと思いました。「すべての共通言語」では、この課題のために設計されたカスタム言語/ライブラリを除外していました。無料のコードヘルプではなく、新しい方法を探していました。ある時点で誰もがこれを行ったと思いますが、異常な方法でそれを行うのは楽しいでしょう。最も興味深いプロジェクトは、毎日のタスクに新しく興味深い方法で取り組むプロジェクトだと思います。だから、これはゴルフではなく人気コンテストです。


14
これがコードゴルフではなく人気コンテストである理由はわかりません(特に名前に「ゴルフ」が含まれていて、お父さんが短いコードを好むため)。
ジオビット14年

5
@Claudiu本当ですが、このサイトは量産コード向けではありません...
Geobits 14年

3
@Claudiuそれは、これらの課題に通常伴う「物語の毛羽立ち」であると正直に思いました。私は、「このサイトは...」と言ったときにされ、ここでほとんどのコードとしていずれにせよ、私は、PP&CGを意味し、明示的に生産に使用するためのものではありません。正直なところ、もし彼が自分のサイトで使用する実際のコードを探しているなら、それを自分でやるか、あるいは契約を
外す

8
@chilemagic you can use any code... OPは、APL / CJAM / GolfScriptソリューションを使用するためにサイトを書き換えますか?実話に基づいた挑戦です。私は投票
edc65

4
それは非常に簡単な作業です。自分でコーディングする方が簡単なのに、なぜOPは質問を入力するために全力を尽くすのでしょうか。いずれにせよ、私はそれを試して楽しんだ。
ジェームズウィリアムズ14年

回答:


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

すべての状態に一致する巧妙なパターンを見つけるにはかなりの時間がかかりました。パターンの順序は重要です。各連続パターンは、前のパターンと一致しなかった残りの状態に適用されます。

2つの単語を含むすべての州は、2つの単語の最初の文字を使用します。

N EW Hの ampshire、N EW Jの ersey、N EW Mの exico、N EW Yの ORK、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 AC olorad OC onnecticu TD elawar EG eorgi AH粟井IKアンサSKの entuckのYL ouisian AP ennsylvani AV irgini 、V ermon T

残りの状態のうち、文字{ ZVX}は一意です。

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

{ FNOUW}で始まる残りの状態はすべて、最初の2文字を使用します。

FL orida、Neの braska、ああ IO、[OK]を lahoma、またはエゴン、ユタああ、 shington、のWiの sconsin、ワイオミング oming

次に、{ DNR}は2番目の文字として一意です。

Arカンザス、In diana、Id aho

一般的なパターンを作るのは本当に難しくなっていますが、...

残りの3つの状態のみがdouble NまたはをL使用し、状態の略語では二重文字が使用されます。

T EN N essee、Mにおけるn個の esota、I L L inois

AまたはOダブルS

M ass a chusetts and M iss o uri

たび{ SNW}現れる前に、手紙の残りの州名で他の文字にそれらの後には略語で使用されています。

A LASはkはM arylan DM AIN EはMはあるS issippi、M上のT ANA、I OW A

2つ残った。これらは最初の2文字を使用します。

アル・アバマ、ミ・チガン


もちろんゴルフができます:

Ruby 2 – 191 165 154文字

正規表現を少しuして、さらに26文字オフにします。また、元の正規表現の1つが冗長であることが判明しました。

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

「現在、Golfscriptエントリのサイズの3分の1未満です!」:P Golfscriptは正規表現を使用しないことに注意してください。
ジョサイアWinslow 14年

そして、サイズを変更しました。:P
ジョサイアウィンズロー14年

1
:(P @JosiahWinslowとああ、メイク3.9575757575 ...その)
daniero

6
笑おっぱいの圧縮を生き残るdidntの説明でregexで
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
いい回避策!
ベータ崩壊14年

2

JavaScript(E6)

ここでの大部分は、キャメルケーストリックを使用して少し短くした名前のリストです。ゴルフ、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

Python

コードゴルフのチャレンジとしてこれを行うことにしました。下にそれを手に入れた906の 713 danieroとHSLの助けを借りて、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文字を保存して、1 つの大きな文字列にしてからコンマ(,)で分割できます。すべての単一引用符は必要ありません。
daniero 14年

@daniero私はそれを考えていなかったと信じられない!今やろう。
ジェームズウィリアムズ14年

ワシントンDCは米国の州ではないため、削除できます。
NinjaBearMonkey

@hslありがとう。私はオンラインで見つけた州のリストからリストを取りましたが、ワシントンDCがそこにあることに気づきませんでした。
ジェームズウィリアムズ14年

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 14年

申し訳ありませんが、エントリをトロールします。私はそれが本当のエントリーではないことを知っています。
ジョサイアWinslow 14年

さて、それでは私がトロールされたと考えてください;)
daniero 14年

@danieroやあ、少なくとも私は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

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
これは標準の抜け穴であり、標準の抜け穴は明示的に言及することなく適用されます。
インゴバーク14年

@IngoBürkこれが標準の抜け穴に該当するとは思わない...ファイルを読むのと同じ方法でインターネットから必要なデータを取得している。
ベータ崩壊14年

2
それでeval(open('a.txt'))有効ですか?任意の種類のファイルを使用する場合は、文字カウントにそのファイルとそのファイル名も含める必要があります。(これはコードゴルフではないので、この場合は実際には問題になりません。)
ドアノブ

@Doorknobこれはコードゴルフではないという点を挙げているので、なぜ私がダウンボットを獲得しているのかわかりません...ポップコンのルールに違反していません。
ベータ崩壊14年

2
賛成の新規性と有用性- -と楽しいdownvoteする理由は、それは質問の精神で完全ません
edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.