Çamurlu quartata-balık temizlemek


27

Bu meydan okuma, PPCG 2015'in En İyisi kategorisinde yer alan Yılın Çaylakları kategorisinin şerefine : çamurlu deniz balığı (çünkü ben aradığınız dil değilim! ) Ve quartata ( Hakikat Makinesi için ). Tebrikler!

Arka fon

Okyanusun en derin çukurlarında, quartata-balık denilen, kare şeklinde nadir ve belirsiz bir balık yaşar . Game of Life hücresel otomatından gelen planöre benziyor . İşte farklı boyutlarda iki quartata balığı:

-o-
--o
ooo

--oo--
--oo--
----oo
----oo
oooooo
oooooo

Quartata-balığının fotoğrafını çekmeyi başardınız, ancak balıkları çamurla kaplı olduğundan görmek oldukça zor. Şimdi fotoğrafı temizlemek için bir program yazmanız gerekecek.

Giriş

.-o#Girişiniz, yeni satırlarla ayrılmış bir dize olarak verilen karakterlerin dikdörtgen bir 2D ızgarasıdır . İsterseniz |ayırıcılar olarak yeni çizgiler yerine borular kullanabilirsiniz ve bir izleyen ve / veya bir önceki ayırıcı varsayalım.

Giriş bazı yan uzunluğunun tam olarak bir quartata-balık içerecektir 3*n, n ≥ 1dönemler çevrili pozitif tam sayı olduğu .okyanus tabanını temsil eder. Balıklar daima yukarıda gösterilen yönde olacaktır. Bu ızgara üzerine kaplanmış, tam bir boş olmayan dikdörtgen karma bölge olacaktır #, bu da bir çamur bloğunu temsil eder. Kabarcık kartata balığını kısmen veya tamamen kaplayabilir. Örnek bir giriş

............
..--oo--....
..--oo--....
..---#####..
..---#####..
..ooo#####..
..oooooo....

Çıktı

Çıktınız girdiden tüm karma karakterleri karakterlerle değiştirerek üretilir .-o, böylece grid tam bir quartata-fish içerir. Bu değişimin doğru şekilde yapılması için her zaman benzersiz bir yol olacaktır; bilhassa, çamur bloğu balığını tamamen kaplar ancak büyüklüğü 3 × 3 ise. Çıkış, girişle aynı ayırıcıyı kullanmalıdır. Yukarıdaki giriş için doğru çıkış

............
..--oo--....
..--oo--....
..----oo....
..----oo....
..oooooo....
..oooooo....

Kurallar ve puanlama

Tam bir program veya bir fonksiyon yazabilirsiniz. En düşük bayt sayısı kazanır ve standart boşluklar izin verilmez. Zaman sınırı yoktur: Eğer gönderiminiz sonunda sınırsız zaman ve kaynak verildiğinde durursa, sorun değil.

Test durumları

Input:
.......
...-o-.
...--o.
##.ooo.
##.....
Output:
.......
...-o-.
...--o.
...ooo.
.......

Input:
...-o-.
...-#o.
...ooo.
.......
Output:
...-o-.
...--o.
...ooo.
.......

Input:
.........
.###.....
.###.....
.ooo.....
Output:
.........
.-o-.....
.--o.....
.ooo.....

Input:
.....
.###.
.###.
.###.
Output:
.....
.-o-.
.--o.
.ooo.

Input:
......
......
......
...###
...###
...###
Output:
......
......
......
...-o-
...--o
...ooo

Input:
###o--....
###o--....
###-oo....
###-oo....
###ooo....
###ooo....
###.......
Output:
--oo--....
--oo--....
----oo....
----oo....
oooooo....
oooooo....
..........

Input:
............
..--oo--....
..--oo--....
..---#####..
..---#####..
..ooo#####..
..oooooo....
Output:
............
..--oo--....
..--oo--....
..----oo....
..----oo....
..oooooo....
..oooooo....

Input:
...--oo--....
.#########...
.#########...
.#########...
...oooooo....
...oooooo....
.............
.............
Output:
...--oo--....
...--oo--....
...----oo....
...----oo....
...oooooo....
...oooooo....
.............
.............

Input:
..............
..............
.########.....
.########.....
.########-....
.########-....
.########o....
.########o....
.########o....
.########o....
.########.....
..............
Output:
..............
..............
..............
..............
....--oo--....
....--oo--....
....----oo....
....----oo....
....oooooo....
....oooooo....
..............
..............

Input:
.................
.................
..---ooo---......
..--#########....
..--#########....
..--#########....
..--#########....
..--#########....
..oo#########....
..oo#########....
..oo#########....
....#########....
Output:
.................
.................
..---ooo---......
..---ooo---......
..---ooo---......
..------ooo......
..------ooo......
..------ooo......
..ooooooooo......
..ooooooooo......
..ooooooooo......
.................

Input:
.........................
.........................
....----oooo----.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....----########.........
....oooo########.........
....oooo########.........
....oooooooooooo.........
....oooooooooooo.........
.........................
Output:
.........................
.........................
....----oooo----.........
....----oooo----.........
....----oooo----.........
....----oooo----.........
....--------oooo.........
....--------oooo.........
....--------oooo.........
....--------oooo.........
....oooooooooooo.........
....oooooooooooo.........
....oooooooooooo.........
....oooooooooooo.........
.........................

Giriş şansının son derece düşük olmasına rağmen bitiremeyeceği bir olasılık varsa tamam mı (kötü rastgelelik)? Ayrıca tek yeni hat borusu dışındaki karakterleri değiştirmenize izin veriliyor mu?
Mavi

