いくつの州と国境を接していますか?


20

小さい頃、ベッドの向かいの壁にアメリカの大きな地図を貼り付けました。私が退屈したとき、私はその地図を見つめ、ものについて考えました。4色の定理、または他のほとんどの州に隣接する州のようなもの。若い人に数える際の頭脳を節約するために、タイムマシン発明し、入力に隣接する状態の数教えてください。時間は微妙なので、これはできるだけ短くする必要があります。

タスク

このページarchive.org mirror)に記載されているように、フルネームまたは郵便略称で米国50州のいずれかを指定すると、国境を接する州の数を返します。以下は、完全な州名のすべての入力を、このWebサイトにある隣接する州の数にマッピングしたものです。

Missouri, Tennessee -> 8
Colorado, Kentucky -> 7
Arkansas, Idaho, Illinois, Iowa, Nebraska, New York, Oklahoma, Pennsylvania, South Dakota, Utah, Wyoming -> 6
Arizona, Georgia, Massachusetts, Michigan, Minnesota, Nevada, New Mexico, Ohio, Virginia, West Virginia -> 5
Alabama, Indiana, Kansas, Maryland, Mississippi, Montana, North Carolina, Oregon, Texas, Wisconsin -> 4
California, Connecticut, Delaware, Louisiana, New Hampshire, New Jersey, North Dakota, Rhode Island, Vermont -> 3
Florida, South Carolina, Washington -> 2
Maine -> 1
Alaska, Hawaii -> 0

ルール

  • プログラムは完全な州名または郵便番号のいずれかを処理できます。組み合わせを使用することはできません。
  • 入力の大文字と小文字を指定できますが、入力の空白を削除することはできません。
  • ワシントンDC、または50州のいずれでもないものを扱う必要はありません。
  • 隣接する状態の数には、入力状態は含まれませ
  • これはであるため、バイト単位の最短回答が優先されます。

私はこれが最高の圧縮を持っているか、数字ごとに最高の正規表現パターンを見つける人であるかもしれないことを知っていますが、それらの答えが多すぎる場合は、米国の地図を生成してそれを使用する回答に報奨金を授与します境界状態の数を計算します。


11
inb4Mathematicaの組み込み
DJMcMayhem

@DJMcMayhem ああええと(最初は音良いが、更新を参照してください...)
スティーブン・

@StepHenああ、私は追い出されました!私はこれを組み込んだ答えに取り組んでいた...;)
notjagan


DCを処理したり、カウントに含めたりすることはできますか?
notjagan

回答:


17

ゼリー73 65バイト

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?

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

ビルトイン?誰が必要ですか?(ʂÞiƬ嫌悪感で地面に)。

などのフルネームとして入力を取得します"Idaho"

使い方

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?
“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘                   The literal list of code-page index lists  [[85, 91], [154], [33, 28, 50], [8, 143, 133, 93, 83, 116, 143, 125, 75], [167, 20, 105, 152, 5, 46, 20, 114, 13, 117], [52, 30, 40, 128, 102, 87, 103, 63, 153, 100], [147, 6], [19, 98]]
                           €        On each sublist:
                         ¤            Evaluate the hash value:
                 ³                     Input
                   O                   Character values
                    S                  Sum.
                     %                 Modulus.
                      168              168
                i                     Does the sublist contain that nilad?
                            T       Get the sublist which does contain that nilad.
                                 ?  If
                                L     Length.
                                    Then
                             ’        Return the index - 1
                                    Else
                              6      Return 6

そのリストを取得するためにどのプロセスを使用しましたか?
スコットミルナー

2
@ScottMilner私はOS%168各州で走り、リストを直接生成しました。250未満のすべての可能性をブルートフォースすることで定数168を見つけ、それらのそれぞれが異なる数の境界を実際に区別できるかどうかをチェックしました。168(他のいくつかの中でも)機能し48、衝突のために値をハードコーディングするだけで済むという追加の利点がありました。
fireflame241

18

Mathematica、112 111バイト

Mark S.LegionMammal978のおかげで-5バイト!

-22バイト(および出力の問題に気づく)ngenisisに感謝!

