Hrabia Mills w dziewięciu mężczyznach Morris

21

Wprowadzenie

Nine Mens's Morris (zwany także Mills) to gra planszowa dla dwóch graczy, w którą gra się na następującej planszy (zdjęcie pochodzi z połączonej strony Wikipedii):

Płyta młyńska

Każdy gracz ma 9 mężczyzn w kolorze czarno-białym. Konkretne zasady nie są ważne dla tego wyzwania, ale jeśli jesteś zainteresowany , odwiedź stronę Wikipedii .

Wyzwanie

Biorąc pod uwagę siatkę jako dane wejściowe, która reprezentuje określony stan płyty, wypisz całkowitą liczbę frezów za mpomocą 0<=m<=8.
Trzej mężczyźni tego samego koloru tworzą młyn, gdy znajdują się w prostym rzędzie połączonych punktów. b2aby f2nie jest młyn, ponieważ ludzie są w innym kolorze. Również d2do d5nie tworzą młyn ponieważ trzy punkty muszą być podłączone.
Tablica na powyższym obrazku zawiera na przykład dwa młyny. Jeden od f2do f6i jeden od e3doe5 .

Wkład

Tablica jest reprezentowana jako siatka 2D z 24 punktami, które są połączone, jak pokazano na powyższym przykładzie. W przykładzie użyto liter oda-g dla kolumn i liczby od 1-7dla wierszy, ale można wybrać dowolny rozsądny format wejściowy, pod warunkiem, że odwzoruje on 24 unikalne współrzędne do jednego z następujących stanów:

  • Pusty
  • Podjęte przez czerń
  • Podjęte przez biały

Konkretne przedstawienie zależy od ciebie. Nie jesteś ograniczony do „b” lub „w” dla kolorów.

Poza tym Twoje dane wejściowe mogą nie zawierać żadnych dodatkowych informacji.

Dodatkowe uwagi

  • Nie musisz mapować punktów według jakichkolwiek wartości. Jeśli chcesz wziąć dane wejściowe jako tablicę 2D, to też dobrze. Należy jednak pamiętać, że nie wszystkie punkty są wykorzystywane i należy wziąć pod uwagę połączenia między nimi.
  • Dane wejściowe mogą być puste, w takim przypadku musisz podać zero (pusta tablica -> brak młynów).
  • Ponieważ każdy gracz ma 9 mężczyzn, wkład nigdy nie będzie zawierał więcej niż 18 zdobytych punktów.
  • Możesz pominąć puste punkty na wejściu, a zatem tylko te, które są zajęte.
  • Dane wejściowe można zamówić w dowolny sposób. Nie możesz polegać na konkretnym zamówieniu.
  • Możesz założyć, że dane wejściowe zawsze będą prawidłowe. Oznacza to, że nie będzie więcej niż 9 mężczyzn w każdym kolorze i że każdy punkt będzie niepowtarzalny.

Zasady

  • Wyjaśnij, jakiego formatu wejściowego używasz w swoim rozwiązaniu. Zaleca się podanie przykładowego przebiegu programu.
  • Dozwolona funkcja lub pełny program.
  • Domyślne reguły wejścia / wyjścia.
  • Obowiązują standardowe luki .
  • To jest , więc wygrywa najmniej bajtów. Tiebreaker to wcześniejsze zgłoszenie.

Przypadki testowe

Format wejściowy tutaj to lista krotek ze współrzędnymi jak w powyższym przykładzie jako pierwszym elementem i stanem drugiego elementu punktu. Punkt oznaczony kolorem białym jest oznaczony jako „w”, a punkt oznaczony kolorem czarnym jako „b”. Wszystkie pozostałe punkty są pomijane i są puste.

