Reinigen Sie die schlammigen Quatata-Fische

27

Diese Challenge ist eine Hommage an die Gewinner der Kategorie Rookie of the Year von Best of PPCG 2015 : Schlammfisch (denn ich bin nicht die Sprache, die Sie suchen! ) Und Quatata (für Implement a Truth-Machine ). Herzliche Glückwünsche!

Hintergrund

In den tiefsten Gräben des Ozeans lebt ein seltener und schwer fassbarer quadratischer Fisch, der als Quartata-Fisch bezeichnet wird . Es sieht aus wie das Segelflugzeug aus dem Game of Life-Zellularautomaten. Hier sind zwei Quartata-Fische unterschiedlicher Größe:

-o-
--o
ooo

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

Sie haben es geschafft, ein Foto des Quartata-Fisches zu machen, aber der Fisch ist ziemlich schwer zu sehen, da er mit Schlamm bedeckt ist. Jetzt müssen Sie ein Programm schreiben, um das Foto zu bereinigen.

Eingang

Ihre Eingabe ist ein rechteckiges 2D-Raster der Zeichen .-o#, das als durch Zeilenumbrüche getrennte Zeichenfolge angegeben wird. Wenn Sie möchten, können Sie Pipes |anstelle von Zeilenumbrüchen als Trennzeichen verwenden, und Sie können ein nachfolgendes und / oder vorangestelltes Trennzeichen annehmen.

Die Eingabe enthält genau einen Quarterfisch mit einer gewissen Seitenlänge 3*n, wobei n ≥ 1es sich um eine positive ganze Zahl handelt, die von Perioden umgeben ist ., die den Meeresboden darstellen. Der Fisch wird immer in der oben gezeigten Ausrichtung sein. Über dieses Raster wird genau ein nicht leerer rechteckiger Bereich von Hashes gelegt #, der einen Schlammklumpen darstellt. Der Klecks kann den Quartata-Fisch ganz oder teilweise bedecken. Eine Beispieleingabe wäre

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

Ausgabe

Ihre Ausgabe wird aus der Eingabe generiert, indem alle Hashes durch die Zeichen ersetzt werden .-o, sodass das Raster genau einen Quartatenfisch enthält. Es wird immer eine einzigartige Möglichkeit geben, diesen Austausch ordnungsgemäß durchzuführen. Insbesondere bedeckt der Schlammklumpen den Fisch nur dann vollständig, wenn seine Größe 3 × 3 beträgt. Der Ausgang muss dasselbe Trennzeichen wie der Eingang verwenden. Für die obige Eingabe wäre die richtige Ausgabe

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

Regeln und Wertung

Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Es gibt keine Zeitbeschränkungen: Wenn Ihre Einreichung bei unbegrenzter Zeit und unbegrenzten Ressourcen irgendwann unterbrochen wird, geht es Ihnen gut.

Testfälle

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.........
.........................
Zgarb
quelle
Ist es in Ordnung, wenn der Eintrag eine Wahrscheinlichkeit hat, dass er nicht beendet wird (schlechte Zufälligkeit), obwohl die Chancen dafür äußerst gering sind? Dürfen Sie auch andere Zeichen als die einzelne Newline-Pipe ändern?
Blue
@muddyfish Ja zur ersten Frage (sie muss schließlich mit Wahrscheinlichkeit 1 enden, unter der Annahme einer vollkommenen Zufälligkeit, kann aber theoretisch für immer ablaufen), Nein zur zweiten Frage (die Zeichen sind fest).
Zgarb
Ist also eine Wahrscheinlichkeit von 0,9 in Ordnung?
Blau
@muddyfish Wenn Sie zufällige Gitter in einer Schleife erzeugen, bis eines passt, ist das in Ordnung.
Zgarb
Wichtiger Testfall: ......|......|......|...###|...###|...###(Für den Fall, dass eine Lösung alle möglichen Koordinaten von oben nach links
ausprobiert

Antworten:

9

Python 2, 433 411 Bytes

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);_

Ausgänge mit a NameError. Trennt das Eingangsrohr.

Ich mische hier Tabulatoren und Leerzeichen. SE rendert Tabs nicht richtig.

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

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

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

(Beachten Sie, dass zusätzliche Leerzeichen am Anfang nur der Schönheit dienen und nicht gedruckt werden.)

Blau
quelle
Sie können die zusätzlichen Tabulatoren in Ihrem Code entfernen und durch einzelne Leerzeichen ersetzen, um einige Bytes zu reduzieren (d. H. Wenn Sie den Leerraum beim Zählen der Bytes in Ihrem Code berücksichtigt haben).
R. Kap
4

JavaScript (ES6), 291 Byte

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')

Erläuterung

Nimmt das Eingaberaster als durch Zeilenumbrüche getrennte Zeichenfolge. Nicht ganz golfen, werde mehr tun, wenn ich Zeit habe.

Es funktioniert durch:

  • Holen Sie sich jede mögliche Position und Größe eines Fisches in den Grenzen des Eingaberasters.
  • Für jede Position / Größe baut es eine Gitterkette mit einem Fisch in dieser Position auf.
  • Überprüft, ob dies die richtige Ausgabe ist, indem jedes Zeichen durchlaufen wird. Wenn jedes Zeichen mit einem Hash übereinstimmt oder ein Hash ist, wird die erstellte Zeichenfolge ausgegeben.

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>

user81655
quelle
4

Python 2, 325 Bytes

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('#','.')

Vorerst eine schlecht golfene Lösung - die for .. in range(...)s sind ein totales Zugunglück. Eingabe / Ausgabe von durch Zeilenumbruch getrennten Zeichenfolgen.

Die Byteanzahl geht derzeit nur von Leerzeicheneinzügen aus. Wenn ich mit dem Golfen fertig bin, wechsle ich später zu gemischten Tabs / Leerzeichen.

Sp3000
quelle