Tr[1^Entity["AdministrativeDivision",#~StringDelete~" "]@"BorderingStates"]+Boole@StringMatchQ[#,"Il*"|"Mic*"]&

もちろん、Mathematicaが組み込まれています。DCをカウントに含めます。


3
これは汚れてAdministrativeDivisionいるように感じますが、驚くほど長いため、Length [x = "AdministrativeDivision"〜Entity〜StringDelete [""] @#〜ToExpression [x <> "Data"]〜 "BorderingStates"]&でバイトを保存します。
マーク

1
ToExpressionSymbol正しく覚えていれば、に置き換えることができます。
LegionMammal978

1
また、エンティティに引数としてAdministrativeDivisionData渡すだけで、を使用する必要はありません"BorderingStates"。例Entity["AdministrativeDivision","Alaska"]["BorderingStates"]
-ngenisis

1
@ngenisis最初の問題に修正を適用しました。幸いなことに、あなたの提案のために、それはそれほど多くのバイトを追加しませんでした。DCについて言及した後者の問題は、OPがこれが有効であり、応答がイエスであるかどうかをOPに尋ねたため、問題ではありません。
-notjagan

1
@notjaganのTr[1^...]代わりに使用しLength@...て、別のバイトを保存することもできます。
-ngenisis

13

JavaScript(ES6)、115 113バイト

編集:Step Hen Python answerからさらに2つの文字列最適化を借用して2バイトを節約しました。私は最初の試みでそれらを見逃しました。

入力として郵便番号を受け取ります。

s=>('7KYCO8MOTN0AKHI1ME2FLSCWA3CACTNDELANHNJRIVT4ALWINCKSMDMSMTXOR5GAZOHMANMIMNVWVA'.match('.\\D*'+s)||'6')[0][0]

どうやって?

.match()メソッドに渡された非RegExp引数は、暗黙的にRegExpオブジェクトに変換されます。そのため、/.\D*{{input}}/エンコードされた文字列で正規表現をテストしています。これは、数字(1)に一致し、その後に0からN個の非数字文字が続き、その後に入力が続きます。

たとえば、入力が"NH"(New Hampshire)の場合、一致する文字列はになります"3CACTNDELANH"。この文字列の最初の文字を保持するか"6"、一致するものがない場合はデフォルトで戻ります。

(1):.は実際に任意の文字に一致しますが、文字列は文字のグループの前にあるものが常に数字になるように構築されます。

デモ


ハッシュバージョン、115バイト

同じ入力形式。

s=>`04436303035050063062750600644408${6e7}503600300540410005207058036442600400000650035`[parseInt(s,33)%589%180%98]

デモ


その文字列をbtoaingすることで多くのバイトを節約できます
-Downgoat

7

Pythonの3168の 154 153 137バイト

lambda s:[i for i,S in enumerate('AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN'.split())if s in S]or 6

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

isaacgのおかげで-4バイト

ETHProductionsのおかげで-10バイト

notjagenのおかげで-1バイト

他の回答が行ったように、デフォルトで6に設定することにより、さらにいくつかのバイトを節約しました。

TIOにはテストが含まれています。入力を郵便番号として受け取ります。状態名のリストを各セットの文字列として生成し、可能な場合WVVAは一緒に押しつぶします(たとえば、として保存されますWVA)。ラムダ関数は、入力に文字列が含まれるリスト内のインデックスを取得します。私はゴルフの機能の本体について知らない方法があるかもしれません。整数を含むリストとして出力- [0]ラムダの最後に追加して整数として出力します。


また、使用するのはl1回だけなので、インライン化することもできます。
isaacg

@ETHproductionsうん、ありがとう
スティーブン

@isaacgありがとう、どうして私はそれを見なかったのかわからない
スティーブン

テキサスの位置を再配置して-1バイト
notjagan

@notjaganありがとう、それを見逃した
スティーブン

4

V、143バイト

çourüee/C8
çdoüke/C7
çrküI„sn]üebüOkünnsüSDüUüwy/C6
çzüg„ot]üttüinnüvaüxiüOh/C5
çbüdiüKüMáû5}üNCüOüTüWi/C4
ç^[CDLNRV]/C3
ç[FSW]/C2
çM/C1
ñlS0

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

Hexdump:

