Điểm cầu lông hợp lệ?


27

Giới thiệu:

Tôi thấy chỉ có một thử thách liên quan đến cầu lông khác ngay bây giờ . Vì tôi tự chơi cầu lông (trong 13 năm qua), tôi đã hình dung mình sẽ thêm một số thử thách liên quan đến cầu lông. Đây là cái đầu tiên:

Thử thách:

Đầu vào: Hai số nguyên
Đầu ra: Một trong ba đầu ra riêng biệt và duy nhất theo lựa chọn của riêng bạn. Một chỉ ra rằng đầu vào là một số điểm cầu lông hợp lệ VÀ bộ đã kết thúc với một người chiến thắng; một chỉ ra rằng đầu vào là một số điểm cầu lông hợp lệ VÀ bộ vẫn đang chơi; một chỉ ra đầu vào không phải là một số điểm cầu lông hợp lệ.

Với cầu lông, cả hai (cặp) người chơi bắt đầu với 0 điểm và bạn dừng lại khi một trong hai (cặp) người chơi đạt được số điểm 21, với chênh lệch ít nhất 2 điểm, tối đa là 30-29.

Vì vậy, đây là tất cả các cặp đầu vào có thể (theo thứ tự) cho biết đó là điểm cầu lông hợp lệ VÀ bộ đã kết thúc:

[[0,21],[1,21],[2,21],[3,21],[4,21],[5,21],[6,21],[7,21],[8,21],[9,21],[10,21],[11,21],[12,21],[13,21],[14,21],[15,21],[16,21],[17,21],[18,21],[19,21],[20,22],[21,23],[22,24],[23,25],[24,26],[25,27],[26,28],[27,29],[28,30],[29,30]]

Và đây là tất cả các cặp đầu vào có thể (theo thứ tự) cho biết đó là điểm cầu lông hợp lệ NHƯNG bộ vẫn đang chơi:

[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[0,10],[0,11],[0,12],[0,13],[0,14],[0,15],[0,16],[0,17],[0,18],[0,19],[0,20],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[1,10],[1,11],[1,12],[1,13],[1,14],[1,15],[1,16],[1,17],[1,18],[1,19],[1,20],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[2,10],[2,11],[2,12],[2,13],[2,14],[2,15],[2,16],[2,17],[2,18],[2,19],[2,20],[3,3],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[3,10],[3,11],[3,12],[3,13],[3,14],[3,15],[3,16],[3,17],[3,18],[3,19],[3,20],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[4,10],[4,11],[4,12],[4,13],[4,14],[4,15],[4,16],[4,17],[4,18],[4,19],[4,20],[5,5],[5,6],[5,7],[5,8],[5,9],[5,10],[5,11],[5,12],[5,13],[5,14],[5,15],[5,16],[5,17],[5,18],[5,19],[5,20],[6,6],[6,7],[6,8],[6,9],[6,10],[6,11],[6,12],[6,13],[6,14],[6,15],[6,16],[6,17],[6,18],[6,19],[6,20],[7,7],[7,8],[7,9],[7,10],[7,11],[7,12],[7,13],[7,14],[7,15],[7,16],[7,17],[7,18],[7,19],[7,20],[8,8],[8,9],[8,10],[8,11],[8,12],[8,13],[8,14],[8,15],[8,16],[8,17],[8,18],[8,19],[8,20],[9,9],[9,10],[9,11],[9,12],[9,13],[9,14],[9,15],[9,16],[9,17],[9,18],[9,19],[9,20],[10,10],[10,11],[10,12],[10,13],[10,14],[10,15],[10,16],[10,17],[10,18],[10,19],[10,20],[11,11],[11,12],[11,13],[11,14],[11,15],[11,16],[11,17],[11,18],[11,19],[11,20],[12,12],[12,13],[12,14],[12,15],[12,16],[12,17],[12,18],[12,19],[12,20],[13,13],[13,14],[13,15],[13,16],[13,17],[13,18],[13,19],[13,20],[14,14],[14,15],[14,16],[14,17],[14,18],[14,19],[14,20],[15,15],[15,16],[15,17],[15,18],[15,19],[15,20],[16,16],[16,17],[16,18],[16,19],[16,20],[17,17],[17,18],[17,19],[17,20],[18,18],[18,19],[18,20],[19,19],[19,20],[20,20],[20,21],[21,21],[21,22],[22,22],[22,23],[23,23],[23,24],[24,24],[24,25],[25,25],[25,26],[26,26],[26,27],[27,27],[27,28],[28,28],[28,29],[29,29]]

