Hình dạng chấm logic


12

Tro choi

Gần đây, phần lớn thời gian của tôi đã bị chiếm bởi một trò chơi gây nghiện trên điện thoại của tôi, được gọi là Logic Dots, đã truyền cảm hứng cho tôi để viết thử thách này. Sẽ dễ dàng hơn để giải thích các quy tắc nếu tôi cho bạn xem màn hình trò chơi, vì vậy đây là một ảnh chụp màn hình của một câu đố chưa giải quyết và đã giải quyết:

Bây giờ ở đây, có ba điều chính cần chú ý.

  1. Bảng trò chơi (lưới ô vuông 4 x 4 ở trung tâm)
  2. Các hình dạng bắt buộc (các dấu chấm được liên kết trong thanh thứ hai từ trên xuống, dưới điểm số và menu, v.v.), đó là tất cả các dòng hoặc abằng 1 hình chữ nhật
  3. Các số trên các hàng và cột, biểu thị số lượng chấm cần có trong cột, cho một giải pháp

Mục tiêu của trò chơi là để phù hợp với các hình dạng cần thiết vào lưới. Bạn có thể xoay các hình dạng, nhưng chúng không thể đi theo đường chéo.

Trong giải pháp, lưu ý rằng tất cả các hình dạng được tạo chính xác một lần (vì chúng chỉ trong các hình dạng được yêu cầu một lần) và trong trường hợp này chúng đều nằm ngang nhưng chúng cũng có thể thẳng đứng. Màu hồng điền vào hình vuông biểu thị hình vuông không được sử dụng.

Đây là một lưới lớn hơn và phức tạp hơn một chút:

Lưu ý rằng trong câu đố chưa được giải quyết, đã có một vài ô vuông được điền vào Các ô vuông màu xám biểu thị các ô vuông bị chặn mà bạn KHÔNG THỂ đặt một dấu chấm lên. Các chấm có đuôi cho bạn biết rằng một chấm nằm ở vị trí đó và nó liên kết với ít nhất một dấu chấm nữa theo hướng đuôi, nhưng không theo bất kỳ hướng nào khác (kể cả hướng ngược lại).

Ký hiệu

Đối với phần còn lại của bài đăng này, tôi sẽ đề cập đến bảng bằng cách sử dụng các biểu tượng sau:

  • <,>, ^, v - Biểu thị một dấu chấm được đặt sẵn với đuôi mở rộng theo hướng của điểm
  • * - Biểu thị một dấu chấm. Nếu được đưa ra trên một lưới chưa được giải quyết (đầu vào), nó là một hình dạng riêng lẻ. Nếu ở đầu ra, thì nó được kết nối với các chấm xung quanh nó.
  • # - Biểu thị một ô vuông bị chặn (nơi bạn không thể đặt dấu chấm)
  • -, | (dấu gạch ngang và thanh) - Biểu thị một dấu chấm với đuôi phải và trái và một dấu chấm có đuôi lên và xuống tương ứng
  • ** (ký tự khoảng trắng) - ** Biểu thị một khoảng trống

Sử dụng các ký hiệu này, trường hợp ví dụ sau (chưa giải quyết) có thể được trình bày như sau:

 <    



    # 
 ^ #

Và giải pháp có thể được trình bày dưới dạng:

*< * *
   *  
     *
 *   *
 * *#*
 ^ # *

Lưu ý rằng không có hai hình dạng có thể chạm theo chiều ngang, chiều dọc hoặc đường chéo , vì vậy trường hợp sau đây không hợp lệ:

 *** 
**   
  ** 

Thử thách

Thách thức của bạn là giải quyết bất kỳ câu đố logic logic nào, bao gồm từ 4 đến 9x9. Bạn sẽ nhận được bốn dòng đầu vào, sau đó là bảng trò chơi. Các dòng sẽ như sau:

  • Dòng thứ nhất, Hình dạng - Các hình dạng cần tìm, mỗi hình được cho dưới dạng sizexquantity(ví dụ: 3x2cho hai hình có chiều dài ba) và cách nhau bởi một khoảng trắng. Dòng ví dụ:3x1 2x1 1x1
  • Dòng thứ 2, Cột - Một danh sách được phân tách bằng dấu cách của số lượng chấm cần thiết cho mỗi cột. Dòng ví dụ:1 1 2 2
  • Dòng thứ 3, Hàng - Một danh sách được phân tách bằng dấu cách của số lượng chấm cần thiết cho mỗi hàng. Dòng ví dụ:3 0 3 0
  • Dòng thứ 4, Kích thước bảng - Một số nguyên duy nhất, kích thước bảng, B

