보다 효율적인 미국 주 코드


20

그 미국 상태를 축약하십시오! 재미 있었지만, 현재의 시스템에서는 미국의 주 이름을 효율적으로 축약하는 것이 어렵다는 것을 알게되었습니다. 효율적인 골프를위한 대체 상태 코드 체계를 생각해 봅시다.

당신의 작업 :

유효한 미국 주 이름 (50 개의 일반 주만 필요)이 주어지면 고유 한 2 문자 코드를 대문자로 반환하는 함수 (또는 프로그램)를 작성하십시오. 코드는 다음 요구 사항을 충족해야합니다.

  • 첫 글자는주의 첫 글자와 같아야합니다.
  • 두 번째 문자는 다른 문자 중 하나 여야합니다 (공백 아님).
  • 항상 동일한 입력에 대해 동일한 출력을 제공해야하며 두 개의 다른 유효한 입력에 대해 동일한 출력을 제공해서는 안됩니다.

예를 들어, "Alabama"가 지정된 경우, 함수가 "AL", "AA", "AB"또는 "AM"을 반환 할 수 있습니다. 알래스카, 아칸소 등의 값이 반환되지 않는 한 ( "AA" "는 상태 이름에"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"와 다른 것으로 간주해야합니다. 첫 글자는 항상 대문자 여야합니까?
Jonathan Allan

공백 문자가 유효한 문자로 간주됩니까?
Jonathan Allan

아니요. 글자는 글자입니다.
Steve Bennett

출력은 대문자 여야합니다. 미안, 난 정말 그것을 지정해야합니다.
Steve Bennett

고마워, 나는 그들이 가장 이해가되었다고 생각한 것에 따라 두 판결을 모두 갔다.
Jonathan Allan

답변:


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이며 907- 모듈로 -6은 1입니다 (다른 모든 길이의 경우 값은 1이 아님). 즉, 알래스카, 하와이, 캔자스, 네바다 및 오레곤이 각각 AA, HH, KK, NN 및 OO라는 약어에 1, 907 번째 문자를 사용하는 경우 하와이, 캔자스에서는 허용되지 않습니다. 또는 네바다; 따라서 조정이 필요합니다. 이것이 연결, 중복 제거, 색인 2로 향하고 정렬하는 이유입니다. 이로 인해 알래스카, 하와이, 캔자스, 네바다 및 오레곤이 각각 AL, HA, KA, NA 및 OR이되고 기존 주 약어와 충돌하지 않습니다. .


@LevelRiverSt는 이제 괜찮을 것입니다.하지만 원래 패치에 비해이 패치보다 더 짧은 해결책이있을 것입니다.
Jonathan Allan

간단한 설명을 추가해 주시겠습니까?
user1502040

@ user1502040 내가 그렇게하고 있었으므로 지금 분명해야합니다. 아무것도 이해하지 못하면 알려주십시오.
Jonathan Allan

이걸 어떻게 생각 해냈어?
user1502040

@ user1502040 입력의 문자로 코드를 작성해야한다는 것을 알고 젤리 인덱싱은 모듈 식이므로 50 개의 고유 코드를 제공하는 인덱스를 찾았습니다 (그런 인덱스를 찾기 위해 파이썬 코드를 작성했습니다. -1000 ~ 1000 범위 내에서 -341 및 -773). 원래 "기타"에 대한 요구 사항을 놓쳤으므로 (설명 된대로) 문제를 해결했습니다. (내가 있으면 놀랄 일이 없지만, 더 짧은 것을 찾지 못했습니다).
Jonathan Allan

3

루비, 34 바이트

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

처음부터 시작하여 s[0]+s*99999[x].upcase50 개 상태 모두에 대해 고유 코드를 반환하는 최대 x = 100000까지의 많은 값을 찾았습니다. 불행히도 약어의 두 번째 문자가 복제 된 상태의 첫 번째 문자 인 경우가있었습니다. (문자가 상태 이름에 두 번 나타나지 않는 한) 허용되지 않습니다. 그래서 표현식을 사용하기로 결정 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"도있었습니다.
Paŭlo Ebermann 2016 년

3
The second letter must be one of the other letters of the state. 앨라배마에는 2 개의 A가 있기 때문에 앨라배마의 AA는 괜찮습니다. KK는 켄터키에게는 좋지만 캔사스에는 적합하지 않습니다.
레벨 리버 St


2

자바 스크립트 (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

자바 스크립트 (ES6), 52 바이트

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


자바 스크립트 (ES6), 52 바이트

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


2
하와이, 캔자스 및 네바다에 잘못된 약어가 있습니다. (두 번째 문자는 주의 다른 문자 중 하나 여야합니다 .) Jelly 솔루션에서이 정확한 문제를 해결했습니다.
Jonathan Allan

아, 참 까다 롭다! 첫 번째 답변으로 되돌려 야합니다. 저장 한 것이 좋습니다.
darrylyeo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.