Tôi có thể tạo hình đó bằng các khối, tấm và cầu thang không?


13

Hãy xem xét một lưới hai chiều hình chữ nhật trong đó mỗi ô có thể trống ( .) hoặc full ( 0).

ví dụ

..00....
0000....
.00000..
000...00
..000000
000.00..

Lưới được coi là vô hạn, tất cả các ô bên ngoài vùng được mô tả đều trống.

Mục tiêu là che các khoảng trống đã lấp đầy và để các khoảng trống mở bằng cách sử dụng một bộ 7 viên gạch có hình dạng riêng biệt, mỗi viên chiếm 4 ô (2 × 2) của lưới.

Đây là 7 viên gạch:

  • Khối - 1 biến thể

    11
    11
    
  • Tấm - 2 biến thể

    ..
    22
    33
    ..
  • Cầu thang - 4 biến thể

    .4
    44
    5.
    55
    66
    .6
    77
    7.

Những viên gạch này phải luôn thẳng hàng với một lưới có các ô rộng và cao gấp đôi các ô của lưới đầu vào. Mỗi viên gạch chỉ có thể chiếm một ô của lưới lớn hơn này nhưng lưới nhỏ hơn có thể được dịch (dịch chuyển lên, xuống, trái, phải) bên dưới lưới lớn hơn để cung cấp thêm tùy chọn cho việc tìm nắp. Cả lưới và gạch riêng lẻ đều không thể xoay được.

Vì vậy, một cách để bao gồm (còn gọi là giải quyết) ví dụ trên là như thế này:

..11....
2211....
.47733..
447...22
..771133
227.11..

(Các viên gạch lân cận giống hệt nhau vẫn có thể gây ra sự mơ hồ nhưng cẩn thận xác định lưới lớn hơn giải quyết điều đó.)

Một giải pháp không hợp lệ cho

000000
000000

566774
556744

bởi vì các viên gạch không thẳng hàng với lưới lớn hơn và cũng không chỉ chiếm một ô của nó.

Một giải pháp hợp lệ ở đây là 3 khối liên tiếp:

111111
111111

Và một giải pháp hợp lệ khác liên quan đến 6 tấm:

......
222222
333333
......

Vì vậy, lưu ý rằng một số lưới đầu vào có nhiều giải pháp .

Một giải pháp không hợp lệ cho

00.00
00...

11.33
11...

bởi vì các viên gạch không thẳng hàng với lưới lớn hơn. Tấm sẽ cần phải di chuyển sang trái hoặc phải bởi một, nhưng sau đó tất nhiên lớp phủ sẽ không đầy đủ. Lưới đầu vào này không có giải pháp .

Thử thách

Viết chương trình đưa vào (thông qua stdin / dòng lệnh) một khối văn bản hình chữ nhật của .'và 0' đại diện cho một lưới được bao phủ.

Nếu có một giải pháp che phủ hợp lệ, hãy in (thông qua thiết bị xuất chuẩn) bất kỳ một giải pháp nào theo cách tương tự như trên, thay thế tất cả 0các giải pháp phù hợp 1thông qua các 7viên gạch.

Nếu không có giải pháp, chương trình của bạn không nên xuất bất cứ thứ gì, chỉ lặng lẽ kết thúc bình thường.