@muddyfish İlk soruya evet (en sonunda olasılık 1 ile bitmeli, mükemmel rastgeleliği varsayarak, ancak teorik olarak sonsuza kadar çalışabilir), ikinciye hayır (karakterler sabittir).
Zgarb

0.9 tekrarlayan bir olasılık tamam mı?
Mavi

@muddyfish Eğer biri uyana kadar bir döngüde rasgele ızgaralar oluşturuyorsanız, sorun değil.
Zgarb

Önemli sınama durumu: ......|......|......|...###|...###|...###(bir çözüm tüm olası sol üst koordinatları denemek ve alanın üzerine 6x6 sığdırmak durumunda)
Sp3000

Yanıtlar:


9

Python 2, 433 411 bayt

import re;i,o,l,j=input(),range,lambda s,r:s.replace(*r),"".join;i=l(l(l(i,".1"),"#."),"| ");s=o(len(i))
for x in s:
 for y in s:
    for q in s:
     r=map(list,l(l(i,"o."),"-.").split(" "))
     try:
        for v in o(q):r[x+v][y:y+q]=["".join(c*(q/3)for c in b)for b in["-o-","--o","ooo"]][3*v/q]
        m=re.match(i," ".join(j(i)for i in r))
     except:0
     if sum("-"in p for p in r)and m:print"|".join(l(j(i),"1.")for i in r);_

A ile çıkar NameError. Giriş borusunu ayırır.

Burada sekmeleri ve boşlukları karıştırıyorum. SE sekmeleri düzgün şekilde oluşturmuyor.

'###o--....|###o--....|###-oo....|###-oo....|###ooo....|###ooo....|###.......'
 --oo--....|--oo--....|----oo....|----oo....|oooooo....|oooooo....|..........

'.....|.###.|.###.|.###.'
 .....|.-o-.|.--o.|.ooo.

'...-o-.|...-#o.|...ooo.|.......'
 ...-o-.|...--o.|...ooo.|.......

(Başlangıçtaki fazladan boşlukların yalnızca özel amaçlı olduğunu ve gerçekte basılmadığını unutmayın)


Kodunuzdaki fazladan sekmelerden kurtulabilir ve birkaç baytı kesmek için bunları tek boşluklarla değiştirebilirsiniz (yani, kodunuzdaki baytları sayarken beyaz boşluğu dikkate aldıysanız).
R. Kap

4

JavaScript (ES6), 291 bayt

g=>eval('w=g.search`\n`;h=g.length/w|0;for(n=(w<h?w:h)/3|0;s=n*3;n--)for(x=w+1-s;x--;)for(y=h+1-s;y--;[...g].every((c,i)=>c==o[i]|c=="#")?z=p:0)for(p="",i=h;i--;)p=(l=[,"-o-","--o","ooo"][(i-y)/n+1|0],l?"."[t="repeat"](x)+l.replace(/./g,c=>c[t](n))+"."[t](w-x-s):"."[t](w))+(p?`\n`:"")+p;z')

açıklama

Girdi ızgarasını yeni satır ayrılmış bir dize olarak alır. Tamamen golf oynamadım, zamanım geldiğinde daha fazlasını yapacak.

Bu çalışır:

  • Bir balığın mümkün olan her pozisyonunu ve büyüklüğünü girdi ızgarasının sınırları dahilinde almak.
  • Her pozisyon / boyut için, o pozisyonda balık bulunan bir ızgara teli oluşturur.
  • Her karakterin üzerinde yineleyerek bunun doğru çıktı olup olmadığını kontrol eder. Her karakter eşleşirse veya bir karma ise, yerleşik dizeyi çıkarır.

var solution =

g=>
  eval(`

    // Get size of input grid
    w=g.search\`\n\`;
    h=g.length/w|0;

    // Check every possible size (n) and position (x and y) of fish
    for(n=(w<h?w:h)/3|0;s=n*3;n--)
      for(x=w+1-s;x--;)
        for(y=h+1-s;y--;

          // Check if possible solution matches input grid
          [...g].every((c,i)=>c==p[i]|c=="#")?z=p:0
        )

          // Create possible solution grid
          for(p="",i=h;i--;)
            p=(
              l=[,"-o-","--o","ooo"][(i-y)/n+1|0],
              l?
                "."[t="repeat"](x)+
                l.replace(/./g,c=>c[t](n))+
                "."[t](w-x-s)
              :"."[t](w)
            )+(p?\`\n\`:"")+p;
    z
  `)
<textarea id="input" rows="6" cols="40">..............
..............
.########.....
.########.....
.########-....
.########-....
.########o....
.########o....
.########o....
.########o....
.########.....
..............</textarea><br />
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


4

Python 2,325 bayt

def f(s):
 s=map(list,s.split());R=range;L=len(s);M=len(s[0])
 for h in R(L/3*3,0,-3):
  for x in R(M-h+1):
   for y in R(L-h+1):
    if all(s[v%L][v/L]in".-#o #"[0<=v%L-y<h>v/L-x>=0::2]for v in R(L*M)):
     for k in R(h*h):s[y+k/h][x+k%h]="-o"[482>>k/h*3/h*3+k%h*3/h&1]
     return'\n'.join(map(''.join,s)).replace('#','.')

Şimdilik kötü bir şekilde oynanan bir çözüm - for .. in range(...)s tam bir tren kazası. Girdiler / çıktılar yeni satır ayrılmış dizeler.

Bayt sayısı şu anda yalnızca boşluk girintilerini varsayar - Gerekirse golf bittikten sonra karışık sekmelere / boşluklara geçeceğim.

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.