Более эффективные коды штатов США


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
Должны ли выходные данные всегда состоять из двух заглавных букв, или это нормально для вывода смешанного регистра? Если смешано в порядке, следует считать «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

Индексирование в желе является 1-индексированным и модульным, поэтому 907- й индекс чего-то длины L является (907-по модулю L) -ым элементом. Например, для «Алабама» длина равна 7, поэтому элемент с индексом 907 является (907-по модулю 7- го ) , а 907 по модулю 7 равен 4 (907 = 129 * 7 + 4 ), поэтому элемент с индексом 907 это «б».

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

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


@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]и нашел наименьшее значение х, который работал, был 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
Где вы увидели правило, что вторая буква не может совпадать с первой? В примере даже было «АА» для Алабамы.
Пауло Эберманн

3
The second letter must be one of the other letters of the state. АА для Алабамы - это хорошо, потому что у Алабамы есть два А. KK хорошо для Кентукки, но не для Канзаса, например.
Уровень River St


2

JavaScript (ES6), 46 байт

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

демонстрация


1

Retina , 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.