Сколько штатов я граничу?

20

Когда я был моложе, на моей стене напротив моей кровати была прикреплена большая карта США. Когда мне было скучно, я смотрел на эту карту и думал о чем-то другом. Материал, подобный теореме о четырех цветах, или какое состояние граничило с большинством других состояний. Чтобы избавить меня от некоторых умственных способностей в подсчете, вы собираетесь изобрести машину времени и сказать мне, сколько штатов граничит с вводом. Поскольку время очень разборчиво, оно должно быть как можно короче.

Задание

Для одного из 50 штатов США, либо по его полному названию, либо по почтовому сокращению, указанному на этой странице ( зеркало archive.org ), возвращается число штатов, которые он граничит. Ниже приводится сопоставление всех входных данных для полных имен состояний с числом смежных состояний, найденных на этом веб-сайте .

Missouri, Tennessee -> 8
Colorado, Kentucky -> 7
Arkansas, Idaho, Illinois, Iowa, Nebraska, New York, Oklahoma, Pennsylvania, South Dakota, Utah, Wyoming -> 6
Arizona, Georgia, Massachusetts, Michigan, Minnesota, Nevada, New Mexico, Ohio, Virginia, West Virginia -> 5
Alabama, Indiana, Kansas, Maryland, Mississippi, Montana, North Carolina, Oregon, Texas, Wisconsin -> 4
California, Connecticut, Delaware, Louisiana, New Hampshire, New Jersey, North Dakota, Rhode Island, Vermont -> 3
Florida, South Carolina, Washington -> 2
Maine -> 1
Alaska, Hawaii -> 0

Правила

  • Ваша программа может обрабатывать полное имя штата или почтовый индекс - она ​​не может использовать комбинацию.
  • Вы можете указать регистр ввода, но не можете удалить пробелы во вводе.
  • Вам не нужно обращаться с Вашингтоном, округ Колумбия, или с чем-либо, что не входит в число 50 штатов.
  • Количество ограниченных состояний не включает состояние ввода.
  • Это , поэтому выигрывает самый короткий ответ в байтах.

Хотя я знаю, что это может быть просто тот, кто имеет лучшее сжатие или найдет лучший шаблон регулярных выражений для числа, если я получу слишком много таких ответов, я назначу награду за ответ, который генерирует карту США и использует ее для рассчитать количество граничащих государств.

Стивен
источник
11
inb4Mathematica Встроенный
DJMcMayhem
@DJMcMayhem э-э-э (звучит хорошо сначала, но посмотри обновление ...)
Стивен
@ StepHen О нет, меня выгнали! Я работал над ответом только сейчас, который включает это ...;)
notjagan
Связано
геокавель
Можем ли мы обработать DC / включить его в наши подсчеты, пожалуйста?
notjagan

Ответы:

17

Желе , 73 65 байт

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?

Попробуйте онлайн!

Встроенные команды? Кому это нужно? ( ʂÞiƬна земле с отвращением).

Принимает ввод как полное имя, например "Idaho".

Как это устроено

