Checkmate (còn gọi là vấn đề về nước tiểu)


35

Giáo viên Precalc của tôi có một trong những vấn đề yêu thích của anh ấy mà anh ấy đã tạo ra (hoặc nhiều khả năng là lấy trộm lấy cảm hứng từ xkcd ) liên quan đến một hàng nbồn tiểu. "Checkmate" là một tình huống trong đó mọi bồn tiểu đã bị chiếm HOẶC có một bồn tiểu bị chiếm bên cạnh họ. Ví dụ, nếu một người là một X, thì

X-X--X

được coi là chiếu tướng. Lưu ý rằng một người không thể chiếm một bồn tiểu bên cạnh một bồn tiểu đã chiếm.

Bài tập

Chương trình của bạn sẽ lấy một số thông qua stdin, đối số dòng lệnh hoặc đối số hàm. Chương trình của bạn sau đó sẽ in ra hoặc trả về số cách mà checkmate có thể xảy ra với số lượng bồn tiểu được nhập vào.

Ví dụ

0 -> 1(trường hợp vô tính là checkmate)
1 -> 1( X)
2 -> 2( X-hoặc -X)
3 -> 2( X-Xhoặc -X-)
4 -> 3( X-X-, -X-X, hoặc X--X)
5 -> 4( X-X-X, X--X-, -X-X-, hoặc -X--X)
6 -> 5( X-X-X-, X--X-X, X-X--X, -X--X-hoặc -X-X-X)
7 -> 7( X-X-X-X, X--X-X-, -X-X--X, -X--X-X, X-X--X-, X--X--Xhoặc -X-X-X-)
8 -> 9( -X--X--X, -X--X-X-, -X-X--X-, -X-X-X-X, X--X--X-, X--X-X-X, X-X--X-X, X-X-X--X, X-X-X-X-)
...

Chấm điểm

Chương trình nhỏ nhất tính bằng byte thắng.




12
Trường hợp n = 0 phải là 1. Có chính xác một thiết lập là checkmate và đó là ''. Điều này giống như với giai thừa và hoán vị, 0! = 1, vì có chính xác 1 cách sắp xếp 0 mục.
orlp


19
Không có nhà vệ sinh nào thực sự là một tình huống checkmate. : D
Tít

Câu trả lời:


20

Ốc đảo , 5 byte

cd+2V

Phiên bản mở rộng

cd+211

Giải trình

1 = a(0)
1 = a(1)
2 = a(2)

a(n) = cd+
       c      # Calculate a(n - 2)
        d     # Calculate a(n - 3)
         +    # Add them up

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


7
Đây là một câu trả lời lạ, ngôn ngữ đã được tạo ra khoảng một tháng trước mà không có tài liệu phù hợp trong repo ....

2
@tuskiomi Nó có một tài liệu, tronginfo.txt
TuxCrafting

6
@ TùxCräftîñg chắc chắn, nếu bạn muốn là kỹ thuật. Tôi có thể vẽ một con ngựa và gọi nó là tài liệu hướng tới dự án lập trình của tôi. Điều đó không làm cho nó hữu ích, hoặc quyết định.

1
@tuskiomi info.txtrất hữu ích, nó chứa một tài liệu cho mỗi lệnh Oasis
TuxCrafting

8
@tuskiomi Đó là kết quả của sự trì hoãn và lười biếng. Tôi sẽ cố gắng thêm một tài liệu ngắn gọn về cách ngôn ngữ thực tế hoạt động ngày hôm nay.
Ad Nam

12

Java 7, 65 42 byte

int g(int u){return u>1?g(u-2)+g(u-3):1;}

Trình tự chỉ cần thêm các yếu tố trước để có được những cái mới. Hat tip cho orlp và Rod cho phương pháp ngắn hơn này;)

Cũ:

int f(int u){return u<6?new int[]{1,1,2,2,3,4}[u]:f(u-1)+f(u-5);}

Sau phần tử thứ năm, khoảng cách trong chuỗi tăng lên bởi phần tử năm trước.


