その米国の州を略してください!


50

50人の米国の1つの所与の状態名を左の入力、出力としての二文字に郵便番号、右に示すように:

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

ルール

  • 入力と出力はどちらも大文字と小文字が区別されます。あなたの多くは、例えばのAlために出力しませんAlabama
  • 入力は、上記の50の州名の1つであると想定できます。
  • インターネットにアクセスしたり、組み込みの状態データを使用したりすることはできません(あなたを見て、Mathematica)。

このスニペットには、入力と出力の個別のリストがあります(実行しないでください。投稿を圧縮するためだけです)。

(スコアなし)District of Columbia入力およびプロデュースとして取り込める場合、ブラウニーポイントDC、バージン諸島など

得点

これはであるため、各言語のバイト単位最短コードが優先されます

(もともとETHProductionsによって提案された)


11
Mathematicaのアプローチを知りたい人のために:Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
DavidC

12
トピック外として閉じられている@BetaDecay質問は、有用なデュープターゲットではありません。
メゴ

7
あなたが保存することができ@DavidC 20バイト:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&:)
ngenisis

2
米国の郵便略称の完全な公式リストに他の12の2文字コードを含めるための追加クレジットを提供します:AA(ARMED FORCES AMERICAS)、AE(ARMED FORCES EUROPE)、AP(ARMED FORCES PACIFIC)、AS(AMERICAN SAMOA)、DC (コロンビア特別区)、FM(ミクロネシア連邦)、GU(グアム)、MH(マーシャル諸島)、MP(北マリアナ諸島)、PR(プエルトリコ)、PW(パラオ)、VI(バージン諸島)。
ジョースナイダー

2
うん、これは馬鹿じゃない
クリストファー

回答:


25

Javascript、124 117バイト

(hvdのおかげで7バイトを節約)

x=>/.+[A-Z]|A..[sz]k?|M.ss.s?|M[io]n?t?|Nev?|[AFIOUW][^o]|T..|.+/.exec(x)[0].replace(/(.).*(.)/,'$1$2').toUpperCase()

説明:

  • 正規表現は、最初の文字と最後の文字、略語の2文字との一致を検出します
  • 最初の部分は、2語以上の州(コロンビア特別区を含む)と一致します
  • 第二部はアラスカとアリゾナに一致
  • 3番目の部分は、マサチューセッツ、ミシシッピ、ミズーリと一致します
  • 4部目はミシガン、ミネソタ、モンタナに一致
  • 5番目の部分はネブラスカとネバダに一致
  • 6番目の部分は、残りのすべての州を最初の2文字に短縮し、アイオワを除外する特別な場合と一致します
  • 7番目の部分は、残りのすべての状態を、最初の文字と3番目の文字に短縮して一致します
  • 8番目の部分は、最初と最後の文字に省略されている他のすべてのものと一致します
  • 次に、それらの文字を削除して大文字にする
  • プエルトリコとアメリカ領サモアにも一致しますが、グアム、マリアナ諸島、米領バージン諸島には一致しません

うわー、これは素晴らしいです!+1!
-NoOneIsHere

3
いいね!さらにいくつかの機会:[A-Z]入力が有効であることがわかっているため、イニシャルは必要ありません。アイオワ州の特別な場合は[AFIOUW][^o]、それを除外するために短縮することができ、最終的に残し.+ます。
hvd

1
あなたの正規表現の機械は私のものと比べてとても効率的です...私の短い正規表現で動作させる方法があればいいのにと思います。しかし、それらはそのような異なる原則に基づいて構築されています。
スティーブベネット

1
独自の方法で奇妙なものがかなりあります。「最初と最後」と「最初の2つ」の両方のルール(コロラド、デラウェア、カリフォルニア...)に一致する素晴らしいコレクションがありますが、ミシシッピ(MS)はそれを台無しにします。
スティーブベネット

1
101:s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()100に到達できますか?:)
スティーブベネット

22

Javascript、 137 135 134 132 113 110 108 101 99 94 93 92バイト