Bất kỳ cặp số nguyên nào khác sẽ là một số điểm cầu lông không hợp lệ.

Quy tắc thử thách:

  • I / O là linh hoạt, vì vậy:
    • Bạn có thể lấy đầu vào là một danh sách gồm hai số; hai số được phân tách thông qua STDIN hoặc tham số hàm; hai chuỗi; v.v.
    • Đầu ra sẽ là ba giá trị riêng biệt và duy nhất của sự lựa chọn của riêng bạn. Có thể là số nguyên (ví dụ [0,1,2], [1,2,3], [-1,0,1], vv); có thể là Booleans (tức là [true,false,undefined/null/empty]); có thể là ký tự / chuỗi (tức là ["valid & ended","valid","invalid"]); v.v.
    • Vui lòng chỉ định I / O bạn đã sử dụng trong câu trả lời của mình!
  • Bạn được phép lấy số nguyên đầu vào được đặt hàng trước từ thấp nhất đến cao nhất hoặc ngược lại.
  • Các số nguyên đầu vào có thể âm, trong trường hợp đó tất nhiên chúng không hợp lệ.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

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

Các trường hợp thử nghiệm này là hợp lệ và bộ đã kết thúc:

0 21
12 21
21 23
28 30
29 30

Các trường hợp thử nghiệm này là hợp lệ, nhưng bộ vẫn đang hoạt động:

0 0
0 20
12 12
21 21
21 22

Những trường hợp kiểm tra không hợp lệ:

-21 19
-19 21
-1 1
12 22
29 31
30 30
42 43
1021 1021

Câu trả lời:


1

Stax , 20 byte

ÇåπßéD╩¬7▼ß▌ΣU¬í╡S┤╘

Chạy và gỡ lỗi nó

Nó nhận đầu vào trong cùng định dạng như các ví dụ. 0có nghĩa là có một người chiến thắng hợp lệ. 1có nghĩa là trò chơi đang diễn ra -1có nghĩa là điểm không hợp lệ.

Trong mã giả, với các đầu vào có thứ tự xy, thuật toán là

sign(clamp(x + 2, 21, 30) - y) | (x < 0 || x >= 30 ? 0 : -1)
  • signcó nghĩa là dấu hiệu số ( -1, 0hay 1)
  • clamp buộc đối số đầu tiên của nó vào khoảng thời gian nửa mở được chỉ định

6

Python 2 , 97 95 75 72 71 70 69 64 55 54 52 51 50 48 byte

lambda a,b:(b-61<~a<a>b/22*b-3)*~(19<b-(b<30)>a)

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

Đưa đầu vào như được đặt hàng trước a,b.

Returns -2, -1, 0cho ended, in play, invalid.

-1 byte, nhờ Kevin Cruijssen


Phần bên trái ( b-61<~a<a>b/22*b-3) là phần kiểm tra tính hợp lệ và phần bên phải ( 19<b-(b<30)>a) là phần kiểm tra trò chơi đã kết thúc.


6

Python 2 , 47 byte

lambda a,b:[61>60-a>b<3+max(19,a)for b in-~b,b]

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

Xuất ra một danh sách hai Booleans. Cảm ơn TFeld đã viết một bộ kiểm tra trong câu trả lời của họ giúp dễ dàng kiểm tra giải pháp của tôi.

ended: [False, True]
going: [True, True]
invalid: [False, False]

Cái nhìn sâu sắc quan trọng là điểm số hợp lệ kết thúc trò chơi chính xác nếu tăng giá trị cao hơn blàm cho điểm không hợp lệ. Vì vậy, chúng tôi chỉ cần mã hóa điều kiện hợp lệ và kiểm tra (a,b+1)thêm (a,b)để xem trò chơi đã kết thúc chưa.