“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘i³OS%168¤$€Tµ’6L?
“U[“Ȥ“!÷2“®Ɓ⁵]StƁ}K“ʂÞiƬ¦.ÞrÆu“4œ(°fWg?Ʋd“Ɠ©“Œb‘                   The literal list of code-page index lists  [[85, 91], [154], [33, 28, 50], [8, 143, 133, 93, 83, 116, 143, 125, 75], [167, 20, 105, 152, 5, 46, 20, 114, 13, 117], [52, 30, 40, 128, 102, 87, 103, 63, 153, 100], [147, 6], [19, 98]]
                           €        On each sublist:
                         ¤            Evaluate the hash value:
                 ³                     Input
                   O                   Character values
                    S                  Sum.
                     %                 Modulus.
                      168              168
                i                     Does the sublist contain that nilad?
                            T       Get the sublist which does contain that nilad.
                                 ?  If
                                L     Length.
                                    Then
                             ’        Return the index - 1
                                    Else
                              6      Return 6
fireflame241
источник
Какой процесс вы использовали, чтобы получить этот список?
Скотт Милнер
2
@ScottMilner Я бегал OS%168по каждому из штатов, которые непосредственно давали список. Я нашел константу 168 путем грубого форсирования всех возможностей менее 250, проверяя каждую из них на возможность на самом деле различать различное количество границ. 168работал (среди нескольких других) и имел дополнительное преимущество, заключающееся в необходимости жесткого кодирования 48значений из-за коллизий.
fireflame241
18

Mathematica, 112 111 байт

-5 байт благодаря Марку С. и LegionMammal978 !

-22 байта (и замечая проблему с выводом) благодаря ngenisis !

Tr[1^Entity["AdministrativeDivision",#~StringDelete~" "]@"BorderingStates"]+Boole@StringMatchQ[#,"Il*"|"Mic*"]&

Конечно, для этого есть встроенная Mathematica. Включает DC в подсчет.

notjagan
источник
3
Это выглядит грязно, но AdministrativeDivisionтак удивительно долго, что вы бы сохранили байт с помощью Length [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &
Марк С.
1
ToExpressionможно заменить Symbol, если я правильно помню.
LegionMammal978
1
Также вам не нужно использовать AdministrativeDivisionData, просто передайте "BorderingStates"в качестве аргумента сущность; напр.Entity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisis
1
@ngenisis Я применил исправление к первой проблеме; К счастью, благодаря вашим предложениям, это не добавило столько байтов. Последняя проблема, которую вы упомянули относительно DC, не является проблемой, так как я спросил OP, было ли это правильно, и ответ был положительным.
notjagan
1
@notjagan Вы также можете использовать Tr[1^...]вместо, Length@...чтобы сохранить другой байт.
ngenisis
13

JavaScript (ES6), 115 113 байт

Редактировать: сохранил 2 байта, позаимствовав еще 2 оптимизации строк из ответа Step Hen Python . Я пропустил их с первой попытки.

Принимает почтовые индексы в качестве входных данных.

s=>('7KYCO8MOTN0AKHI1ME2FLSCWA3CACTNDELANHNJRIVT4ALWINCKSMDMSMTXOR5GAZOHMANMIMNVWVA'.match('.\\D*'+s)||'6')[0][0]

Как?

Не-RegExp аргумент, передаваемый .match()методу, неявно преобразуется в объект RegExp. Итак, мы проверяем регулярное выражение /.\D*{{input}}/в нашей закодированной строке. Это соответствует цифре (1) , затем от 0 до N нецифровых символов, за которыми следует ввод.

Например: если ввод "NH"(Нью-Гэмпшир), совпадающая строка будет "3CACTNDELANH". Мы просто сохраняем первый символ этой строки или возвращаем "6"по умолчанию, если совпадений не было.

(1): .Фактически соответствует любому символу, но строка построена таким образом, что то, что находится перед группой букв, всегда является цифрой.

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


Хеш-версия, 115 байт

Тот же формат ввода.

s=>`04436303035050063062750600644408${6e7}503600300540410005207058036442600400000650035`[parseInt(s,33)%589%180%98]

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

Arnauld
источник
Вы можете сэкономить много байтов, купив эту строку
Downgoat
7

Python 3 , 168 154 153 137 байт

lambda s:[i for i,S in enumerate('AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN'.split())if s in S]or 6

Попробуйте онлайн!

-4 байта благодаря isaacg

-10 байт благодаря ETHProductions

-1 байт благодаря notjagen

Сохранено еще несколько байтов по умолчанию до шести, как и другие ответы.

TIO включает в себя тесты. Принимает ввод в виде почтового индекса. Формирует список имен состояний в виде строк для каждого набора, при возможности сводимых вместе (например, WVVAсохраняется как WVA). Лямбда-функция получает индекс в списке, строка которого содержит входные данные. Там может быть способ, которым я не знаю о гольфе тело функции. Выводит в виде списка, содержащего целое число - добавьте [0]в конец лямбда- выражения для вывода в виде целого числа.

Стивен
источник
Кроме того, вы используете только lодин раз, так что вы можете также включить его.
Исаак
@ETHproductions да, спасибо
Стивен
@isaacg спасибо, не знаю, почему я этого не видел
Стивен
-1 байт , переставляя позицию Техаса.
notjagan
@ notjagan спасибо, пропустил это
Стивен
4

V , 143 байта

çourüee/C8
çdoüke/C7
çrküI„sn]üebüOkünnsüSDüUüwy/C6
çzüg„ot]üttüinnüvaüxiüOh/C5
çbüdiüKüMáû5}üNCüOüTüWi/C4
ç^[CDLNRV]/C3
ç[FSW]/C2
çM/C1
ñlS0

Попробуйте онлайн!

HexDump:

00000000: e76f 7572 fc65 652f 4338 0ae7 646f fc6b  .our.ee/C8..do.k
00000010: 652f 4337 0ae7 726b fc49 8473 6e5d fc65  e/C7..rk.I.sn].e
00000020: 62fc 4f6b fc6e 6e73 fc53 8144 fc55 fc77  b.Ok.nns.S.D.U.w
00000030: 792f 4336 0ae7 7afc 6784 6f74 5dfc 7474  y/C6..z.g.ot].tt
00000040: fc69 6e6e fc76 61fc 7869 fc4f 682f 4335  .inn.va.xi.Oh/C5
00000050: 0ae7 62fc 6469 fc4b fc4d e1fb 357d fc4e  ..b.di.K.M..5}.N
00000060: 8143 fc4f fc54 fc57 692f 4334 0ae7 5e5b  .C.O.T.Wi/C4..^[
00000070: 4344 4c4e 5256 5d2f 4333 0ae7 5b46 5357  CDLNRV]/C3..[FSW
00000080: 5d2f 4332 0ae7 4d2f 4331 0af1 6c53 30    ]/C2..M/C1..lS0

