Граф Міллз у дев'яти чоловічих Моррісах


21

Вступ

Морріс Дев'яти чоловіків (його ще називають Міллз) - це настільна гра для двох гравців, яка грається на наступній дошці (зображення, зняте із пов'язаної сторінки Вікіпедії):

Дошка млин

У кожного гравця 9 чоловіків, кольорові чорно-білі. Конкретні правила не важливі для цього виклику, але перегляньте сторінку Вікіпедії, якщо вам це цікаво.

Змагання

Беручи під увагу сітку в якості вхідних даних, який представляє певний boardstate, вихід загальної кількості млини mз 0<=m<=8.
Три чоловіки одного кольору утворюють млин, коли вони перебувають у прямому ряду з'єднаних точок. b2щоб f2НЕ млин , так як люди різного кольору. Крім того, d2щоб d5не утворювати млин, оскільки три точки повинні бути з'єднані.
Дошка на зображенні вище містить, наприклад, дві млини. Один від f2до f6і один від e3до e5.

Вхідні дані

Дошка представлена ​​у вигляді двовимірної сітки з 24 точками, які з'єднані, як показано на прикладі зображення вище. У прикладі використовуються літери a-gдля стовпців та цифри 1-7для рядків, але ви можете обрати будь-який розумний формат введення, якщо він відображає 24 унікальних координати в один із наступних станів:

  • Порожній
  • Узятий чорним
  • Узятий білим

Конкретна репрезентація залежить від вас, якщо ви не обмежуєтесь кольорами "b" чи "w".

Крім цього, ваш внесок може не містити додаткової інформації.

Додаткові нотатки

  • Не потрібно зіставляти точки за будь-якими значеннями. Якщо ви хочете взяти вхід як двовимірний масив, це теж добре. Але майте на увазі, що не всі пункти там використовуються і вам доведеться враховувати зв’язки між ними.
  • Вхід може бути порожнім, і тоді вам доведеться вивести нуль (порожня дошка -> без млинів).
  • Оскільки у кожного гравця 9 чоловіків, то вхід ніколи не буде містити більше 18 очок.
  • Ви можете залишити порожні точки на вході, а отже, лише ті точки введення, які прийняті.
  • Введення даних можна замовити будь-яким способом. Ви не можете розраховувати на певне замовлення.
  • Ви можете припустити, що введення завжди буде дійсним. Це означає, що не буде більше 9 чоловіків кожного кольору і кожна точка буде унікальною.

Правила

  • Поясніть, який формат введення ви використовуєте у своєму рішенні. Надання прикладного запуску програми настійно рекомендується.
  • Дозволена функція або повна програма.
  • Правила вводу / виводу за замовчуванням .
  • Застосовуються стандартні лазівки .
  • Це , тому виграє найменший байт. Tiereaker є більш раннім поданням.

Тестові кейси

Формат введення тут - це список кортежів з координатами, як у наведеному вище прикладі, як перший елемент та стан точкового другого елемента. Точка, взята білим кольором, позначена як "w", а точка, взята чорною як "b". Усі інші пункти залишені та порожні.

[("a4", "w"), ("b2", "b"), ("b4", "b"), ("c4", "b"), ("d1", "w") , ("d2", "w"), ("e3", "w"), ("e4", "w"), ("e5", "w"), ("f2", "b") , ("f4", "b"), ("f6", "b"), ("g4", "w")] -> 2
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b4", "b"), ("c4", "b") , ("d3", "w"), ("d2", "w"), ("d1", "w")] -> 3
[] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", w")] -> 0
[("b4", "b"), ("a4", b "), (" c4 ", b")] -> 1
[("a1", "b"), ("a4", "b"), ("a7", "b"), ("b2", "b"), ("b4", "b") , ("b6", "b"), ("c3", "b"), ("c4", "b"), ("c5", "b"), ("e3", "w") , ("e4", "w"), ("e5", "w"), ("f2", "w"), ("f4", "w"), ("f6", "w") , ("g1", "w"), ("g4", "w"), ("g7", "w")] -> 8

Щасливе кодування!



