Чистая мутная рыба-четверть

27

Это задание посвящено победителям в номинации « Новичок года» в номинации « Лучшее из PPCG 2015» : грязная рыба (потому что я не тот язык, который вы ищете! ) И четверть (для реализации машины правды ). Поздравляем!

Задний план

В самых глубоких окопах океана обитает редкая и неуловимая рыба квадратной формы, называемая рыбой четвертной . Похоже на планер из клеточного автомата Game of Life. Вот две рыбы-четверки разных размеров:

-o-
--o
ooo

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

Вам удалось сделать фотографию рыбы-четверти, но ее довольно трудно увидеть, так как она покрыта грязью. Теперь вам нужно написать программу для очистки фотографии.

вход

Ваш ввод - это прямоугольная двумерная сетка символов .-o#, представленная в виде строки, разделенной новой строкой. Если вы хотите, вы можете использовать каналы |вместо новых строк в качестве разделителей, и вы можете использовать один конечный и / или предшествующий разделитель.

Входные данные будут содержать ровно одну четвертную рыбу некоторой длины стороны 3*n, где n ≥ 1это положительное целое число, окруженное точками, .которые представляют дно океана. Рыба всегда будет в ориентации, изображенной выше. В этой сетке будет ровно одна непустая прямоугольная область хэшей #, представляющая собой каплю грязи. Капля может частично или полностью покрывать четвертную рыбу. Пример ввода будет

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

Выход

Ваш вывод должен быть сгенерирован из ввода путем замены всех хешей символами .-o, чтобы сетка содержала ровно одну рыбку-четверть. Всегда будет уникальный способ выполнить эту замену должным образом; в частности, капля грязи полностью покроет рыбу, только если ее размер 3 × 3. Выход должен использовать тот же разделитель, что и вход. Для приведенного выше ввода правильный вывод будет

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

Правила и оценки

Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Нет ограничений по времени: если ваша заявка будет в конечном итоге остановлена ​​с учетом неограниченного времени и ресурсов, у вас все в порядке.

Контрольные примеры

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
источник
Это нормально, если у записи есть вероятность, что она не закончится (плохая случайность), даже если вероятность этого крайне мала? Также разрешено ли вам изменять символы, кроме одного символа новой строки?
Синий,
@muddyfish Да на первый вопрос (в конечном итоге он должен заканчиваться с вероятностью 1, предполагая совершенную случайность, но теоретически может выполняться бесконечно), нет на секунду (символы фиксированы).
Згарб
так что вероятность 0,9 повторяется нормально?
Blue
@muddyfish Если вы генерируете случайные сетки в цикле, пока один не подходит, это нормально.
Згарб
Важный контрольный пример: ......|......|......|...###|...###|...###(в случае, если решение пробует все возможные верхние левые координаты и пытается разместить область размером 6х6)
Sp3000

Ответы:

9

Python 2, 433 411 байт

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

Выход с NameError. Принимает входную трубу отдельно.

Я смешиваю табуляции и пробелы здесь. SE не отображает вкладки должным образом.

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

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

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

(Обратите внимание, что дополнительные пробелы в начале предназначены только для красивости и на самом деле не напечатаны)

синий
источник
Вы можете избавиться от лишних вкладок в вашем коде и заменить их одиночными пробелами, чтобы сократить несколько байт (то есть, если вы учли пробел при подсчете байтов в вашем коде).
Р. Кап
4

JavaScript (ES6), 291 байт

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

объяснение

Принимает сетку ввода как строку, разделенную новой строкой. Не полностью в гольф, буду делать больше, когда у меня будет время.

Работает:

  • Получение каждой возможной позиции и размера рыбы в границах входной сетки.
  • Для каждой позиции / размера он строит сетку с рыбой в этой позиции.
  • Проверяет, является ли это правильным выводом, перебирая каждый символ. Если каждый символ совпадает или является хешем, он выводит встроенную строку.

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
источник
4

Python 2, 325 байт

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

Пока плохо решаемое решение - for .. in range(...)это крушение поезда. Входы / выходы строк, разделенных новой строкой.

Число байтов в настоящее время предполагает только отступы пробела - я переключусь на смешанные табуляции / пробелы позже, когда закончу игру в гольф, если это необходимо.

Sp3000
источник