Dokuzlu Erkek Morris'deki Sayım Değirmenleri


21

Giriş

Nine Mens's Morris (Mills olarak da bilinir) aşağıdaki panoda oynanan iki oyuncu için bir tahta oyunudur (bağlantılı Wikipedia sayfasından görüntü alınmıştır):

Değirmen kurulu

Her oyuncunun siyah ve beyaz renkli 9 erkek var. Somut kurallar bu meydan okuma için önemli değil, ancak ilgileniyorsanız Wikipedia sayfasını inceleyin .

Meydan okuma

Belirli boardstate, çıkış toplam değirmen sayısı temsil eder, girdi olarak bir ızgara, Verilen mile 0<=m<=8.
Aynı renkteki üç adam, düz bir sıradaki noktalarda olduklarında bir değirmen oluştururlar. b2için f2erkeklerin farklı renk olduğu için bir değirmen değil. Ayrıca d2etmek d5üç puan bağlı olmanız beri fabrikası kurulmasına olmaz.
Yukarıdaki resimdeki pano örneğin iki değirmen içermektedir. Dan biri f2için f6ve itibaren bir e3etmek e5.

Giriş

Kart, yukarıdaki örnek resimde gösterildiği gibi bağlanmış 24 noktalı bir 2B ızgara olarak temsil edilir. Örnek a-g, sütunlar için gelen harfleri 1-7ve satırlar için gelen rakamları kullanır , ancak 24 benzersiz koordinatı aşağıdaki durumlardan birine eşleştiği sürece makul herhangi bir giriş biçimini seçebilirsiniz:

  • Boş
  • Siyah tarafından alınan
  • Beyaz tarafından alınan

Somut repertuar size kalmış, renkler için "b" veya "w" ile sınırlı değilsiniz.

Bunun yanı sıra, girişiniz herhangi bir ek bilgi içermeyebilir.

Ek Notlar

  • Noktaları herhangi bir değerle eşlemek zorunda değilsiniz. Girdiyi 2D dizi olarak almak istiyorsanız, bu da iyi. Ancak, içindeki tüm noktaların kullanılmadığını ve aralarındaki bağlantıları göz önünde bulundurmanız gerektiğini unutmayın.
  • Giriş boş olabilir, bu durumda sıfır vermeniz gerekir (boş tahta -> değirmen yok).
  • Her oyuncunun 9 kişisi olduğundan, giriş 18'den fazla puan alamaz.
  • Girişte boş noktalar bırakabilir ve bu nedenle yalnızca alınan giriş noktalarını bırakabilirsiniz.
  • Giriş herhangi bir şekilde sipariş edilebilir. Belirli bir siparişe güvenemezsiniz.
  • Girişin her zaman geçerli olacağını varsayabilirsiniz. Bu, her rengin 9'dan fazla erkek olmayacağı ve her bir noktanın benzersiz olacağı anlamına gelir.

kurallar

  • Çözümünüzde hangi giriş biçimini kullandığınızı açıkça belirtin. Programınızın bir örnek çalışmasını sağlamak şiddetle teşvik edilir.
  • İşlev veya tam programa izin verildi.
  • Giriş / çıkış için varsayılan kurallar .
  • Standart boşluklar uygulanır.
  • Bu , yani en düşük bayt sayısı kazanır. Tiebreaker daha önce gönderildi.

Test durumları

Buradaki giriş formatı, yukarıdaki örnekte olduğu gibi koordinatlara ve ikinci noktadaki noktaya ait durumların bulunduğu bir listedir. Beyaz tarafından alınan puan "w", siyah tarafından "b" alınan puandır. Diğer tüm noktalar boş bırakılmıştır.

