我要与几个州接壤?


20

小时候,我在床对面的墙上贴着一张美国大地图。当我无聊的时候,我会盯着那张地图思考一下。诸如四色定理之类的东西,或者哪个州与大多数其他州接壤。为了节省我一些计算的脑力,您将要发明一台时间机器,并告诉我输入有多少个州。由于时间很挑剔,因此需要尽可能短。

任务

此页面上找到的美国50个州中的一个(全名或邮政缩写)(archive.org mirror),返回其毗邻的州数。以下是本网站上所有完整州名称输入到相邻州数量的映射。

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

规则

  • 您的程序可以处理全州名称或邮政编码-它不能使用组合。
  • 您可以指定输入的大小写,但是不能删除输入中的空格。
  • 您不必处理华盛顿特区或任何不是50个州之一的州。
  • 带边框的状态数包括输入状态。
  • 这是,因此最短答案以字节为单位。

虽然我知道这可能是每个数字的压缩率最高或找到最佳正则表达式模式的人,但是如果我得到的答案过多,我将悬赏于能够生成美国地图并将其用于计算边界状态的数量。


11
inb4Mathematica内置
DJMcMayhem

@DJMcMayhem 呃哦(起初听起来不错,但请参阅更新...)
Stephen

@StepHen哦,不,我被赶了!我正在研究包含此内容的答案;;)
notjagan


如果可以的话,我们可以处理DC /将其包括在计数中吗?
notjagan

Answers:


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

您使用什么过程来获取该列表?
Scott Milner

2
@ScottMilner我OS%168在每个州都跑过,直接产生了清单。我通过对所有小于250的可能性进行暴力破解,并检查它们中的每一个是否能够真正区分不同数量的边界来找到常数168。168(在其他几个例子中)工作,并具有48由于冲突而仅需对值进行硬编码的额外好处。
fireflame241

18

Mathematica,112 111字节

-5字节,感谢Mark S.LegionMammal978

由于ngenisis,所以-22个字节(并注意输出问题)!

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

当然,有内置的Mathematica。在计数中包括DC。


3
这听起来很脏,但是它AdministrativeDivision是如此之长,以至于您要用Length [x =“ AdministrativeDivision”〜Entity〜StringDelete [“”] @#〜ToExpression [x <>“ Data”]〜“ BorderingStates”]保存一个字节
Mark S.

1
ToExpressionSymbol如果我没记错的话,可以用代替。
LegionMammal978

1
另外,您无需使用AdministrativeDivisionData,只需将其"BorderingStates"作为参数传递给实体;例如Entity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisis

1
@ngenisis我解决了第一个问题;幸运的是,由于您的建议,它没有添加那么多字节。您提到的关于DC的后一个问题不是问题,因为我问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 3中168个 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

在线尝试!

-4字节,感谢isaacg

-10个字节归功于ETHProductions

-1字节归功于notjagen

像其他答案一样,通过默认设置为六个来保存更多的字节。

TIO包括测试。将输入作为邮政编码。为每个集合生成状态名称列表作为字符串,并在可能的情况下将其压缩在一起(例如,WVVA存储为WVA)。lambda函数获取列表中的索引,该索引的字符串包含输入。我可能不知道高尔夫球具的功能。输出为包含整数的列表- [0]加到lambda的末尾以整数形式输出。


另外,您只使用l一次,因此最好内联它。
isaacg

@ETHproductions是的,谢谢
斯蒂芬

@isaacg,谢谢,dunno,为什么我没有看到它
Stephen

重新排列得克萨斯州的位置为-1个字节
notjagan

@notjagan谢谢,错过了
Stephen

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

在线尝试!

十六进制转储:

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因为它将与Colorado和匹配California。(以及Conneticut和卡罗来纳州),一旦我们对每个边界超过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而言是失败的,因此我添加了两个字节来解决此问题。151至153字节。


1
我很确定这失败了AKHI因为0||6计算结果为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嗯,我从其他任何帖子中都没有得到这个主意,如果您看一下“令人讨厌的哈希算法”,我会在一个小时左右的时间里散布随机的哈希主意,然后思考一下空格,发现我无法无论我多么努力,都要击败该实现。
魔术八达通

@Stephen现在我读了您的书,希望我也考虑过默认为6 xD。
魔术章鱼缸

1
我没想到,我首先在这个答案上看到它,所以随时考虑:P
Stephen

2

视网膜106个 105字节

MO|TN
8
CO|KY
7
AK|HI
0
ME
1
FL|WA
2
[CDLR].|N[HJD]|VT
3
.[CSX]|AL|IN|MD|MT|OR|WI
4
[GMV].|.[HMVZ]
5
..
6

在线尝试!有人说过正则表达式吗?编辑:由于@Arnauld,节省了1个字节。


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

Excel VBA中,177 154 147个字节

匿名VBE函数String从range接受代表状态州邮政编码的预期类型的​​输入,[A1]并返回,Integer它表示与该州接壤的州的数量。

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)

让我们从稍微优化的简单硬编码答案开始。将邮政编码作为输入。

-145字节感谢bfontaine。


4
使用dict(MO=8,TN=8,...)代替可以节省近100个字节{'MO':8,'TN':8,...}。然后,通过使用.get(a,6)和删除与其他6个州接壤的那些州,您可以节省近50个字节。通过这两个技巧,我可以降至219。
bfontaine

@Mitch通过使用空间而不是.做来节省更多split()(我认为)
Stephen

@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
Izaak van Dongen

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,因此我们执行一些逻辑以查看是否$a是其中一种0状态,并在必要时减去。无论如何,它留在管道上,并且输出是隐式的。


1

Python 3,729733字节

将输入内容作为邮政的缩写。这是我第一次尝试打高尔夫球,这是我想用这种地狱般的方法所能得到的最短的尝试。我知道它很庞大-考虑一下我可能会更好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

我只是意识到我已经奢侈了三个字母的变量名-减少了4个字节,还有400个字节!


欢迎来到PPCG!有时,更简单的解决方案会更短一些,如其他Python回答所示:P
Stephen

是的,我喜欢您为此付出的所有努力,考虑到您的罪恶感是“使您的代码如此简洁,难以辨认”,您将完全可以使用。
Zacharý17年
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.