Catan Yerleşkeleri - En Uzun Yol!


16

Bu Catan Yerleşimcilerinin oyunsonu:

Catan tahtası

Arka fon:

Yollar (uzun çubuk parçaları) ve yerleşimler (ve şehirler) küçük kulübelerle oluşturulmuştur. Bu parçaların yerleşimini aşağıdaki şemayı kullanarak kodlarız: Yukarıdan, bir yolun yerleştirilebileceği bir sıra yatay köşeler ve kenarlarımız var. Sonra sadece yollardan oluşan bir sütun var vb. Kırmızı için R, Turuncu için O ve Mavi için B ve hiçbir şey için _ kullanıldığında, resimde gösterilen tablo şöyle kodlanır:

________RR_R_
__R_
__RR_R_RRR_____R_
B___R
_B_________B__OO_OOR_
B__B_R
BB_BBB_____B____RR_R_
OBB_O
OO__BB_BB__OOO_OO
O_O_
_O_OOO_O_____

Bunun gibi bir kart giriş dizeniz olacaktır. Herhangi bir harf [A-Z]bir oyuncu rengini gösterebilir, ancak en fazla dört renk (boş dahil) olacaktır. Kurulların aksi takdirde Yerleşimci kurallarına göre geçerli olacağı garanti edilir, yani:

  • Her renk, diğer oyuncu yerleşimleri / şehirleri (tepe binaları) tarafından parçalanabilecek veya dağıtılamayabilecek en fazla iki bitişik yol ağına sahip olacaktır. Örnek görüntünün sağ tarafındaki kırmızı yolu ayıran turuncu yerleşime bakın.
    • Her yol ağının en az bir yerleşim yeri olması garanti edilir.
  • Tüm yerleşim birimlerinin ve şehirlerin en yakın diğer yerleşimden / şehirden (sizinkine veya başka bir yere) en az iki kenar olması garanti edilir.
  • Bir oyuncunun oyun tahtasında sadece 15 yolu olabilir.
  • Catan meraklıları için: yerleşim yerleri ve şehirler arasında bu sorunun amacı doğrultusunda bir ayrım yoktur, bu yüzden girdi dizesinde ayrım yapmıyorum.

Bütün bunlar "girdi" dizesinin özellikleri içindir.

En Uzun Yol:

Settlers'de oyuncular "en uzun yola" sahip oldukları için iki zafer puanı kazanırlar. Bu, şu şekilde tanımlanır: Başlangıç ​​noktasından bitiş noktasına kadar olan ve rakiplerin yerleşimi veya şehri tarafından bölünmeyen en uzun bitişik tek yol (yollarda ölçülür) . Belirli bir başlangıç ​​noktasından belirli bir bitiş noktasına kadar yolu izleyebildiğiniz sürece, döngüler uygundur. Yani, 6 yollu bir döngü artı bir yol dallanma uzunluğu 7'dir, ancak karşı taraftaki 6 yol döngüsünün iki dallanması olan bir tanesi hala sadece 7 değerindedir.

Örnek haritada, sağ taraftaki Kırmızı yol sadece 4 değerindedir, çünkü tahtanın sağ tarafındaki Turuncu bir yerleşim tarafından kesilir (bu yüzden yerleşimler hiç dahil edilmez). Mavinin 13 uzunluğunda bir yolu vardır ve Orange'ın 12 uzunluğunda bir yolu vardır. Red'in üst yolu sadece 7 değerindedir, çünkü yanındaki iki tek yola bağlanmaz.

Çıktı:

En uzun uzunlukta bir yola sahip olan tüm oyuncular (bağlar varsa birden fazla olabilir), ardından da bu yolun ne kadar uzunluğunun 10 tabanındaki bir boşluk ve / veya alt çizgi sınırlaması vardır.

Yani örnek kart için çıktı:

B 13

Sorun bildirimi:

Bir program veya işlev yazabilir , giriş kartını STDIN aracılığıyla veya işlevinize bir dize bağımsız değişkeni olarak alabilirsiniz; İsteğe bağlı olarak, çıktıya tek bir sondaki yeni satır ekleyebilirsiniz.

Bu , en kısa program kazanır. Elbette standart boşluklar yasaklanmıştır .


2
Gerçek sorun ifadesi: Turuncu oyuncu bir pislik.
corsiKa

From the top, we have a row horizontal vertices and edges where a road can be placed. Then we have a column of only roads, and so forth. Bunun ne anlama geldiğini anlamam birkaç dakika sürdü. Yatay satırların yerleşimleri ve yerleşim yerlerini de içerdiğini daha açık bir şekilde açıklamalısınız.
DLosc

@corsiKa Daha önce bana bunu yapan biri oldu!
Jerry Jeremiah

1
Görüntüdeki turuncu ve kırmızı gerçekten benzer. Başka bir renk seçmeliydin.
mbomb007

Yanıtlar:


3

Python 2, 445 400 bayt

Ben Settlers hayranıyım, bu yüzden bu meydan okuma eğlenceliydi.

T="^"
Z=26
A=T*52
for i in range(11):A+=(T*(i%2)*3).join(x for x in raw_input()).center(Z,T)
A+=T*52
def f(c,p=0,l=0,B=A):
 b=l;C=B[0:p]+T+B[p+1:];n=(Z,1)[p%2]
 for i in(p<1)*range(390):
    if(i/Z%2<1&i%2>0)|(i/Z%2>0&i%2<1):b=max(b,f(c,i))
 for i in(p-n,p+n)*(B[p]==c):
    for j in(i-Z,i-1,i+1,i+Z)*(B[i]in c+"_"):b=max(b,f(c,j,l+1,C))
 return b
i=l=0
for x in A:
 if x<T:i=f(x)
 if i>l:c=x;l=i
print c,l

Puan, 4 boşluğun her tekrarını bir sekmeyle değiştirmeyi yansıtır.

açıklama

İşlev tanımından önceki satırlar girdiyi okur ve tek bir dize değişkenine normalleştirilmiş bir kart oluşturur. İşlem, dikey yol parçalarını temsil eden kısa satırlara "^" karakterleri ekler. Ayrıca kartı "^" karakterlerle doldurur.

^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^________RR_R_^^^^^^^
^^^^^^_^^^_^^^R^^^_^^^^^^^
^^^^__RR_R_RRR_____R_^^^^^
^^^^B^^^_^^^_^^^_^^^R^^^^^
^^_B_________B__OO_OOR_^^^
^^B^^^_^^^_^^^B^^^_^^^R^^^
^^BB_BBB_____B____RR_R_^^^
^^^^O^^^B^^^B^^^_^^^O^^^^^
^^^^OO__BB_BB__OOO_OO^^^^^
^^^^^^O^^^_^^^O^^^_^^^^^^^
^^^^^^_O_OOO_O_____^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^

Varsayılan parametrelerle çağrıldığında, işlev belirli bir rengin yol uzunluğunu döndürür. İlk döngü yalnızca position (p) parametresi sağlandığında etkindir. Geçerli her bir yol pozisyonunda yolun uzunluğunu özyineli olarak bulur ve en uzun olanı takip eder. Position parametresinde bir yol olduğunda, işlev aynı renkteki bitişik yolların uzunluğunu özyineli olarak ekler. Sayılan segmentleri yeniden saymadığından emin olmak için yol, kartın çalışma kopyasında "~" ile değiştirilir.

İşlev tanımını izleyen kod, karttaki her renk için işlevi çağırır ve en yüksek puanlama rengini ve uzunluğunu yazdırır.

Burada demo

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.