Учитывая одно из 50 названий штатов США слева в качестве входных данных, выведите двухбуквенный почтовый индекс, как показано справа:
Alabama AL
Alaska AK
Arizona AZ
Arkansas AR
California CA
Colorado CO
Connecticut CT
Delaware DE
Florida FL
Georgia GA
Hawaii HI
Idaho ID
Illinois IL
Indiana IN
Iowa IA
Kansas KS
Kentucky KY
Louisiana LA
Maine ME
Maryland MD
Massachusetts MA
Michigan MI
Minnesota MN
Mississippi MS
Missouri MO
Montana MT
Nebraska NE
Nevada NV
New Hampshire NH
New Jersey NJ
New Mexico NM
New York NY
North Carolina NC
North Dakota ND
Ohio OH
Oklahoma OK
Oregon OR
Pennsylvania PA
Rhode Island RI
South Carolina SC
South Dakota SD
Tennessee TN
Texas TX
Utah UT
Vermont VT
Virginia VA
Washington WA
West Virginia WV
Wisconsin WI
Wyoming WY
правила
- Вход и выход чувствительны к регистру. Вы много не выводятся , например ,
Al
дляAlabama
. - Вы можете предположить, что вводом является одно из 50 названий состояний, показанных выше.
- Вы не можете получить доступ к Интернету или использовать встроенные данные о состоянии (глядя на вас, Mathematica).
Отдельные списки входов и выходов можно найти в этом фрагменте (пожалуйста, не запускайте его, это просто для сжатия сообщения):
(Не набирая баллы) Очки Брауни, если вы также можете взять в District of Columbia
качестве исходных данных и производства DC
, Виргинские острова и т. Д. И т. Д.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах на каждом языке .
(Первоначально предложено ETHProductions)
code-golf
string
kolmogorov-complexity
state-abbreviation
Стив Беннетт
источник
источник
Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
20
байты:Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&
:)Ответы:
Javascript,
124117 байт(сэкономлено 7 байт благодаря hvd)
Объяснение:
источник
[A-Z]
не нужна, поскольку известно, что ввод действителен. Особый случай Айовы может быть сокращен, чтобы[AFIOUW][^o]
исключить это, оставляя это для финала.+
.s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()
мы можем добраться до 100? :)Javascript,
13713513413211311010810199949392 байтаЭто основано на решении HP Williams, с некоторыми улучшениями вне регулярных выражений и несколькими изменениями в нем.
(Разрывы строк только для удобства чтения)
Комментарий к регулярному выражению:
Бессмысленное альтернативное регулярное выражение (той же длины):
история
94
99
101
108
110
113
132
134
135
137
источник
...s.s?
захватывает Миссисипи, Миссури, Массачусетс и Аляску) случайно. На самом деле я находился в процессе перемещения.*sk
фрагмента куда-то еще, и тесты просто запускались и проходили, а фрагмента нигде не было. Легче всего получить 5 персонажей!...s.s?
это также непреднамеренно соответствует Канзасу, и, чудом, все еще дает правильный результат.M[onti]+
. Так странно: если состояние начинается с M, то вторая буква является последней в последовательности, по крайней мере, одного o, n, t или i. Очень странный способ захватить Мичиган, Миннесоту или Монтану.JavaScript (ES6),
156136 байтдемонстрация
Показать фрагмент кода
источник
X MOD[50-1000] MOD[50-1000] MOD[50-100]
. Но это.slice(1)
была ошибка. В настоящее время снова работает на всю строку.Желе , 75 байт
Попробуйте онлайн!
... или посмотрите набор тестов. Обратите внимание, что нужно было внести небольшое изменение, чтобы запустить полную программу для нескольких входов за один раз (я поменял атом ввода программы,
³
для вызова из регистра®
, один и установил регистр каждому названию штата по очереди).Как?
Вычисляет индекс для использования для второго символа почтового индекса, добавляет его к первому символу и в верхнем регистре результат.
Сначала находит индекс пробела (или 0, если не найден);
Еще проверяет, Аляска ли это или Миссури (получая 5 для
k
илиo
);Иначе находит индекс состояния ввода в списке
Arizona Minnesota Mississippi Nevada Montana Texas Tennessee
(или 0, если не найден) - если это так, он принимает индекс mod 2 плюс 3 (дляz n s v t x n
);Иначе, преобразует строку в ординалы, преобразовывает ее из базы 256, находит остаток после деления на 29487, находит остаток после деления на 14 и использует ее для индексации в двоичном представлении 9620 и удваивает результат - получая 0 для штатов, которые используют свою последнюю букву и 2 для тех, которые используют свою вторую букву.
Все, кроме самого первого случая, увеличиваются, а результирующее значение уменьшается (увеличивая индекс пространства, найденный на единицу).
источник
Python 2 , 191 байт
Попробуйте онлайн!
Использует простую хэш-функцию, чтобы найти второй символ аббревиатуры.
источник
Python 2,
9490 байтПопробуйте онлайн
(Только Python 2, поскольку хэши Python 3 нестабильны, а также вы не можете хэшировать строку, не превращая ее в байты.)
Работает со всеми 50 штатами, а также в качестве бонусного округа Колумбия и Пуэрто-Рико.
Можно было бы сохранить один байт, написав число в базе-36:
int("5clu7x0aixb0pelmpugv5iiibphrpf",36)
.Я жду, чтобы увидеть, могу ли я придумать более креативное решение.Обновить:
Поскольку в хэше 12 неиспользуемых позиций цифр, есть 2 36 возможных номеров, которые будут работать. Казалось разумным полагать, что у одного из них будет главный фактор с большим показателем. Для любого заданного простого числа и показателя степени найти значение довольно быстро; Мне удалось найти одно с коэффициентом 19 9 , уменьшив размер выражения, необходимого для представления числа, на четыре байта.
По сути, это та же процедура, что и в моем ответе на C, но с использованием Python. Поскольку базовая хеш-функция отличается, мне пришлось найти другую функцию сокращения, которая оказывается mod 52 вместо mod 54. Но самая большая экономия по сравнению с C связана с возможностью использования bignums для кодирования вектора, и, конечно, тот факт, что стандартом для Python является то, что можно использовать лямбда-литерал вместо полной программы.
источник
Retina ,
1138180777068 байтПопробуйте онлайн! Включает в себя все 51 тестовых случаев. Сохранено 32 байта путем присвоения регулярного выражения @ JörgHülsermann, которое находит вторую букву (с настройкой для поддержки DC; редактирование: сохранено 1 байт благодаря @ JörgHülsermann). Сэкономили 3 байта, переключившись на регулярное выражение @ SteveBennett из своего комментария в ответ @ HPWilliam. Сохранено
79 байт, еще раз спасибо @SteveBennett. Другие буквы затем удаляются, а строка в верхнем регистре.источник
e
был самым хлопотным, правда.d
. (Возможно, вы захотите использовать автоматическое тестирование - у меня есть скрипт, который постоянно проверяет все 50 случаев.)PHP> = 7,1, 113 байт
Онлайн версия
Забастовки проходят через более раннее начало матча
([vxz])
Матчи Аризона, Невада,Нью-Мексико,Пенсильвания,Техас,(.)
(один пробел раньше) соответствует Нью-Гемпширу, Нью-Джерси, Нью-Мексико, Нью-Йорку, Северной Каролине, Северной Дакоте, Род-Айленду, Южной Каролине, Южной Дакоте, Западной Вирджинии[CGHKLPV].*(.)
матчи Калифорния, Колорадо, Коннектикут, Джорджия, Гавайи, Канзас, Кентукки, Луизиана,Нью-Гемпшир,Северная Каролина,Пенсильвания,Южная Каролина, Вермонт, Вирджиния,Западная Вирджинияow(a)
матч Айоваlas(k)
соответствовать Аляскеssi?(.)
матчи Массачусетс, Миссисипи, Миссури,Теннессиn(n|t|[de]$)
матчиКоннектикут,Кентукки,Мэн, Мэриленд, Миннесота, Монтана,Пенсильвания,Род-Айленд,Теннесси,ВермонтНет совпадения для этих штатов, поэтому мы берем первые две буквы: Алабама, Арканзас, Делавэр, Флорида, Айдахо, Иллинойс, Индиана, Мичиган, Небраска, Огайо, Оклахома, Орегон, Юта, Вашингтон, Висконсин, Вайоминг
Впервые я использую этот Regex Subpatter
?|
с, чтобы хранить обратные ссылки в одном.Поддержка округа Колумбия
Заменить
(.)
на([^o])
+3 байтаПопробуйте онлайн!
PHP, 150 байт
Попробуйте онлайн! Testcases
источник
n|t|
байт ли короче[nt]|
?PHP,
887854 байтаПопробуйте онлайн!
Первый таймер, ура!
источник
$argv[1]
заменяется на$argn
sandbox.onlinephpfunctions.com/code/…php
!C
945937718711660616 байтСохранено 219 байтов благодаря ASCII-только.
Новая строка не нужна, только для отображения. Принимает состояние в качестве ввода. Попробуйте онлайн!
Как это устроено:
struct{int*a,b;}m[]=...
объявляет картуm
с двумя значениями - четырехбайтовой строкой и одним символом. Это используется в цикле сравнения, который сравнивает индексы со второго по пятый сchar*a
картой.gets(b)
считывает строкуb
. Это будет государство сокращать.putchar(*b)
печатает первый символ этой строки, так как каждая аббревиатура начинается с первой буквы состояния.for(;m[i].a;i++)
перебирает каждое значение карты. (Это может быть сокращено.)if(!strncmp(m[i].a,b+1,4))
сравнивает текущее значение карты со вторым по пятый символамиb
(сокращенное состояние). Это потому, что единственные различия заключаются в первых пяти символах, но мы уже напечатали первый символ.puts(&m[i].b);
печатает вторую букву аббревиатуры (если имя штата совпадает с текущим значением карты) и символ новой строки.источник
C
148141 байт*(int*)(s+1)
считает входной символ со второго по пятый целым числом; это целое число затем хэшируется в 0-56, используя хэшi%663694%57
. Затем значение хэширования ищется в векторе смещений, которые представляют местоположение второй буквы аббревиатуры. Я выбрал именно эти четыре байта, потому что (1) Миссури и Миссисипи сначала различаются по пятому символу, и (2) в некоторых штатах есть только четыре символа. В C вы можете использовать терминатор NUL, но ничего кроме этого не является надежным. (Это хэширует оба Севера к одному и тому же значению, а также оба Юга. Но это не имеет значения, потому что для каждого из них соответствующее смещение равно 6).Так получилось, что этот конкретный хеш дает правильную позицию для вторых букв аббревиатур округа Колумбия, Пуэрто-Рико и «Виргинских островов» (набираемых таким образом, а не как «Виргинские острова США», потому что алгоритм настаивает, что первый символ аббревиатуры будет первым символом имени).
Константы 663694 и 57 были найдены с помощью автоматического теста; 57 был наименьшим диапазоном хэшей, который я нашел. (Первая версия использовала 380085 и 63, но когда я расширил тестовый диапазон, я нашел новую.) Кажется, что существует немного меньший хэш, если добавлен код для «используйте последний символ в имени»; к сожалению, синтаксис C для выбора последнего символа слишком многословен, чтобы сделать это полезным.
Существует только 8 различных смещений, поэтому они могли быть сохранены в 171-битной (3 * 57) таблице поиска с тремя битами на запись. Но я не мог придумать, как эффективно вставить эти биты в программу. Шестнадцатеричное кодирование потребует около одного символа на четыре бита плюс
0x
префиксы. Я не мог сделать лучше, чем 151 байт, что намного длиннее, чем строковая версия. Если бы 171 бит можно было как-то вставить в виде необработанных октетов, они бы занимали 22 байта, так что может быть решение, но чтение файла неуклюже.источник
На самом деле , 181 байт
Это решение ожидает ввода в виде строки в кавычках.
Попробуйте онлайн!
объяснение
В этом решении используется та же стратегия хеширования, что и в моем решении Python 3 . Для краткости я опущу объяснение того, как вычисляется хэш и почему он был выбран (перейдите к другому ответу, если хотите этот бит).
Также для краткости, я собираюсь опустить содержимое очень длинных строк, так как иначе объяснение было бы нечитаемым.
источник
Python 3 , 230 байт
Попробуйте онлайн!
Ввод ожидается в виде байтового объекта (байтовой строки, а не строки Юникода).
Спасибо Джонатону Аллану за нелепое количество байтов
объяснение
Каждое имя состояния хешируется в целое число
a
путем применения хэшаa = sum(o*5**i) % 236
(гдеo
- порядковый номер ASCII символа иi
его индекс в строке, начиная с конца). Модуль236
был выбран потому, что это наименьший модуль, при котором все значения хеш-функции различаются для 50 названий штатов США. Эти хэши затем сопоставляются с аббревиатурами состояний, и результирующий словарь (сжатый с использованием подстановки строк) используется для поиска аббревиатуры по имени состояния (хеширование его для получения подходящего ключа).источник
lambda s:chr(s[0])+'.....IA................L..NOI..M..........E.N..Y.XR.Z....D.I...D....DA.D...........HA..LJ.........N............T.I..........C..T...HAAT.....A...VL.V............CE................AEK.........T.......Y.A...R.Y....O.S...........K.......S'[sum(c*5**i for i,c in enumerate(s[::-1]))%236]
lambda s:chr(s[0])+'IA%%L!NOI!M%!E.N!Y.XR.Z$D.I!.D$DA.D%!.HA!LJ%.N%$T.I%!C!T!.HAAT$.A!.VL.V%$CE%%AEK%.T$!.Y.A!.R.Y$O.S%!.K$!.S'.replace('%','$$').replace('$','!!').replace('!','..')[sum(c*5**i for i,c in enumerate(s[::-1]))%236-5]
Рубин,
106103 байтаЕсли на входе есть пробел, вторая выходная буква будет той, что после пробела. Else ...
Хеш сумма всех символов на входе, чтобы получить символ, чей индекс в магической строке указывает индекс второй выходной буквы во входной строке, в соответствии с формулой
j>8?j/4:-1
(-1 означает конец.). Если хеш дает символ, которого нет в магической строке, вторая буква является второй буквой ввода.В качестве объяснения магической строки ниже приведены хеш-символы и буквенные индексы, которые они кодируют. Обратите внимание, что Делавэр появляется, хотя вторая буква будет делать - это потому, что его хэш-код конфликтует с Кентукки. К счастью, последняя буква Делавера такая же, как и вторая.
Неуправляемый в тестовой программе
источник
/// ,
619608 байтПопробуйте онлайн!
Поскольку нет другого способа ввода ввода в ///, он идет в конце программы. Просто добавьте желаемый вход в программу.
Сэкономили 11 байт, сделав больше замен, в соответствии с рекомендациями @SteveBennett
источник
Python 2 ,
131125 байтПопробуйте онлайн!
источник
TAESGL , 386 байт
переводчик
Очень простое сжатие имен состояний, добавленных в массив с сокращениями.
источник
Japt, 383 байта
Сжатие первой строки может быть улучшено, экспериментируя с порядком букв.
Попробуйте онлайн
источник
Mathematica,
138140134 байт+2 байта - обнаружена ошибка (необходимо смещение массива 1, а не 0)
-6 байт - нашел лучший хеш
#~StringTake~1<>"R_ATE__IN_COI_J_I_SLNAT_Y_Y_HKOAE__SAA_DDLM_RVAH_XDTVA__I_N_EA_T_DY_C_KZL"~StringTake~{1+Hash@#~Mod~89866736~Mod~73}&
Подобно другим, он берет имя и принимает первую букву. Затем он применяет хэш Mathematica по умолчанию, затем применяет к нему два модуля "
Hash@#~Mod~89866736~Mod~73
", чтобы получить уникальный номер для каждого состояния. Это значение затем ищется в строке для генерации второй буквы.Вероятно, можно играть в гольф больше, но пространство поиска для Mathematica огромно. Дублированные вторые буквы не учитывались при поиске по хешу.
_
символы представляют потерянные значения в строке. Теоретически вы можете получить строку только до 19 символов, но найти пользовательский хеш для создания этого будет кошмаром.источник
Perl 5,
150148 байт (147 + 1)Это ни в коем случае не оптимально, но делает свою работу. Требуется
-n
флаг командной строки.источник
Python 2 , 152 байта
Попробуйте онлайн!
Порт ответа Арно .
источник