진흙 투성이 쿼타 타 물고기 청소


27

이 도전의 올해 카테고리 수상자의 신인의 영광에 PPCG 2015 년 최저 : muddyfish (위해 ! 난 당신이 찾고있는 언어가 아니에요 과) quartata (대한 진실 - 기계 구현 ). 축하합니다!

배경

바다의 가장 깊은 참호에는 쿼타 타 물고기라고 불리는 희귀하고 찾기 어려운 사각형 모양의 물고기가 있습니다. Game of Life 셀룰러 오토 마톤 의 글라이더 처럼 보입니다 . 크기가 다른 두 개의 쿼타 타 물고기는 다음과 같습니다.

-o-
--o
ooo

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

당신은 쿼타 타 물고기의 사진을 찍을 수 있었지만, 물고기는 진흙으로 덮여 있기 때문에보기가 다소 어렵습니다. 이제 사진을 정리하는 프로그램을 작성해야합니다.

입력

입력은 .-o#개행으로 구분 된 문자열로 제공되는 문자의 직사각형 2D 격자입니다 . 원하는 경우 줄 |바꾸기 대신 파이프 를 구분 기호로 사용할 수 있으며 후행 및 / 또는 선행 구분 기호를 가정 할 수 있습니다.

입력은 측면 길이의 정확히 하나의 쿼타 타 피쉬를 포함 할 것이며 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.........
.........................

항목의 확률이 매우 낮더라도 완료되지 않을 확률 (불량한 임의성)이면 괜찮습니까? 또한 단일 개행 파이프 이외의 문자를 변경할 수 있습니까?
Blue

@muddyfish 예 첫 번째 질문 (완전한 임의성을 가정하고 이론적으로 영원히 실행될 수 있음을 가정하여 결국 확률 1로 끝나야 함), 아니오부터 두 번째 (문자는 고정되어 있음).
Zgarb

0.9의 확률로 되풀이됩니까?
Blue

@muddyfish 당신이 맞을 때까지 임의의 그리드를 루프로 생성한다면 괜찮습니다.
Zgarb

중요한 테스트 사례 : ......|......|......|...###|...###|...###(솔루션이 가능한 모든 왼쪽 위 좌표를 시도하고 면적에 6x6을 맞추려고 시도하는 경우)
Sp3000

답변:


9

파이썬 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

자바 스크립트 (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

파이썬 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(...)열차는 완전히 파괴되었습니다. 줄 바꾸기로 구분 된 문자열을 입력 / 출력합니다.

바이트 수는 현재 공간 들여 쓰기 만 가정합니다. 나중에 필요한 경우 골프를 마치면 혼합 탭 / 공간으로 전환하겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.