より効率的な米国の州コード


20

その米国の州を略してください!楽しかったのですが、現在のシステムでは米国の州名を効率的に短縮するのは難しいことがわかりました。効率的なゴルフのための代替の州コード体系を考えてみましょう。

あなたのタスク:

有効な米国の州名(通常の50州のみが必要)を指定して、それを識別する一意の2文字のコードを大文字で返す関数(またはプログラム)を作成します。コードは次の要件を満たしている必要があります。

  • 最初の文字は、州の最初の文字と同じでなければなりません。
  • 2番目の文字は、州の他の文字の1つでなければなりません(スペースではありません)。
  • 同じ入力に対して常に同じ出力を与える必要があり、2つの異なる有効な入力に対して同じ出力を与えてはなりません。

たとえば、「アラバマ」を指定すると、関数は「AL」、「AA」、「AB」または「AM」を返すことができます-アラスカ、アーカンソーなどのいずれに対してもその値を返さない限り(「AA "は、州名に" A "が2回以上現れるためにのみ可能です。)

標準的な抜け穴は禁止されています。標準入出力は大丈夫です。これはコードゴルフであるため、バイト単位での最短のソリューションが勝ちです。

可能な入力の完全なリストは次のとおりです。

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
出力は常に2つの大文字にする必要がありますか、それとも大文字と小文字を混在させて出力しても問題ありませんか?混合がOKの場合、「Ab」は「AB」とは異なるものと見なされます。そして、最初の文字は常に大文字でなければなりませんか?
ジョナサンアラン

スペース文字は有効な文字と見なされますか?
ジョナサンアラン

いいえ、文字は文字です。
スティーブベネット

出力は大文字でなければなりません。申し訳ありませんが、実際に指定する必要がありました。
スティーブベネット

おかげで、私はそれらの判決が最も理にかなっていると思ったので、私はそれらの裁定の両方で行った。
ジョナサンアラン

回答:


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-modulo-7)thであり、907-modulo-7は4(907 = 129 * 7 + 4)であるため、インデックスのアイテム907は「b」です。

907は、最初の正のインデックスで、インデックス1を使用する州の略語と、50州すべてのインデックスが一意になります。

スペースを含む状態名の長さは4〜14で、907-modulo-6は1です(他のすべての長さについては値は1ではありません)。つまり、アラスカ、ハワイ、カンザス、ネバダ、およびオレゴンがそれぞれAA、HH、KK、NN、およびOOであるという略語に1文字目と907文字目を使用する場合、これはハワイ、カンザス、またはネバダ州; そのため、調整が必要です。これが連結、重複排除、インデックス2へのソート、ソートの理由です。これにより、アラスカ、ハワイ、カンザス、ネバダ、オレゴンがそれぞれAL、HA、KA、NA、ORになり、既存の州の略語と衝突しません。 。


@LevelRiverStはこれで問題ありませんが、おそらく、元の欠陥のあるパッチに対するこのパッチよりも短いソリューションがあります。
ジョナサンアラン

簡単な説明を追加してもらえますか?
user1502040

@ user1502040私はそうしていたので、今はっきりしているはずです。あなたが何も理解していないなら教えてください。
ジョナサンアラン

どうやってこれを思いついたの?
user1502040

@ user1502040入力の文字からコードを作成する必要があることはわかっていましたが、Jellyインデックスはモジュール式であるため、50個の一意のコードを与えるインデックスを探しました(そのようなインデックスを見つけるためにPythonコードを作成しました- -1000から1000の範囲内の-341および-773)。私はもともと「その他」の要件を満たしていなかったため、問題を修正しました(説明どおり)。(短いものはまだ見つかりませんでしたが、もしあったとしても驚かないでしょう)。
ジョナサンアラン

3

ルビー、34バイト

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

始めてs[0]+s*99999[x].upcase、xの最大値がx = 100000であり、50個すべての状態に対して一意のコードが返されることを発見しました。残念なことに、略語の2番目の文字が複製された状態の最初の文字である場合がありますが、これは許可されません(状態名に2回表示されない限り)。したがって、式を使用することを決定し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
2番目の文字を最初の文字と同じにすることはできないというルールをどこで見ましたか?この例には、アラバマ州の「AA」も含まれていました。
パエロエベルマン

3
The second letter must be one of the other letters of the state. アラバマには2つのAがあるため、アラバマのAAは問題ありません。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
!`^..

オンラインでお試しください!状態に2番目の大文字、または文字の1つが含まれている場合flmpxz、それがコードの2番目の文字になります。それ以外の場合、文字の1つが含まれている場合、それがhruコードの2番目の文字になります。そうでない場合は、州の最初の2文字を使用します。


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
ハワイ、カンザス、ネバダは現在、無効な略語を持っています。(2番目文字は、州の他の文字の1つである必要があります。)私はJellyソリューションでこの正確な問題を解決しました。
ジョナサンアラン

あ、なんてトリッキー!私は最初の答えに戻らなければなりません。良いことは保存しました。
-darrylyeo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.