Скільки штатів я межую?


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
inb4Вбудована Mathematica
DJMcMayhem

@DJMcMayhem uh oh (спочатку добре звучить, але дивіться оновлення ...)
Стівен

@ СтепHen О ні, мене вигнали! Я працював над відповіддю саме зараз, коли це включає ...;)
нежаган


Чи можемо ми обробити 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

Який процес ви використали для отримання цього списку?
Скотт Мілнер

2
@ScottMilner Я побігав OS%168за кожним із штатів, які безпосередньо дали результат. Я виявив константу 168 шляхом насильницького форсування всіх можливостей менше 250, перевіривши кожну з них на можливість фактично розмежувати різні кількості кордонів. 168працював (серед кількох інших) і мав додаткову вигоду лише від 48значень жорсткого коду через зіткнення.
fireflame241

18

Математика, 112 111 байт

-5 байт завдяки Марку С. та LegionMammal978 !

-22 байти (і помічаючи проблему з виходом) завдяки ngenisis !

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

Звичайно, для цього є вбудована Mathematica. Включає постійний струм в рахунок.


3
Це відчувається брудним, але AdministrativeDivisionнастільки дивовижно довгим, що ви збережете байт з довжиною [x = "AdministrativeDivision" ~ Entity ~ StringDelete [""] @ # ~ ToExpression [x <> "Data"] ~ "BorderingStates"] &
Марк С.

1
ToExpressionможна замінити Symbol, якщо я правильно пам’ятаю.
LegionMammal978

1
Також вам не потрібно використовувати AdministrativeDivisionData, просто передайте "BorderingStates"аргумент сутності; наприкладEntity["AdministrativeDivision","Alaska"]["BorderingStates"]
ngenisis

1
@ngenisis я застосував виправлення до першої проблеми; на щастя, завдяки вашим пропозиціям він не додав стільки байтів. Остання проблема, яку ви згадали щодо DC, не є проблемою, тому що я запитав ОП, чи це дійсно, і відповідь "так".
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]

Як?

Аргумент non-RegExp, переданий .match()методу, неявно перетворюється на об'єкт RegExp. Отже, ми тестуємо регулярний вираз /.\D*{{input}}/на нашій кодованій рядку. Це узгодження цифри (1) , а потім 0 ​​- N нецифрових символів, а потім введення.

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

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

Демо


Версія хешу, 115 байт

Той самий формат введення.

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

Демо


Ви могли врятувати багато байт, скориставшись цією
струною

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 байт завдяки ноджагену

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

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


Крім того, ви використовуєте лише lодин раз, так що ви можете також вписати його.
isaacg

@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. (Як і Коннетикут і Кароліни) Однак, як тільки ми перевірили кожен стан, який межує більше трьох меж, ми можемо просто шукати початки з C, оскільки він більше не може відповідати попередньому.

Кілька тестових випадків можуть бути помилковими, оскільки я не маю часу перевірити їх усі. Повідомте мене, якщо ви знайдете якісь неправильні виходи. :)


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 Ну, я не отримав ідею з будь-яких інших публікацій, якщо ви подивитесь на "алгоритм придушення хешування", я псувався випадковими ідеями хешування, як годину, а потім подумав про пробіли, виявив, що я не міг перемогти цю реалізацію незалежно від того, наскільки я старався.
Magic Octopus Urn

@Stephen зараз, коли я читав ваш, я хотів би, щоб я також думав про дефолт до 6 xD.
Чарівний восьминіг Урна

1
Я не думав про це, спершу побачив це у цій відповіді , тому сміливо приймайте це: P
Стівен


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.


4
Ви можете зберегти майже 100 байт за допомогою, dict(MO=8,TN=8,...)а не {'MO':8,'TN':8,...}. Потім ви можете зберегти майже 50 байт, використовуючи .get(a,6)та видаляючи ті стани, які межують з 6 іншими станами. Я можу досягти 219 за допомогою цих двох хитрощів.
bfontaine

@Mitch заощаджуйте ще трохи, використовуючи простір замість .і роблячи split()(я думаю)
Стівен

@Mitch вам навіть потрібні періоди? Чи існує спосіб розділити список на 2 групи?
Magic Octopus Urn

Я вважаю, що ви можете зберегти ще кілька байтів за допомогою 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
Ізаак ван Донген

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


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
Stephen

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