Я припускаю, що кольори повинні бути суміжними, а також вирівнюватися, але це трохи незрозуміло. Наприклад, d2, d3, d5 того ж кольору утворювали млин?
Роберт Бенсон

@RobertBenson Ні , це не буде , тому що d3і d5не підключені. Правила говорять: Three men of the same color form a mill when they are in a straight row of connected points.. Я додав кілька прикладів у цей розділ, щоб зрозуміти, дякую за коментар!
Денкер

Відповіді:


4

APL (Dyalog Classic) , 26 25 байт

-1 завдяки FrownyFrog

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢

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

Аргумент - це масив 3x3x3 1(чорний), ¯1(білий) та 0(порожній). Перший вимір - по глибині гніздування концентричних квадратів. Інші два розміри - по вертикальній і горизонтальній осі.

000---------001---------002
 |           |           |
 |  100-----101-----102  |
 |   |       |       |   |
 |   |  200-201-202  |   |
 |   |   |       |   |   |
010-110-210     212-112-012
 |   |   |       |   |   |
 |   |  220-221-222  |   |
 |   |       |       |   |
 |  120-----121-----122  |
 |           |           |
020---------021---------022

У нас є млин, коли підсумовування вздовж будь-якої осі дає a 3або ¯3, за винятком того, що ми повинні відкинути чотири кути при підсумовуванні вздовж першої осі.

{} є функцією з неявним аргументом

↓⍵ є розкол - в нашому випадку це перетворює 3x3x3 куб у вигляді матриці 3х3 вкладених довжини 3 векторів

⍵⍪↓⍵ бере оригінальний куб і склеює матрицю 3х3 3-векторів під ним, тому ми отримуємо змішаний масив скалярів і векторів 4x3x3

+/суми вздовж останньої осі; це має комбінований ефект підсумовування вихідного куба вздовж останньої осі (+/⍵ ) та підсумовування його по середній осі за рахунок розколу, який ми зробили ( +/↓⍵)

Тепер ми повинні подбати про спеціальний корпус для першої осі.

+⌿⍵ сум по першій осі, повертаючи матрицю 3x3

4 2⍴ але ми не повинні рахувати кути, тому ми переставляємо його на матрицю 4x2 таким чином:

ABC      AB
DEF  ->  CD
GHI      EF
         GH  ("I" disappears)

зараз нас цікавить лише остання колонка (BDFH ), тому ми використовуємо ідіому⊢/

,конкатенати BDFHдо матриці, яку ми раніше отримували для 2-ї та 3-ї осі (BDFH а обидва матриці мають провідний розмір 4)

згладжує все, що ми отримали поки що, в один вектор

| приймає абсолютні значення

{ }∩≢ фільтрує лише трійки - довжина (≢) вводу завжди 3

рахує їх


Хе, я ось-ось збирався це запропонувати.
Адам

Чи можете ви на мить приєднатися до chat.stackexchange.com/rooms/52405/apl ?
Адам

≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢одна коротша :)
FrownyFrog

@FrownyFrog дякую! відредаговано
ngn

4

JavaScript (ES6), 276 228 125 117 105 байт

a=>btoa`i·yø!9%z)ª»-ºü1j;ÝÈ%¥·¡ªÜ"·ç¹Ê1`.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

(вище наведено деякі недруковані символи ascii, які тут не відображатимуться, тому ось версія, без btoaякої можна скопіювати та запустити)

a=>'abcdefghijklmnopqrstuvwxajvdksglpbehqtwimrfnucox'.replace(/.../g,b=>(a[b[0]]+a[b[1]]+a[b[2]])/3&1||'').length

Розбиває опорний рядок на трійники літер, які співпадають з груповими ключами фрези. Введення виконується у вигляді об’єкта, де клавішами є букви a-x, починаючи знизу ліворуч і закінчуючи вгорі праворуч, спочатку рухаючись ліворуч праворуч. Значення 1для білого кольору,-1 для чорного та 0для порожнього.

Приклад

