Làm sạch cá quartata bùn


27

Thử thách này là để vinh danh những người chiến thắng hạng mục Tân binh của năm của Best of PPCG 2015 : bùn (vì tôi không phải là ngôn ngữ mà bạn đang tìm kiếm! ) Và quartata (cho Thực hiện một cỗ máy sự thật ). Xin chúc mừng!

Lý lịch

Trong các rãnh sâu nhất của đại dương, có một loài cá hình vuông hiếm gặp và khó nắm bắt được gọi là cá quartata . Nó trông giống như tàu lượn từ máy tự động di động Game of Life. Đây là hai loài cá có kích cỡ khác nhau:

-o-
--o
ooo

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

Bạn đã có thể chụp một bức ảnh về cá quartata, nhưng con cá này khá khó nhìn vì nó được bao phủ trong bùn. Bây giờ bạn sẽ phải viết một chương trình để làm sạch ảnh.

Đầu vào

Đầu vào của bạn là một lưới 2D hình chữ nhật của các ký tự .-o#, được đưa ra dưới dạng một chuỗi phân tách dòng mới. Nếu bạn muốn, bạn có thể sử dụng đường ống |thay vì dòng mới làm dấu phân cách và bạn có thể giả sử một dấu phân cách và / hoặc dấu phân cách trước.

Đầu vào sẽ chứa chính xác một quartata-fish có chiều dài bên 3*n, trong đó n ≥ 1là một số nguyên dương, được bao quanh bởi các khoảng thời gian .đại diện cho đáy đại dương. Cá sẽ luôn ở trong định hướng được mô tả ở trên. Overlaid trên lưới này, sẽ có chính xác một vùng băm hình chữ nhật không trống #, đại diện cho một đốm bùn. Các đốm màu có thể bao phủ cá quartata một phần hoặc toàn bộ. Một ví dụ đầu vào sẽ là

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

Đầu ra

Đầu ra của bạn sẽ được tạo từ đầu vào bằng cách thay thế tất cả các giá trị băm bằng các ký tự .-o, để lưới chứa chính xác một quartata-fish. Sẽ luôn có một cách duy nhất để thực hiện thay thế này đúng cách; đặc biệt, các đốm bùn sẽ bao phủ cá hoàn toàn chỉ khi kích thước của nó là 3 × 3. Đầu ra phải sử dụng cùng một dấu phân cách như đầu vào. Đối với đầu vào trên, đầu ra chính xác sẽ là

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

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép. Không có giới hạn thời gian: nếu bài nộp của bạn cuối cùng sẽ dừng lại với thời gian và tài nguyên không giới hạn, bạn vẫn ổn.

Các trường hợp thử nghiệm

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

Có ổn không nếu mục nhập có xác suất sẽ không kết thúc (tính ngẫu nhiên xấu) mặc dù khả năng đó là cực kỳ thấp? Ngoài ra, bạn có được phép thay đổi các ký tự khác ngoài đường ống mới không?
Màu xanh

@muddyfish Có câu hỏi đầu tiên (cuối cùng phải kết thúc với xác suất 1, giả sử ngẫu nhiên hoàn hảo, nhưng về mặt lý thuyết có thể chạy mãi mãi), không đến giây (các ký tự được cố định).
Zgarb

vậy xác suất 0,9 có ổn không?
Màu xanh

@muddyfish Nếu bạn tạo lưới ngẫu nhiên trong một vòng lặp cho đến khi phù hợp, điều đó ổn.
Zgarb

Trường hợp thử nghiệm quan trọng: ......|......|......|...###|...###|...###(trong trường hợp một giải pháp thử tất cả các tọa độ trên cùng bên trái có thể và cố gắng đặt 6x6 trên khu vực)
Sp3000

Câu trả lời:


9

Python 2, 433 411 byte

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

Lối thoát với a NameError. Mất đường ống đầu vào.

Tôi đang trộn các tab và không gian ở đây. SE không kết xuất các tab đúng cách.

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

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

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

(Lưu ý không gian thừa khi bắt đầu chỉ dành cho sự đẹp mắt và không thực sự được in)


Bạn có thể loại bỏ các tab bổ sung trong mã của mình và thay thế chúng bằng các khoảng trắng đơn để cắt giảm một vài byte (nghĩa là, nếu bạn đã xem xét khoảng trắng khi đếm các byte trong mã của mình).
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')

Giải trình

Lấy lưới đầu vào dưới dạng một chuỗi phân tách dòng mới. Không hoàn toàn chơi golf, sẽ làm nhiều hơn khi tôi có thời gian.

Nó hoạt động bằng cách:

  • Bắt mọi vị trí và kích thước có thể của một con cá trong giới hạn của lưới đầu vào.
  • Đối với mỗi vị trí / kích thước, nó xây dựng một chuỗi lưới với một con cá ở vị trí đó.
  • Kiểm tra nếu đây là đầu ra chính xác bằng cách lặp qua mỗi ký tự. Nếu mỗi ký tự khớp hoặc là một hàm băm, nó sẽ xuất ra chuỗi được xây dựng.

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 byte

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

Một giải pháp chơi golf tồi cho bây giờ - for .. in range(...)s là một xác tàu hỏa hoàn toàn. Đầu vào / đầu ra chuỗi phân tách dòng mới.

Số lượng byte hiện chỉ giả định thụt lề không gian - Tôi sẽ chuyển sang các tab / không gian hỗn hợp sau này khi tôi chơi golf xong, nếu cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.