これは、正規表現以外のいくつかの改善と、その中のいくつかの調整を加えたHP Williamsソリューションに基づいています。

s=>s[0]+
/.*( .|z)|...s.s?|T..|M[i-t]+|[AFINOUW][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

(読みやすくするための改行のみ)

正規表現の解説:

.*( .|z)|      // Two-or-three word states, plus Arizona
...s.s?|       // Mississippi, Missouri, Massachussetts, Alaska, and (non-harmfully) Kansas
M[i-t]+|       // Montana, Minnesota, Michigan
[AFINOUW][^o]v?|  // All the other first-two-letter states, avoiding Iowa, plus Nevada
T‌​..|           // Tennessee, Texas
.+             // Everything else is first-and-last

無意味な代替正規表現(同じ長さ):

/...(a$|z|s.s?|.* .)|M[i-t]+|T..|[AFINOUW].v?|.*/  

歴史

94

s=>s[0]+/.*( .|z)|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*/
.exec(s)[0].slice(-1).toUpperCase()

99

s=>s[0]+/.*( .|z|l.*k)|T..|M.ss.s?|M[io]n?t?|[AFIOUWN][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

101

s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|T‌​e.|.+/
.exec(s)[0].sl‌​ice(-1).toUpperCase(‌​)

108

 s=>s[0]+/MI(N|SSO|S)|[CDGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|D$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

110

s=>s[0]+/MI(N|SSO|S)|[CGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

113

s=>s[0]+/^MI(N|SSO|S)|^[CGHKLPV].*|.*?( .|[XZV])|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

132

s=>(S=s.toUpperCase(),' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_[ED]$_WA_Z_X_..'
.split`_`.some(p=>s=S.match(p)),S[0]+s[0].slice(-1))

134

s=>' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_E$_D$_WA_Z_X_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

135

s=>' ._SSO_^MI[NS]_LASK_^[CGHKLPV].*_NT_EN_[DE]$_WA_.[XVZ]_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

137

s=>' ._OWA_SSO_ONT_^MI[NS]_LASK_^[CGHKLPV].*_EN_[DE]$_.[XVZ]_..'.split`_`.
map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

これは正気ではありません。もう一度賛成できたらと思います。
ETHproductions

今見てはいけません!99!
スティーブベネット

94.完全にクレイジー。この最適化(...s.s?ミシシッピ州、ミズーリ州、マサチューセッツ州、アラスカ州)を偶然発見しました。私は実際に.*skフラグメントを別の場所に移動する過程にあり、フラグメントはどこにも存在していませんでしたが、テストが実行されて合格しました。これまでで最も簡単な5キャラクターの獲得!
スティーブベネット

うわー、そして、私...s.s?はそれがカンザスにも不注意に一致しており、奇跡的にも正しい結果を与えていることに気付いた。
スティーブベネット

そして、もう1つのキャラクターM[onti]+。奇妙なことに、状態がMで始まる場合、2番目の文字は、少なくとも1つのo、n、t、またはiのシーケンスの最後です。ミシカン、ミネソタ、またはモンタナをキャプチャする非常に奇妙な方法。
スティーブベネット

20

JavaScript(ES6)、156 136バイト

s=>s[0]+'.KT..N.VEA.XVL.H.TZ.AA..I.EADATO.JTISRDIYOI.DALA.Y.KE.C.D.R.YAS.NM...C.L...N'[parseInt(s.split` `.join``,36)%359%248*8%99*3%83]

デモ


1
これは、この方法を使用して最適化されるように総当たりしますか?
ASCIIのみ

2
@ ASCII-onlyこれは、任意の範囲でブルートフォースされるため、に最適であることが保証されるだけですX MOD[50-1000] MOD[50-1000] MOD[50-100]。しかし、これ.slice(1)は間違いでした。現在、文字列全体で再度実行しています。
アーナルド

2
newbにこれが何をするのか説明してもらえますか?
ハンクレコード

1
@Hankrecordsもちろんです。(しかし、私は現在、インターネットアクセスが制限されている電車の中にいます。)
アーナルド

1
今、私は135です!
スティーブベネット

17

ゼリー、75 バイト

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸?
e“\B“½ƈN»ȧ5ȯÇ’
i⁶ȯÇ‘ịṭḢŒu

オンラインでお試しください!

...または参照テストスイートを -小さな変更を注意してください(私は、プログラム入力原子をスワップアウト一度に複数の入力のための完全なプログラムを実行するためになされなければならなかった³、レジスタからリコールのために、®一つやレジスタを設定各州名に順番に)。

どうやって?

郵便番号の2番目の文字に使用するインデックスを計算し、最初の文字に追加して結果を大文字にします。

最初にスペース文字のインデックスを見つけます(見つからない場合は0)。

それ以外の場合は、アラスカかミズーリかをチェックします(kまたは5を返しoます)。

それ以外のArizona Minnesota Mississippi Nevada Montana Texas Tennessee場合は、リスト内の入力状態のインデックスを見つけます(見つからない場合は0)-そうである場合、そのインデックスmod 2 + 3(for z n s v t x n)を取ります。

Elseは文字列を序数に変換し、基数256から変換し、29487で除算した後の残りを見つけ、14で除算した後の残りを見つけ、それを使用して9620のバイナリ表現にインデックス付けし、結果を2倍して0を返します最終文字を使用する州の場合、2番目の文字を使用する州の場合は2。

最初のケースを除くすべてのケースがインクリメントされ、結果の値がデクリメントされます(1で見つかったスペースインデックスがアップします)。

i⁶ȯÇ‘ịṭḢŒu - Main link: state string
 ⁶         - space character
i          - first index (of a space character in the state) or 0 if not found  (n-1 or 0)
   Ç       - call link 3 as a monad  (get n-1 in other cases)
  ȯ        - logical or  (yielding n-1)
    ‘      - increment   (yielding n)
     ị     - index into the state string (get the nth character)
       Ḣ   - head the state string (get the first character)
      ṭ    - tack
        Œu - convert to uppercase
           - implicit print

e“\B“½ƈN»ȧ5ȯÇ’ - Link 3: n-5 or ... : state string
 “\B“½ƈN»      - ["Alaska","Missouri"]
e              - exists in? (1 if so, 0 if not)
          5    - 5
         ȧ     - logical and
            Ç  - call link 2 as a monad
           ȯ   - logical or
             ’ - decrement

“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸? - Link 2: n = 3 or n = 4 or ... : state string
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»           - "Arizona Minnesota Mississippi Nevada Montana Texas Tennessee"
                    Ḳ          - split at spaces
                     i         - first index of state string in that list or 0
                      µ        - monadic chain separation (call that i)
                             ? - if: 
                            ⁸  -   link's left argument, i
                               - then:
                       %2      -   mod 2
                         +3    -   plus 3  - odd entries to 4: AriZona, MisSissippi, MonTana, TenNessee
                               -            even entries to 3: MiNnesota, NeVada, TeXas
                               - else:
                           ¢   -   call link 1 as a nilad

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ - Link 1 ...n=2 or n=0: no arguments
³                  - program's 1st input    e.g. Iowa          or Ohio
 O                 - cast to ordinals            [73,111,119,97]  [79, 104, 105, 111]
   ⁹               - 256
  ḅ                - convert from base           1232041825       1332242799
     ⁽qġ           - 29487
    %              - modulo                      15991            20139
        %14        - modulo 14                   3                7
                ¤  - nilad followed by link(s) as a nilad:
            ⁽"w    -   9620                     V       V
               B   -   convert to binary = [1,0,0,1,0,1,1,0,0,1,0,1,0,0]
           ị       - index into                  0                1
                 Ḥ - double                      0                2
                   -   ...0th index of Iowa is 'a', 2nd of Ohio is 'h'

1
これは最長のゼリー私が今まで)=見たことがある
caird coinheringaahing

11

Python 2、191バイト

lambda s:s[0]+("KZD"*5+"HNTD"*5+"AYY"*4+"__L_O_VTA_I__A_T_RS_KA__S_"+"MOO"*5+"I_C_"+"AE"*6+"_I_D__A_"+"EDL"*5+"HV_A"+"IR"*7+"XC"*6+"E____N__YJ_YT___L")[reduce(lambda a,x:a+ord(x)^24,s,0)%174]

オンラインでお試しください!

単純なハッシュ関数を使用して、略語の2番目の文字を見つけます。


11

Python 2、94 90バイト

lambda s:s[0]+s[(19**9*0x4710b8f6019c1b61deca10eef13b1>>hash(s)%8199472%52*3&7)+1].upper()

オンラインで試す

(Python 3のハッシュは安定しておらず、文字列をバイトに変換しないとハッシュできないため、Python 2のみです。)

50州すべてに加えて、ボーナスとしてコロンビア特別区とプエルトリコで機能します。

base-36:に数値を書き込むことにより、1バイトを節約することができますint("5clu7x0aixb0pelmpugv5iiibphrpf",36)もっと創造的な解決策が考えられるかどうかを楽しみにしています。

更新:

ハッシュには12個の未使用の桁位置があるため、2 36個の可能な数字が機能します。それらの1つが大きな指数を持つ素因数を持つと信じるのは理にかなっているように思えました。任意の素数と指数について、値を見つけるのは非常に高速です。私はなんとか19 9の係数を持つものを見つけることができ、4バイトで数値を表現するために必要な式のサイズを減らしました。

これは基本的に私のCの回答と同じ手順ですが、Pythonを使用します。基本ハッシュ関数が異なるため、異なる縮約関数を見つけなければなりませんでしたが、これはmod 54ではなくmod 52でした。しかし、Cを超える最大の節約は、bignumを使用してベクトルをエンコードできることです。 Pythonの標準は、完全なプログラムの代わりにラムダリテラルを使用しても問題ないという事実です。


9

網膜113 81 80 77 70 68バイト

M1!`.+[A-Zz]|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*
\B.*(?=.)

T`l`L

オンラインでお試しください!51個すべてのテストケースが含まれます。@JörgHülsermannの2番目の文字を見つける正規表現を割り当てて32バイトを節約しました(DCをサポートするための微調整を行います。編集:@JörgHülsermannのおかげで1バイトを節約しました)。@HPWilliamの回答へのコメントから@SteveBennettの正規表現に切り替えることで3バイトを節約しました。保存された7 9は@SteveBennettに再び感謝バイト。他の文字は削除され、文字列は大文字になります。


非常に素晴らしい、完全に取り外し可能な一連の文字列を取得できるとは思わなかったでしょう。
colsw

@ConnorLSW eは本当に面倒でした。
ニール

@JörgHülsermannお返しをありがとう!
ニール

@JörgHülsermannああ、だから私は別のバイトを保存することができますか?
ニール

1
待って、インディアナ IDになります。おそらく$をd。(自動テストを使用することをお勧めします-50件すべてを常にチェックするスクリプトがあります。)
スティーブベネット

8

PHP> = 7.1、113バイト

<?=($a=$argn)[0],ucfirst(preg_match('#[vxz]| .|owa|lask|[CGHKLPV].*|ssi?.|n(n|t|[de]$)#',$a,$t)?$t[0][-1]:$a[1]);

オンライン版

ストライキは、以前の最初の試合を通して一致します

([vxz])アリゾナ、ネバダ、ニューメキシコ、 ペンシルベニア、テキサス、

(.) (1つ前のスペース)は、ニューハンプシャー、ニュージャージー、ニューメキシコ、ニューヨーク、ノースカロライナ、ノースダコタ、ロードアイランド、サウスカロライナ、サウスダコタ、ウェストバージニアに一致します

[CGHKLPV].*(.)カリフォルニア、コロラド、コネチカット、ジョージア、ハワイ、カンザス、ケンタッキー、ルイジアナ、ニューハンプシャーノースカロライナ、ペンシルバニア、サウスカロライナ、バーモント、バージニア、ウェストバージニアと一致

ow(a) アイオワと一致

las(k) アラスカに一致

ssi?(.)マサチューセッツ、ミシシッピ、ミズーリ、テネシーに一致

n(n|t|[de]$)コネチカット、 ケンタッキー、メイン、メリーランド、ミネソタ、モンタナ、ペンシルベニア、 ロードアイランド、テネシー、バーモントに一致

これらの州には一致しないため、アラバマ、アーカンソー、デラウェア、フロリダ、アイダホ、イリノイ、インディアナ、ミシガン、ネブラスカ、オハイオ、オクラホマ、オレゴン、ユタ、ワシントン、ウィスコンシン、ワイオミングの最初の2文字を受け取ります

初めてこの正規表現サブパターン ?|を使用すると、後方参照を1つに格納できます。

コロンビア特別区を支援

交換する(.)([^o])3つのバイト

オンラインでお試しください!

PHP、150バイト

<?=($t=preg_replace("#.\K\w+ |las|ri|nec|eorgi|awa|ow|[aio]ni?|e(?=n|v|x)|ntuck|ouisi|a?in|arylan|issi?|nnsylv|erm|irg#","",$argn))[0],ucfirst($t[1]);

オンラインでお試しください!テストケース


3
ではないn|t|より短いバイト[nt]|
ニール

@Neilはい。気付いていません。ありがとう
ヨルグヒュルサーマン

7

PHP、887 854バイト

<?=array_combine(['Alabama','Alaska','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'],['AL','AK','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'])[$argv[1]];

オンラインでお試しください!

はじめてのタイマー


1
このように、配列内で少しゴルフされた値は、スペースのある値、または2番目の文字が正しく削除された値です。そして、$argv[1]置き換えられ$argn sandbox.onlinephpfunctions.com/code/...
イェルクHülsermann

@JörgHülsermannどうもありがとう!ここでのcodegolfに関するあなたの答えを本当に楽しみにしていますphp
イヴァンカトドロワ

私はここで他の人に対して少しだけ光です。誰かが改善を見つけた場合、学習努力は良いです。私は、あなたが将来的にはより多くの質問に答えることを願っています
イェルクHülsermann

7

C、945 937 718 711 660 616バイト

ASCIIのみのおかげで219バイトを節約しました。

struct{int*a,b;}m[]={"laba",76,"lask",75,"rizo",90,"rkan",82,"alif",65,"olor",79,"onne",84,"elaw",69,"lori",76,"eorg",65,"awai",73,"daho",68,"llin",76,"ndia",78,"owa",65,"ansa",83,"entu",89,"ouis",65,"aine",69,"aryl",68,"assa",65,"ichi",73,"inne",78,"issi",83,"isso",79,"onta",84,"ebra",69,"evad",86,"ew H",72,"ew J",74,"ew M",77,"ew Y",89,"orth",67,"orth",68,"hio",72,"klah",75,"rego",82,"enns",65,"hode",73,"outh",67,"outh",68,"enne",78,"exas",88,"tah",84,"ermo",84,"irgi",65,"ashi",65,"est ",86,"isco",73,"yomi",89};
i;char b[99];main(){gets(b);putchar(*b);for(;m[i].a;i++)if(!strncmp(m[i].a,b+1,4))puts(&m[i].b);}

改行は不要で、表示のみを目的としています。状態を入力として受け取ります。オンラインでお試しください!

使い方:

  • struct{int*a,b;}m[]=...m4つの文字列と1つの文字という2つの値でマップを宣言します。これは、2番目から5番目のインデックスをchar*aマップ内で比較する比較ループで使用されます。
  • gets(b)文字列を読み取りますb。これは、短縮する状態になります。
  • putchar(*b) 各略語は州の最初の文字で始まるため、その文字列の最初の文字を出力します。
  • for(;m[i].a;i++)マップの各値をループします。(これは短縮できる場合があります。)
  • if(!strncmp(m[i].a,b+1,4))現在のマップ値をb(短縮する状態)の2番目から5番目の文字と比較します。これは、最初の5文字のみが異なるためですが、最初の文字はすでに印刷されています。
  • puts(&m[i].b); 略語の2文字目(州名が現在のマップ値と一致する場合)と改行を出力します。

これは、North * / South *状態に対して誤った出力を生成するようです。
フェリックスドンベック

6

C、148 141バイト

main(){char s[99];gets(s);printf("%c%c\n",*s,s["-2-1--561-1-62--642138364---4142--1416--67-7131-111-7-246"[*(int*)(s+1)%663694%57]-48]&95);}

*(int*)(s+1)入力の2番目から5番目の文字を整数と見なします。その整数は、ハッシュを使用して0〜56にハッシュされi%663694%57ます。ハッシュ値は、略語の2番目の文字の位置を表すオフセットのベクトルで検索されます。(1)ミズーリ州とミシシッピ州では最初に5番目の文字が異なり、(2)一部の州では4文字のみであるため、特定の4バイトを選択しました。CではNULターミネーターバイトを使用できますが、それ以上は信頼できません。(これにより、両方の北と南の両方が同じ値にハッシュされます。しかし、これらはすべて関連するオフセットが6であるため、問題ではありません。)

たまたま、その特定のハッシュは、コロンビア特別区、プエルトリコおよび「バージン諸島」の略語の2番目の文字の正しい位置を生成します(アルゴリズムは、「アメリカ領ヴァージン諸島」ではなく、そのように入力しました。略語の文字は名前の最初の文字です)。

定数663694および57は自動テストで検出されました。57は、私が見つけた最小のハッシュ範囲でした。(最初のバージョンは380085と63を使用していましたが、テスト範囲を拡張したときに新しいものを見つけました。)「名前の最後の文字を使用する」ためのコードを追加すると、少し小さいハッシュが存在するようです 残念ながら、最後の文字を選択するためのC構文は冗長であるため、有用ではありません。

オフセットは8つしかないため、エントリごとに3ビットの171ビット(3 * 57)ルックアップテーブルに格納できます。しかし、これらのビットをプログラムに効率的に挿入する方法は考えられませんでした。16進エンコードには、4ビットごとに約1文字と0xプレフィックスが必要です。文字列バージョンよりもはるかに長い151バイトを超えることはできませんでした。171ビットが生のオクテットとして何らかの方法で挿入できる場合、それらは22バイトを占有するため、解決策があるかもしれませんが、ファイルの読み取りは不格好です。


4

実際には、181バイト

2"OHCALAGAMAWVFLNVILMNMOMIRINCDEMTMEINWANYTXORNEOKIDAZNMUTNDMDVAKYSDPAARWYNHIAMSALNJAKTNHIKSVTWICOSCCT"╪"âäà♠îÉæô↨→←∟♣áíå*,▓/12│┤94▼╛?DE╞G╚╠╬ST╒WXßb;Θoq╙|⌂"♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└

このソリューションでは、入力を引用符付き文字列として想定しています。

オンラインでお試しください!

説明

このソリューションは、私のPython 3ソリューションと同じハッシュ戦略を利用しています。簡潔にするために、ハッシュの計算方法と選択理由の説明は省略します(そのビットが必要な場合は、他の答えを読んでください)。

また、簡潔にするために、非常に長い文字列の内容は省略します。そうしないと説明が読めなくなるからです。

2"..."╪"..."♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└
2"..."╪                                state abbreviations (push the long string, split into length-2 chunks)
       "..."♂┘                         hash values for the state names (a string of CP437-encoded characters, converted to their CP437 ordinals)
              Z                        zip the two lists
               ⌠i≈┐⌡M                  for each pair:
                i                        flatten the pair
                 ≈                       convert hash value to int
                  ┐                      store abbreviation at the register numbered by the hash value
                     X                 discard the now-empty list
                      O                convert input string to list of ASCII ordinals
                       ;rR             range(len(ordinal_list)), reversed
                          5♀ⁿ          5**i mapped over that range
                             *         dot product of powers of 5 and ordinal list
                              :236@%   mod by 236
                                    └  push value in that register

3

Python 3、230バイト

lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%‌​$T.I%!C!T!.HAAT$.A!.‌​VL.V%$CE%%AEK%.T$!.Y‌​.A!.R.Y$O.S%!.K$!.S'‌​.replace('%','$$').r‌​eplace('$','!!').rep‌​lace('!','..')[sum(c‌​*5**i for i,c in enumerate(s[::-1]))%236-5]

オンラインでお試しください!

入力は、バイトオブジェクト(Unicode文字列ではなくバイト文字列)として期待されます。

途方もない量のバイトをくれたJohnathon Allanに感謝

説明

各状態名は、ハッシュをa適用することによって整数にハッシュされますa = sum(o*5**i) % 236(ここoで、文字のASCII序数でありi、文字列内のインデックスであり、末尾から数えます)。モジュラス236が選択されたのは、50個の米国の州名ですべてのハッシュ値が区別される最小のモジュラスであるためです。次に、これらのハッシュは状態の略語にマップされ、結果の辞書(文字列置換を使用して圧縮)を使用して、州名が与えられた略語を検索します(ハッシュを使用して適切なキーを取得します)。


179バイト節約lambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
ジョナサンアラン

...さらにその上に51がありますlambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
ジョナサンアラン

しかし、私は少しプレイしてものを見つけることができません-私は、カウントが後方にカウントが前方にいることをハッシュ関数よりも少ないバイトの費用がかかることを驚いている
クリスHに

1
@ChrisH私はそれを見つけたと思ったが、圧縮された文字列はより高価です。
メゴ

2

ルビー、106 103バイト

->s{s[0]+(s=~/ /?$'[0]:s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?j>7?j/4:-1:1]).upcase}

入力にスペースが含まれる場合、2番目の出力文字はスペースの後の文字です。そうでなければ...

入力内のすべての文字の合計をハッシュして、式j>8?j/4:-1(-1は終了を意味します)に従って、マジックストリングのインデックスが入力ストリングの2番目の出力文字のインデックスを示す文字を取得します。ハッシュがマジックストリングにない文字を与える場合、2番目の文字は入力の2番目の文字です。

マジックストリングの説明として、ハッシュ文字とそれらがエンコードする文字インデックスを以下に示します。デラウェアは2番目の文字で表示されますが、ハッシュコードがケンタッキー州と衝突するためです。幸いなことに、デラウェア州の最後の手紙は2番目と同じです。

Letter(index)
Last  (-1)  (-MD    )-VA    6-GA-LA  >-DE-KY    P-PA    _-CT    a-KS    c-VT
3rd    (2)  ;-TN    ?-MN    .-TX     O-NV
4th    (3)  }-MS    A-IA    F-MT     L-AZ
5th    (4)  K-MO    M-AK    r-ME     S-HI 

テストプログラムでゴルフをしていない

a="Alabama
Alaska
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($/)

f=->s{                                                            #String argument s.
  s[0]+(                                                          #Return character s[0] +
    s=~/ /?$'[0]:                                                 #if s contains a space, 1st character after space, ELSE
      s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?  #if (sum of ascii codes, mod 136 mod 95 +32).chr in the magic string
        j>7?j/4:-1:                                                 #return s[j/4] if j>7 else return s[-1] ELSE
      1]                                                          #if not in the magic string, return s[1].
  ).upcase                                                        #Convert the second character to uppercase if needed.
}


a.map{|i|p [i,f[i]]}

2

///619 608バイト

/2/~M//@/~South //1/~North //!/~New //~/\/\///Alabama/AL~Alaska/AK~Arizona/AZ~Arkansas/AR~California/CA~Connecticut/CT~Delaware/DE~Florida/FL~Georgia/GA~Hawaii/HI~Idaho/ID~Illinois/IL~Indiana/IN~Iowa/IA~Kansas/KS~Kentucky/KY~Louisiana/LA2aine/ME2aryland/MD2assachusetts/MA2ichigan/MI2innesota/MN2ississippi/MS2issouri/MO2ontana/MT~Nebraska/NE~Nevada/NV!Hampshire/NH!Jersey/NJ!Mexico/NM!York/NY1Carolina/NC1Dakota/ND~Ohio/OH~Oklahoma/OK~Oregon/OR~Pennsylvania/PA~Rhode Island/RI@Carolina/SC@Dakota/SD~Tennessee/TN~Texas/TX~Utah/UT~Vermont/VT~Virginia/VA~Washington/WA~West Virginia/WV~Wisconsin/WI~Wyoming/WY/

オンラインでお試しください!

///に入力を取得する他の方法がないため、プログラムの最後に移動します。目的の入力をプログラムに追加するだけです。

@SteveBennettが推奨するように、より多くの置換を行うことで11バイトを節約しました


「New」や「akota」など、一度に複数回置き換えることができるパターンがおそらくいくつかあります。迷惑なあなたは大文字に、残りの文字を変換することは非常に高価であるため、状態名のセクションを削除するようにあまり賢くないことを...
スティーブ・ベネット

@SteveBennett編集、ありがとう!
同志SparklePony


1

TAESGL、386バイト

B=«ōďā,AL,ņćđ,AK,ķċđ,AZ,ćōē,AR,ďċđ,CA,ĭāď,CO,ŕĭ,CT,ćđēą,DE,ĕŕ,FL,īĭ,GA,ńāē,HI,ćĉďą,ID,ĭċď,IL,ľđā,ţ,ńĕĕ,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»Ĵ",";B[BĪA)+1

通訳

略語で配列に追加された状態名の非常に単純な圧縮。


1

Japt、383バイト

最初の文字列の圧縮は、文字の順序を実験することで改善できる場合があります。

g +`lkzÇUaidlnyaÀÍ¥evhjmycdhkÎödnxttaaviy`g`alabaµ
Ã2ka
iza
kÂ6s
Öâfnia
åªv
¬nש
Ü.Ø
fÓQ»
gegia
°ii
i»
ÅJno
Äa
Å0
kÂ6s
kÀ_cky
lia
Úpe
æ¯À
ÚUaÖ³etts
Úòig
·nÌta
æ«7ppi
æ¬
Úa
ßka
va»
w mp¢i
w jÀ y
w ´xi¬
w yk
Íh ÖÚ¦na
Íh »kota
oo
oklaÊá
eg
pnsylvia
r¸ Ó
Ñh ÖÚ¦na
Ñh »kota
âÊte
x
©ah
vÚ
virgia
Øgn
ØÙ virgia
æÈ;n
wyÇg`·bUv) u

オンラインで試す


1

Mathematica、138 140 134バイト

+2バイト-間違いを見つけました(0ではなく1の配列オフセットが必要です)

-6バイト-より良いハッシュが見つかりました

#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&

他と同様に、名前を取り、最初の文字を取ります。次に、デフォルトのMathematicaハッシュを適用してから、2つのモジュラスを適用Hash@#~Mod~89866736~Mod~73して、状態ごとに一意の番号を取得します。この値は文字列で検索され、2番目の文字が生成されます。

おそらくもっとゴルフをすることができますが、検索スペースはMathematicaが見つけるには巨大です。重複した2番目の文字は、ハッシュ検索では考慮されませんでした。_文字は文字列の無駄な値を表します。理論的には、文字列を19文字までしか取得できませんでしたが、それを生成するカスタムハッシュを見つけるのは悪夢です。


1

パール5、150 148バイト(147 + 1)

これは決して最適ではありませんが、その仕事をします。-nコマンドラインフラグが必要です。

s/las//;s/ai?n//;s/[oie]n|ri//;s/e([vx])/$1/;s/issi?//;s/(.).+ /\1/;/(.)(.)/;/^([^W]).*(?:[cogavn][wiku]|[ir][ys][li]|rm)([adyti])$/;print uc"$1$2"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.