{b:1,d:-1,e:1,f:-1,i:1,k:-1,l:-1,m:1,n:-1,r:1,u:-1} => 2
{j:1,d:-1,k:-1,l:-1,b:1,e:1,i:1,m:1,r:1,f:-1,n:-1,u:-1,o:1} => 2
{a:-1,j:-1,v:-1,k:-1,l:-1,h:1,e:1,b:1} => 3
{} => 0
{k:-1,j:-1,l:1} => 0
{k:-1,j:-1,l:1} => 1
{a:-1,j:-1,v:-1,d:-1,k:-1,s:-1,g:-1,l:-1,p:-1,i:1,m:1,r:1,f:1,n:1,u:1,c:1,o:1,x:1} => 8

Ці приклади взяті з прикладів ОП, перетворені на об'єкт буквений ключ та число. Перший - із прикладу зображення, а інші - із прикладу.


1
Хороша робота! Ви можете стиснути велику струну за допомогою atob.
ETHproductions

@ETHproductions Дякую! Здається, він використовує недруковані символи ascii, тому я також включатиму його без того btoa. Також було знайдено деякі інші вдосконалення, які знижують її ще більше.
Mwr247

2

Математика, 217 131 байт

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

Count[Total/@{{a1,d1,g1},{b2,d2,f2},{c3,d3,e3},{a4,b4,c4},{e4,f4,g4},{c5,d5,e5},{b6,d6,f6},{a7,d7,g7},{a1,a4,a7},{b2,b4,b6},{c3,c4,c5},{d1,d2,d3},{d5,d6,d7},{e3,e4,e5},{f2,f4,f6},{g1,g4,g7}}/.#/.{"w"->1,"b"->2},3|6]&

Приклад введення:

{a4 -> "w", b2 -> "b", b4 -> "b", c4 -> "b", d1 -> "w", d2 -> "w", e3 -> "w", e4 -> "w", e5 -> "w", f2 -> "b", f4 -> "b", f6 -> "b", g4 -> "w"}

Дозволяючи однозначним іменам координат тривіально гольфувати 51 символ, що робить це 166-байтним рішенням. Називаючи гравців 1 і 2, а не "w" і "b" гольфи від 17 подальших символів.

Таким чином ми отримуємо

Count[Total/@{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,a,j,v,d,k,s,g,l,p,b,e,h,q,t,w,r,i,m,f,u,n,c,o,x}~Partition~3,3|6]/.#&

Якщо я правильно розумію правила форматування вхідних даних, ви повинні мати можливість приймати їх як 1і 2. використаний приклад wі b, але я впевнений, що ми не обмежуємося цим.
Mwr247

@ Mwr247 Ви праві. Ви можете використовувати будь-який потрібний вам формат, доки він не додасть додаткової інформації. Я уточню це, коли буду вдома.
Денкер

1

APL (Dyalog Unicode) , 50 байт

"Рішення об'єктів"

Хоча довше (29 символів), ніж рішення @ ngn , воно використовує зовсім інший підхід: вхід має таку ж загальну структуру, що і рішення, але всі слоти представлені як об'єкти. Порожні слоти (включаючи неіснуючий центральний стовпець) повинні бути порожніми об'єктами. в той час як усі чорні чоловіки повинні бути посиланнями на об'єкт "чорна людина", а всі білі чоловіки повинні бути посиланнями на "білу людину". Всі об'єкти можуть необов'язково мати хороший D вантажують F ОРЗ з для зручності читання, і , отже, центральний стовпець може бути необов'язково зроблений невидимим.

+/1=(≢¨(,∪/,∪⌿⍤2),(⊢/4 2⍴∪⌿))

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

+/ сума

1=(... ) ті, хто в

≢¨(... ) обчислення

  , згорблений (сплющений)

  ∪/ унікальні набори поперек

  , приєднався до

  ∪⌿⍤2 унікальний набір

,() Приєднався до

  ⊢/ крайній правий стовпець

  4 2⍴ розміщений на чотири ряди та два стовпці,

  ∪⌿ унікальні стовпчасті набори

На вершину оператора, який додається з AGL ( ä), був би довести довжину до 27 символів .

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