유효한 배드민턴 점수?


27

소개:

지금 당장 배드민턴 관련 도전하나 밖에 없었습니다 . 배드민턴을했을 때 (지난 13 년 동안) 배드민턴 관련 도전 과제를 추가 할 것이라고 생각했습니다. 첫 번째는 다음과 같습니다.

도전:

입력 : 2 개의 정수
출력 : 사용자가 선택한 3 개의 고유하고 고유 한 출력 중 하나. 입력이 유효한 배드민턴 점수이며 세트가 승자로 끝났다는 것을 나타내는 1; 하나는 입력이 유효한 배드민턴 점수이며 세트가 여전히 플레이 중임을 나타냅니다. 입력이 유효한 배드민턴 점수가 아님을 나타냅니다.

배드민턴을 사용하면 두 쌍의 플레이어가 모두 0 점으로 시작하고 두 쌍의 플레이어 중 하나가 21 점에 도달하면 최소 2 점 차이로 최대 30-29까지 멈 춥니 다.

따라서 이들은 가능한 배드민턴 점수이며 세트가 종료되었음을 나타내는 가능한 모든 입력 쌍입니다 (어느 순서로든).

[[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]]

그리고 이들은 가능한 배드민턴 점수이지만 세트가 아직 플레이 중임을 나타내는 가능한 모든 입력 쌍입니다 (어느 순서로든).

[[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]]

다른 정수 쌍은 잘못된 배드민턴 점수가됩니다.

도전 규칙 :

  • I / O는 유연하므로 다음과 같습니다.
    • 입력을 두 개의 숫자 목록으로 사용할 수 있습니다. STDIN 또는 함수 매개 변수를 통한 두 개의 분리 된 숫자; 두 줄; 기타
    • 결과는 당신이 선택한 3 개의 독특하고 독특한 값입니다. 정수 (예 : 일 수있다 [0,1,2], [1,2,3], [-1,0,1], 등); 부울 (예 :) 일 수 있습니다 [true,false,undefined/null/empty]. 문자 / 문자열 (예 :) 일 수 있습니다 ["valid & ended","valid","invalid"]. 기타
    • 답변에 사용한 I / O를 지정하십시오!
  • 입력 순서를 가장 낮은 순서에서 높은 순서로 또는 그 반대로 할 수 있습니다.
  • 입력 정수는 음수 일 수 있으며,이 경우 물론 유효하지 않습니다.

일반적인 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 링크를 추가하십시오 (예 : TIO ).
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

이 테스트 케이스는 유효하며 세트가 종료되었습니다.

0 21
12 21
21 23
28 30
29 30

이 테스트 사례는 유효하지만 세트가 여전히 작동 중입니다.

0 0
0 20
12 12
21 21
21 22

이 테스트 사례는 유효하지 않습니다.

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

답변:


1

Stax , 20 바이트

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

실행 및 디버깅

예제와 동일한 형식으로 입력됩니다. 0유효한 승자가 있음을 의미합니다. 1게임이 진행 중임을 의미합니다. -1유효하지 않은 점수를 의미합니다.

의사 코드에서 주문 입력을 x하고 y, 알고리즘은

sign(clamp(x + 2, 21, 30) - y) | (x < 0 || x >= 30 ? 0 : -1)
  • sign의미 숫자 기호 ( -1, 0또는 1)
  • clamp 첫 번째 인수를 지정된 반 개방 간격으로 강제합니다.

6

파이썬 2 , 97 95 75 72 71 70 69 64 55 54 52 51 50 48 바이트

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

온라인으로 사용해보십시오!

입력을 사전 주문으로 a,b받습니다.

반환 -2, -1, 0대한 ended, in play, invalid.

Kevin Cruijssen 덕분에 -1 바이트


왼쪽 부분 ( b-61<~a<a>b/22*b-3)은 유효성 검사이고 오른쪽 부분 ( 19<b-(b<30)>a)은 게임 종료 검사입니다.


6

파이썬 2 , 47 바이트

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

온라인으로 사용해보십시오!

두 부울 목록을 출력합니다. 덕분에 TFeld 에서 테스트 스위트 작성에 대한 자신의 답변을 쉽게 내 솔루션을 확인했다.

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

중요한 통찰력은 높은 b점수를 올리면 점수가 유효하지 않은 경우 유효한 점수가 게임을 정확하게 종료한다는 것 입니다. 그래서 우리는 유효성 조건을 코딩 하고 게임이 끝났는지 확인하는 것 (a,b+1)외에도 확인합니다 (a,b).

유효성은 함께 연결된 세 가지 조건을 통해 확인됩니다.

  • b<3+max(19,a): 또는 (2로이기) 를 통해 더 높은 점수 b가 이기지 않은지 확인합니다.b<=21b<=a+2
  • 60-a>b:과 동일 a+b<=59하며 점수가 위를 넘지 않도록합니다.(29,30)
  • 61>60-a:에 a>=0해당하며 낮은 점수가 음수가 아닌지 확인합니다.

파이썬 2 , 44 바이트

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

온라인으로 사용해보십시오!

TFeld에 의한 향상된 유효성 검사는 3 바이트를 절약합니다. 주요 아이디어는 "초과 근무"에 지점이다 b>21b/22*b내가에 분기했던 반면, 효과적으로 제로 아래-21 점수를 설정하는 a>19긴과 함께 max(19,a).


파이썬 2 , 43 바이트

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

온라인으로 사용해보십시오!

출력 :

ended: 0
going: -1
invalid: 1

299


