更有效的美国州代码


20

缩写为美国州!虽然很有趣,但是我们了解到在当前系统中很难有效地缩写美国州名。让我们提出一种替代性的状态代码方案,以提高高尔夫效率。

你的任务:

编写一个函数(或程序),给定一个有效的美国州名(仅需要50个正常状态),并以大写形式返回唯一的两个字母的代码来标识它。该代码必须满足以下要求:

  • 首字母必须与州的首字母相同。
  • 第二个字母必须是状态的其他字母之一(不能为空格)。
  • 它必须始终为相同的输入提供相同的输出,并且绝对不能为两个不同的有效输入提供相同的输出。

例如,给定“阿拉巴马州”,您的函数可以返回“ AL”,“ AA”,“ AB”或“ AM”-只要它不为阿拉斯加,阿肯色州等中的任何一个返回该值。之所以只能使用“”,是因为状态名称中多次出现“ 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

2
输出应该始终是两个大写字母,还是可以输出混合大小写?如果可以混合,则应将“ Ab”视为不同于“ AB”;并且第一个字母必须总是大写吗?
乔纳森·艾伦,

空格字符是否被视为有效字母?
乔纳森·艾伦,

不,字母是字母。
史蒂夫·本内特

输出必须为大写。抱歉,我确实应该指定那个。
史蒂夫·本内特

谢谢,我同意了这两项裁定,因为我确实认为它们最有意义。
乔纳森·艾伦,

Answers:


7

果冻 13  12 字节

907ị;⁸Qḣ2ṢŒu

用于获取和返回字符列表的单子链接。

在线尝试!或查看测试套件

怎么样?

907ị;⁸Qḣ2ṢŒu - Monadic link: list of characters, state    e.g. Alabama   or   Kansas
907          - literal 907
   ị         - index into state                                b              K
     ⁸       - link's left argument, state
    ;        - concatenate                                     bAlabama       KKansas
      Q      - de-duplicate (unique by 1st appearance)         bAlam          Kans
       ḣ2    - head to index 2                                 bA             Ka
         Ṣ   - sort                                            Ab             Ka
          Œu - convert to uppercase                            AB             KA

Jelly中的索引是1索引并且是模块化的,因此长度为L的 907 索引是第(907-modulo-L)项。例如,对于“亚拉巴马”的长度为7,从而在索引907的项是(907-模7),和907-模7是4(907 = 129 * 7 + 4),所以在索引项907是'b'。

907是第一个正索引,在该索引处使用索引1的州缩写和在所有50个州中的索引都唯一。

状态名称(包括它们的空格)的长度在4到14之间(包括4和14),而907-modulo-6是1(而对于所有其他长度,该值都不是1)。也就是说,如果我们使用第1个和第907个字符作为缩写,则阿拉斯加,夏威夷,堪萨斯州,内华达州和俄勒冈州分别为AA,HH,KK,NN和OO-夏威夷,堪萨斯州,或内华达州;因此需要进行调整;这就是级联,重复数据删除,进入索引2并进行排序的原因,这使得阿拉斯加,夏威夷,堪萨斯州,内华达州和俄勒冈州分别成为AL,HA,KA,NA和OR,并且不与现有的州名缩写冲突。


@LevelRiverSt现在应该可以,尽管对于我原始的有缺陷的补丁,可能有比此补丁更短的解决方案。
乔纳森·艾伦,

能否请您简要说明一下?
user1502040

@ user1502040我正在这样做,现在应该弄清楚,如果您什么都不懂,请告诉我。
乔纳森·艾伦,

您是怎么想到的?
user1502040

@ user1502040我知道我们需要根据输入中的字母创建代码,并且Jelly索引是模块化的,因此我只是在寻找一个可以提供50个唯一代码的索引(我只是写了一些Python代码来找到此类索引, -341和-773在-1000至1000范围内)。我最初错过了对“其他”的要求,因此解决了该问题(如上所述)。(我也没有发现任何短的东西,尽管如果有的话我也不会感到惊讶)。
乔纳森·艾伦,