Ghi chú

  • Đầu vào và đầu ra không cần phải có cùng kích thước hình chữ nhật. Đầu ra của bạn có thể có các hàng và / hoặc cột không liên quan của tất cả .(miễn là chúng không làm mất hiệu lực giải pháp).

  • Cũng có thể cắt bớt các hàng và cột của tất cả .nếu nó không ảnh hưởng đến các không gian được lấp đầy. ví dụ

    222222
    333333
    

    là một giải pháp hợp lệ để

    000000
    000000
    

    Ngược lại, hai cột trống trong 00..00không thể được loại bỏ vì điều đó sẽ làm xáo trộn các không gian được lấp đầy.

  • Bạn có thể tùy ý giả sử đầu vào có một dòng mới duy nhất. Một dòng mới duy nhất trong đầu ra là tốt, ngay cả trong trường hợp không có giải pháp.

  • Các lưới hoàn toàn trống (tất cả .) và lưới 0 × 0 tầm thường không phải là trường hợp đầu vào mà bạn cần phải lo lắng. Nhưng lưới 1 × 1 0là, như tất cả các lưới khác có chứa ít nhất một lưới 0. (Bạn không thể cho rằng chiều rộng hoặc chiều cao của lưới đầu vào là chẵn!)

  • Thay vì một chương trình, bạn có thể viết một hàm lấy đầu vào làm đối số chuỗi và in đầu ra bình thường hoặc trả về dưới dạng chuỗi. Bất kỳ giá trị giả có thể được trả lại nếu không có giải pháp.

  • Bạn có thể sử dụng bất kỳ 9 ký tự ASCII có thể in riêng biệt nào thay thế . 0 1 2 3 4 5 6 7. Chỉ cần chắc chắn để nói những gì thay thế của bạn là! Dòng mới phải được giữ nguyên.

Chấm điểm

Mã ngắn nhất tính bằng byte thắng. Tiebreaker là bài bình chọn cao nhất.

Thử thách này được lấy cảm hứng từ các khối , tấmcầu thang trong Minecraft , tuân theo các quy tắc tương tự được mô tả ở đây. Nếu bạn thích PPCG và Minecraft, bạn có thể muốn kiểm tra Máy chủ Minecraft PPCG .


3
Có vẻ như máy chủ Minecraft không được triển khai theo kịch bản Golf - nhàm chán :-)
Thomas Weller

5
@ThomasWeller Nó đã được thực hiện lại trong CJam để lưu một vài byte.
Alex A.

Câu trả lời:


6

Python - 525 491 478 430 byte

r=range
def t(s):
 m=s.find("\n")+1
 for q in r(4):
  try:
   for i in r(-q%2,m-1,2):
    for j in r(-q/2,len(s)/m,2):
     k,g=j*m+i,""
     b=[k,k+1,k+m,k+m+1]
     for z in b:g+=a(s,z)
     for z in b:
      if a(s,z)!="d":s=s[:z]+`dict(dddd=0,zzdd=3,ddzz=2,zzzd=7,zzdz=6,zdzz=5,dzzz=4,zzzz=1)[g]`+s[z+1:]
   return s
  except:d
def a(v,i):
 try:
  if v[i]!="\n":return v[i]
  return "d"
 except:return "d"

Giải thích: Đây là mã golf đầu tiên của tôi, vì vậy nó có thể không tối ưu, nhưng đây là cách nó hoạt động. Hàm t (s) đưa ra kết quả cho chuỗi được truyền vào. Đầu tiên, nó tìm thấy số cột, sau đó đi qua bốn bản dịch riêng biệt có thể bằng 1 (không, trái, lên, lên trái) và cố gắng giải quyết nó cho từng cái. Nó nhìn vào từng khối 2x2 và ánh xạ nó thành một số khối hợp lệ, được đưa ra bởi một từ điển và thay đổi các số không thành số.

Nếu nó tìm thấy một cái không có trong từ điển, nó sẽ bỏ phần bù cụ thể đó và bắt đầu lại từ cái tiếp theo. Nếu nó đi qua tất cả 4 lần bù mà không tìm được giải pháp hợp lệ, nó sẽ kết thúc mà không xuất ra bất cứ điều gì. a (v, i) cho phép giá trị mặc định bên ngoài chuỗi và bỏ qua các ký tự dòng mới. Mặc dù nó có thể kết thúc với các giải pháp một phần trong suốt thời gian chạy, nhưng nó sẽ luôn ghi đè chúng bằng giải pháp chính xác cuối cùng nếu nó tồn tại.

Chỉnh sửa: Một ánh xạ khác nhau của các ký tự được sử dụng :. -> d, 0 -> z, tất cả các số khác tự đi. Điều này áp dụng cho cả đầu vào và đầu ra.


1
Chào mừng đến với PPCG! Chúng tôi có một số mẹo để chơi gôn trong Python ; bằng cách đó tôi nghĩ bạn có thể lưu một số byte.
lirtosiast
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.