Я написал это до того, как понял, что вы можете использовать вход в качестве почтовых индексов. Я не уверен, что это на самом деле короче или нет :shrug:. В этом ответе используется регулярное выражение для поиска определенных состояний, а затем, если оно совпадает, измените ввод на определенное число. Однако, по мере того, как количество состояний, с которыми мы тестировали, увеличивается, наименьший поиск, который мы можем использовать, уменьшается. Так, например, мы не можем искать, Cпотому что это будет соответствовать Coloradoи California. (А также Conneticut и The Carolinas) Однако, как только мы проверили каждое состояние, имеющее более 3 границ, мы можем просто искать старты с C, потому что он больше не может соответствовать предыдущему.

Несколько тестовых случаев могут быть ошибочными, так как у меня нет времени, чтобы протестировать их все. Дайте мне знать, если вы найдете какие-либо неверные результаты. :)

DJMcMayhem
источник
3

JavaScript, 153 байта

MO=TN=8;CO=KY=7;AZ=GA=MA=MI=MN=NV=NM=OH=VA=WV=5;AL=IN=KS=MD=MS=MT=NC=OR=TX=WI=4;CT=DE=LA=NH=NJ=ND=RI=VT=3;FL=WA=2;ME=1;AK=HI="0";alert(self[prompt()]||6)

Переменная цепочка. Я уверен, что есть лучший способ сделать это, хотя.

Благодаря предложению кого-то из Discord на выходе по умолчанию установлено 6, самое распространенное число граничных состояний. 183 байта до 151 байта.

Комментатор указал, что это невозможно для AK и HI, поэтому я добавил два байта, чтобы решить эту проблему. От 151 до 153 байтов.

Эли Ричардсон
источник
1
Я почти уверен, что это не удается AKи HIпотому что 0||6оценивается в 6, что является неправильным выводом.
kamoroso94
@ kamoroso94 Я обновил свой код, если вы думаете, что есть лучшее решение, дайте мне знать.
Эли Ричардсон
3