Nếu u = 3 thì hàm của bạn trả về 1 nhưng các ví dụ cho thấy nó phải là 2.
Chọc

Rất tiếc! Tôi đã sử dụng fchức năng của mình từ đoạn trích khác thay vì đệ quy. Ngu ngốc, sửa chữa ...
Geobits

1
Không thể phần cuối cùng ( u>0?u:1;) trở thành 1;?
Conor O'Brien

2
@Jordan Nếu không có bồn tiểu, thì "mọi bồn tiểu đều đã bị chiếm dụng" trong một cấu hình có thể. Tôi tin rằng trường hợp thử nghiệm thể hiện trong câu hỏi là sai.
Geobits

1
Bạn có thể thay thế u>0?u:1;)bằng cách 1;thay đổi so sánh đầu tiên thành u>1, sau đó vào u = 2, đầu ra sẽ là g (0) + g (-1), sẽ là 2
Rod

9

Python 2, 42 40 39 35 byte

f=lambda n:n>1and f(n-2)+f(n-3)or 1

Tạo các bộ thực tế:

lambda n:["{:0{}b}".format(i,n).replace("0","-").replace("1","X")for i in range(2**n)if"11"not in"{:0{}b}".format(i*2,2+n).replace("000","11")]

8

Ruby, 58 34 byte

Lấy cảm hứng mạnh mẽ từ câu trả lời Java gốc của Geobits.

f=->n{n<3?n:n<6?n-1:f[n-1]+f[n-5]}

Xem nó trên repl.it: https://repl.it/Dedh/1

Lần thử đầu tiên

->n{(1...2**n).count{|i|!("%0#{n}b"%i)[/11|^00|000|00$/]}}

Xem nó trên repl.it: https://repl.it/Dedh


6

Python, 33 byte

f=lambda n:+(n<2)or f(n-2)+f(n-3)

Sử dụng các trường hợp cơ sở thay đổi f(-1) = f(0) = f(1) = 1. Nếu Truecó thể được sử dụng cho 1, chúng ta sẽ không cần 3 byte cho +().


6

J, 31 27 23 byte

Saved 4 byte nhờ dặm!

0{]_&(]}.,+/@}:)1 1 2"_

Một lời giải thích là đến sớm.

Giải pháp cũ

(>.1&^)`(-&3+&$:-&2)@.(2&<)

Đây là một chương trình nghị sự. LHS là một gerund bao gồm hai động từ: >.1&^-&3+&$:-&2. Cái đầu tiên được sử dụng nếu điều kiện ( 2&<) không thành công. Điều đó có nghĩa là ngã ba >.1&^được kích hoạt qua đối số. Quan sát:

   1 ^ 0 1 2
1 1 1
   (1&^) 0 1 2
1 1 1
   0 1 2 >. (1&^) 0 1 2
1 1 2
   (>.1&^) 0 1 2
1 1 2

Ở đây, >.lấy tối đa của hai giá trị. Do đó, nó mang lại 1, 1 và 2 như các điều khoản ban đầu.

Động từ thứ hai trong gerund là một ngã ba:

-&3 +&$: -&2

Các tin bên trái và bên phải được áp dụng cho động từ, trừ 3 và 2 tương ứng; sau đó động từ giữa được gọi với các đối số trái và phải bằng với các đối số. $:gọi động từ trên mỗi đối số và +thêm hai động từ đó. Về cơ bản nó tương đương với($: arg - 3) + ($: arg - 2)

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

   f =: (>.1&^)`(-&3+&$:-&2)@.(2&<)
   f 0
1
   f 2
2
   f 4
3
   f 6
5
   f 8
9
   F =: f"0         NB. for tables
   F i.13
1 1 2 2 3 4 5 7 9 12 16 21 28
   i.13
0 1 2 3 4 5 6 7 8 9 10 11 12
   (,. F) i.13
 0  1
 1  1
 2  2
 3  2
 4  3
 5  4
 6  5
 7  7
 8  9
 9 12
10 16
11 21
12 28

4

