Mã tiểu bang Hoa Kỳ hiệu quả hơn


20

Viết tắt là tiểu bang Hoa Kỳ! rất vui, nhưng chúng tôi đã học được rằng viết tắt tên nhà nước Mỹ một cách hiệu quả là khó với hệ thống hiện tại. Chúng ta hãy đưa ra một sơ đồ mã trạng thái thay thế để chơi golf hiệu quả.

Nhiệm vụ của bạn:

Viết một hàm (hoặc chương trình), với tên trạng thái hợp lệ của Hoa Kỳ (chỉ yêu cầu 50 trạng thái bình thường), trả về mã hai chữ cái duy nhất bằng chữ in hoa xác định nó. Mã phải đáp ứng các yêu cầu sau:

  • Chữ cái đầu tiên phải giống với chữ cái đầu tiên của tiểu bang.
  • Chữ cái thứ hai phải là một trong những chữ cái khác của trạng thái (không phải là khoảng trắng).
  • Nó phải luôn cung cấp cùng một đầu ra cho cùng một đầu vào và không bao giờ phải cung cấp cùng một đầu ra cho hai đầu vào hợp lệ khác nhau.

Chẳng hạn, với "Alabama", chức năng của bạn có thể trả về "AL", "AA", "AB" hoặc "AM" - miễn là nó không trả về giá trị đó cho bất kỳ Alaska, Arkansas, v.v. ("AA "chỉ có thể vì" A "xuất hiện nhiều lần trong tên trạng thái.)

Sơ hở tiêu chuẩn bị cấm. Tiêu chuẩn đầu vào / đầu ra là ok. Đây là mã golf, vì vậy giải pháp ngắn nhất, tính bằng byte, thắng.

Danh sách đầy đủ các đầu vào có thể có ở đây:

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
Đầu ra phải luôn luôn là hai chữ cái viết hoa, hoặc nó có ổn với đầu ra hỗn hợp không? Nếu hỗn hợp là OK thì "Ab" được coi là khác với "AB"; và chữ cái đầu tiên phải luôn là chữ hoa?
Jonathan Allan

Là nhân vật không gian được coi là một lá thư hợp lệ?
Jonathan Allan

Không. Chữ cái là chữ cái.
Steve Bennett

Đầu ra phải là chữ hoa. Xin lỗi, tôi thực sự nên đã chỉ định rằng.
Steve Bennett

Cảm ơn, tôi đã đi với cả hai phán quyết đó vì tôi nghĩ chúng có ý nghĩa nhất.
Jonathan Allan

Câu trả lời:


7

Thạch ,  13  12 byte

907ị;⁸Qḣ2ṢŒu

Một liên kết đơn và lấy danh sách các ký tự.

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm

Làm sao?

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

Indexing trong Jelly là 1-lập chỉ mục và mô-đun, vì vậy 907 ngày chỉ số của một cái gì đó có độ dài L là (907-modulo-L) thứ mục. Ví dụ cho "Alabama" chiều dài là 7 nên mục tại index 907 là (907-modulo-7) ngày , và 907-modulo-7 là 4 (907 = 129 * 7 + 4 ), vì vậy mục tại index 907 là 'b'.

907 là chỉ số tích cực đầu tiên mà tại đó các chữ viết tắt trạng thái sử dụng chỉ số 1 và chỉ số đó trên tất cả 50 trạng thái trở nên duy nhất.

Tên trạng thái, bao gồm cả khoảng trắng của chúng, có độ dài từ 4 đến 14, và 907-modulo-6 là 1 (trong khi đối với tất cả các độ dài khác, giá trị không phải là 1). Điều này có nghĩa là nếu chúng ta sử dụng các ký tự thứ 1 và 907 cho các chữ viết tắt thì Alaska, Hawaii, Kansas, Nevada và Oregon sẽ lần lượt là AA, HH, KK, NN và OO - điều này không được chấp nhận đối với Hawaii, Kansas, hoặc Nevada; vì vậy một sự điều chỉnh cần phải được thực hiện; đây là lý do của sự kết hợp, khử trùng lặp, hướng đến chỉ số 2 và sắp xếp, điều này làm cho Alaska, Hawaii, Kansas, Nevada và Oregon lần lượt trở thành AL, HA, KA, NA và OR và không va chạm với các chữ viết tắt nhà nước hiện có .