00000000: e76f 7572 fc65 652f 4338 0ae7 646f fc6b  .our.ee/C8..do.k
00000010: 652f 4337 0ae7 726b fc49 8473 6e5d fc65  e/C7..rk.I.sn].e
00000020: 62fc 4f6b fc6e 6e73 fc53 8144 fc55 fc77  b.Ok.nns.S.D.U.w
00000030: 792f 4336 0ae7 7afc 6784 6f74 5dfc 7474  y/C6..z.g.ot].tt
00000040: fc69 6e6e fc76 61fc 7869 fc4f 682f 4335  .inn.va.xi.Oh/C5
00000050: 0ae7 62fc 6469 fc4b fc4d e1fb 357d fc4e  ..b.di.K.M..5}.N
00000060: 8143 fc4f fc54 fc57 692f 4334 0ae7 5e5b  .C.O.T.Wi/C4..^[
00000070: 4344 4c4e 5256 5d2f 4333 0ae7 5b46 5357  CDLNRV]/C3..[FSW
00000080: 5d2f 4332 0ae7 4d2f 4331 0af1 6c53 30    ]/C2..M/C1..lS0

入力を郵便番号として受け取ることができることに気付く前に、これを書きました。それが実際に短いかどうかはわかりません:shrug:。この回答では、正規表現を使用して特定の状態を検索し、一致する場合は入力を特定の数値に変更します。ただし、テストした状態の数が増えると、使用できる最小の検索が下がります。したがって、たとえば、我々はを検索することができないCことが一致するため、ColoradoCalifornia。(コネチカット州およびカロライナ州と同様に)ただし、境界線が3つ以上あるすべての州をテストすると、C始まるものを検索できます。これは、以前の州とは一致しないためです。

いくつかのテストケースは、すべてをテストする時間がないため、間違っている可能性があります。誤った出力が見つかった場合はお知らせください。:)


3

JavaScript、153バイト

MO=TN=8;CO=KY=7;AZ=GA=MA=MI=MN=NV=NM=OH=VA=WV=5;AL=IN=KS=MD=MS=MT=NC=OR=TX=WI=4;CT=DE=LA=NH=NJ=ND=RI=VT=3;FL=WA=2;ME=1;AK=HI="0";alert(self[prompt()]||6)

変数チェーン。しかし、これを行うより良い方法があると確信しています。

Discordの誰かからの提案のおかげで、出力のデフォルトは6で、最も一般的な国境の州の数です。183バイトから151バイト。

AKとHIでこれが失敗することをコメントする人が指摘したので、問題を修正するために2バイトを追加しました。151〜153バイト。


1
私はこれが失敗しAK、6 と評価されるHIので0||6、これは正しくない出力であると確信しています。
kamoroso94

@ kamoroso94より良い修正があると思われる場合は、コードを更新しました。
エリリチャードソン

3

05AB1E78 72バイト

.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•s¡¬ð¢

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


.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•
# Push the string: akhi me flscwa cactdelanhnjndrivt alinksmdmsncmtortxwi azgamamimnnvnmvaohwv idilianarenyokpnsdutwy kyco motn

s¡    # Split on input.
  ¬   # Get head.
   ð¢ # Count number of spaces.

これは、状態の略語の順序により、状態間の重複でNO状態が発生するためです。

a[kh]i 
me 
f[ls][cw]a 
c[ac][td][el][an][hn][jn][dr][iv]t 
a[li][nk][sm][dm][sn][cm][to][rt][xw]i 
a[zg][am][am][im][nn][vn][mv][ao][hw]v 
i[di][li][an][ar][en][yo][kp][ns][du][tw]y 
k[yc]o 
m[ot]n

しばらくして配置を正しくしました...次に、入力を分割し、最初の部分のスペースを数えることにより、正しい結果が得られます。


他の回答から「デフォルトの6」を盗むと、65バイトになります。

05AB1E、65バイト

.•3θ0ÔÕ—ú^?D§:‚A†ǝλα“i›p‚ιCöΔƒñPŠ J€ŽãB»ΣUƤÆuhÃgЦ,Y²•s¡¬ð¢D9Qi6

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


Took awhile to get the arrangement right->ああ、私はあなたが私の答えからそれをコピーできたと思う(私がこれを正しく読んでいるなら)
スティーブン

@Stephenまあ、私は他の投稿からアイディアを得ませんでした。「サッキーハッシュアルゴリズム」を見ると、1時間ほどランダムにハッシュするアイデアをいじり回して、スペースについて考えました。どんなに一生懸命試みても、その実装を破りました。
魔法のタコUr

