Trồng cây trên sân golf!


10

Thử thách này được lấy cảm hứng từ ứng dụng này .


Đây là một phiên bản dễ dàng hơn nhiều của thử thách này . Thử thách này là , trong khi thử thách còn lại là .


Bạn sẽ được cung cấp một lưới đầu vào hình vuông, có kích thước 6 x 6 được chia thành 6 khu vực, trong đó các ô của mỗi khu vực có một mã định danh duy nhất (Tôi sẽ sử dụng các chữ cái viết thường từ af trong văn bản ở đây, nhưng bạn có thể chọn bất cứ thứ gì bạn thích, ví dụ số nguyên 1-6 ).

Đầu vào có thể trông như thế này (định dạng đầu vào tùy chọn):

aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff

Hoặc, dễ hình dung hơn:

nhập mô tả hình ảnh ở đây

Thử thách:

Bạn phải đặt 6 cây trong công viên này, theo các quy tắc sau:

  • Sẽ có chính xác 1 cây trên mỗi cột và 1 cây trên mỗi hàng
  • Tất cả các khu vực sẽ có chính xác 1 cây.
  • Không có cây nào có thể liền kề với cây khác, theo chiều dọc, chiều ngang hoặc đường chéo

Giải pháp cho bố cục trên là:

nhập mô tả hình ảnh ở đây

Lưu ý: Chỉ có một giải pháp cho mỗi câu đố

Quy tắc bổ sung:

  • Các định dạng đầu vào và đầu ra là tùy chọn
    • Ví dụ, đầu ra có thể là một danh sách các chỉ mục, lưới có 1/0 cho biết nếu có một cây ở vị trí đó hoặc một phiên bản sửa đổi của đầu vào nơi các cây được chỉ định
  • Thời gian thực hiện phải có tính quyết định
  • Chương trình phải hoàn thành trong vòng 1 phút trên một máy tính xách tay hiện đại hợp lý
  • Brownie điểm nếu bạn không vũ phu!

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

aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff
---
aAbbbb
aabbbB
aaCcbb
acccDb
Ecccdb
eeeFff
----------
aabccc
aacccc
aaddce
aeeeee
aeeefe
eeeeee
---
aaBccc
aacccC
aadDce
Aeeeee
aeeeFe
eEeeee
----------
aaaabb
aacbbb
aadddb
addeef
ddddee
dddeee
---
aaaaBb
aaCbbb
Aadddb
addeeF
dDddee
dddEee
----------
abbbcd
abebcd
addddd
dddddd
effdff
eeffff
---
abBbcd
abebCd
Addddd
dddDdd
effdfF
eEffff

Các trường hợp thử nghiệm tương tự trên một định dạng dễ phân tích cú pháp hơn một chút:

Test case 1:
[1,1,2,2,2,2;1,1,2,2,2,2;1,1,3,3,2,2;1,3,3,3,4,2;5,3,3,3,4,2;5,5,5,6,6,6]
Test case 2:
[1,1,2,3,3,3;1,1,3,3,3,3;1,1,4,4,3,5;1,5,5,5,5,5;1,5,5,5,6,5;5,5,5,5,5,5]
Test case 3:
[1,1,1,1,2,2;1,1,3,2,2,2;1,1,4,4,4,2;1,4,4,5,5,6;4,4,4,4,5,5;4,4,4,5,5,5]
Test case 4:
[1,2,2,2,3,4;1,2,5,2,3,4;1,4,4,4,4,4;4,4,4,4,4,4;5,6,6,4,6,6;5,5,6,6,6,6]

Âm thanh như một người giải sudoku nhưng khác nhau.
juniorRubyist

Câu trả lời:


2

C, 223 182 byte

O[15],U;main(y,v)char**v;{if(y>7)for(;y-->2;printf("%06o\n",O[y]));else for(int*r,x=1,X=8;X<14;U&x|*r|O[10-y]*9&x*9?0:(U^=O[9-y]=*r=x,*r=main(y+1,v),U^=x),x*=8)r=O+v[1][y*7-++X]-88;}

Đưa đầu vào làm đối số theo định dạng được đưa ra trong câu hỏi. Ghi đầu ra vào thiết bị xuất chuẩn dưới dạng lưới 0s với 1s nơi cây đi qua.

./TreesMin 'aabbbb
aabbbb
aaccbb
acccdb
ecccdb
eeefff'

Đầu ra mẫu:

010000
000001
001000
000010
100000
000100

Phá vỡ

