Đây có phải là một hình vuông mất?


19

Có một trò chơi tên là Get Home được chơi trên bàn cờ vua. Trong trò chơi này, có một mảnh duy nhất được di chuyển bởi cả hai người chơi lần lượt. Có một số quy tắc để làm thế nào mảnh có thể được di chuyển. Đến lượt, người chơi phải thực hiện một trong những động tác sau cho n dương .

  • n không gian lên

  • n không gian bên trái

  • n khoảng trắng lên và sang trái (một đường chéo)

Người chơi di chuyển quân cờ vào góc trên bên trái của bảng sẽ thắng trò chơi.

Bây giờ chúng ta sẽ định nghĩa khái niệm về một hình vuông bị mất. Trong video này (từ nơi tôi có ý tưởng), một ô vuông thua được định nghĩa là một hình vuông trên đó, bất kỳ người chơi nào bắt đầu lượt của họ sẽ bị buộc phải thực hiện một động tác cho phép đối thủ của họ giành chiến thắng. Ví dụ đơn giản nhất về hình vuông thua sẽ là hình vuông tại (1,2). Một mảnh tại (1,2) có thể di chuyển đến bất kỳ nơi nào sau đây.

Hình minh họa

Tất cả đều có đường dẫn trực tiếp đến chiến thắng cho người chơi tiếp theo.

Nó cũng theo sau rằng bất kỳ hình vuông nào có đường di chuyển đến hình vuông thua đều cho phép người chơi bắt đầu trên hình vuông đó để giành chiến thắng. Điều này có nghĩa là bất kỳ hình vuông nào không di chuyển khỏi hình vuông bị mất cũng là hình vuông bị mất.

Điều này đưa chúng ta đến định nghĩa khá gọn gàng về một hình vuông bị mất:

Hình vuông thua là hình vuông mà từ đó không có di chuyển nào có thể đến hình vuông mất khác và (0,0) là hình vuông mất.

Bài tập

Cho tọa độ của một hình vuông trên bàn cờ có kích thước tùy ý xác định xem đó có phải là hình vuông thua không. Xuất hai giá trị một cho mất bình phương và một cho người khác.

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

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

Dưới đây là tất cả các ô vuông thua trên bàn cờ 8 x 8 thông thường (được đánh dấu bằng 0).

0 1 1 1 1 1 1 1
1 1 0 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 0 1 1
1 1 1 1 1 1 1 0
1 1 1 0 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 0 1 1 1

Dưới đây là hình ảnh của một bảng 100 x 100 với các ô vuông bị mất được đánh dấu màu đen (mỗi ô vuông là 2 pixel x 2 pixel).

Bảng 100


2
Tôi không nghĩ có đủ các trường hợp thử nghiệm để tìm một mẫu. Tôi nghĩ rằng tôi thấy một mẫu, nhưng tôi không thể nói chắc chắn. Là 10, 7một hình vuông mất? Là 10, 8? Thế còn 15, 11?
DJMcMayhem

1
@WheatWizard Bạn có phiền làm cho hình ảnh lớn hơn một chút không?
Erik the Outgolfer 17/8/17

1
@WheatWizard Tôi có nghĩa là pixel lớn hơn ... ví dụ: 5x5 pixel thay vì 1x1, có thể là một số lưới quá nếu không quá khó (btw cảm ơn vì 100x100)
Erik the Outgolfer

2
Cũng liên quan (trả lại di chuyển tối ưu hoặc tín hiệu rằng vị trí đang mất).
Zgarb

1
Tôi nghĩ rằng việc cho phép các điểm không chính xác của dấu phẩy động gây cản trở hiệu suất là điều bình thường ngay cả với khả năng số nguyên lớn tùy ý ...
Jonathan Allan

Câu trả lời:


8

Trăn 3 , 112 50 46 42 byte

-4 byte nhờ Jonathan Allan !

-2 byte nhờ xnor !

lambda r,c:abs(r-c)*(3+5**.5)//2==max(r,c)

Hãy thử trực tuyến!

Dựa trên công thức cho các vị trí lạnh trong trò chơi của Wythoff và thực hiện một số sửa đổi để tạo ra một công thức rõ ràng. Giải thích trong nước một khi tôi thực sự hoàn thành một phương pháp thích hợp cho việc tạo ra công thức.


Bạn không thể thay đổi 0<=xđể x>0và tiết kiệm một hoặc hai byte?
Jonathan Frech

@JonathanFrech Nó phải là <=hoặc >=để bao gồm vị trí 0, 0.
notjagan

Bạn đã đúng, chỉ có thể lưu một byte .
Jonathan Frech

1
Một byte ít hơn với cách thực hiện khác nhau giống nhau:lambda r,c:int(abs(r-c)*(5**.5+1)**2/4)==max(r,c)
Jonathan Allan

1
/2//1trông giống như //2.
xnor

5

Thạch , 8 byte

ạ/×ØpḞ⁼Ṃ