Sau đó, bảng được đưa ra và là Bcác dòng đầu vào đại diện cho bảng bằng cách sử dụng ký hiệu được đề cập ở trên. Ví dụ, đầu vào hoàn chỉnh cho trường hợp ví dụ sau như sau:

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

Chương trình của bạn sau đó sẽ xuất bảng đã giải quyết, trong cùng một ký hiệu. Đầu ra khớp với đầu vào trên như sau:

** * *
   *  
     *
 *   *
 * *#*
 * # *

Lưu ý rằng một bảng trò chơi có thể có nhiều giải pháp. Trong trường hợp này, chỉ cần xuất một giải pháp hợp lệ. Ngoài ra, chương trình của bạn phải xuất ra một giải pháp chính xác trong vòng 10 giây trên một máy tính để bàn hợp lý cho lưới 10 x10 phức tạp.

Đây là mã golf, vì vậy ít byte nhất sẽ thắng.


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

Đầu vào 1

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

Đầu ra 1

*** *

 ***#
  #  
* * *

Đầu vào 2

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 

Đầu ra 2

* * *
  *  
  * *
*  # 
  * *

Đầu vào 3

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

Đầu ra 3

#     
 *****

 **** 
 #    
* ** *

Vâng, đó là chính xác @flawr
globby

@flawr t no two shapes can touch horizontally, vertically or diagonally(cái này nên ở đầu, không bị mất gần như cuối, nhưng dù sao thì ...)
edc65

@globby Sẽ không thay thế mọi khoảng trống bằng #, tôi cho rằng # là khi bạn nhấn một khoảng trống trong trò chơi. Khi bạn hoàn thành một cấp độ, nó sẽ lấp đầy tất cả các ô trống.
Teun Pronk

@TeunPronk Số # là các khoảng trắng được xác định trước mà bạn không thể đặt một dấu chấm ở cấp độ, như các ô vuông màu xám trong ví dụ thứ hai.
globalby

2
Tốt hơn là cung cấp một tiền thưởng, bạn nên thêm các trường hợp kiểm tra thú vị hơn và sửa các lỗi trong câu hỏi của bạn. Chẳng hạn, đầu ra cuối cùng trước các trường hợp thử nghiệm hiện tại vẫn chứa <và ^
edc65

Câu trả lời:


3

Python 2: 766 739 696 663 633 byte

def f(B,S,o=0):
 if[]==S:print'\n'.join(B);exit()
 s=S[0]
 for i in r:
  for j in R(Z-s+1):
   if(B[i][j]in' '+'>v'[o])*(B[i][j+s-1]in' '+'<^'[o])*({' ','-|'[o]}>=set(B[i][j+1:j+s-1]))*all(B[x][y]in'# 'for x,y in [(x,y)for y in R(j-1,j+s+1)for x in i-1,i+1]+[(i,j-1),(i,j+s)]if 0<=x<Z>y>=0):q=B[:];q[i]=q[i][:j]+'*'*s+q[i][j+s:];q=(q,t(q))[o];any((t(q)+q)[k].count('*')>m[k]for k in R(Z+Z))or f(q,S[1:])
 o or f(t(B),S,1)
y=raw_input;S=[];s=str.split
for i in s(y()):u,v=map(int,s(i,'x'));S+=[u]*v
m=map(int,s(y())+s(y()));Z=input();R=range;r=R(Z);B=[y()for _ in r];J=''.join;t=lambda x:map(J,zip(*x))
f(B,S[:len(S)-J(B).count('*')])

Xem nó hoạt động trực tuyến: Ideone.com (Phiên bản trực tuyến có thể quá chậm đối với các lưới lớn và khó khăn, ngoại tuyến sẽ ổn)

Đầu vào là thông qua stdin, chỉ cần sao chép và qua các dòng từ OP (nhưng hãy cẩn thận, đôi khi stackexchange sẽ xóa các khoảng trắng hoặc dòng).

Một số ý tưởng cơ bản của mã này: Nó sử dụng hàm đệ quy f. fcố gắng đặt một hình dạng ở bảng. Đối với mỗi vị trí có thể, nó gọi chính nó với bảng sửa đổi. Có 3 vòng lặp trong đó. oxác định hướng (2 - ngang, 3 - dọc). Nó sẽ luôn đặt hình dạng nằm ngang, do đó, ở cuối o=2, nó sẽ hoán chuyển bảng với chức năng t. ilà hàng và jtất cả các cột bắt đầu có thể. Sau đó, rất nhiều kiểm tra xảy ra, nếu các đầu của hình có ký tự hợp lệ, nếu giữa hình có ký tự hợp lệ và nếu xung quanh trống.


Tôi đã vật lộn để cắt 6 byte cuối cùng, khi tôi thấy bản chỉnh sửa cuối cùng của bạn (-30) và đã bỏ cuộc ... Bạn có phiếu bầu của tôi cho những gì xứng đáng
edc65