Hiệu lực được kiểm tra thông qua ba điều kiện được kết nối với nhau:

  • b<3+max(19,a): Kiểm tra xem điểm số cao hơn bkhông phải là chiến thắng trong quá khứ, với một b<=21hoặc b<=a+2(thắng hai)
  • 60-a>b: Tương đương a+b<=59, đảm bảo điểm số không cao hơn(29,30)
  • 61>60-a: Tương đương a>=0, đảm bảo điểm thấp hơn là không âm

Python 2 , 44 byte

lambda a,b:[b-61<~a<a>b/22*b-3for b in-~b,b]

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

Kiểm tra tính hợp lệ được cải thiện bởi TFeld tiết kiệm 3 byte. Ý tưởng chính là phân nhánh theo "thời gian làm thêm" b>21với b/22*bhiệu quả đặt điểm dưới 21 - thành 0, trong khi tôi phân nhánh a>19dài hơn max(19,a).


Python 2 , 43 byte

lambda a,b:a>>99|cmp(2+max(19,a)%30-a/29,b)

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

Đầu ra:

ended: 0
going: -1
invalid: 1

299


1
Sử dụng tính kiểm tra tính hợp lệ mới nhất của tôi ( b-61<~a<a>b/22*b-3), bạn có thể lưu 3 byte.
TFeld

1
+1 byte để làm cho giải pháp thứ hai của bạn hoạt động cho tất cả các đầu vào:lambda a,b:-(a<0)|cmp(2+max(19,a)%30-a/29,b)
TFeld



4

Thạch , 25 byte

»19«28‘<‘×+2>ɗʋ⁹×,%Ƒ“œþ‘ɗ

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

Đối số còn lại: tối thiểu. Đối số đúng: tối đa.
Không hợp lệ : 0. Đang thực hiện : 1. Đã kết thúc : 2.

xy