Hãy thử trực tuyến! hoặc xem 60 trên 60 bên trái dưới dạng lưới .

Làm sao?

Vị trí lạnh trong trò chơi của Wythoff là vị trí thua cuộc. Các tọa độ [n,m]cho một vị trí lạnh khi n = floor(kφ) = floor(mφ) - mhoặc m = floor(kφφ) = ceil(nφ) = n + kcho một số số tự nhiên kvà tỷ lệ vàng , φ. Các cựu giữ khi nít hơn m; cái sau khi mnhỏ hơn n(cả hai giữ tại 0,0).

klà do sự khác biệt tuyệt đối giữa nmvà nếu floor(abs(n-m)φ)=min(n,m)điều kiện được đáp ứng.

ạ/×ØpḞ⁼Ṃ - Link: list, c ([n,m])
 /       - reduce c by:
ạ        -   absolute difference = abs(n-m)
   Øp    - golden ratio yield
  ×      - multiply
     Ḟ   - floor
       Ṃ - minimum of c = min(n,m)
      ⁼  - equal?

2

JavaScript (ES6), 64 byte

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&(y/p%p-x*p%++p)**2<1e-9

Bây giờ tôi thấy rằng đây không phải là kỹ thuật tốt nhất, nhưng tôi đã phải tự mình nghĩ ra vì tôi bị mất internet ngay sau khi tải trang này. (Sẽ đăng cách đây một thời gian nếu không có các sự cố internet này ...)

Trong một thế giới hoàn hảo, độ chính xác float sẽ không thành vấn đề và tôi có thể lưu 9 byte:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p<1&y/p%p==x*p%++p

Có thể lưu thêm 6 byte nếu JS hỗ trợ chuỗi so sánh của Python:

f=(x,y,p=5**.5/2+.5)=>x<y?f(y,x):y/p%p==x*p%++p<1

0

Bình, 39 byte

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh

Tôi đã viết điều này với một chức năng được đặt tên (ew), và cực kỳ lười biếng với việc chơi golf. Kế hoạch chơi golf khá nhiều byte vào tối nay

Hãy thử trực tuyến, với các thử nghiệm do chính tôi tạo ra, có nghĩa là thay thế Đúng / Sai

Giải trình:

Các đường chéo của ma trận giải pháp có bình phương mất theo chuỗi các số lặp lại trong OEIS A005206 . Từ Lthông qua ;là ký hiệu đánh bóng khá đơn giản để xác định y(b)=b-y(y(b-1)).

Phần còn lại của lời giải thích sau

=SQL?!b0-byytb;q@myd+0.fqyZytZ@Q1)-F_Qh    Full program, take stdin as [x, y], output True or False to stdout
=SQ                                        Sort input
   L?!b0-byytb;                            Named lambda as explained above
                    +0.f                   Make sequence of first max(x, y) numbers, starting with 0, 
                        qy y               For which are equal 
                          Z tZ             each element and the previous are equal
                myd                        Map this sequence to the y(index), not just index numbers
             q                             Check if are equal 
              @                  )-F_Q     the x-yth element of sequence (x-y represents which diagonal) 
                                     h(Q)  and the lower of [x,y] (Q is added by the interpreter to fix arity issues

0

Hàng loạt, 204 byte

@if %1 lss %2 %0 %2 %1
@if %1==0 exit/b0
@set/au=l=i=0
:g
@set/au+=2+i%%2,l+=1+i%%2
@if %1==%n% if %2==%m% exit/b0
@if %1 leq %n% exit/b1
:l
@set/a"k=3*i^2*i^i,i+=1
@if %k%==0 goto g
@goto l

Trả về qua mã thoát. Giải thích: Vì Batch chỉ có số học số nguyên nên tôi đã phải nghĩ ra một giải pháp hoàn toàn không đối xứng. Không bao gồm 0,0mục nhập, các cặp tọa độ vuông mất theo quy tắc sau: nếu 11số nhị phân không có tiếp theo là chẵn thì thêm 3,2nếu không thêm 2,1. Một thử nghiệm cho 11số nhị phân không có giá trị là nếu không có số mang khi nó được nhân với ba, nói cách khác là vậy (i*2)+i==(i*2)^i. Dưới đây là một số 11nhị phân miễn phí đầu tiên và tọa độ của chúng:

   0     2,1  + 3,2 =  5,3
   1     5,3  + 2,1 =  7,4
  10     7,4  + 3,2 = 10,6
 100    10,6  + 3,2 = 13,8
 101    13,8  + 2,1 = 15,9
1000    15,9  + 3,2 = 18,11
1001    18,11 + 2,1 = 20,12
1010    20,12 + 3,2 = 23,14

v.v ... Bí ẩn quy tắc này đủ để làm cho các chuỗi bổ sung. Sau đó, nó vẫn còn để tính toán chuỗi cho đến khi nó đạt đến tọa độ lớn hơn, tại đó chúng ta có thể xác định xem hình vuông có bị mất hay không.

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.