1
최신 유효성 검사 ( b-61<~a<a>b/22*b-3)를 사용하면 3 바이트를 절약 할 수 있습니다.
TFeld

1
두 번째 솔루션이 모든 입력에 대해 작동하도록 +1 바이트 :lambda a,b:-(a<0)|cmp(2+max(19,a)%30-a/29,b)
TFeld

4

자바 스크립트 (ES6),  55 53  48 바이트

내가 완전히 가정하지 않았다는 사실을 알린 @KevinCruijssen에게 감사드립니다.ab

(a)(b)ab012

a=>b=>a<0|a>29|b>30|b>21&b-a>2?2:b>20&b-a>1|b>29

온라인으로 사용해보십시오!



4

젤리 , 25 바이트

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

온라인으로 사용해보십시오!

왼쪽 주장 : 최소. 올바른 주장 : 최대.
잘못되었습니다 : 0. 진행 중 : 1. 종료 : 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]

설명:

»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 바이트

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)} 

이 함수는 오름차순으로 정렬 된 점수를 가져오고 점수가 유효하지 않거나 세트가 완료되었는지 여부를 포함하는 세트 (빈 세트가 완료되고 유효한 경우 {true}, 세트가 완료되지 않은 경우 {false})이면 빈 세트를 리턴합니다. 유효한)

실행할 전체 프로그램은 다음과 같습니다.

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)}

설명:

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

자바 (JDK) , 59 48 바이트

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

온라인으로 사용해보십시오!

반환 ObjectInteger 0무효 게임과 위해 Booleantruefalse유효 지속적으로 게임을 각각 유효 완성 된 게임을. 높은 점수부터 순서대로 (그리고 카레 된) 점수를받습니다.

-2 bytes일치 종료 검사를 반전시켜
-11 bytes@KevinCruijssen 덕분에 카레 잉, 비트 연산자 및 일부 반환 유형 자동 상자 속임수 사용

언 골프

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 바이트 SBCS

종료가 2 인 중위 암시 함수, 진행 중은 1, 유효하지 않은 값은 0, 작고 큰 점수가 남습니다.

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

온라인으로 사용해보십시오!

구현 에릭 Outgolfer의 수학 공식이 결합

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)))])

APL로 직접 번역됩니다 (엄격히 오른쪽 연관되어 있으므로 일부 괄호를 피하십시오).

((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+

이것이 우리의 해결책입니다. (,≡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 ) = ]
,≡[(x,y)=]


3

x86 어셈블리, 42 바이트

입력을 ECX받아 EDX등록합니다. 주 ECX보다 커야합니다 EDX.
출력에 EAX어디 0수단 게임에 아직 1게임을 통해 존재와 표현 -1(일명 FFFFFFFF잘못된 점수를 나타내는 참조).

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

또는 인텔 구문에서 더 읽기 쉽습니다.

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

재미있는 사실 :이 함수 는 스택 사용시 바이트를 절약 하기 위해 클로버 를 사용해야한다는 점을 제외하고는 레지스터를 보존하는 C 호출 규칙의 규칙을 거의 따릅니다 EBX.


선택 사항 (바이트 수에 포함되지 않음)

위의 코드를 시작하기 직전에 다음 6 바이트를 추가하면 전달 ECXEDX정렬되지 않을 수 있습니다 .

39 D1 7D 02 87 CA

읽을 수있는 인텔 구문에서 다음 중 하나입니다.

CMP ECX, EDX
JGE check
XCHG ECX, EDX

2

레티 나 0.8.2 , 92 바이트

\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

온라인으로 사용해보십시오! 링크에는 테스트 사례가 포함됩니다. 오름차순으로 입력을받습니다. 설명 : 첫 번째 단계는 단순히 소수를 단항으로 변환하여 점수를 올바르게 비교할 수 있습니다. 두 번째 단계에는 3 개의 그룹으로 그룹화 된 6 개의 대체 패턴이 포함되어있어 10승리, 01지속적인, 00불법적 인 세 가지 고유 한 값을 출력 할 수 있습니다 . 패턴은 다음과 같습니다.

  • 0-19에 대항하여 21 점은 승리입니다
  • 20-28에 대항하여 +2의 점수는 승리입니다
  • 29에 대항하여 30 점은 승리입니다
  • (낮은) 점수에 대해 0-20의 점수가 진행 중입니다.
  • 최대 28 점까지 +1 점
  • 부정적 점수를 포함한 기타 모든 것은 불법입니다


1

배쉬 4+, 97 89 91 88 바이트

입력이 오름차순이라고 가정하십시오. VDM-SL 답변 에서 사용 된 개념 . 온라인 사용해보기
z==0 -게임 진행 중
z==1-게임 완료
z==2-유효하지 않습니다

-8 에서 브래킷 정리하여 (( & | ))조건
버그를 수정, 케빈 Cruijssen 덕분에
-3 논리 개선

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
귀하의 89 바이트 버전은 출력 것 1대신 2에 대해 0 30. 97 바이트 버전이 올바르게 작동 했으므로 수정할 수없는 경우 언제든지 롤백 할 수 있습니다. 해당 97 버전으로 상향 조정되었습니다. :)
Kevin Cruijssen


1
나는 그것을 고쳤다. 그러나 당신은 나아졌다! 유지하기 : P
roblogic

버그 29 30:( "완료되어야합니다"
roblogic

1
아 죄송 합니다. 문제를 해결하려면 2 차 3 차에 i>29있어야 j>29합니다.
Kevin Cruijssen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.