[a]={a:1¬a:0(a,b)=(amod30,bmod31)x,yZX:=min(max(x+1,20),29)p:=(x,y)([X<y]+1)[X+2>y][p=p]

Giải trình:

»19«28‘<‘×+2>ɗʋ⁹×,%Ƒ“œþ‘ɗ Left argument: x, Right argument: y
»19«28‘                   X := Bound x + 1 in [20, 29]:
»19                         X := max(x, 19).
   «28                      X := min(X, 28).
      ‘                     X := X + 1.
       <‘×+2>ɗʋ⁹          X := If X + 2 <= y, then 0, else if X < y, then 2, else 1:
       <                    t := If X < y, then 1, else 0.
        ‘                   t := t + 1.
          +2>ɗ              u := Check if X + 2 > y:
          +2                  u := X + 2.
            >                 u := If u > y, then 1, else 0.
         ×                  X := t * u.
                 ,%Ƒ“œþ‘ɗ z := If x mod 30 = x and y mod 31 = y, then 1, else 0:
                 ,          z := (x, y).
                  % “œþ‘    m := z mod (30, 31) = (x mod 30, y mod 31).
                   Ƒ        z := If z = m, then 1, else 0.
                ×         X * z.

3

VDM-SL , 80 byte

f(i,j)==if(j-i>2and j>21)or(i<0or i=30or j>30)then{}else{(j>20and j-i>1or j=30)} 

Hàm này lấy các điểm được sắp xếp theo thứ tự tăng dần và trả về tập hợp trống nếu điểm không hợp lệ hoặc tập hợp chứa liệu tập hợp đã hoàn thành chưa (vì vậy {true} nếu tập hợp hoàn thành và hợp lệ và {false} nếu tập không đầy đủ và có hiệu lực)

Một chương trình đầy đủ để chạy có thể trông như thế này:

functions
f:int*int+>set of bool
f(i,j)==if(j-i>2and j>21)or(i<0or i=30or j>30)then{}else{(j>20and j-i>1or j=30)}

Giải trình:

if(j-i>2 and j>21)             /*if scores are too far apart*/
or(i<0 or i=30 or j>30)        /*or scores not in a valid range*/
then {}                        /*return the empty set*/
else{                       }  /*else return the set containing...*/
     (j>20 and j-i>1 or j=30)  /*if the set is complete*/

3

Java (JDK) , 59 48 byte

a->b->b<0|b>29|a>b+2&a>21|a>30?0:a<21|a<30&a<b+2

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

Trả về một Object, đó là Integer 0cho các trò chơi không hợp lệ và Booleans truefalsecho các trò chơi đang diễn ra hợp lệ và cho các trò chơi đã hoàn thành hợp lệ tương ứng. Lấy số điểm đã ra lệnh (và bị chế giễu), với số điểm cao hơn trước.

-2 bytesbằng cách đảo ngược kiểm tra kết thúc trận đấu.
-11 bytesbằng cách currying, sử dụng các toán tử bitwise và một số thủ thuật autoboxing kiểu trả về - nhờ @KevinCruijssen

Bị đánh cắp

a->                      // Curried: Target type IntFunction<IntFunction<Object>>
    b->                  // Target type IntFunction<Object>
                         // Invalid if:
            b<0          //    Any score is negative
          | b > 29       //    Both scores above 29
          |   a > b + 2  //    Lead too big
            & a > 21     //        and leader has at least 21 points
          | a > 30       //    Anyone has 31 points
        ? 0              // If invalid, return 0 (autoboxed to Integer)
                         // If valid, return whether the game is ongoing (autoboxed to Boolean)
                         // Ongoing if:
        :   a < 21       //    Nobody has 21 points
          |   a < 30     //    Leader has fewer than 30 points
            & a < b + 2  //        and lead is small

3

APL (Dyalog Unicode) , 35 byte SBCS

Hàm Infix ngầm trong đó kết thúc là 2, liên tục là 1, không hợp lệ là 0, điểm nhỏ hơn và lớn hơn được để lại.

(,≡30 31|,)×(⊢<2+X1+⊢>X29201+⊣

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

Áp dụng các công thức toán học của Erik the Outgolfer kết hợp thành

X:=min(max(x+1,20),29) ([X<y]+1)[X+2>y][(x,y)=(xmod30,ymod31)]

[(x,y)=(x,y)mod(30,31)]×[y<2+X]×(1+[y<(X:=min(29,max(20,1+x)))])

và được dịch trực tiếp sang APL (liên kết đúng, vì vậy chúng tôi tránh một số dấu ngoặc đơn):

((x,y)30 31|x,y)×(y<2+X)×1+y>X29201+x

xy

((,)30 31|,)×(<2+X)×1+>X29201+

(,30 31|,)×(<2+X)×1+>X29201+

đó là giải pháp của chúng tôi; (,≡30 31|,)×(⊢<2+X)×1+⊢>X←29⌊20⌈1+⊣:

x
1+1+x
20⌈max(20,)
29⌊min(29,)
X←XX:=
⊢>[y>]
1+1+
(()×
2+XX2+X
⊢<[y<]
(()×
,(x,y)
30 31|mod(30,31)
,≡[(x,y)=]


3

hội x86, 42 byte

Đưa đầu vào ECXEDXđăng ký. Lưu ý rằng ECXphải lớn hơn EDX.
Đầu ra vào EAX, 0có nghĩa là trò chơi vẫn tiếp tục, 1đại diện cho trò chơi kết thúc và -1(hay còn gọi là FFFFFFFFđại diện cho điểm số không hợp lệ.

31 C0 83 F9 1E 77 1F 83 FA 1D 77 1A 83 F9 15 7C 
18 83 F9 1E 74 12 89 CB 29 D3 83 FB 02 74 09 7C 
08 83 F9 15 74 02 48 C3 40 C3

Hoặc, dễ đọc hơn trong Cú pháp của Intel:

check:
    XOR EAX, EAX
    CMP ECX, 30     ; check i_1 against 30
    JA .invalid     ; if >, invalid.
    CMP EDX, 29     ; check i_2 against 29
    JA .invalid     ; if >, invalid.
    CMP ECX, 21     ; check i_1 against 21
    JL .runi        ; if <, running.
    CMP ECX, 30     ; check i_1 against 30
    JE .over        ; if ==, over.
    MOV EBX, ECX
    SUB EBX, EDX    ; EBX = i_1 - i_2
    CMP EBX, 2      ; check EBX against 2
    JE .over        ; if ==, over.
    JL .runi        ; if <, running.
                    ; if >, keep executing!
    CMP ECX, 21     ; check i_1 against 21
    JE .over        ; if ==, over.
                    ; otherwise, it's invalid.
    ; fallthrough!
    .invalid:
        DEC EAX     ; EAX = -1
        RETN
    .over:
        INC EAX     ; EAX = 1
    ; fallthrough!
    .runi:
        RETN        ; EAX = 0 or 1

Thực tế thú vị: chức năng này gần như tuân theo các quy tắc của C Calling ước về việc đăng ký để bảo tồn, ngoại trừ tôi phải ghi đè EBXđể lưu một số byte khi sử dụng ngăn xếp.


Tùy chọn (không bao gồm trong số đếm byte)

Bằng cách thêm trực tiếp 6 byte sau trước khi bắt đầu mã ở trên, bạn có thể vượt qua ECXEDXkhông được sắp xếp:

39 D1 7D 02 87 CA

Đó là những điều sau đây trong Cú pháp Intel có thể đọc được:

CMP ECX, EDX
JGE check
XCHG ECX, EDX

2

Võng mạc 0.8.2 , 92 byte

\d+
$*
^(1{0,19},1{21}|(1{20,28}),11\2|1{29},1{30})$|^(1*,1{0,20}|(1{0,28}),1?\4)$|.+
$#1$#3

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đưa đầu vào theo thứ tự tăng dần. Giải thích: Giai đoạn đầu tiên chỉ đơn giản là chuyển đổi từ số thập phân sang đơn vị để điểm số có thể được so sánh đúng. Giai đoạn thứ hai chứa sáu mẫu thay thế, được nhóm thành ba nhóm để có thể tạo ra ba giá trị riêng biệt, 10để giành chiến thắng, 01cho liên tục và 00bất hợp pháp. Các mẫu là:

  • Chống lại 0-19, điểm 21 là chiến thắng
  • Chống lại 20-28, điểm +2 là chiến thắng
  • Chống lại 29, số điểm 30 là một chiến thắng
  • Chống lại bất kỳ điểm nào (thấp hơn), điểm 0-20 đang diễn ra
  • Chống lại số điểm lên tới 28, điểm +1 đang diễn ra
  • Bất cứ điều gì khác (bao gồm cả điểm tiêu cực) là bất hợp pháp


1

Bash 4+, 97 89 91 88 byte

Giả sử rằng đầu vào đang tăng dần. Sử dụng các khái niệm từ câu trả lời VDM-SL . Dùng thử trực tuyến
z==0 - trò chơi đang diễn ra
z==1- trò chơi đã hoàn thành
z==2- không hợp lệ

-8 bằng cách dọn dẹp khung từ các (( & | ))điều kiện
+2 sửa lỗi, nhờ Kevin Cruijssen
-3 cải tiến logic của Kevin Cruijssen

i=$1 j=$2 z=0
((j-i>2&j>21|i<0|i>29|j>30?z=2:0))
((z<1&(j>20&j-i>1|j>29)?z=1:0))
echo $z

1
Phiên bản 89 byte của bạn dường như xuất ra 1 thay vì 2cho 0 30. Phiên bản 97 byte của bạn đã hoạt động chính xác, vì vậy nếu bạn không thể sửa nó, bạn luôn có thể quay lại. Nâng cấp cho phiên bản 97 đó. :)
Kevin Cruijssen


1
Tôi đã sửa nó, nhưng bạn đã tốt hơn! Khó theo kịp: P
roblogic

Lỗi tại 29 30:( nó phải được "hoàn thành"
roblogic

1
À không .. i>29nênj>29 ở trong ternary thứ hai để sửa nó.
Kevin Cruijssen
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.