@LevelRiverSt sẽ ổn ngay bây giờ, mặc dù có thể có một giải pháp ngắn hơn bản vá này cho bản gốc còn thiếu sót của tôi.
Jonathan Allan

Bạn có thể vui lòng thêm một lời giải thích ngắn gọn?
user1502040

@ user1502040 Tôi đã làm như vậy, nên rõ ràng ngay bây giờ, cho tôi biết nếu bạn không hiểu gì.
Jonathan Allan

Làm thế nào bạn đến với điều này?
user1502040

@ user1502040 Tôi biết rằng chúng tôi cần tạo mã từ các chữ cái trong đầu vào và rằng lập chỉ mục Jelly là mô-đun, vì vậy tôi chỉ tìm một chỉ mục cung cấp 50 mã duy nhất (tôi chỉ viết một số mã Python để tìm các chỉ mục đó - cũng tìm thấy -341 và -773 trong phạm vi -1000 đến 1000). Ban đầu tôi đã bỏ lỡ yêu cầu "khác" để khắc phục vấn đề (như được mô tả). (Tôi cũng chưa tìm thấy thứ gì ngắn hơn, mặc dù tôi sẽ không ngạc nhiên nếu có).
Jonathan Allan

3

Ruby, 34 byte

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

Tôi bắt đầu với s[0]+s*99999[x].upcasevà tìm thấy nhiều giá trị của x lên đến x = 100000, trả về mã duy nhất cho tất cả 50 tiểu bang. Thật không may, tất cả họ đều có trường hợp chữ cái viết tắt thứ hai là chữ cái đầu tiên của trạng thái trùng lặp, không được phép (trừ khi chữ cái xuất hiện hai lần trong tên trạng thái.) Vì vậy, tôi quyết định sử dụng biểu thức s[0]+s[1,8]*999[x]và tìm giá trị nhỏ nhất của x đã làm việc là 445.

Nhận xét trong chương trình thử nghiệm và đầu ra

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
Trường hợp bạn thấy quy tắc rằng chữ cái thứ hai không thể giống với chữ cái đầu tiên? Ví dụ thậm chí có "AA" cho Alabama.
Paŭlo Ebermann

3
The second letter must be one of the other letters of the state. AA cho Alabama vẫn ổn vì Alabama có hai chữ A. KK là tốt cho Kentucky nhưng không phải cho Kansas chẳng hạn.
Cấp sông St


2

JavaScript (ES6), 46 byte

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

Bản giới thiệu


1

Võng mạc , 49 46 byte

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

T`l`L
!`^..

Hãy thử trực tuyến! Nếu trạng thái chứa một chữ cái viết hoa thứ hai, hoặc một trong các chữ cái flmpxz, thì đó trở thành chữ cái thứ hai của mã. Mặt khác, nếu nó chứa một trong các chữ cái hru, thì đó sẽ trở thành chữ cái thứ hai của mã, nếu không thì chỉ sử dụng hai chữ cái đầu tiên của trạng thái.


0

JavaScript (ES6), 52 byte

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


JavaScript (ES6), 52 byte

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


2
Hawaii, Kansas và Nevada hiện đã có chữ viết tắt không hợp lệ. (Chữ cái thứ hai phải là một trong những chữ cái khác của tiểu bang.) Tôi đã giải quyết vấn đề chính xác này trong giải pháp Jelly của tôi.
Jonathan Allan

A, thật là khó khăn! Tôi sẽ phải trở lại câu trả lời đầu tiên của tôi, điều tốt là tôi đã lưu nó.
darrylyeo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.