3

JavaScript (ES6) 661 667 695 702 745 755 786 790 784 798

Công việc đang tiến triển, có thể rút ngắn. Có lẽ là quá chậm trên một lưới phức tạp. Có thể không.

Chỉnh sửa lâu hơn một chút, nhanh hơn rất nhiều.
Chỉnh sửa 2 Sửa lỗi, kiểm tra cột / hàng. Ngẫu nhiên, bây giờ nó nhanh hơn

Hàm M là chính. Tham số w là một chuỗi nhiều dòng với tất cả các đầu vào. Hàm phân tích cú pháp đầu vào và chuẩn bị một bảng bắt đầu. Các ký tự <>^v|-*trong bảng bắt đầu được thay thế bằng ,, mỗi ký tự ,phải được thay thế bằng *giải pháp chính xác.

Hàm R cố gắng đệ quy để đặt tất cả các hình dạng trong bảng. Khi một hình được đặt, nó tự gọi nó qua một danh sách ngắn hơn các hình và bảng đã sửa đổi. Khi tất cả các hình dạng được đặt, một giải pháp vẫn có thể không hợp lệ nếu không được ,thay thế bởi *.

Kiểm tra chức năng P nếu một hình có thể được đặt aa vị trí và hướng cho trước. Nó kiểm tra tất cả các trang phục (bên trong bảng, không chồng chéo, không chạm, hàng hợp lệ và số cột)

M=w=>(
  [x,c,r,z]=w=w[S='split'](n='\n'),
  (b=[...w.slice(4).join(n)])
  .map((c,p)=>~(k='*<>-*^v|'.indexOf(c))&&[(q=k>3?z:1,0),k&1&&-q,k&2&&q].map(o=>b[p+o]=0),
    c=c[S](e=' '),r=r[S](e),w=z++,f='*',s='',x[S](e).map(v=>s+=v[0].repeat(v[2]))),
  R=(s,b,x=0,y=0,n=s[0],V=i=>b[i]>'#',
    P=(p,o,q,t,g,l,d=[...b])=>{
        if(l<z-n&!V(p+o*l-o)&!V(p+o*l+o*n))
        {
          for(i=-1;v=d[p],++i<w;p+=o,t-=v==f)
            if(i>=l&i-n<l)
              for(v!=e&v!=0|[q,w,~z].some(w=>V(p+w)|V(p-w))?t=0:d[p]=f,j=o*i,u=k=0;
                  ++k<z;(u+=d[j]==f)>g[i]?t=0:j+=q);
          return t>=n&&d.join('')
        }
    })=>{
    if(b){
      if(!n)return~b.search(0)?0:b;
      for(s=s.slice(1);y<w||(y=0,++x<w);++y)
        if(h=R(s,P(y*z,1,z,r[y],c,x))||n>1&&R(s,P(x,z,1,c[x],r,y)))return h
    }
  })(s,b)

Kiểm tra trong bảng điều khiển FireFox / FireBug

;['3x2 1x4\n2 2 3 1 2\n4 0 3 0 3\n5\n     \n     \n    #\n  #  \n    *\n'
,'3x1 1x6\n2 0 4 0 3\n3 1 2 1 2\n5\n*    \n     \n     \n   # \n     \n'
,'5x1 4x1 2x1 1x2\n1 2 3 3 2 2\n0 5 0 4 0 4\n6\n#     \n  -   \n      \n      \n #    \n   <  \n'
,'4x1 3x1 2x2 1x2\n1 4 0 3 0 5\n4 1 1 2 3 2\n6\n <    \n      \n      \n      \n    # \n ^ #  \n']
.forEach(x=>console.log(x,M(x).replace(/ /g,'`'))) // space replaced with ` for clarity

Đầu ra (tổng thời gian thực hiện <1 giây)

3x2 1x4
2 2 3 1 2
4 0 3 0 3
5


    #
  #  
    *

***`*
`````
`***#
``#``
*`*`*

3x1 1x6
2 0 4 0 3
3 1 2 1 2
5
*    


   # 


*`*`*
``*``
``*`*
*``#`
``*`*

5x1 4x1 2x1 1x2
1 2 3 3 2 2
0 5 0 4 0 4
6
#     
  -   


 #    
   <  

#`````
`*****
``````
`****`
`#````
*`**`*

4x1 3x1 2x2 1x2
1 4 0 3 0 5
4 1 1 2 3 2
6
 <    



    # 
 ^ #  

**`*`*
```*``
`````*
`*```*
`*`*#*
`*`#`*

Hình như @globby quên mất tiền thưởng đó. Dù sao, đã có rất nhiều niềm vui trong cuộc đua này.
Jakube
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.