清洁浑浊的四方鱼


27

这项挑战是为了纪念2015年最佳PPCG的“年度最佳新秀” :泥泞鱼(因为我不是您要寻找的语言!)和夸脱塔实现“真机”)。恭喜你!

背景

在海洋最深的海沟中,生活着一种稀有且难以捉摸的方形鱼,称为四方鱼。它看起来像来自“生命游戏”细胞自动机的滑翔机。这是两种大小不同的四方鱼类:

-o-
--o
ooo

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

您已经成功拍摄了四方鱼的照片,但是鱼很难被看见,因为它被泥覆盖了。现在,您必须编写一个程序来清理照片。

输入项

您的输入是字符的矩形2D网格,.-o#以换行符分隔的字符串形式给出。如果需要,可以使用管道|而不是换行符作为分隔符,并且可以假定使用一个尾随和/或前一个分隔符。

输入将仅包含一个边长为的四分之一鱼类3*n,其中n ≥ 1为正整数,并用.代表海底的时期包围。鱼将始终处于上述方向。在此网格上,将恰好有一个非空的哈希矩形区域#,代表一团泥土。斑点可能会部分或全部覆盖夸脱鱼类。输入示例

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

输出量

您的输出应通过用字符替换所有哈希值来从输入中生成.-o,以便网格仅包含一个quartata-fish。总会有一种独特的方法来正确执行此替换;特别是,只有当大小为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.........
.........................

如果条目的可能性极低,那么即使条目具有完成的可能性(不良随机性)也可以吗?还可以更改除单个换行符以外的字符吗?

@muddyfish是第一个问题(假设完全随机,它最终必须以概率1结束,但理论上可能永远存在),第二个否定(字符是固定的)。
Zgarb '16

那么0.9的概率会好吗?
蓝色

@muddyfish如果您要在一个循环中生成随机网格直到合适为止,就可以了。
Zgarb '16

重要的测试案例:(......|......|......|...###|...###|...###如果解决方案尝试所有可能的左上角坐标,并尝试在该区域上拟合6x6)
Sp3000,2016年

Answers:


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.|.......

(请注意,开头的多余空格仅用于装饰,实际上并未打印出来)


您可以摆脱代码中多余的选项卡,并用单个空格替换它们以减少几个字节(也就是说,如果在计算代码中的字节时考虑了空格)。
R. Kap

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>


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(...)这是一个打得不好的解决方案-s简直是火车残骸。输入/输出以换行符分隔的字符串。

字节数当前仅假设空格缩进–打高尔夫球后,如有必要,我将在稍后切换到混合制表符/空格。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.