MATL , 25 23 byte

W:qB7BZ+t!XAw3BZ+!3>a>s

Hãy thử trực tuyến! Hoặc kiểm tra tất cả các trường hợp thử nghiệm .

Giải trình

Hai nếp cuộn! Yay!

Điều này xây dựng một mảng, giả sử A, trong đó mỗi cấu hình có thể là một hàng. 1trong mảng này đại diện cho một vị trí chiếm đóng. Ví dụ, đối với đầu vào 4mảng A là

0 0 0 0
0 0 0 1
0 0 1 0
···
1 1 1 0
1 1 1 1

Đoạn mã sau đó kết hợp mảng A với [1 1 1]. Điều này cung cấp cho một mảng B. Các vị trí bị chiếm đóng và hàng xóm của các vị trí bị chiếm đóng trong A cho kết quả khác không trong mảng B:

0 0 0 0
0 0 1 1
0 1 1 1
···
2 3 2 1
2 3 3 2

Vì vậy, điều kiện đầu tiên để cấu hình trở thành người kiểm tra là B không chứa số không trong hàng đó. Điều này có nghĩa là trong hàng A không có vị trí trống, hoặc có một số nhưng là hàng xóm của các vị trí bị chiếm đóng.

Chúng ta cần một điều kiện thứ hai. Ví dụ, hàng cuối cùng đáp ứng điều kiện trên, nhưng không phải là một phần của giải pháp vì cấu hình không hợp lệ để bắt đầu. Một cấu hình hợp lệ không thể có hai vị trí chiếm đóng lân cận, nghĩa là không thể có hai vị trí liền kề 1trong A. Tương đương, nó không thể có hai giá trị liền kề trong B vượt quá 1. Vì vậy, chúng ta có thể phát hiện điều này bằng cách kết hợp B với [1 1]và kiểm tra xem trong mảng kết quả, C,

0 0 0 0
0 1 2 1
1 2 2 1
···
5 5 3 1
5 6 5 2

không có giá trị trong hàng đó vượt quá 3. Kết quả cuối cùng là số lượng cấu hình đáp ứng hai điều kiện.

W:q    % Range [0 1 ... n-1], where n is implicit input
B      % Convert to binary. Each number produces a row. This is array A
7B     % Push array [1 1 1] 
Z+     % 2D convolution, keeping size. Entries that are 1 or are horizontal 
       % neighbours of 1 produce a positive value. This is array B
t!     % Duplicate and transpose (rows become columns)
XA     % True for columns that contain no zeros
w      % Swap. Brings array B to top
3B     % Push array [1 1]
Z+     % 2D convolution, keeping size. Two horizontally contiguous entries
       % that exceed 1 will give a result exeeding 3. This is array C
!      % Transpose
3>     % Detect entries that exceed 3
a      % True for columns that contain at least one value that exceeds 3
>      % Element-wise greater-than comparison (logical and of first
       % condition and negated second condition)
s      % Sum (number of true values)

4

PHP, 105 113 93 byte

+3 cho n=1; +9 cho $argv, -1-3 đánh gôn
-20: nhận thấy rằng tôi không thể kết hợp, nhưng chỉ tính số lượng của chúng

for($i=1<<$n=$argv[1];$i--;)$r+=!preg_match("#11|(0|^)0[0,]#",sprintf("%0{$n}b,",$i));echo$r;

chạy với -r

vòng lặp từ 2 ** n-1 đến 0:

  • kiểm tra biểu diễn nhị phân n chữ số cho 11, 000, 00ở đầu hoặc cuối cùng, hoặc một đơn0
  • nếu không khớp, tăng kết quả

kết quả in

cùng kích thước, regex đơn giản hơn một chút

for($i=1<<$n=$argv[1];--$i;)$r+=!preg_match("#11|^00|00[,0]#",sprintf("%0{$n}b,",$i));echo$r;
  • vòng lặp từ 2 ** n-1 đến 1 (thay vì 0)
  • kiểm tra biểu diễn nhị phân cho 11, 00ở đầu hoặc cuối, hoặc000
  • không in gì cho n = 0

