Daha verimli ABD eyalet kodları


20

ABD eyaletini kısaltın! eğlenceliydi, ancak ABD eyalet adlarını verimli bir şekilde kısaltmanın mevcut sistemle zor olduğunu öğrendik. Verimli golf için alternatif bir devlet kodu şeması hazırlayalım.

Senin görevin:

Geçerli bir ABD durum adı (yalnızca 50 normal durum gereklidir) verildiğinde, büyük harfle tanımlayan benzersiz iki harfli kod döndüren bir işlev (veya program) yazın. Kod şu gereksinimleri karşılamalıdır:

  • İlk harf, devletin ilk harfiyle aynı olmalıdır.
  • İkinci harf, devletin diğer harflerinden biri olmalıdır (boşluk değil).
  • Aynı giriş için her zaman aynı çıkışı vermeli ve iki farklı geçerli giriş için asla aynı çıkışı vermemelidir.

Örneğin, "Alabama" verildiğinde, işleviniz "AL", "AA", "AB" veya "AM" değerlerini döndürebilir - Alaska, Arkansas vb. İçin bu değeri döndürmediği sürece ("AA "yalnızca mümkündür, çünkü" A "durum adında birden fazla görünüyor.)

Standart boşluklar yasaktır. Standart giriş / çıkış tamam. Bu kod golf, bayt olarak çok kısa bir çözüm kazanır.

Olası girdilerin tam listesi burada:

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
Çıktı her zaman iki büyük harf olmalı mı, yoksa karışık harf çıktısı mı almalı? Karışıksa, "Ab", "AB" den farklı kabul edilmelidir; ve ilk harf her zaman büyük olmalı mı?
Jonathan Allan

Boşluk karakteri geçerli bir harf olarak mı değerlendiriliyor?
Jonathan Allan

Hayır. Harfler harflerdir.
Steve Bennett

Çıktı büyük harf olmalıdır. Üzgünüm, bunu gerçekten belirtmeliydim.
Steve Bennett

Teşekkürler, en anlamlı olduklarını düşündüğüm gibi her iki kararı da aldım.
Jonathan Allan

Yanıtlar:


7

Jöle ,  13  12 bayt

907ị;⁸Qḣ2ṢŒu

Karakter listelerini alan ve döndüren monadik bir bağlantı.

Çevrimiçi deneyin! veya bir test takımına bakın

Nasıl?

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'de indeksleme 1 endeksli ve modülerdir, bu nedenle L uzunluğundaki bir şeyin 907'nci endeksi (907-modulo-L) th öğesidir. Örneğin "Alabama" için uzunluk 7'dir, bu nedenle 907 indeksindeki öğe (907-modulo-7) th'dir ve 907-modulo-7 4'tür (907 = 129 * 7 + 4 ), bu nedenle indeksteki öğe 907 'b'dir.

907, indeks 1'i kullanarak durum kısaltmalarının ve 50 durumun tamamındaki bu indeksin benzersiz hale geldiği ilk pozitif indekstir.

Boşlukları da dahil olmak üzere durum adları 4 ila 14 dahil uzunluğundadır ve 907-modulo-6 1'dir (diğer tüm uzunluklar için değer 1 değildir). Bu, Alaska, Hawaii, Kansas, Nevada ve Oregon'un sırasıyla AA, HH, KK, NN ve OO kısaltmaları için 1. ve 907. karakterleri kullanacak olsaydık - Hawaii, Kansas için kabul edilemez, veya Nevada; bu nedenle bir ayarlama yapılması gerekir; bu, birleştirme, de-duplikasyon, indeks 2'ye ve sıralamaya gitme nedenidir, bu Alaska, Hawaii, Kansas, Nevada ve Oregon'u sırasıyla AL, HA, KA, NA ve OR yapar ve mevcut eyalet kısaltmalarıyla çarpışmaz .


@LevelRiverSt şimdi iyi olmalı, ancak orijinal kusurlu olanım için bu yamadan daha kısa bir çözüm olsa da.
Jonathan Allan

Lütfen kısa bir açıklama ekleyebilir misiniz?
user1502040

@ user1502040 Bunu yapıyordum, şimdi net olmalıyım, hiçbir şey anlamadıysanız bana bildirin.
Jonathan Allan

Bunu nasıl buldunuz?
user1502040

@ user1502040 Girişteki harflerden kodlar oluşturmamız gerektiğini biliyordum ve Jelly indeksleme modülerdi, bu yüzden sadece 50 benzersiz kod veren bir dizin aradım (sadece bu tür dizinleri bulmak için bazı Python kodu yazdım - ayrıca bulma -134 ila 1000 aralığında -341 ve -773). Başlangıçta "diğer" (yani açıklandığı gibi) sorunu yamalı gereksinimi kaçırdı. (Ben de daha kısa bir şey bulamadım, ancak ben olsaydı ben sürpriz olmaz).
Jonathan Allan

3

Ruby, 34 bayt

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

Ben çıkıyor s[0]+s*99999[x].upcaseve 50 eyalette için benzersiz kodlar döndü x = 100000 kadar x'in çoğu değeri bulundu. Ne yazık ki hepsinde kısaltmanın ikinci harfinin çoğaltılmış durumun ilk harfi olduğu durumlar vardı (izin verilmez (harf, eyalet adında iki kez görünmediği sürece).) Bu yüzden ifadeyi kullanmaya karar verdim s[0]+s[1,8]*999[x]ve en küçük değerini buldum. Çalışan x 445 idi.

Test programına yorum ve çıktı

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
İkinci harfin ilk harfle aynı olamayacağı kuralı nerede gördünüz? Örneğin Alabama için "AA" bile vardı.
Paŭlo Ebermann

3
The second letter must be one of the other letters of the state. Alabama için AA iyidir çünkü Alabama'da iki A vardır. KK Kentucky için iyidir, örneğin Kansas için değildir.
Level River St


2

JavaScript (ES6), 46 bayt

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

gösteri


1

Retina , 49 46 bayt

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

T`l`L
!`^..

Çevrimiçi deneyin! Durum ikinci bir büyük harf veya harflerden birini içeriyorsa flmpxz, bu kodun ikinci harfi olur. Aksi takdirde, harflerden birini içeriyorsa hru, bu kodun ikinci harfi olur, aksi takdirde sadece devletin ilk iki harfini kullanın.


0

JavaScript (ES6), 52 bayt

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


JavaScript (ES6), 52 bayt

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


2
Hawaii, Kansas ve Nevada'da artık geçersiz kısaltmalar var. (İkinci harf eyaletin diğer harflerinden biri olmalı .) Jelly sorunumdaki bu sorunu çözdüm.
Jonathan Allan

Ah, ne kadar da zor! İlk cevabıma geri dönmeliyim, kaydettiğim güzel şey.
darrylyeo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.