Більш ефективні коди США


20

Скоротіть цю штат США! було весело, але ми дізналися, що ефективно скорочувати імена штатів США важко в сучасній системі. Давайте придумаємо альтернативну схему державного коду для ефективного гольфу.

Ваше завдання:

Напишіть функцію (або програму), яка, маючи дійсне ім’я штату США (потрібно лише 50 нормальних штатів), повертає унікальний двобуквенний код у верхньому регістрі, ідентифікуючи його. Код повинен відповідати цим вимогам:

  • Перший лист повинен бути таким же, як і перший лист держави.
  • Друга літера повинна бути однією з інших літер держави (а не пробілом).
  • Він завжди повинен давати однаковий вихід на один і той же вхід і ніколи не повинен давати однаковий вихід для двох різних дійсних входів.

Наприклад, давши "Алабаму", ваша функція може повернути "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
Чи слід у виведенні завжди бути великими великими літерами, чи це нормально для виведення змішаного регістру? Якщо змішане значення OK, слід вважати "Ab" відмінним від "AB"; і чи повинна перша літера завжди бути великою літерою?
Джонатан Аллан

Чи вважається пробільний символ дійсним листом?
Джонатан Аллан

Ні. Літери - це букви.
Стів Беннетт

Вихід повинен бути великим. Вибачте, я справді повинен був це вказати.
Стів Беннетт

Дякую, я пішов із обома цими рішеннями, бо вважав, що вони мають найбільше сенсу.
Джонатан Аллан

Відповіді:


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-індексованою та модульною, тому 907- й індекс чогось довжини L є (907-модульно-L) елементом. Наприклад , для «Алабами» довжина 7 тому деталь з індексом 907 є (907-модуль 7) й і 907-модуль 7 4 (907 = 129 * 7 + 4 ), так що елемент з індексом 907 - "b".

907 - це перший позитивний індекс, при якому скорочення штатів, що використовують індекс 1, і цей індекс у всіх 50 штатах стають унікальними.

Назви штатів, включаючи їх пробіли, мають довжину від 4 до 14 включно, а 907-модуль-6 дорівнює 1 (тоді як для всіх інших довжин значення не дорівнює 1). Це означає, що якби ми використовували символи 1-го та 907-го для скорочень, які Аляска, Гаваї, Канзас, Невада та Орегон були відповідно AA, HH, KK, NN, OO - це не прийнятно для Гаваїв, Канзасу, або Невада; тому необхідно здійснити коригування; це причина конкатенації, дедуплікації, перехід до індексу 2 і сортування, завдяки чому Аляска, Гаваї, Канзас, Невада та Орегон стають відповідно AL, HA, KA, NA та АБО і не стикаються з існуючими абревіатурами штатів .


@LevelRiverSt має бути в порядку зараз, хоча, мабуть, коротше рішення, ніж цей патч, для мого оригінального недоліку.
Джонатан Аллан

Чи можете ви додати коротке пояснення?
user1502040

@ user1502040 Я це робив, має бути зрозуміло зараз, повідомте мені, якщо ви нічого не розумієте.
Джонатан Аллан

Як ви придумали це?
user1502040

@ user1502040 Я знав, що нам потрібно створити коди з букв на вході, і це те, що індексація Jelly була модульною, тому я просто шукав індекс, який дав 50 унікальних кодів (я просто написав кілька кодів Python, щоб знайти такі індекси - також знаходжу -341 та -773 в межах від -1000 до 1000). Я спочатку пропустив вимогу до "інших", щоб виправити цю проблему (як описано). (Ще короткого я не знайшов, хоча і не здивувався б, якби був).
Джонатан Аллан

3

Рубін, 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
Де ви побачили правило, що друга літера не може бути такою ж, як перша? Приклад навіть мав "АА" для Алабами.
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 46 байт

\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.
Джонатан Аллан

Ах, як хитро! Мені доведеться повернутися до своєї першої відповіді, добре, що я її врятував.
darrylyeo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.