Kode negara bagian AS lebih efisien


20

Singkat negara bagian AS itu! menyenangkan, tetapi kami belajar bahwa menyingkat nama negara bagian AS secara efisien sulit dilakukan dengan sistem saat ini. Mari kita datang dengan skema kode negara alternatif untuk bermain golf yang efisien.

Tugas Anda:

Tulis fungsi (atau program) yang, diberi nama negara bagian AS yang valid (hanya diperlukan 50 negara bagian normal), mengembalikan kode dua huruf unik dalam huruf besar yang mengidentifikasinya. Kode harus memenuhi persyaratan ini:

  • Huruf pertama harus sama dengan huruf pertama negara.
  • Huruf kedua harus merupakan salah satu huruf lain dari negara bagian (bukan spasi).
  • Itu harus selalu memberikan output yang sama untuk input yang sama, dan tidak boleh memberikan output yang sama untuk dua input valid berbeda.

Misalnya, mengingat "Alabama", fungsi Anda dapat mengembalikan "AL", "AA", "AB" atau "AM" - selama itu tidak mengembalikan nilai itu untuk Alaska, Arkansas, dll. ("AA "hanya mungkin karena" A "muncul lebih dari satu kali dengan nama negara.)

Celah standar dilarang. Input / output standar ok. Ini adalah kode golf, jadi solusi terpendek, dalam byte, menang.

Daftar lengkap kemungkinan input ada di sini:

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
Haruskah output selalu berupa dua huruf besar, atau apakah OK untuk menampilkan case campuran? Jika campuran OK, "Ab" dianggap berbeda dari "AB"; dan haruskah huruf pertama selalu huruf besar?
Jonathan Allan

Apakah karakter spasi dianggap sebagai huruf yang valid?
Jonathan Allan

Tidak. Surat adalah surat.
Steve Bennett

Output harus huruf besar. Maaf, saya benar-benar harus menentukan itu.
Steve Bennett

Terima kasih, saya pergi dengan kedua keputusan itu karena saya pikir mereka paling masuk akal.
Jonathan Allan

Jawaban:


7

Jelly ,  13  12 byte

907ị;⁸Qḣ2ṢŒu

Tautan monadik yang mengambil dan mengembalikan daftar karakter.

Cobalah online! atau lihat test suite

Bagaimana?

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

Pengindeksan dalam Jelly adalah 1-diindeks dan modular, sehingga 907 th indeks sesuatu panjang L adalah (907-modulo-L) th barang. Misalnya untuk "Alabama" panjangnya adalah 7 sehingga item pada indeks 907 adalah (907-modulo-7) ke-th , dan 907-modulo-7 adalah 4 (907 = 129 * 7 + 4 ), jadi item pada indeks 907 adalah 'b'.

907 adalah indeks positif pertama di mana singkatan negara menggunakan indeks 1 dan indeks di atas semua 50 negara menjadi unik.

Nama negara, termasuk spasinya, memiliki panjang 4 hingga 14 inklusif, dan 907-modulo-6 adalah 1 (sedangkan untuk semua panjang lainnya nilainya tidak 1). Ini berarti bahwa jika kita menggunakan karakter ke-1 dan ke-907 untuk singkatan bahwa Alaska, Hawaii, Kansas, Nevada, dan Oregon masing-masing akan menjadi AA, HH, KK, NN, dan OO - ini tidak dapat diterima untuk Hawaii, Kansas, atau Nevada; jadi penyesuaian perlu dilakukan; ini adalah alasan untuk penggabungan, de-duplikasi, menuju ke indeks 2 dan urutkan, ini membuat Alaska, Hawaii, Kansas, Nevada, dan Oregon menjadi AL, HA, KA, NA dan OR masing-masing dan tidak bertabrakan dengan singkatan negara yang ada .


@LevelRiverSt seharusnya OK sekarang, meskipun mungkin ada solusi yang lebih pendek dari patch ini ke yang asli saya cacat.
Jonathan Allan

Bisakah Anda menambahkan penjelasan singkat?
user1502040

@ user1502040 saya melakukannya, harus jelas sekarang, beri tahu saya jika Anda tidak mengerti apa-apa.
Jonathan Allan

Bagaimana Anda membuat ini?
user1502040

@ user1502040 Saya tahu kami harus membuat kode dari huruf-huruf dalam input, dan bahwa pengindeksan Jelly adalah modular, jadi saya hanya mencari indeks yang memberikan 50 kode unik (saya hanya menulis beberapa kode Python untuk menemukan indeks seperti itu - juga menemukan -341 dan -773 dalam kisaran -1000 hingga 1000). Saya awalnya melewatkan persyaratan untuk "lain" sehingga menambal masalah (seperti yang dijelaskan). (Saya belum menemukan sesuatu yang lebih pendek, meskipun saya tidak akan terkejut jika ada).
Jonathan Allan

3

Ruby, 34 byte

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

Saya mulai dengan s[0]+s*99999[x].upcasedan menemukan banyak nilai x hingga x = 100000 yang mengembalikan kode unik untuk semua 50 negara. Sayangnya mereka semua memiliki kasus di mana huruf kedua singkatan adalah huruf pertama dari negara yang digandakan, yang tidak diperbolehkan (kecuali jika huruf itu muncul dua kali dalam nama negara.) Jadi saya memutuskan untuk menggunakan ekspresi s[0]+s[1,8]*999[x]dan menemukan nilai terkecil dari x yang berhasil adalah 445.

Berkomentar di program pengujian, dan output

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
Di mana Anda melihat aturan bahwa huruf kedua tidak boleh sama dengan yang pertama? Contohnya bahkan memiliki "AA" untuk Alabama.
Paŭlo Ebermann

3
The second letter must be one of the other letters of the state. AA untuk Alabama baik-baik saja karena Alabama memiliki dua A. KK baik-baik saja untuk Kentucky tetapi tidak untuk Kansas misalnya.
Level River St


2

JavaScript (ES6), 46 byte

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

Demo


1

Retina , 49 46 byte

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

T`l`L
!`^..

Cobalah online! Jika negara berisi huruf besar kedua, atau salah satu huruf flmpxz, maka itu menjadi huruf kedua dari kode. Kalau tidak, jika itu berisi salah satu huruf hru, maka itu menjadi huruf kedua dari kode, jika tidak gunakan saja dua huruf pertama dari negara.


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, dan Nevada kini memiliki singkatan yang tidak valid. (Surat kedua harus menjadi salah satu lainnya huruf negara.) Saya memutuskan masalah ini tepat dalam larutan Jelly saya.
Jonathan Allan

Ah, sungguh rumit! Saya harus kembali ke jawaban pertama saya, untungnya saya menyimpannya.
darrylyeo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.