@Stephenがあなたのものを読んだので、6 xDのデフォルト設定についても考えていたらよかったと思います。
魔法のタコUr

1
私はそれを考えていなかった、私は最初にこの答えでそれを見たので、気軽にそれを取る:P
スティーブン


2

JavaScript(ES6)、195バイト

s=>/las|ii/[t='test'](s)?0:/ai/[t](s)?1:/Fl|Wa|S.*C/[t](s)?2:/fo|ct|de|ui|mp|er|^N.+ak/i[t](s)?3:/do|ck/[t](s)?7:/ur|ee/[t](s)?8:/iz|gi|ch|ev|xi|hi|es/[t](s)?5:/rk|ah|oi|ow|br|om|lv|ak/[t](s)?6:4

州のフルネームで機能する一連の正規表現。

テストケース:


2

ゼリー 61  59 バイト

OP%⁽/r%101eЀ“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘Tȯ7’

完全な状態名を取得して結果を出力する完全なプログラム(モナドリンクとして、単一の数値または数値6を含むリストを返します)。

オンラインでお試しください!またはテストスイートをご覧ください。

どうやって?

“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘

コードページインデックスのリストのリストです。

[[11,61],[31],[40,55],[0,5,24,29,44,48,64,76],[12,23,28,60,67,77,90,97],[18,33,41,53,72,78,86],[],[49,94],[4,43]]

“ ... ‘以下のように表示されます。

OP%⁽/r%101eЀ“ ... ‘Tȯ7’ - Main link: list of characters, stateName  e.g. Ohio
O                        - cast to ordinals                   [79,104,105,111]
 P                       - product                                    95757480
   ⁽/r                   - base 250 literal                              12865
  %                      - modulo by 12865                                3285
      %101               - modulo by 101                                    53
             “ ... ‘     - list of lists of code-page indices
          eЀ            - map: exists in?                 [0,0,0,0,0,1,0,0,0]
                    T    - truthy indices (if none yields an empty list)   [6]
                     ȯ7  - logical or with 7 (replace empty list with 7)   [6]
                       ’ - decrement                                       [5]
                         - implicit print (Jelly's representation of a list of
                         -                 one item is just that item)       5

1

エクセルVBA、177 154 147のバイト

Stringrangeから州の郵便番号を表す予想されるタイプの入力を受け取り[A1]Integerその州に接する州の数を表すを返す匿名VBE関数。

For i=0To 8:r=r+IIf(Instr(1,Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")(i),[A1]),i,0):Next:?IIf(r,r,6)

以前のバージョン

154バイト:

For Each s in Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN"):r=r+IIf(Instr(1,s,[A1]),i,0):i=i+1:Next:?IIf(r,r,6)

177バイト:

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN"):[3:3]="=IfError(If(Find($A1,A2),Column(A3)),"""")":[B1]="=Sum(3:3)":?[If(B1,B1,6)]

読みやすい形式

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")
[3:3]="=IfError(If(Find($A1,A2),Column(A3)-1),"""")"
[B1]="=Sum(3:3)"
?[If(B1,B1,6)]

1

Python 2、363 218バイト

lambda a:dict(WA=2,WI=4,WV=5,FL=2,NH=3,NJ=3,NM=5,NC=4,ND=3,RI=3,NV=5,CO=7,CA=3,GA=5,CT=3,OH=5,KS=4,SC=2,KY=7,OR=4,DE=3,HI=0,TX=4,LA=3,TN=8,VA=5,AK=0,AL=4,VT=3,IN=4,AZ=5,ME=1,MD=4,MA=5,MO=8,MN=5,MI=5,MT=4,MS=4).get(a,6)

単純にわずかに最適化されたハードコーディングされた回答から始めましょう。入力として郵便番号を受け取ります。

bfontaineのおかげで-145バイト。


4
dict(MO=8,TN=8,...)代わりにを使用すると、ほぼ100バイトを節約できます{'MO':8,'TN':8,...}。その後、.get(a,6)6つの他の状態に隣接する状態を使用および削除することで、ほぼ50バイトを節約できます。私はこれらの2つのトリックで219まで下げることができます。
bfontaine

@Mitchは.、代わりにスペースを使用して実行することでさらに節約しますsplit()(私は思う)
スティーブン

@Mitch期間も必要ですか?リストを2つのグループに分割する方法はありますか?
魔法のタコ

を使用して、さらにバイトを節約できると思いますdict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3))。またint、文字列として出力することが許可されている場合は、おそらくこれを省略することができます。
イザークヴァンドンゲン

実際、アンパックを使用すればできますdict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3))。申し訳ありませんが、私は少し優柔不断です:D
イザークヴァンドンゲン