[( "W", "A4"), ( "b2", "B"), ( "b4", "B"), ( "C4", "B"), ( "d1", "W") ( "w", "e5"), ( "w", "e4"), ( "w", "e3"), ( "w", "D2"),,,,, ( "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

Mutlu Kodlama!



Renklerin aynı hizada olduğu kadar bitişik olması gerektiğine inanıyorum, ancak biraz belirsiz. Örneğin, aynı renkteki d2, d3, d5 bir değirmen oluşturur mu?
Robert Benson,

@RobertBenson Hayır çünkü olmaz d3ve d5bağlı değildir. Kurallar ki: Three men of the same color form a mill when they are in a straight row of connected points.. Bunu açıklamak için bu bölüme bazı örnekler ekledim, yorumunuz için teşekkürler!
Denker

Yanıtlar:


4

APL (Dyalog Klasik) , 26 25 bayt

-1 FrownyFrog sayesinde

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

Çevrimiçi deneyin!

Argüman 3x3x3 1(siyah), ¯1(beyaz) ve 0(boş) dizisidir . İlk boyut, eşmerkezli karelerin yuvalanma derinliği boyuncadır. Diğer iki boyut dikey ve yatay eksen boyuncadır.

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

İlk eksen boyunca toplarken dört köşeyi atmamız gerektiğinden, herhangi bir eksen boyunca toplandığında bir 3ya da bir ¯3öğütücümüz var.

{} örtük argümanı olan bir işlevdir

↓⍵bir ayrık - iç içe uzunluk-3 vektörleri, 3x3'lük bir matris içine 3x3x3 küp döner bizim durumumuzda

⍵⍪↓⍵ Orijinal küpü alır ve altındaki 3-vektörlü 3x3'lük matrisi yapıştırır, böylece 4x3x3'lük karışık bir skaler ve vektör dizisi elde ederiz.

+/son eksen boyunca toplanır; Bu son eksen (birlikte orijinal küp toplayarak birleşik bir etkiye sahiptir +/⍵(nedeniyle yaptığımız bölünmeye) ve orta ekseni boyunca bunu toplanmasıyla +/↓⍵)

Şimdi ilk eksen için özel durumla ilgilenmeliyiz.

+⌿⍵ birinci eksen boyunca toplanır, 3x3'lük bir matris döndürülür

4 2⍴ ancak köşeleri saymamalıyız, bu yüzden bunu böyle bir 4x2 matrisine göre yeniden şekillendiriyoruz:

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

Şimdi sadece son sütunu ( BDFH) ilgileniyoruz , bu yüzden deyimi kullanıyoruz⊢/

,BDFH2. ve 3. eksen için daha önce elde ettiğimiz matrisi birleştirir ( BDFHve matrisin her ikisi de 4'ün önde gelen boyutuna sahiptir)

Şimdiye kadar elde ettiğimiz her şeyi tek bir vektörde düzleştirir

| mutlak değerleri alır

{ }∩≢ sadece üçlü filtreler - girişin uzunluğu (≢) daima 3'tür.

onları sayar


Heh, tam da bunu önermek üzereydim.
Adám


≢{|∊(+/⍵⍪↓⍵),⊢/4 2⍴+⌿⍵}∩≢daha kısa olan :)
FrownyFrog

@ FrownyFrog teşekkürler! düzenlenmiş
ngn

4

JavaScript (ES6), 276 228 125 117 105 bayt

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

(yukarıda burada görünmeyen bazı yazdırılamayan ascii karakterler içeriyor, işte btoabu, kopyalanamayan ve çalıştırılamayan bir sürüm. )

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

Bir referans dizesini, değirmen grubu tuşları ile eşleşen harf üçlelerine ayırır. Giriş, tuşların harfler olduğu a-x, sol alttan başlayıp sağ üstte biten, önce soldan sağa hareket eden bir nesne biçimindedir . Değerler 1beyaz, -1siyah ve 0boş içindir.

Örnek

{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

Bu örnekler OP'nin örneklerinden alınmış, harf-anahtar ve sayı-değer nesnesine dönüştürülmüştür. İlki örnek resimden, diğerleri örnek kümeden.


1
İyi iş! Büyük ipi ile sıkıştırabilirsin atob.
ETHproductions

@ETHproductions Teşekkürler! Yine de yazdırılamayan ascii karakterleri kullanıyor gibi görünüyor, bu yüzden birini btoade ekleyeceğim . Ayrıca onu daha da düşürecek başka gelişmeler de oldu.
Mwr247

2

Mathematica, 217 131 Bayt

Bunun özellikle rekabetçi olmadığından emin olsam da, işte sana bir giriş.

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

Giriş örneği:

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

Tek karakterli koordinat adlarına izin vermek, temelde 51 karakterden oluşuyor ve bu da 166 baytlık bir çözüm haline getiriyor. "W" ve "b" yerine oyuncuları 1 ve 2 olarak adlandırmak, 17 karakter daha başlatır.

Öyleyse biz alırız

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]/.#&

Ben doğru Biçimlendirme kurallarını girişi anladıysanız, siz de onları almaya gerekir 1ve 2. kullanılan örnek wve bbununla sınırlı olmadığımızdan kesinlikle eminim.
Mwr247

@ Mwr247 Haklısın. Ek bilgi eklemediği sürece istediğiniz herhangi bir formatı kullanabilirsiniz. Evdeyken bunu açıklığa kavuştururum.
Denker

1

APL (Dyalog Unicode) , 50 bayt

"Nesnelerin Çözümü"

@ Ngn'in çözümünden daha uzun (29 karakter) olsa da , tamamen farklı bir yaklaşım kullanıyor: Girdi, bu çözümle aynı genel yapıya sahip, ancak tüm yuvalar nesne olarak gösteriliyor. Boş yuvalar (mevcut olmayan orta sütun dahil) boş nesneler olmalıdır. tüm siyah adamlar "siyah adam" nesnesine referans olmalı ve tüm beyaz adamlar "beyaz adam" nesnesine referans olmalıdır. Tüm nesneler, isteğe bağlı olarak güzel olabilir D isplay F orm s okunabilmesi için ve merkez sütunu, isteğe bağlı olarak görünmez yapılabilir, böylece.

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

Çevrimiçi deneyin!

+/ toplamı

1=() Olanlar

≢¨() Ve

  , sökülmüş (düzleştirilmiş)

  ∪/ genelinde benzersiz kümeler

  , birleştirilmiş

  ∪⌿⍤2 benzersiz ayarlar

,() İle birleştirilmiş

  ⊢/ en sağdaki sütun

  4 2⍴ , dört satır ve iki sütuna yeniden şekillendirilmiş,

  ∪⌿ benzersiz sütunlu kümeler

Bir tepesindeki olarak AGL (birlikte verilen operatörü, ä), 27 karaktere kadar uzunlukta getirecek .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.