รหัสของสหรัฐอเมริกาที่มีประสิทธิภาพยิ่งขึ้น


20

อักษรย่อของสหรัฐอเมริกานั้น! สนุก แต่เราได้เรียนรู้ว่าการย่อชื่อรัฐในสหรัฐอเมริกาอย่างมีประสิทธิภาพนั้นยากกับระบบปัจจุบัน ลองมากับรูปแบบรหัสรัฐทางเลือกสำหรับการเล่นกอล์ฟที่มีประสิทธิภาพ

งานของคุณ:

เขียนฟังก์ชั่น (หรือโปรแกรม) ซึ่งให้ชื่อรัฐของสหรัฐอเมริกาที่ถูกต้อง (เพียง 50 สถานะปกติที่จำเป็น) ส่งคืนโค้ดสองตัวอักษรที่ไม่ซ้ำกันในตัวพิมพ์ใหญ่ที่ระบุมัน รหัสจะต้องตรงตามข้อกำหนดเหล่านี้:

  • ตัวอักษรตัวแรกจะต้องเหมือนกับตัวอักษรตัวแรกของรัฐ
  • ตัวอักษรตัวที่สองต้องเป็นหนึ่งในตัวอักษรอื่น ๆ ของรัฐ (ไม่ใช่ช่องว่าง)
  • จะต้องให้ผลลัพธ์เดียวกันสำหรับอินพุตเดียวกันและจะต้องไม่ให้เอาต์พุตเดียวกันสำหรับอินพุตที่ถูกต้องสองรายการ

ตัวอย่างเช่นเมื่อได้รับ "Alabama" ฟังก์ชันของคุณอาจส่งคืน "AL", "AA", "AB" หรือ "AM" - ตราบใดที่มันไม่ส่งคืนค่านั้นสำหรับ Alaska, Arkansas ฯลฯ ("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

ลิงก์ monadic ที่รับและส่งคืนรายการอักขระ

ลองออนไลน์! หรือดูชุดทดสอบ

อย่างไร?

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

การจัดทำดัชนีในเยลลี่ 1 การจัดทำดัชนีและแบบแยกดังนั้น 907 THดัชนีของบางสิ่งบางอย่างของความยาว L เป็น (907-modulo-L) THรายการ ตัวอย่างเช่น "Alabama" ความยาวคือ 7 ดังนั้นรายการที่ index 907 คือ (907-modulo-7) thและ 907-modulo-7 คือ 4 (907 = 129 * 7 + 4 ) ดังนั้นรายการที่ index 907 คือ 'b'

907 เป็นดัชนีเชิงบวกแรกที่ตัวย่อของรัฐใช้ดัชนี 1 และดัชนีนั้นในทุก ๆ 50 รัฐกลายเป็นเอกลักษณ์

ชื่อรัฐรวมถึงช่องว่างของพวกเขามีความยาว 4 ถึง 14 รวมและ 907-modulo-6 คือ 1 (ในขณะที่ความยาวอื่น ๆ ทั้งหมดค่าไม่ได้เป็น 1) ซึ่งหมายความว่าหากเราจะใช้ตัวอักษรที่ 1 และ 907 สำหรับตัวย่อที่ Alaska, Hawaii, Kansas, Nevada และ Oregon จะเป็น AA, HH, KK, NN และ OO ตามลำดับ - นี่ไม่เป็นที่ยอมรับสำหรับ Hawaii, Kansas, หรือเนวาดา; ดังนั้นจึงจำเป็นต้องทำการปรับ นี่คือเหตุผลสำหรับการเรียงต่อกันยกเลิกการทำซ้ำมุ่งหน้าไปยังดัชนี 2 และเรียงลำดับทำให้ Alaska, Hawaii, Kansas, Nevada และ Oregon กลายเป็น AL, HA, KA, NA และ OR ตามลำดับและไม่ชนกับตัวย่อสถานะที่มีอยู่ .


@LevelRiverSt ควรจะตกลงตอนนี้แม้ว่าอาจจะมีวิธีการแก้ปัญหาที่สั้นกว่าแพทช์นี้ไปยังข้อบกพร่องเดิมของฉัน
Jonathan Allan

คุณช่วยเพิ่มคำอธิบายสั้น ๆ ได้ไหม?
user1502040

@ user1502040 ฉันทำเช่นนั้นควรมีความชัดเจนตอนนี้แจ้งให้เราทราบหากคุณไม่เข้าใจอะไรเลย
Jonathan Allan

คุณคิดอย่างไรกับสิ่งนี้
user1502040

@ user1502040 ฉันรู้ว่าเราจำเป็นต้องสร้างรหัสจากตัวอักษรในอินพุตและการทำดัชนี Jelly นั้นเป็นแบบแยกส่วนดังนั้นฉันแค่มองหาดัชนีที่ให้รหัสที่ไม่ซ้ำกัน 50 รหัส (ฉันเพิ่งเขียนโค้ด Python บางตัวเพื่อค้นหาดัชนีดังกล่าว - -341 และ -773 ภายในช่วง -1000 ถึง 1,000) ฉันเดิมพลาดข้อกำหนดสำหรับ "อื่น ๆ " เพื่อแก้ไขปัญหา (ดังอธิบาย) (ฉันไม่ได้พบอะไรที่สั้นกว่านี้เช่นกันแม้ว่าฉันจะไม่แปลกใจถ้ามี)
Jonathan Allan

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" สำหรับอลาบามา
Paŭlo 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 49ไบต์

\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
ขณะนี้ฮาวายแคนซัสและเนวาดามีตัวย่อที่ไม่ถูกต้อง (ตัวอักษรตัวที่สองต้องเป็นหนึ่งในตัวอักษรอื่น ๆของรัฐ) ฉันแก้ไขปัญหาที่แน่นอนนี้ในโซลูชัน Jelly ของฉัน
Jonathan Allan

อาหากิน! ฉันจะต้องกลับคำตอบแรกของฉันสิ่งที่ดีที่ฉันบันทึกไว้
darrylyeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.