1

PowerShell、187バイト

param($a)$x=($b=" MO8TN8CO7KY7AZ5GA5MA5MI5MN5NV5NM5OH5VA5WV5AL4IN4KS4MD4MS4MT4NC4OR4TX4WI4CA3CT3DE3LA3NH3NJ3ND3RI3VT3FL2SC2WA2ME1").IndexOf($a);if($x+1){$b[$x+2];exit}6-6*($a-in'AK','HI')

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

これを行うためのより良い方法があると確信していますが、ここに私が思いついたアプローチがあります。

入力$aを受け取り、.IndexOfそれを使用して、状態/境界の組み合わせの長い文字列でその出現を取得します。プロセスに$x文字列を格納し$bます。次にif、一致を検出したかどうかを確認するステートメントに進み、一致する場合は、インデックスにインデックスを付けてからに進みexitます。それ以外の場合は、6状態またはAKまたはのいずれかHIであるため、いくつかのロジックを実行$a0て、いずれかの状態であるかどうかを確認し、必要に応じて減算します。いずれにせよ、それはパイプラインに残り、出力は暗黙的です。


1

Python 3、729 733バイト

入力を郵便の略語として受け取ります。これはゴルフの挑戦における私の最初の試みであり、これは私がこの地獄のようなアプローチで得ることができると思う最短のものです。私はそれが巨大であることを知っています-それについて考えると、おそらく私はif-elseステートメントでうまくいっていただろうが、その時間と努力のすべての後、私はそれを投稿しなければなりませんでした:D.

lambda s:sum((i-32)*96**j for j,i in enumerate(b'`*g$<#?wP\\.=)kuDbk$yvv\\D:Nh:cd/Pj, e*[_yXGz6lR<$jMo0qUU*7(Dua3-ThO}iX6VWRYDv=<K$8mVbYK9ld);TFB/m\'NE3ow4./pUsI5yJrwYrM4@e6\\kHJ%q8NA3>fb!~-rtwsRW=RBni}Y7T^gD\\IoxzJf.%|1.&4*"$%Q+).|8p(vcJ]cLRGUyC2eF:<Q4!_)y\\<`tr2A[z7re6OaR["2PRv\x7f,bRE [XrvtA<R<UlS23on?Byym&uy{XuB\x7fIMfh<y&waHElg-vk:4*on\x7f@?Ai5=2swfZSBF.PjkL{,|=,M<Bw"w,e@f`aKnmh\'xgg1#b4En\x7f+*\'g_ZRoeN*Q]mX\'>RoGc~ZP~e&{Hwo6bd<](hV)=l9#[f<Gj,#Ea!nJnL=9k"M,`bP2PsP6(eJoGEU>GA?,BpS}"RzzdMRtL[cre;\\tld^xT\':pry\'Nu_*R}eYg_U!Ld{p7<f:95lD]OBMX(r"Jg\'|%Cq"`Qy9g0aNrtYP9dnPRRr3\'yT(CE~\\&@5#tMLZ+a:V5NNXVp+Uy61s9$=Vb99(!ga7f7x}#=*]q.\x7f0R+f[*m:i^qe#D 8M&W\x7faGmCNCU9"~1Pj!]2r5 H>rYPqwfg4cFG*3-(z'))>>(5*int(s,36)-1850)&15

私はちょうど3文字の変数名の贅沢を手に入れたと気づいた-4バイト、400行く!


PPCGへようこそ!P:他のPythonの回答で示したように時々 、単純な解決策は、短い
スティーブン

ええ、私はあなたの有罪喜びは「それは判読不能だ簡潔なので、あなたのコードを作る」されて、あなたは右の中に収まるだろう考えると、あなたはこのに入れ、すべての努力を愛する。
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.