O[15],                                  // Tree positions & region usage
U;                                      // Column usage (bitmask)
main(y,v)char**v;{                      // Recursive main function
  if(y>7)                               // Finished grid?
    for(;y-->2;printf("%06o\n",O[y]));  //  Print it (rows are padded octal)
  else                                  // Not finished:
    for(int*r,x=1,X=8;X<14;             //  Loop over columns
      U&x|*r|O[10-y]*9&x*9              //   Current cell violates rules?
        ?0                              //    Do nothing
        :(U^=O[9-y]=*r=x,               //   Else: mark cell
          *r=main(y+1,v),               //    Recurse
          U^=x)                         //    Unmark cell
      ,x*=8)                            //   Advance to next column
      r=O+v[1][y*7-++X]-88;             //   Region pointer for current iteration
}

Đây là bản phóng tác của câu trả lời của tôi cho phiên bản mã nhanh nhất của câu hỏi này . Không có quá nhiều ngắn mạch, nhưng nó đủ nhanh cho lưới 6x6.


1

Clingo , 66 byte

1{t(X,Y):c(X,Y,Z)}:-Z=1..n.:-t(X,Y),2{t(X,J;I,Y;X-1..X+1,Y..Y+1)}.

Chạy với clingo plant.lp - -c n=<n>nơi <n>là kích thước lưới. Định dạng đầu vào là một danh sách các c(X,Y,Z).báo cáo cho mỗi tế bào ( X, Y) màu Z, với 1 ≤ X, Y, Zn, cách nhau bằng khoảng trắng không bắt buộc. Đầu ra bao gồm t(X,Y)cho mỗi cây tại ( X, Y).

Bản giới thiệu

$ clingo plant.lp - -c n=6 <<EOF
> c(1,1,1). c(2,1,1). c(3,1,2). c(4,1,2). c(5,1,2). c(6,1,2).
> c(1,2,1). c(2,2,1). c(3,2,2). c(4,2,2). c(5,2,2). c(6,2,2).
> c(1,3,1). c(2,3,1). c(3,3,3). c(4,3,3). c(5,3,2). c(6,3,2).
> c(1,4,1). c(2,4,3). c(3,4,3). c(4,4,3). c(5,4,4). c(6,4,2).
> c(1,5,5). c(2,5,3). c(3,5,3). c(4,5,3). c(5,5,4). c(6,5,2).
> c(1,6,5). c(2,6,5). c(3,6,5). c(4,6,6). c(5,6,6). c(6,6,6).
> EOF
clingo version 5.1.0
Reading from plant.lp ...
Solving...
Answer: 1
c(1,1,1) c(2,1,1) c(3,1,2) c(4,1,2) c(5,1,2) c(6,1,2) c(1,2,1) c(2,2,1) c(3,2,2) c(4,2,2) c(5,2,2) c(6,2,2) c(1,3,1) c(2,3,1) c(3,3,3) c(4,3,3) c(5,3,2) c(6,3,2) c(1,4,1) c(2,4,3) c(3,4,3) c(4,4,3) c(5,4,4) c(6,4,2) c(1,5,5) c(2,5,3) c(3,5,3) c(4,5,3) c(5,5,4) c(6,5,2) c(1,6,5) c(2,6,5) c(3,6,5) c(4,6,6) c(5,6,6) c(6,6,6) t(1,5) t(2,1) t(6,2) t(3,3) t(5,4) t(4,6)
SATISFIABLE

Models       : 1+
Calls        : 1
Time         : 0.045s (Solving: 0.00s 1st Model: 0.00s Unsat: 0.00s)
CPU Time     : 0.000s

Để làm cho định dạng đầu vào / đầu ra dễ xử lý hơn, đây là các chương trình Python để chuyển đổi từ và sang định dạng được đưa ra trong thử thách.

Đầu vào

import sys
print(' '.join("c({},{},{}).".format(x + 1, y + 1, ord(cell) - ord('a') + 1) for y, row in enumerate(sys.stdin.read().splitlines()) for x, cell in enumerate(row)))

Đầu ra

import re
import sys
for line in sys.stdin:
    c = {(int(x), int(y)): int(z) for x, y, z in re.findall(r'\bc\((\d+),(\d+),(\d+)\)', line)}
    if c:
        t = {(int(x), int(y)) for x, y in re.findall(r'\bt\((\d+),(\d+)\)', line)}
        n, n = max(c)
        for y in range(1, n + 1):
            print(''.join(chr(ord('aA'[(x, y) in t]) + c[x, y] - 1) for x in range(1, n + 1)))
        print()
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.