[(„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

Happy Coding!

Denker
źródło
Powiązane - trochę.
inserttusernamehere
Zakładam, że kolory muszą być zarówno ciągłe, jak i wyrównane, ale jest to trochę niejasne. Np. Czy d2, d3, d5 tego samego koloru tworzyłyby młyn?
Robert Benson,
@RobertBenson Nie, to nie będzie, bo d3i d5nie są połączone. Przepisy mówią: Three men of the same color form a mill when they are in a straight row of connected points.. Dodałem kilka przykładów w tej sekcji, aby to wyjaśnić, dziękuję za komentarz!
Denker

Odpowiedzi:

4

APL (Dyalog Classic) , 26 25 bajtów

-1 dzięki FrownyFrog

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

Wypróbuj online!

Argumentem jest tablica 3x3x3 1(czarna), ¯1(biała) i 0(pusta). Pierwszy wymiar znajduje się na głębokości zagnieżdżenia koncentrycznych kwadratów. Pozostałe dwa wymiary znajdują się wzdłuż osi pionowej i poziomej.

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

Mamy młyn, ilekroć sumowanie wzdłuż dowolnej osi daje a 3lub ¯3, z wyjątkiem tego, że musimy odrzucić cztery rogi podczas sumowania wzdłuż pierwszej osi.

{} jest funkcją z niejawnym argumentem

↓⍵jest podzielony - w naszym przypadku zamienia sześcian 3x3x3 w macierz 3x3 zagnieżdżonych wektorów o długości 3

⍵⍪↓⍵ bierze oryginalny sześcian i przykleja macierz 3x3 3 wektorów poniżej, więc otrzymujemy mieszany układ skalarów i wektorów 4x3x3

+/sumy wzdłuż ostatniej osi; ma to połączony efekt sumowania oryginalnego sześcianu wzdłuż ostatniej osi ( +/⍵) i sumowania go wzdłuż środkowej osi ze względu na podział, który zrobiliśmy (+/↓⍵ )

Teraz musimy zająć się specjalnym przypadkiem dla pierwszej osi.

+⌿⍵ sumuje wzdłuż pierwszej osi, zwracając macierz 3x3

4 2⍴ ale nie możemy liczyć narożników, dlatego przekształcamy go w macierz 4x2 w następujący sposób:

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

teraz interesuje nas tylko ostatnia kolumna ( BDFH), więc używamy idiomu⊢/

,konkatenuje BDFHz matrycą, którą uzyskaliśmy wcześniej dla 2. i 3. osi ( BDFHa zarówno matryca ma wiodący wymiar 4)

spłaszcza wszystko, co dotychczas uzyskaliśmy, w pojedynczy wektor

| przyjmuje wartości bezwzględne

{ }∩≢ filtruje tylko trójki - długość (≢) wejścia wynosi zawsze 3

liczy je

ngn
źródło
Heh, właśnie miałem to zasugerować.
Adám
Czy możesz na chwilę dołączyć do chat.stackexchange.com/rooms/52405/apl ?
Adám
≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢jest o jeden krótszy :)
FrownyFrog,
@FrownyFrog dzięki! edytowane w
ngn
4

JavaScript (ES6), 276 228 125 117 105 bajtów

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

(powyższe zawiera niektóre niedrukowalne znaki ascii, które nie pojawią się tutaj, więc jest wersja bez tej, btoaktórą można skopiować i uruchomić)

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

Dzieli ciąg odniesienia na trójki literowe, które pasują do kluczy grupy młyna. Dane wejściowe mają postać obiektu, w którym kluczami są litery a-x, zaczynające się od lewego dolnego rogu i kończące się w prawym górnym rogu, przesuwając się najpierw od lewej do prawej. Wartości dotyczą 1bieli, -1czerni i 0pustego miejsca.

Przykład

{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

Te przykłady pochodzą z przykładów OP, przekonwertowanych na klucz literowy i obiekt wartości liczbowych. Pierwszy pochodzi z przykładowego obrazu, a pozostałe z przykładowego zestawu.

Mwr247
źródło
1
Dobra robota! Możesz skompresować duży łańcuch atob.
ETHprodukcje
@ETHproductions Dzięki! Wygląda jednak na to, że korzysta z niedrukowalnych znaków ascii, więc dołączę też jedną bez nich btoa. Znalazłem też kilka innych ulepszeń, które jeszcze bardziej go obniżają.
Mwr247,
2

Mathematica, 217 131 bajtów

Chociaż jestem pewien, że nie jest to szczególnie konkurencyjne, oto wpis dla ciebie.

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]&

Przykład wprowadzania:

{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"}

Umożliwianie nazw współrzędnych jednego znaku w trywialny sposób daje 51 znaków, dzięki czemu jest to rozwiązanie 166-bajtowe. Nazywanie graczy 1 i 2 zamiast „w” i „b” golfuje od 17 kolejnych postaci.

Więc rozumiemy

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]/.#&
Simmons
źródło
Jeśli dobrze rozumiem reguły formatowania danych wejściowych, powinieneś być w stanie przyjąć je jako 1i 2. użyty przykład wi bjestem pewien, że nie jesteśmy do tego ograniczeni.
Mwr247
@ Mwr247 Masz rację. Możesz użyć dowolnego formatu, o ile nie dodaje on dodatkowych informacji. Wyjaśnię to, kiedy będę w domu.
Denker
1

APL (Dyalog Unicode) , 50 bajtów

„Rozwiązanie obiektów”

Chociaż jest dłuższy (29 znaków) niż rozwiązanie @ ngn , stosuje zupełnie inne podejście: Dane wejściowe mają taką samą ogólną strukturę jak to rozwiązanie, ale wszystkie gniazda są reprezentowane jako obiekty. Puste pola (w tym nieistniejąca środkowa kolumna) muszą być pustymi obiektami. podczas gdy wszyscy czarni mężczyźni muszą być odniesieniami do obiektu „czarnego człowieka”, a wszyscy biali mężczyźni muszą być odniesieniami do obiektu „białego człowieka”. Wszystkie obiekty mogą ewentualnie mieć piękny D WYŚWIETLACZ F orm s dla odczytu, a więc kolumna środkowa może być opcjonalnie wykonane niewidoczne.

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

Wypróbuj online!

+/ suma

1=() Te w

≢¨() Wysokość …

  , zniszczony (spłaszczony)

  ∪/ unikalne zestawy w poprzek

  , połączony z

  ∪⌿⍤2 unikalne ustawienia

,() Połączony z

  ⊢/ skrajna prawa kolumna

  4 2⍴ , przekształcony w cztery rzędy i dwie kolumny,

  ∪⌿ unikalne zestawy kolumnowe

Szczycie operator, jak dostarczane z AGL ( ä) przyniesie długość do 27 znaków .

Adám
źródło