3

Ruby,34个字节

->s{s[0]+(s[1,8]*999)[445].upcase}

我开始时s[0]+s*99999[x].upcase发现了很多x值,最多x = 100000,它们返回了所有50个州的唯一代码。不幸的是,他们都遇到过缩写的第二个字母是州的第一个字母重复的情况,这是不允许的(除非该字母在州名称中出现两次)。因此,我决定使用该表达式s[0]+s[1,8]*999[x]并找到的最小值x有效的是445。

在测试程序中注释,并输出

f=->s{s[0]+            #Return character 0 of the input. Then..
(s[1,8]*999)[          #Concatenate 999 copies of the 8 characters starting at character 1 (or till end of name if state has less than 9 characters) 
   445].upcase         #Return character 445 of the result, converted to uppercase. 
}                     
"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($/).map{|i|p [f[i],i]}

["AA", "Alabama"]
["AL", "Alaska"]
["AI", "Arizona"]
["AS", "Arkansas"]
["CR", "California"]
["CA", "Colorado"]
["CT", "Connecticut"]
["DA", "Delaware"]
["FO", "Florida"]
["GO", "Georgia"]
["HA", "Hawaii"]
["IA", "Idaho"]
["IO", "Illinois"]
["ID", "Indiana"]
["IW", "Iowa"]
["KA", "Kansas"]
["KC", "Kentucky"]
["LA", "Louisiana"]
["MI", "Maine"]
["MA", "Maryland"]
["MH", "Massachusetts"]
["MG", "Michigan"]
["MO", "Minnesota"]
["MS", "Mississippi"]
["MU", "Missouri"]
["MN", "Montana"]
["NS", "Nebraska"]
["NE", "Nevada"]
["NM", "New Hampshire"]
["NR", "New Jersey"]
["NX", "New Mexico"]
["NO", "New York"]
["NC", "North Carolina"]
["ND", "North Dakota"]
["OI", "Ohio"]
["OO", "Oklahoma"]
["OR", "Oregon"]
["PL", "Pennsylvania"]
["RI", "Rhode Island"]
["SC", "South Carolina"]
["SD", "South Dakota"]
["TS", "Tennessee"]
["TX", "Texas"]
["UA", "Utah"]
["VR", "Vermont"]
["VN", "Virginia"]
["WG", "Washington"]
["WI", "West Virginia"]
["WS", "Wisconsin"]
["WO", "Wyoming"]

1
您在哪里看到第二个字母不能与第一个字母相同的规则?该示例甚至在阿拉巴马州使用“ AA”。
圣保罗Ebermann

3
The second letter must be one of the other letters of the state. 阿拉巴马州的AA很好,因为阿拉巴马州有两个A。KK对肯塔基州很好,但对堪萨斯州则不行。
圣约翰河上的水平


2

JavaScript(ES6),46个字节

s=>s[0]+s[(s>'M')+1153%s.length].toUpperCase()

演示版


1

视网膜49 46字节

\B.*(?=[A-Zflmpxz])|\B.*(?=[hru])

T`l`L
!`^..

在线尝试!如果状态包含第二个大写字母或一个字母flmpxz,则该字母成为代码的第二个字母。否则,如果它包含字母之一hru,则该字母将成为代码的第二个字母,否则仅使用状态的前两个字母。


0

JavaScript(ES6),52个字节

s=>s[0]+(s=s.slice(2,9))[146%s.length].toUpperCase()


JavaScript(ES6),52个字节

s=>s[0]+(s[8]||s[s[1]=='o'?5:4]||s[2]).toUpperCase()


2
夏威夷,堪萨斯州和内华达州现在有无效的缩写。(第二个字母必须是该州的其他字母之一。)我在果冻解决方案中解决了这个确切的问题。
乔纳森·艾伦,

啊,好棘手!我将不得不回到我的第一个答案,好东西我保存了下来。
darrylyeo
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.