Скоротіть цю штат США!


50

Враховуючи одне з 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)


11
Для тих, хто цікавиться знати підхід Mathematica:Entity[a="AdministrativeDivision",{#,"UnitedStates"}]@EntityProperty[a,"StateAbbreviation"]&
DavidC

12
@BetaDecay Питання, які закриваються як поза темою, не є корисними цілями на обміну.
Mego

7
@DavidC Ви можете зберегти 20байти: Entity["AdministrativeDivision",{#,"UnitedStates"}]@"StateAbbreviation"&:)
ngenisis

2
Запропонуйте додатковий кредит за включення інших 12-символьних кодів у повний офіційний список поштових скорочень США: AA (Збройні сили) AMERICAS, AE (ARMED FORCES EUROPE), AP (ARMED FORCES PACIFIC), AS (AMERICAN SAMOA), DC (РАЙОН КОЛУМБІЇ), FM (ФЕДЕРАЦІЙНІ ДЕРЖАВИ МІКРОНЕЗІЇ), ГУ (ГУАМ), МЗ (МАРШАЛЬНІ ОСТРОВІ), МП (Північні острови МАРІАНИ), ПР (ПУЕРТО-РІКО), ПВ (ПАЛАУ), VI (ВІРГІНСЬКІ ОСТРОВИ).
Джо Снайдер

2
Так, це не дура.
Крістофер

Відповіді:


25

Javascript, 124 117 байт

(збережено 7 байт завдяки hvd)

x=>/.+[A-Z]|A..[sz]k?|M.ss.s?|M[io]n?t?|Nev?|[AFIOUW][^o]|T..|.+/.exec(x)[0].replace(/(.).*(.)/,'$1$2').toUpperCase()

Пояснення:

  • Регепс знаходить збіг першої та останньої літер двох літер абревіатури
  • Перша частина відповідає державам з більш ніж двома словами (включаючи округ Колумбія)
  • Друга частина відповідає матчу Аляска та Арізона
  • Третя частина відповідає Массачусетсу, Міссісіпі та Міссурі
  • Четверта частина відповідає матчам Мічигану, Міннесоти та Монтани
  • П'ята частина відповідає матчу Небраски та Невади
  • Шоста частина відповідає всім державам, що залишилися, скороченими до їх перших двох літер, з особливим випадком виключення Айови
  • Сьома частина відповідає всім державам, що залишилися, скороченими до їх першої та третьої літер
  • Восьма частина відповідає всім іншим, які скорочуються до їх першої та останньої літери
  • Тоді це лише випадок позбавлення цих букв і написання великих букв
  • Також зустрічається Пуерто-Рико та Американське Самоа, але не Гуам, Маріанські острови або Віргінські острови США

Ого, це чудово! +1!
NoOneIsHere

3
Приємно! Ще кілька можливостей: початковий [A-Z]не потрібен, оскільки відомо, що введення є дійсним. Спеціальний випадок Айови можна скоротити, [AFIOUW][^o]щоб виключити, залишивши його для остаточного .+.
hvd

1
Ваша регекс-техніка настільки ефективна в порівнянні з моєю ... хотілося б, щоб був спосіб змусити її працювати з моїм коротшим регексом. Але вони побудовані на таких різних принципах.
Стів Беннетт

1
Що ж, є досить багато, які по-своєму дивні. Є приємна колекція, яка відповідає як правилам "перший і останній", так і "першим двом" (Колорадо, Делавер, Каліфорнія ...), але тоді Міссісіпі (МС) його руйнує.
Стів Беннетт

1
101: s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|Te.|.+/.exec(s)[0].slice(-1).toUpperCase()Чи можемо ми дістатися до 100? :)
Стів Беннетт

22

Javascript, 137 135 134 132 113 110 108 101 99 94 93 92 байти

Це засновано на рішенні HP Williams, з деякими вдосконаленнями поза межами регулярного виразів та декількома налаштуваннями в ньому.

s=>s[0]+
/.*( .|z)|...s.s?|T..|M[i-t]+|[AFINOUW][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

(Лінійні перерви лише для читання)

Коментар до регулярної виразки:

.*( .|z)|      // Two-or-three word states, plus Arizona
...s.s?|       // Mississippi, Missouri, Massachussetts, Alaska, and (non-harmfully) Kansas
M[i-t]+|       // Montana, Minnesota, Michigan
[AFINOUW][^o]v?|  // All the other first-two-letter states, avoiding Iowa, plus Nevada
T‌​..|           // Tennessee, Texas
.+             // Everything else is first-and-last

Безглуздий альтернативний вираз (однакова довжина):

/...(a$|z|s.s?|.* .)|M[i-t]+|T..|[AFINOUW].v?|.*/  

Історія

94

s=>s[0]+/.*( .|z)|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*/
.exec(s)[0].slice(-1).toUpperCase()

99

s=>s[0]+/.*( .|z|l.*k)|T..|M.ss.s?|M[io]n?t?|[AFIOUWN][^o]v?|.*/
.exec(s)[0].slice(-1).toUpperCase()

101

s=>s[0]+/.+[A-Zz]|Nev?|.*sk|M.ss.s?|M[io]n?t?|[AFIOUW][^o]|T‌​e.|.+/
.exec(s)[0].sl‌​ice(-1).toUpperCase(‌​)

108

 s=>s[0]+/MI(N|SSO|S)|[CDGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|D$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

110

s=>s[0]+/MI(N|SSO|S)|[CGHKLPV].*|.* .|.*[XZV]|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

113

s=>s[0]+/^MI(N|SSO|S)|^[CGHKLPV].*|.*?( .|[XZV])|.*?N[NTE]|.*(SK|[ED]$|WA)|../
.exec(s.toUpperCase())[0].slice(-1)

132

s=>(S=s.toUpperCase(),' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_[ED]$_WA_Z_X_..'
.split`_`.some(p=>s=S.match(p)),S[0]+s[0].slice(-1))

134

s=>' ._SSO_^MI[NS]_^[CGHKLPV].*_.V_N[TNE]_SK_E$_D$_WA_Z_X_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

135

s=>' ._SSO_^MI[NS]_LASK_^[CGHKLPV].*_NT_EN_[DE]$_WA_.[XVZ]_..'.split`_`
.map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

137

s=>' ._OWA_SSO_ONT_^MI[NS]_LASK_^[CGHKLPV].*_EN_[DE]$_.[XVZ]_..'.split`_`.
map(p=>s=(z=s.toUpperCase().match(p))?s[0]+z[0].slice(-1):s)&&s

Це просто божевільно, хотілося б, щоб я міг знову проголосувати.
ETHproductions

Не дивись зараз! 99!
Стів Беннетт

94. Зовсім божевільний. Я виявив цю оптимізацію ( ...s.s?захоплює Міссісіпі, Міссурі, Массачусетс та Аляску) випадково. Я фактично переміщував .*skфрагмент кудись інше, і тести просто траплялися і проходили, поки фрагмента ніде не було. Найпростіший набір 5 символів коли-небудь!
Стів Беннетт

Нічого собі, і я щойно зрозумів, що ...s.s?також ненавмисно відповідає Канзасу, і, дивом, все ще дає правильний результат.
Стів Беннетт

І ще один персонаж с M[onti]+. Так дивно: якщо стан починається з M, то друга літера є останньою в послідовності щонайменше одного o, n, t або i. Дуже дивний спосіб захопити Мічикан, Міннесоту чи Монтану.
Стів Беннетт

20

JavaScript (ES6), 156 136 байт

s=>s[0]+'.KT..N.VEA.XVL.H.TZ.AA..I.EADATO.JTISRDIYOI.DALA.Y.KE.C.D.R.YAS.NM...C.L...N'[parseInt(s.split` `.join``,36)%359%248*8%99*3%83]

Демо


1
Чи жорстоке застосування цього методу є оптимальним?
ASCII лише

2
@ ASCII-лише Це жорстоко застосовується на арбітражних діапазонах, тому гарантовано лише оптимальне використання X MOD[50-1000] MOD[50-1000] MOD[50-100]. Але .slice(1)помилка була. Наразі знову запущений на весь рядок.
Арнольд

2
Чи можете ви пояснити новонародженому, що це робить?
Hankrecords

1
@Hankrecords Звичайно, зроблять. (Але я зараз у поїзді з обмеженим доступом до Інтернету.)
Арнальд,

1
зараз моє 135!
Стів Беннетт

17

Желе , 75 байт

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸?
e“\B“½ƈN»ȧ5ȯÇ’
i⁶ȯÇ‘ịṭḢŒu

Спробуйте в Інтернеті!

... або дивіться тестовий набір - Зверніть увагу, що для запуску повної програми для декількох входів за один раз слід внести невелику зміну (я поміняв атом введення програми ³, для відкликання з регістра ®, один і встановив регістр до кожної назви держави по черзі).

Як?

Обчислює індекс, який потрібно використовувати для другого символу поштового індексу, додає його до першого символу та додає до верхнього регістру результат.

Спочатку знаходить індекс символу пробілу (або 0, якщо його не знайдено);

Інше перевіряє, чи це Аляска чи Міссурі (5 за kабо o);

Інше знаходить в списку індекс стану введення Arizona Minnesota Mississippi Nevada Montana Texas Tennessee(або 0, якщо його не знайдено) - якщо так, то цей індекс mod 2 плюс 3 (для z n s v t x n);

Else перетворює рядок у порядкові, перетворює, що з бази 256, знаходить залишок після ділення на 29487, знаходить залишок після ділення на 14 і використовує його для індексації у двійкове представлення 9620 і подвоює результат - даючи 0 для держав, які використовують остаточне письмо та 2 для тих, що використовують друге письмо.

Усі, крім самого першого випадку, збільшуються, а отримане значення зменшується (збільшення індексу простору, знайденого одиницею).

i⁶ȯÇ‘ịṭḢŒu - Main link: state string
 ⁶         - space character
i          - first index (of a space character in the state) or 0 if not found  (n-1 or 0)
   Ç       - call link 3 as a monad  (get n-1 in other cases)
  ȯ        - logical or  (yielding n-1)
    ‘      - increment   (yielding n)
     ị     - index into the state string (get the nth character)
       Ḣ   - head the state string (get the first character)
      ṭ    - tack
        Œu - convert to uppercase
           - implicit print

e“\B“½ƈN»ȧ5ȯÇ’ - Link 3: n-5 or ... : state string
 “\B“½ƈN»      - ["Alaska","Missouri"]
e              - exists in? (1 if so, 0 if not)
          5    - 5
         ȧ     - logical and
            Ç  - call link 2 as a monad
           ȯ   - logical or
             ’ - decrement

“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»Ḳiµ%2+3¢⁸? - Link 2: n = 3 or n = 4 or ... : state string
“¿ØƈṢḍw÷S=)µZṂ÷ĿæÆɱ»           - "Arizona Minnesota Mississippi Nevada Montana Texas Tennessee"
                    Ḳ          - split at spaces
                     i         - first index of state string in that list or 0
                      µ        - monadic chain separation (call that i)
                             ? - if: 
                            ⁸  -   link's left argument, i
                               - then:
                       %2      -   mod 2
                         +3    -   plus 3  - odd entries to 4: AriZona, MisSissippi, MonTana, TenNessee
                               -            even entries to 3: MiNnesota, NeVada, TeXas
                               - else:
                           ¢   -   call link 1 as a nilad

³Oḅ⁹%⁽qġ%14ị⁽"wB¤Ḥ - Link 1 ...n=2 or n=0: no arguments
³                  - program's 1st input    e.g. Iowa          or Ohio
 O                 - cast to ordinals            [73,111,119,97]  [79, 104, 105, 111]
   ⁹               - 256
  ḅ                - convert from base           1232041825       1332242799
     ⁽qġ           - 29487
    %              - modulo                      15991            20139
        %14        - modulo 14                   3                7
                ¤  - nilad followed by link(s) as a nilad:
            ⁽"w    -   9620                     V       V
               B   -   convert to binary = [1,0,0,1,0,1,1,0,0,1,0,1,0,0]
           ị       - index into                  0                1
                 Ḥ - double                      0                2
                   -   ...0th index of Iowa is 'a', 2nd of Ohio is 'h'

1
Це найдовше желе, що я коли-небудь бачив =)
caird coinheringaahing

11

Пітон 2 , 191 байт

lambda s:s[0]+("KZD"*5+"HNTD"*5+"AYY"*4+"__L_O_VTA_I__A_T_RS_KA__S_"+"MOO"*5+"I_C_"+"AE"*6+"_I_D__A_"+"EDL"*5+"HV_A"+"IR"*7+"XC"*6+"E____N__YJ_YT___L")[reduce(lambda a,x:a+ord(x)^24,s,0)%174]

Спробуйте в Інтернеті!

Для пошуку другого символу абревіатури використовується проста хеш-функція.


11

Python 2, 94 90 байт

lambda s:s[0]+s[(19**9*0x4710b8f6019c1b61deca10eef13b1>>hash(s)%8199472%52*3&7)+1].upper()

Спробуйте в Інтернеті

(Тільки Python 2, тому що хеші Python 3 не є стабільними, і ви також не можете хеш-рядок, не перетворюючи його в байти.)

Працює з усіма 50 штатами, плюс як бонусний округ Колумбія та Пуерто-Рико.

Можна було б зберегти один байт, написавши число в базовій-36: int("5clu7x0aixb0pelmpugv5iiibphrpf",36). Я чекаю, чи зможу я придумати більш креативне рішення.

Оновлення:

Оскільки у хеші є 12 невикористаних знаків, є 2 36 можливих цифр, які працюватимуть. Здавалося, розумно вважати, що один з них матиме головний фактор з великим показником. Для будь-якого заданого простого і показника знаходження значення відбувається досить швидко; Мені вдалося знайти один з коефіцієнтом 19 9 , зменшивши розмір виразу, необхідного для представлення числа на чотири байти.

Це в основному та сама процедура, що і моя відповідь C, але з використанням Python. Оскільки основна хеш-функція різна, мені довелося знайти іншу функцію скорочення, яка виявляється модом 52 замість моди 54. Але найбільша економія над С виходить від можливості використання bignums для кодування вектора, і звичайно той факт, що стандарт для Python здається таким, що нормально використовувати лямбда-літерал замість повної програми.


9

Сітківка , 113 81 80 77 70 68 байт

M1!`.+[A-Zz]|...s.s?|M[io]n?t?|[AFIOUWN][^o]v?|T..|.*
\B.*(?=.)

T`l`L

Спробуйте в Інтернеті! Включає всі 51 тестові випадки. Збережено 32 байти за допомогою присвоєння регексу @ JörgHülsermann, який знаходить другу літеру (з налаштуванням для підтримки DC; редагувати: збережено 1 байт завдяки @ JörgHülsermann). Збережено 3 байти, перейшовши на регекс @ SteveBennett з його коментаря до відповіді @ HPWilliam. Збережено 7 9 байт ще раз завдяки @SteveBennett. Інші букви видаляються, а рядки - прописними.


Дуже добре, не подумав би, що ти можеш отримати набір повністю знімних рядків.
colsw

@ConnorLSW eбув найбільш клопітка насправді.
Ніл

@ JörgHülsermann Дякую за користь повернення!
Ніл

@ JörgHülsermann О, тож я зможу зберегти ще один байт?
Ніл

1
Зачекайте, Індіана справді стає посвідченням особи. Ви, ймовірно, можете це виправити, лише додавши $ після d. (Можливо, ви хочете скористатися автоматичним тестуванням. У мене є сценарій, який постійно перевіряє всі 50 випадків.)
Стів Беннетт

8

PHP> = 7,1, 113 байт

<?=($a=$argn)[0],ucfirst(preg_match('#[vxz]| .|owa|lask|[CGHKLPV].*|ssi?.|n(n|t|[de]$)#',$a,$t)?$t[0][-1]:$a[1]);

Інтернет-версія

Удари відповідають матчу, який починався раніше

([vxz])відповідає Арізона, Невада, Нью-Мексико, Пенсильванія, Техас,

(.) (один проміжок раніше) відповідає Нью-Гемпширу, Нью-Джерсі, Нью-Мексико, Нью-Йорку, Північній Кароліні, Північній Дакоті, Род-Айленду, Південній Кароліні, Південній Дакоті, Західній Вірджинії

[CGHKLPV].*(.)поєдинки Каліфорнія, Колорадо, Коннектикут, Джорджія, Гаваї, Канзас, Кентуккі, Луїзіана, Нью-Гемпшир , Північна Кароліна, Пенсильванія, Південна Кароліна , Вермонт, Вірджинія, Західна Вірджинія

ow(a) матч Айова

las(k) матч на Алясці

ssi?(.)поєдинки Массачусетса, Міссісіпі, Міссурі, Теннессі

n(n|t|[de]$)поєдинки Коннектикут, Кентуккі, Мен, Меріленд, Міннесота, Монтана, Пенсильванія, Род-Айленд, Теннессі, Вермонт

Немає відповідності для цих штатів, тому ми беремо перші два листи Алабама, Арканзас, Делавер, Флорида, Айдахо, Іллінойс, Індіана, Мічиган, Небраска, Огайо, Оклахома, Орегон, Юта, Вашингтон, Вісконсін, Вайомінг

Перший раз, коли я використовую цей Regex Subpatter, ?| дозволяє зберігати зворотні посилання в одному.

Підтримка округу Колумбія

Замінити (.)з ([^o])+3 Bytes

Спробуйте в Інтернеті!

PHP, 150 байт

<?=($t=preg_replace("#.\K\w+ |las|ri|nec|eorgi|awa|ow|[aio]ni?|e(?=n|v|x)|ntuck|ouisi|a?in|arylan|issi?|nnsylv|erm|irg#","",$argn))[0],ucfirst($t[1]);

Спробуйте в Інтернеті! Тестові шафи


3
Чи не n|t|байт коротший [nt]|?
Ніл

@Neil Так. Я цього не усвідомлював. Дякую
Йорг Гюльсерманн

7

PHP, 887 854 байт

<?=array_combine(['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'],['AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VT','VA','WA','WV','WI','WY'])[$argv[1]];

Спробуйте в Інтернеті!

Перший таймер, ура!


1
Таким чином, трохи гольф У масиві значень з пробілом або там, де друга літера видалена правильно. І $argv[1]замінюється $argn sandbox.onlinephpfunctions.com/code/…
Jörg Hülsermann

@ JörgHülsermann велике спасибі! Мені дуже подобаються ваші відповіді тут на codegolf php!
Іванка Тодорова

Я лише трохи світла проти інших людей. Навчання зусиллям добре, якщо хтось знаходить поліпшення. Я сподіваюся, що ви відповісте на більше запитань у майбутньому
Йорг Гюльсерманн

7

C, 945 937 718 711 660 616 байт

Збережено 219 байт завдяки лише ASCII.

struct{int*a,b;}m[]={"laba",76,"lask",75,"rizo",90,"rkan",82,"alif",65,"olor",79,"onne",84,"elaw",69,"lori",76,"eorg",65,"awai",73,"daho",68,"llin",76,"ndia",78,"owa",65,"ansa",83,"entu",89,"ouis",65,"aine",69,"aryl",68,"assa",65,"ichi",73,"inne",78,"issi",83,"isso",79,"onta",84,"ebra",69,"evad",86,"ew H",72,"ew J",74,"ew M",77,"ew Y",89,"orth",67,"orth",68,"hio",72,"klah",75,"rego",82,"enns",65,"hode",73,"outh",67,"outh",68,"enne",78,"exas",88,"tah",84,"ermo",84,"irgi",65,"ashi",65,"est ",86,"isco",73,"yomi",89};
i;char b[99];main(){gets(b);putchar(*b);for(;m[i].a;i++)if(!strncmp(m[i].a,b+1,4))puts(&m[i].b);}

Новий рядок непотрібний, лише для цілей відображення. Приймає стан як вхідний. Спробуйте в Інтернеті!

Як це працює:

  • 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); друкує другу букву абревіатури (якщо назва держави збігається з поточним значенням карти) та новий рядок.

Це, здається, дає неправильний вихід для держав Північ / Південь.
Фелікс Домбек

6

C, 148 141 байт

main(){char s[99];gets(s);printf("%c%c\n",*s,s["-2-1--561-1-62--642138364---4142--1416--67-7131-111-7-246"[*(int*)(s+1)%663694%57]-48]&95);}

*(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 байти, тож може бути рішення, але читання файлу незграбне.


4

Власне , 181 байт

2"OHCALAGAMAWVFLNVILMNMOMIRINCDEMTMEINWANYTXORNEOKIDAZNMUTNDMDVAKYSDPAARWYNHIAMSALNJAKTNHIKSVTWICOSCCT"╪"âäà♠îÉæô↨→←∟♣áíå*,▓/12│┤94▼╛?DE╞G╚╠╬ST╒WXßb;Θoq╙|⌂"♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└

Це рішення очікує введення у вигляді котируваного рядка.

Спробуйте в Інтернеті!

Пояснення

Це рішення використовує ту саму стратегію хешування, що і моє рішення Python 3 . Для стислості я збираюся опустити пояснення того, як обчислюється хеш і чому він був обраний (перейдіть, прочитайте іншу відповідь, якщо хочете цього шматочка).

Для стислості я збираюся випускати вміст дуже довгих рядків, оскільки в іншому випадку пояснення було б нечитабельним.

2"..."╪"..."♂┘Z⌠i≈┐⌡MXO;rR5♀ⁿ*:236@%└
2"..."╪                                state abbreviations (push the long string, split into length-2 chunks)
       "..."♂┘                         hash values for the state names (a string of CP437-encoded characters, converted to their CP437 ordinals)
              Z                        zip the two lists
               ⌠i≈┐⌡M                  for each pair:
                i                        flatten the pair
                 ≈                       convert hash value to int
                  ┐                      store abbreviation at the register numbered by the hash value
                     X                 discard the now-empty list
                      O                convert input string to list of ASCII ordinals
                       ;rR             range(len(ordinal_list)), reversed
                          5♀ⁿ          5**i mapped over that range
                             *         dot product of powers of 5 and ordinal list
                              :236@%   mod by 236
                                    └  push value in that register

3

Python 3 , 230 байт

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('%','$$').r‌​eplace('$','!!').rep‌​lace('!','..')[sum(c‌​*5**i for i,c in enumerate(s[::-1]))%236-5]

Спробуйте в Інтернеті!

Введення очікується як об'єкт байтів (рядок байтів, а не рядок Unicode).

Дякую Джонатану Аллану за абсурдну кількість байтів

Пояснення

Кожне ім'я стану хешируется до цілого числа a, застосовуючи хеш a = sum(o*5**i) % 236(де oє порядковим порядком символу ASCII символу і iє його індексом у рядку, відраховуючи з кінця). Модуль 236був обраний, оскільки саме найменший модуль обумовлює відмінність усіх хеш-значень для 50 імен штатів США. Потім ці хеші відображаються в абревіатурах держав, і отриманий словник (стислий за допомогою підстановки рядків) використовується для пошуку абревіатури з назвою стану (хешування для отримання відповідного ключа).


Збережіть 179 байт за допомогою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]
Джонатан Аллан

... і ще 51 поверх цього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]
Джонатан Аллан

Я здивований, що підрахунок назад коштує менше байтів, ніж хеш-функція, яка розраховується вперед - але я не можу знайти його з невеликою грою
Кріс Н

1
@ChrisH Я думав, що знайшов його, але стислий рядок дорожчий.
Mego

2

Рубі, 106 103 байти

->s{s[0]+(s=~/ /?$'[0]:s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?j>7?j/4:-1:1]).upcase}

Якщо вхід містить пробіл, другий вихідний лист - той, що знаходиться після пробілу. Ще ...

Хешируйте суму всіх символів на вводі, щоб отримати символ, індекс якого в магічній рядку позначає індекс другої літери виводу у вхідному рядку, відповідно до формули j>8?j/4:-1(-1 означає кінець). Якщо хеш надає символу, який не знаходиться в чарівному рядку, друга літера є другою буквою введення.

Як пояснення магічного рядка, хеш-символи та буквені індекси, які вони кодують, знаходяться нижче. Зауважте, що Делавер з'являється, навіть якщо друга літера буде це робити - це тому, що його хеш-код стикається з Кентуккі. На щастя, останній лист Делавер так само, як і другий.

Letter(index)
Last  (-1)  (-MD    )-VA    6-GA-LA  >-DE-KY    P-PA    _-CT    a-KS    c-VT
3rd    (2)  ;-TN    ?-MN    .-TX     O-NV
4th    (3)  }-MS    A-IA    F-MT     L-AZ
5th    (4)  K-MO    M-AK    r-ME     S-HI 

Ungolfed в тестовій програмі

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".split($/)

f=->s{                                                            #String argument s.
  s[0]+(                                                          #Return character s[0] +
    s=~/ /?$'[0]:                                                 #if s contains a space, 1st character after space, ELSE
      s[(j="()6>P_ac;?.O}AFLKMrS".index((s.sum%136%95+32).chr))?  #if (sum of ascii codes, mod 136 mod 95 +32).chr in the magic string
        j>7?j/4:-1:                                                 #return s[j/4] if j>7 else return s[-1] ELSE
      1]                                                          #if not in the magic string, return s[1].
  ).upcase                                                        #Convert the second character to uppercase if needed.
}


a.map{|i|p [i,f[i]]}

2

/// , 619 608 байт

/2/~M//@/~South //1/~North //!/~New //~/\/\///Alabama/AL~Alaska/AK~Arizona/AZ~Arkansas/AR~California/CA~Connecticut/CT~Delaware/DE~Florida/FL~Georgia/GA~Hawaii/HI~Idaho/ID~Illinois/IL~Indiana/IN~Iowa/IA~Kansas/KS~Kentucky/KY~Louisiana/LA2aine/ME2aryland/MD2assachusetts/MA2ichigan/MI2innesota/MN2ississippi/MS2issouri/MO2ontana/MT~Nebraska/NE~Nevada/NV!Hampshire/NH!Jersey/NJ!Mexico/NM!York/NY1Carolina/NC1Dakota/ND~Ohio/OH~Oklahoma/OK~Oregon/OR~Pennsylvania/PA~Rhode Island/RI@Carolina/SC@Dakota/SD~Tennessee/TN~Texas/TX~Utah/UT~Vermont/VT~Virginia/VA~Washington/WA~West Virginia/WV~Wisconsin/WI~Wyoming/WY/

Спробуйте в Інтернеті!

Оскільки іншого способу прийому даних у /// немає, він знаходиться в кінці програми. Просто додайте потрібний вхід до програми.

Збережено 11 байт, зробивши більше замін, як рекомендує @SteveBennett


Напевно, є кілька шаблонів, які можна замінити відразу кілька разів, як-от "Новий" та "Акота". Прикро, що ви не можете зробити набагато розумнішим, як видалення розділів імен штатів, тому що перетворення решти символів у великі регістри настільки дороге ...
Стів Беннетт

@SteveBennett Відредаговано, дякую!
Товариш SparklePony


1

TAESGL , 386 байт

B=«ōďā,AL,ņćđ,AK,ķċđ,AZ,ćōē,AR,ďċđ,CA,ĭāď,CO,ŕĭ,CT,ćđēą,DE,ĕŕ,FL,īĭ,GA,ńāē,HI,ćĉďą,ID,ĭċď,IL,ľđā,ţ,ńĕĕ,IA,ķő,KS,ŏĝ,KY,ŏĕĕ,LA,ŏđć,ME,ņāē,MD,ńđā,MA,īđą,MI,ļēď,MN,ŕğ,MS,ňė,MO,ććĕĉ,MT,ćċćĉ,NE,ŕēď,NV,ň ćŋā,NH,ň ĩēđ,NJ,ň ğĕċ,NM,ň ĉĝ,NY,ćņ ġĉă,NC,ćņ ńċą,ND,ĩēą,OH,ŋĺ,OK,ļķ,OR,ĺđď,PA,ĉĉğ đēā,RI,ōċ ġĉă,SC,ōċ ńċą,SD,ňďą,TN,ċĕď,TX,ōđą,UT,ćđāā,VT,ğğ,VA,ďĉē,WA,ĉĉć ğğ,WV,ľēđ,WI,ĉĩĕ,WY»Ĵ",";B[BĪA)+1

Перекладач

Дуже просте стиснення імен стану, доданих у масив із абревіатурами.


1

Japt, 383 байт

Стиснення першого рядка може бути неможливим, експериментуючи з порядком букв.

g +`lkzÇUaidlnyaÀÍ¥evhjmycdhkÎödnxttaaviy`g`alabaµ
Ã2ka
iza
kÂ6s
Öâfnia
åªv
¬nש
Ü.Ø
fÓQ»
gegia
°ii
i»
ÅJno
Äa
Å0
kÂ6s
kÀ_cky
lia
Úpe
æ¯À
ÚUaÖ³etts
Úòig
·nÌta
æ«7ppi
æ¬
Úa
ßka
va»
w mp¢i
w jÀ y
w ´xi¬
w yk
Íh ÖÚ¦na
Íh »kota
oo
oklaÊá
eg
pnsylvia
r¸ Ó
Ñh ÖÚ¦na
Ñh »kota
âÊte
x
©ah
vÚ
virgia
Øgn
ØÙ virgia
æÈ;n
wyÇg`·bUv) u

Спробуйте в Інтернеті


1

Математика, 138 140 134 байт

+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 символів, але знайти спеціальний хеш для створення цього було б кошмаром.


1

Perl 5, 150 148 байт (147 + 1)

Це аж ніяк не оптимально, але це робить свою справу. Потрібен -nпрапор командного рядка.

s/las//;s/ai?n//;s/[oie]n|ri//;s/e([vx])/$1/;s/issi?//;s/(.).+ /\1/;/(.)(.)/;/^([^W]).*(?:[cogavn][wiku]|[ir][ys][li]|rm)([adyti])$/;print uc"$1$2"

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