05AB1E , 78 72 байта

.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•s¡¬ð¢

Попробуйте онлайн!


.•n£þuγ{çâ/₁=èó[nK™ΩFîÀî˜Çʒ÷¿ηZ¬³ã®ÿΣÔ¢*5ŠÜ‚!¶Ö¾#}ê(Ûø‰¢þL[Æ₁cgIkö•
# Push the string: akhi me flscwa cactdelanhnjndrivt alinksmdmsncmtortxwi azgamamimnnvnmvaohwv idilianarenyokpnsdutwy kyco motn

s¡    # Split on input.
  ¬   # Get head.
   ð¢ # Count number of spaces.

Это работает ТОЛЬКО потому, что порядок сокращений состояний позволяет НЕТ состоянию возникать в перекрытии между состояниями:

a[kh]i 
me 
f[ls][cw]a 
c[ac][td][el][an][hn][jn][dr][iv]t 
a[li][nk][sm][dm][sn][cm][to][rt][xw]i 
a[zg][am][am][im][nn][vn][mv][ao][hw]v 
i[di][li][an][ar][en][yo][kp][ns][du][tw]y 
k[yc]o 
m[ot]n

Потребовалось некоторое время, чтобы получить правильное расположение ... Затем, разделив вход и посчитав пробелы в первой части, мы получим правильный результат.


Если я украду «по умолчанию 6» из других ответов, я получу 65 байтов:

05AB1E , 65 байт

.•3θ0ÔÕ—ú^?D§:‚A†ǝλα“i›p‚ιCöΔƒñPŠ J€ŽãB»ΣUƤÆuhÃgŠ¦,Y²•s¡¬ð¢D9Qi6

Попробуйте онлайн!

Урна волшебного осьминога
источник
Took awhile to get the arrangement right-> О, я думаю, вы могли бы скопировать это из моего ответа (если я правильно читаю это)
Стивен
@Stephen Ну, я не получил идею из других постов, если вы посмотрите на «алгоритм хеширования отстой», я возился со случайными идеями для хеширования в течение часа, а затем подумал о пробелах, обнаружил, что не могу бить эту реализацию, как бы я ни старался.
Волшебная урна осьминога
@ Стефен, теперь, когда я читаю твой, я бы тоже хотел подумать о дефолте до 6 xD.
Волшебная Урна Осьминога
1
Я не думал об этом, я сначала увидел его в этом ответе , так что не стесняйтесь принять его: P
Стивен
2

Сетчатка , 106 105 байт

MO|TN
8
CO|KY
7
AK|HI
0
ME
1
FL|WA
2
[CDLR].|N[HJD]|VT
3
.[CSX]|AL|IN|MD|MT|OR|WI
4
[GMV].|.[HMVZ]
5
..
6

Попробуйте онлайн! Кто-то сказал регулярное выражение? Редактировать: 1 байт сохранен благодаря @Arnauld.

Нил
источник
2

JavaScript (ES6), 195 байт

s=>/las|ii/[t='test'](s)?0:/ai/[t](s)?1:/Fl|Wa|S.*C/[t](s)?2:/fo|ct|de|ui|mp|er|^N.+ak/i[t](s)?3:/do|ck/[t](s)?7:/ur|ee/[t](s)?8:/iz|gi|ch|ev|xi|hi|es/[t](s)?5:/rk|ah|oi|ow|br|om|lv|ak/[t](s)?6:4

Серия регулярных выражений, которые работают на полное имя государства.

Тестовые случаи:

Рик Хичкок
источник
2

Желе ,  61  59 байт

OP%⁽/r%101eЀ“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘Tȯ7’

Полная программа, принимающая полное имя состояния и печатающая результат (в виде монадической ссылки она возвращает либо список, содержащий одно число или число 6).

Попробуйте онлайн! или посмотрите набор тестов .

Как?

“¿=“þ“(7“¡¦ðø,0@L“€ç÷<CMZa“Ø!)5HNV““1^“¥+‘

список списков индексов кодовой страницы:

[[11,61],[31],[40,55],[0,5,24,29,44,48,64,76],[12,23,28,60,67,77,90,97],[18,33,41,53,72,78,86],[],[49,94],[4,43]]

и показано “ ... ‘ниже:

OP%⁽/r%101eЀ“ ... ‘Tȯ7’ - Main link: list of characters, stateName  e.g. Ohio
O                        - cast to ordinals                   [79,104,105,111]
 P                       - product                                    95757480
   ⁽/r                   - base 250 literal                              12865
  %                      - modulo by 12865                                3285
      %101               - modulo by 101                                    53
             “ ... ‘     - list of lists of code-page indices
          eЀ            - map: exists in?                 [0,0,0,0,0,1,0,0,0]
                    T    - truthy indices (if none yields an empty list)   [6]
                     ȯ7  - logical or with 7 (replace empty list with 7)   [6]
                       ’ - decrement                                       [5]
                         - implicit print (Jelly's representation of a list of
                         -                 one item is just that item)       5
Джонатан Аллан
источник
1

Excel VBA, 177 154 147 байт

Анонимная функция VBE, которая принимает входные данные ожидаемого типа, Stringпредставляющего почтовый индекс штата, из диапазона [A1]и возвращает число Integer, представляющее число состояний, граничащих с этим состоянием.

For i=0To 8:r=r+IIf(Instr(1,Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")(i),[A1]),i,0):Next:?IIf(r,r,6)

Предыдущие версии

154 байта:

For Each s in Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN"):r=r+IIf(Instr(1,s,[A1]),i,0):i=i+1:Next:?IIf(r,r,6)

177 байт:

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA A KYCO MOTN"):[3:3]="=IfError(If(Find($A1,A2),Column(A3)),"""")":[B1]="=Sum(3:3)":?[If(B1,B1,6)]

Отформатирован для удобства чтения

[2:2]=Split("AKHI ME FLSCWA CACTLANHNJNDERIVT ALWINCKSMDMSMTXOR MAZOHGANMIMNVWVA | KYCO MOTN")
[3:3]="=IfError(If(Find($A1,A2),Column(A3)-1),"""")"
[B1]="=Sum(3:3)"
?[If(B1,B1,6)]
Тейлор Скотт
источник
1

Python 2, 363 218 байт

lambda a:dict(WA=2,WI=4,WV=5,FL=2,NH=3,NJ=3,NM=5,NC=4,ND=3,RI=3,NV=5,CO=7,CA=3,GA=5,CT=3,OH=5,KS=4,SC=2,KY=7,OR=4,DE=3,HI=0,TX=4,LA=3,TN=8,VA=5,AK=0,AL=4,VT=3,IN=4,AZ=5,ME=1,MD=4,MA=5,MO=8,MN=5,MI=5,MT=4,MS=4).get(a,6)

Давайте начнем с простого, слегка оптимизированного, жестко закодированного ответа. Принимает почтовый индекс в качестве ввода.

-145 байт благодаря bfontaine.

pppery
источник
4
Вы можете сохранить почти 100 байтов, используя dict(MO=8,TN=8,...)вместо {'MO':8,'TN':8,...}. Затем вы можете сохранить почти 50 байтов, используя .get(a,6)и удаляя те состояния, которые граничат с 6 другими состояниями. Я могу добраться до 219 с этими двумя трюками.
17
@ Митч сэкономит еще больше, используя вместо этого место .и делая split()(я думаю)
Стивен
@ Митч, тебе вообще нужны месячные? Есть ли способ разбить список на группы по 2?
Волшебная Урна Осьминога
Я считаю, что вы можете сохранить еще несколько байтов, используя dict((i[0]+i[1],int(i[-1])) for i in zip(*[iter("WA2WI4WV5FL2...")]*3)). Кроме того, вы могли бы оставить intэто, если разрешено иметь вывод в виде строки.
Исаак ван Донген
На самом деле, если вы используете распаковку, вы можете сделать dict((a+b,int(c)) for a,b,c in zip(*[iter("WA2WI4WV5...")]*3)). Извините, я немного нерешительный: D
Izaak van Dongen
1

PowerShell , 187 байт

param($a)$x=($b=" MO8TN8CO7KY7AZ5GA5MA5MI5MN5NV5NM5OH5VA5WV5AL4IN4KS4MD4MS4MT4NC4OR4TX4WI4CA3CT3DE3LA3NH3NJ3ND3RI3VT3FL2SC2WA2ME1").IndexOf($a);if($x+1){$b[$x+2];exit}6-6*($a-in'AK','HI')

Попробуйте онлайн!

Я уверен, что есть лучший способ сделать это, но вот подход, который я придумал.

Принимает ввод $aи использует его, чтобы получить .IndexOfего появление в длинной строке комбинаций состояния / границы. Сохраняет это в $xи строку в $bпроцессе. Затем переходит к ifоператору, который проверяет, найдено ли совпадение, и, если да, индексирует цифру, а затем exit. В противном случае мы являемся одним из 6состояний или AKили HI, поэтому мы выполняем некоторую логику, чтобы увидеть, $aявляется ли одно из 0состояний, и вычитаем при необходимости. В любом случае, это остается на конвейере и вывод неявный.

AdmBorkBork
источник
1

Python 3, 729 733 байта

Вводит в качестве почтовой аббревиатуры. Это моя первая попытка поиграть в гольф, и я думаю, что это самая короткая попытка, которую я получу при таком адском подходе. Я знаю, что это грандиозно - если подумать, мне, наверное, было бы лучше с if-elseзаявлениями, но после всего этого времени и усилий мне пришлось опубликовать это: D.

lambda s:sum((i-32)*96**j for j,i in enumerate(b'`*g$<#?wP\\.=)kuDbk$yvv\\D:Nh:cd/Pj, e*[_yXGz6lR<$jMo0qUU*7(Dua3-ThO}iX6VWRYDv=<K$8mVbYK9ld);TFB/m\'NE3ow4./pUsI5yJrwYrM4@e6\\kHJ%q8NA3>fb!~-rtwsRW=RBni}Y7T^gD\\IoxzJf.%|1.&4*"$%Q+).|8p(vcJ]cLRGUyC2eF:<Q4!_)y\\<`tr2A[z7re6OaR["2PRv\x7f,bRE [XrvtA<R<UlS23on?Byym&uy{XuB\x7fIMfh<y&waHElg-vk:4*on\x7f@?Ai5=2swfZSBF.PjkL{,|=,M<Bw"w,e@f`aKnmh\'xgg1#b4En\x7f+*\'g_ZRoeN*Q]mX\'>RoGc~ZP~e&{Hwo6bd<](hV)=l9#[f<Gj,#Ea!nJnL=9k"M,`bP2PsP6(eJoGEU>GA?,BpS}"RzzdMRtL[cre;\\tld^xT\':pry\'Nu_*R}eYg_U!Ld{p7<f:95lD]OBMX(r"Jg\'|%Cq"`Qy9g0aNrtYP9dnPRRr3\'yT(CE~\\&@5#tMLZ+a:V5NNXVp+Uy61s9$=Vb99(!ga7f7x}#=*]q.\x7f0R+f[*m:i^qe#D 8M&W\x7faGmCNCU9"~1Pj!]2r5 H>rYPqwfg4cFG*3-(z'))>>(5*int(s,36)-1850)&15

Я только что понял, что взял роскошь трехбуквенного имени переменной - 4 байта вниз, 400 вперед!

Исаак ван Донген
источник
Добро пожаловать в PPCG! Иногда более простые решения короче, как показывают другие ответы Python: P
Стивен
Да, мне нравятся все усилия, которые вы вкладываете в это, учитывая то, что ваше чувство вины заключается в том, чтобы «сделать ваш код таким лаконичным, чтобы он был неразборчивым», и вы в него
впишетесь