PHP, 82 byte

Arnauld hès trả lời ported và golf:

for($i=$k=1<<$n=$argv[1];--$i;)$r+=!($i&$x=$i/2|$i*2)&&(($i|$x)&~$k)==$k-1;echo$r;

không in gì cho n = 0


thêm 3 byte cho cái mới n=0: chèn ?:1trước trận chung kết;
Titus

4

Thạch , 11 byte

,’fR_2߀So1

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

,’fR_2߀So1  Main link. Argument: n

 ’           Decrement; yield n - 1.
,            Pair; yield [n, n - 1].
   R         Range; yield [1, ..., n].
  f          Filter; keep the elements that are common to both lists.
             This yields [n, n - 1] if n > 1, [1] if n = 1, and [] if n < 1.
    _2       Subtract 2 from both elements, yielding [n - 2, n - 3], [-1], or [].
      ߀     Recursively call the main link for each integer in the list.
        S    Take the sum of the resulting return values.
         o1  Logical OR with 1; correct the result if n < 1.

2
Cái này hoạt động ra sao? Nó sử dụng công thức đệ quy, hay cái gì khác?
Conor O'Brien

@ ConorO'Brien Có, nó sử dụng công thức đệ quy. Tôi đã thêm một lời giải thích.
Dennis

4

JavaScript (ES6) / Đệ quy, 30 27 byte

Chỉnh sửa: đã lưu 3 byte nhờ Shaun H

let

f=n=>n<3?n||1:f(n-2)+f(n-3)

for(var n = 1; n < 16; n++) {
  console.log(n, f(n));
}

JavaScript (ES6) / Không đệ quy 90 77 byte

Chỉnh sửa: đã lưu 13 byte nhờ Conor O'Brien và Titus

let f =

n=>[...Array(k=1<<n)].map((_,i)=>r+=!(i&(x=i>>1|i+i))&&((i|x)&~k)==k-1,r=0)|r

for(var n = 1; n < 16; n++) {
  console.log(n, f(n));
}


1
Tôi nghĩ ((i|r|l)&(k-1))có thể trở thành ((i|r|l)&k-1), hoặc thậm chí((i|r|l)&~-k)
Conor O'Brien

một byte: i<<1-> i*2hoặci+i
Titus

1
Bạn có thể sử dụng một biến cho l và r, tiết kiệm 6 byte : !(i&(x=i>>1|i+i))&&((i|x)&(k-1))==k-1; và nếu bạn có thể chèn vào ,k--một nơi nào đó, bạn có thể thay thế k-1bằng kđể lưu parens.
Tít

&(k-1)không cần parens nào; nhưng bạn có thể sử dụng &~kthay thế.
Tít

1
Tôi sẽ rời khỏi đây:f=n=>n<3?n||1:f(n-2)+f(n-3)
Shaun H

3

Toán học, 35 byte

a@0=a@1=1;a@2=2;a@b_:=a[b-2]+a[b-3]

Xác định một hàm a. Lấy một số nguyên làm đầu vào và trả về một số nguyên làm đầu ra. Giải pháp đệ quy đơn giản.


3

AnyDice , 51 byte

function:A{ifA<3{result:(A+2)/2}result:[A-2]+[A-3]}

Cần có thêm câu trả lời AnyDice quanh đây.

Giải pháp của tôi định nghĩa một hàm đệ quy tính toán a(n)=a(n-2)+a(n-3). Nó trả về a(0)=a(1)=1a(2)=2sử dụng một số phép thuật chia số nguyên.

Dùng thử trực tuyến

Lưu ý: đầu ra có thể trông lạ và đó là vì nó thường được sử dụng để xuất xác suất xúc xắc. Chỉ cần nhìn vào số bên trái của biểu đồ thanh.


3

Perl, 35 34 byte

Bao gồm +1 cho -p

Cung cấp đầu vào trên STDIN

checkmate.pl <<< 8

checkmate.pl:

#!/usr/bin/perl -p
$\+=$b-=$.-=$\-$b*4for(++$\)x$_}{

Một công thức bí mật mới được phát triển. Ripple cập nhật 3 biến trạng thái mà không cần gán song song.

Nó cũng ngắn không kém (nhưng chậm hơn rất nhiều và chiếm nhiều bộ nhớ hơn) để giải quyết vấn đề ban đầu:

#!/usr/bin/perl -p
$_=grep!/XX|\B-\B/,glob"{X,-}"x$_

nhưng nó không làm việc cho 0


2

JavaScript (ES6), 62 byte

n=>[1,...Array(n)].reduce(($,_,i,a)=>a[i]=i<3?i:a[i-3]+a[i-2])

Đây là lần đầu tiên tôi cần hai tên biến giả. Một phiên bản đệ quy có thể sẽ ngắn hơn, nhưng tôi thực sự thích reduce... Chỉnh sửa: Tìm thấy một giải pháp, cũng là 62 byte, chỉ có một biến giả:

n=>[1,...Array(n)].reduce((p,_,i,a)=>a[i]=i<5?i+2>>1:a[i-5]+p)

2

Thạch , 19 byte

Các giải pháp đệ quy có thể ngắn hơn ...

Ḥ⁹_c@⁸
+3µ:2R0;瀵S

Xem nó tại TryItOnline
Hoặc xem loạt cho n = [0, 99], cũng tại TryItOnline

Làm sao?

Trả về n+3số của Padovan bằng cách đếm các kết hợp

Ḥ⁹_c@⁸ - Link 1, binomial(k, n-2k): k, n
Ḥ      - double(2k)
 ⁹     - right argument (n)
  _    - subtract (n-2k)
     ⁸ - left argument (k)
   c@  - binomial with reversed operands (binomial(k, n-2k))

+3µ:2R0;瀵S - Main link: n
  µ       µ  - monadic chain separation
+3           - add 3 (n+3)
   :2        - integer divide by 2 ((n+3)//2)
     R       - range ([1,2,...,(n+3)//2]
      0;     - 0 concatenated with ([0,1,2,...,(n+3)//2]) - our ks
        ç€   - call previous link as a dyad for each
           S - sum

2

> <> , 25 + 2 = 27 byte

211rv
v!?:<r@+@:$r-1
>rn;

Cần đầu vào để có mặt trên ngăn xếp khi bắt đầu chương trình, vì vậy +2 byte cho -vcờ. Hãy thử trực tuyến!

Dòng đầu tiên khởi tạo ngăn xếp đến 1 1 2 n, nơi nlà số đầu vào. Dòng thứ hai, chạy ngược lại, kiểm tra nlớn hơn 1. Nếu có, nđược giảm và phần tử tiếp theo trong chuỗi được tạo như sau:

r$:@+@r              a(n-3) a(n-2) a(n-1) n

r        Reverse   - n a(n-1) a(n-2) a(n-3)
 $       Swap      - n a(n-1) a(n-3) a(n-2)
  :      Duplicate - n a(n-1) a(n-3) a(n-2) a(n-2)
   @     Rotate 3  - n a(n-1) a(n-2) a(n-3) a(n-2)
    +    Add       - n a(n-1) a(n-2) a(n)
     @   Rotate 3  - n a(n) a(n-1) a(n-2)
      r  Reverse   - a(n-2) a(n-1) a(n) n

Dòng cuối cùng xuất số ở dưới cùng của ngăn xếp, là phần tử bắt buộc trong chuỗi.


2

CJam , 20 byte

1_2_{2$2$+}ri*;;;o];

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

Giải trình

Điều này sử dụng mối quan hệ lặp lại được hiển thị trong trang OEIS .

1_2_                   e# Push 1, 1, 2, 2 as initial values of the sequence
           ri          e# Read input
    {     }  *         e# Repeat block that many times
     2$2$              e# Copy the second and third elements from the top
         +             e# Add them
              ;;;      e# Discard the last three elements
                 o     e# Output
                  ];   e# Discard the rest to avoid implicit display

2

05AB1E , 12 byte

XXXIGX@DŠ0@+

Giải trình

XXX            # initialize stack as 1, 1, 1
   IG          # input-1 times do:
     X@        # get the item 2nd from bottom of the stack
       DŠ      # duplicate and push one copy down as 2nd item from bottom of the stack
         0@    # get the bottom item from the stack
           +   # add the top 2 items of the stack (previously bottom and 2nd from bottom)
               # implicitly print the top element of the stack after the loop

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


1

FRACTRAN, 104 93 byte

Đầu vào là 11**n*29và đầu ra là 29**checkmate(n).

Điều này chủ yếu là để giải trí, đặc biệt là vì tôi hiện đang bị Python, JS Java vượt mặt. Cùng số byte như PHP mặc dù: D Gợi ý chơi gôn.

403/85 5/31 3/5 9061/87 3/41 37/3 667/74 37/23 7/37 38/91 7/19 5/77 1/7 1/17 1/2 340/121 1/11

Ungolfing

               At the start we have 11**n * 29
1/11           If n < 2, we remove the 11s and print 29**1
340/121        If n >= 2, we subtract two 11s (n-2) and add one 17, two 2s and one 5.
                 We now have 17**1 * 29**1 * 2**2 * 5.
                 These are the register for a, b, c at registers 17, 29, and 2.
                 5 is an indicator to start the first loop.
                 This loop will move a to register 13.
403/85 5/31    Remove the 17s one at a time, adds them to the 13 register.
                 5 and 31 reset the loop.
3/5            Next loop: moves b to a and adds b to a in register 13.
9061/87 3/41   Remove the 29s one at a time, adds them to the 17 and 13 registers.
                 3 and 41 reset the loop.
37/3           Next loop: moves c to b in register 29.
667/74 37/23   Remove the 2s one at a time, adds them to the 29 register.
                 37 and 23 reset the loop.
7/37           Next loop: moves a+b to c in register 2.
38/91 7/19     Remove the 13s one at a time, adds them to the 2 register.
                 7 and 19 reset the loop.
5/77           Move to the first loop if and only if we have an 11 remaining.
1/7 1/17 1/2   Remove the 7 loop indicator, and all 17s and 2s.
               Return 29**checkmate(n).

1

Trên thực tế, 25 byte

Điều này có vẻ hơi dài cho một f(n) = f(n-2) + f(n-3)mối quan hệ tái phát đơn giản . Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

╗211╜¬`);(+)`nak╜2╜2<I@E

Ungolfing

         Implicit input n.
╗        Save n to register 0.
211      Stack: 1, 1, 2. Call them a, b, c.
╜¬       Push n-2.
`...`n   Run the following function n-2 times.
  );       Rotate b to TOS and duplicate.
  (+       Rotate a to TOS and add to b.
  )        Rotate a+b to BOS. Stack: b, c, a+b
         End function.
ak       Invert the resulting stack and wrap it in a list. Stack: [b, c, a+b]
╜        Push n.
2        Push 2.
╜2<      Push 2 < n.
I        If 2<n, then 2, else n.
@E       Grab the (2 or n)th index of the stack list.
         Implicit return.

1

Trên thực tế , 18 byte

Đây là một cổng thực sự của câu trả lời Jelly dài hơn của Dennis. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

3+;╖½Lur⌠;τ╜-@█⌡MΣ

Ungolfing

         Implicit input n.
3+       Add 3. For readibility, m = n+3.
;╖       Duplicate and store one copy of m in register 0.
½Lu      floor(m/2) + 1.
r        Range from 0 to (floor(m/2)+1), inclusive.
⌠...⌡M   Map the following function over the range. Variable k.
  ;        Duplicate k.
  τ╜-      Push m-2k. Stack: [m-2k, k]
  @█       Swap k and m-2k and take binomial (k, m-2k).
            If m-2k > k, █ returns 0, which does not affect the sum() that follows.
         End function.
Σ        Sum the list that results from the map.
         Implicit return.



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.