Limpe os peixes lamacentos do quartata

27

Este desafio é uma homenagem aos vencedores da categoria Novato do ano do Best of PPCG 2015 : muddyfish (porque eu não sou o idioma que você está procurando! ) E quartata (para Implementar uma máquina da verdade ). Parabéns!

fundo

Nas trincheiras mais profundas do oceano, vive um peixe raro e esquivo em forma de quadrado chamado peixe-quartata . Parece o planador do autômato celular Game of Life. Aqui estão dois peixes-quartata de tamanhos diferentes:

-o-
--o
ooo

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

Você conseguiu tirar uma foto do peixe quartata, mas é difícil vê-lo, pois está coberto de lama. Agora você terá que escrever um programa para limpar a foto.

Entrada

Sua entrada é uma grade 2D retangular dos caracteres .-o#, fornecida como uma sequência separada por nova linha. Se desejar, você pode usar tubos em |vez de novas linhas como separadores e pode assumir um separador à direita e / ou precedente.

A entrada conterá exatamente um peixe-quartata de algum comprimento lateral 3*n, onde n ≥ 1é um número inteiro positivo, cercado por períodos .que representam o fundo do oceano. O peixe estará sempre na orientação descrita acima. Sobreposto a essa grade, haverá exatamente uma região retangular não vazia de hashes #, que representa uma gota de lama. O blob pode cobrir o peixe quartata parcial ou totalmente. Um exemplo de entrada seria

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

Saída

Sua saída será gerada a partir da entrada substituindo todos os hashes pelos caracteres .-o, para que a grade contenha exatamente um quartata-peixe. Sempre haverá uma maneira exclusiva de executar essa substituição corretamente; em particular, a gota de lama cobrirá inteiramente o peixe se seu tamanho for 3 × 3. A saída deve usar o mesmo separador que a entrada. Para a entrada acima, a saída correta seria

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

Regras e pontuação

Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. Não há limites de tempo: se o seu envio acabar com tempo e recursos ilimitados, você estará bem.

Casos de teste

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
fonte
Tudo bem se a entrada tiver uma probabilidade de não terminar (aleatoriedade ruim), mesmo que as chances sejam extremamente baixas? Você também tem permissão para alterar caracteres diferentes do tubo de linha nova?
Azul
@muddyfish Sim, para a primeira pergunta (ela deve terminar com a probabilidade 1, assumindo a aleatoriedade perfeita, mas teoricamente pode durar para sempre), não para a segunda (os caracteres são fixos).
Zgarb
então é uma probabilidade de 0,9 recorrente ok?
Azul
@muddyfish Se você estiver gerando grades aleatórias em um loop até que uma caiba, tudo bem.
Zgarb 03/04
Caso importante teste: ......|......|......|...###|...###|...###(no caso de uma solução tenta todos os possíveis coordenadas superior esquerdo, e tenta encaixar uma 6x6 sobre a área)
SP3000

Respostas:

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

Sai com a NameError. Separa o tubo de entrada.

Estou misturando guias e espaços aqui. O SE não renderiza guias adequadamente.

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

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

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

(Observe que os espaços extras no início são apenas para beleza e não são realmente impressos)

Azul
fonte
Você pode se livrar das guias extras em seu código e substituí-las por espaços únicos para reduzir alguns bytes (ou seja, se você considerou o espaço em branco ao contar os bytes em seu código).
R. Kap
4

JavaScript (ES6), 291 bytes

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

Explicação

Leva a grade de entrada como uma sequência separada por nova linha. Não completamente jogado, fará mais quando tiver tempo.

Funciona por:

  • Obter todas as posições e tamanhos possíveis de um peixe nos limites da grade de entrada.
  • Para cada posição / tamanho, ele cria uma cadeia de grade com um peixe nessa posição.
  • Verifica se esta é a saída correta, iterando sobre cada caractere. Se cada caractere corresponder ou for um hash, ele emitirá a string criada.

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

Uma solução mal treinada por enquanto - os for .. in range(...)s são um desastre total de trem. Entrada / saída de novas seqüências de caracteres separadas.

Atualmente, a contagem de bytes assume apenas recuos de espaço - mudarei para tabulações / espaços mistos mais tarde quando terminar o golfe, se necessário.

Sp3000
fonte