불가능한 다트 점수


39

다트 체크 아웃에 대한 큰 질문이 있지만이 질문을 이미 찾지 못한 것에 놀랐습니다. 다트가 Codegolf를 만났습니다.

당신의 도전은 'n'다트에 대한 최대 점수 아래의 'n'다트로 불가능한 점수를 계산하는 것입니다. 예를 들어 n = 3 인 경우 가능한 최대 점수는 180이므로 [163,166,169,172,173,175,176,178,179]를 반환합니다.

베어 본 규칙 요약의 경우 :

단일 다트에 가능한 점수는 다음과 같습니다.

  • 0 (미스)
  • 1-20, 25, 50
  • 1-20의 이중 또는 삼중

규칙 :

  • 표준 코드 골프 규칙 적용
  • 언어가 허용하는 방식에 상관없이 단일 매개 변수 'n'을 가져 와서 n 개의 다트로 점수를 매길 수없는 최대 점수 미만의 모든 고유 점수 목록 / 배열을 반환해야합니다. 이 값을 콘솔에 인쇄 할 수도 있습니다.
  • 결과의 순서는 중요하지 않습니다
  • 바이트 단위의 최단 코드 승리

1
휴대 전화에서 서식을 작성하고 작성하는 데 사과드립니다.
beirtipol

다소 관련됨 ; 범위에서 누락 된 값을 찾는 것에 대한 또 다른 것이 있다고 생각하지만 찾을 수없는 것 같습니다.
주세페

1
진심으로 사과, 3 다트의 기본 질문에 대한 답변에서 출력을 뽑았지만 확인하지 못했습니다! 질문을 업데이트하겠습니다!
beirtipol

2
걱정마 :-) 나에게 잘 보인다!
주세페

답변:


32

파이썬 3 , 80 79 59 57 바이트

Arnauld 덕분에 -1 바이트
-ArBo 덕분에 -20 바이트
-음수 7 덕분에 -2 바이트

lambda x:[-i-~x*60for i in(x<2)*b'a[YUSOLI'+b'MJGDCA@>=']

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


26
내가 뭐라 구요?!
beirtipol

2
@ beirtipol 두 번째 다트 이후 숫자에 패턴이 있습니다 (첫 번째 다트에도 있지만 다른 숫자가 있습니다).이 패턴을 기반으로 숫자를 계산합니다.
로드

4
아, 잘 연주, 실제로 연주
beirtipol

8
@EriktheOutgolfer 압축하는 경우 모든 것을 압축 할 수 있습니다.) 59 바이트
ArBo

2
@negativeseven은 60 가지로 나를 이겼습니다. :) 바이트 문자열을 분리 된 상태로 유지하는 것이 좋았습니다.
ArBo


9

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

@Shaggy 덕분에 1 바이트 절약

Rod가 사용하는 패턴을 기반으로합니다 .

n=>[...1121213+[n-1?33:2121242426]].map(x=>n-=x,n*=60)

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


1
s=60*n-> n*=60바이트를 저장합니다.
얽히고 설킨

@Shaggy 감사합니다. :) 이 나중에 다시 사용되는 초기 (게시되지 않은) 버전으로 인해 하나를 놓쳤습니다 . n
Arnauld

9

Perl 6 , 39 바이트 (37 자)

이것은 분명히 거대한 슬레지 해머를 사용하고 있지만 작동합니다. (그것은 단지 그것을 무차별 적으로 강요하지 않으며, 그것은 잔인하게 무차별 적으로 강제한다)

{^60*$_∖[X+] (|(^21 X*^4),25,50)xx$_}

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

이에 대한 설명은 다음과 같습니다.

{                                   } anonymous block for the 
                                       set difference of
 ^60*$_                                   - 0 .. max score (60 * throwcount)
        [X+]                    xx$_      - the cross addition (throwcount times) of 
             (                 )              all possible score values, being 
              |(    X*  )                       flattened cross multiplication of
                ^21   ^4                          0..20 and 0..3 (for double and triple)
                         ,25,50                 and 25 and 50

X* ^4크로스 승수는 중복 값을 많이 생성 (이 20 + 관여 0과 1이의 될 것입니다 전에 십자가 추가하고), 그러나 우리는 차이 집합 사용하기 때문에 그 어떤 문제가 발생하지 않습니다 고유 값으로 작동합니다.

현재 $n == 1(빈 세트를 반환해야 함) 실패 하지만 문제가 제기 되어 향후 버전에서 작동 할 것입니다. JoKing의 버전 은 조금 더 길지만 $n == 1현재 Rakudo에서 작동합니다 .


1
와우, 어색 ... 내 여분의 바이트 (_ 대신 $의 ^ N -1 당신은 $를 사용할 수 있지만)은 n = 1 문제를 해결 출신
조 국왕

1
하를 @JoKing, 나는 아무것도 잘못은, 또한 (당신은 현재 이론의 내 전류 대 버전에서 작동 특히 이후) 두 사람이 거의 같은 대답을 얻기로 $ _ 내 부분에 총 brainfart에 감사 있다고 생각하지 않습니다
user0721090601


8

MATL , 25 23 바이트

실수를 수정하고 2 바이트 를 골프 로 한 @Giuseppe 에게 감사 합니다!

25tE3:!21:q*vZ^!stP:wX-

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

설명

무차별 대입 접근.

25      % Push 25
tE      % Duplicate, double: gives 50
3:!     % Push column vector [1;2;3]
21:q    % Push row vector [0 1 ... 20]
*       % Multiply with broadcast. Gives a matrix with all products
v       % Concatenate everything into a column vector
Z^      % Implicit input: n. Cartesian power with exponent n
!s      % Sum of each row
tP      % Duplicate, flip: The first entry is now 60*n
:       % Push row vector [1 2 ... 60*n]
w       % Swap
X-      % Set difference. Implicit display

귀하의 버전이 작동하지 않으므로 문제를 해결 n=2하고 부팅하기 위해 바이트를 떨어 뜨 렸습니다! 온라인으로 사용해보십시오!
주세페

오, 물건을 다시 정렬하여 다른 바이트를 찾았습니다 :-) 23 바이트
주세페

@ 주세페 이봐, 정말 고마워!
Luis Mendo

7

J , 48 45 바이트

2&>(35 44,q:626b66jh)&,60&*-1 4 8 14,q:@13090

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

FrownyFrog 덕분에 -3 바이트

무차별 대입 솔루션을 시도했지만이로드의 아이디어를 이길 수 없었습니다.


언제나처럼 tyvm, @FrownyFrog
Jonah

더 짧은626b66jh
FrownyFrog

어떤베이스가 사용되고 있으며 J는 그것을 어떻게 사용하는지 알고 있습니까?
요나


아, 타이 나는이 잊었다 b.... 거기에 "구분자"이고 숫자의 일환으로 그것을 읽고 있었다
요나

6

R , 64 바이트

function(n,`!`=utf8ToInt)c(60*n-!"",(!"#%),/")[n<2])

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

Rod가 찾은 놀라운 답변을 포팅합니다 .

R , 85 73 68 바이트

function(n)setdiff(0:(60*n),combn(rep(c(0:20%o%1:3,25,50),n),n,sum))

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

무차별 힘은 n다트로 가능한 모든 점수를 생성 한 다음 적절한 세트 차이를 취합니다.

에 신용 OrangeCherries '옥타브 솔루션 을 생각 나게 위해 combn.

Robin Ryder 의 사용 제안 덕분에 5 바이트가 더 남았습니다%o% .


그것에 대해 유감스럽게도, 예제를 다시 확인해야합니다!
beirtipol

1
FUN인수를 잘 사용 combn! 대신 68 바이트 를 얻을 수 있습니다 . %o%x*3,x*2
로빈 라이더

@RobinRyder duh. 나는 심지어 옥타브 답변에서 방송 곱셈을 수행하는 방법을 알아 내려고 시도했습니다!
주세페


3

Pyth , 22 바이트

-S*60Q+M^+yB25*M*U4U21

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

3보다 큰 입력의 경우 TIO에서 시간 초과됩니다.

-S*60Q+M^+yB25*M*U4U21Q   Implicit: Q=eval(input())
                          Trailing Q inferred
                 U4       Range [0-3]
                   U21    Range [0-20]
                *         Cartesian product of the two previous results
              *M          Product of each
          yB25            [25, 50]
         +                Concatenate
        ^             Q   Cartesian product of the above with itself Q times
      +M                  Sum each
                            The result is all the possible results from Q darts, with repeats
  *60Q                    60 * Q
 S                        Range from 1 to the above, inclusive
-                         Setwise difference between the above and the possible results list
                          Implicit print

아니 짧은,하지만 당신은 변경하는 경우 U4S3성능 모두 데카르트 제품은 모든 추가 쓸모 0을 처리 할 필요가 없기 때문에 조금 향상됩니다. 이 경우 입력 3 ~ 30 초 대신 ~ 13 초 만에 출력 3 (입력 4가 여전히 시간 초과되지만 코드 골프이므로 그렇게 중요하지 않습니다. p).
케빈 크루이 ssen

@KevinCruijssen 아주 좋은 지적, 나는 직교 곱의 양쪽에 0을 포함한다고 생각하지 않았습니다. 더 이상 골프 나 편집해야 할 이유가 있으면이를 포함시켜야합니다. 감사합니다!
Sok

너무 나쁜이 Pyth에서 0 기반의 포괄적 인 범위의 내장 아니다 .. 나는이 시도 -S*60QsM^*MP*S3aU21 25하지만, 사이의 공간 21과는 250 기반의 포괄적 인 범위로 .. 조금 짜증나는 yT대신에 사용될 수있는 21좀 다음과 같이 : -S*60QsM^*MP*S3a}ZyT25( 그러나 Z물론 }0 기반의 포괄적 범위로 대체되었습니다). 25목록 에를 추가 75하고 첫 번째 데카르트 후 제품을 제거하는 이 대체 방법에서 골프를 타는 것이 있습니까?
Kevin Cruijssen



2

05AB1E , 21 20 18 바이트

20Ý25ª3Lδ*˜¨ãOZÝsK

@Grimy 덕분에 -3 바이트 .

직교 제품 내장으로 인해 입력이 높아질수록 시간이 매우 빨리 초과 ã됩니다.

온라인으로 시도 하거나 몇 가지 테스트 사례를 확인하십시오 .

설명:

20Ý                 # Push a list in the range [0, 20]
   25ª              # Append 25 to this list
      3L            # Push a list [1,2,3]
        δ*          # Multiply the top two lists double-vectorized:
                    #  [[0,0,0],[1,2,3],[2,4,6],[3,6,9],...,[20,40,60],[25,50,75]]
          ˜         # Flatten this list: [0,0,0,1,2,...,40,60,25,50,75]
           ¨        # Remove the last value (the 75)
            ã       # Create all possible combinations of the (implicit) input size,
                    # by using the cartesian power
             O      # Sum each inner list of input amount of values together
              Z     # Get the maximum (without popping the list), which is 60*input
               Ý    # Create a list in the range [0, 60*input]
                s   # Swap so the initially created list is at the top of the stack again
                 K  # And remove them all from the [0, 60*input] ranged list
                    # (then output the result implicitly)

이 메모에서 최대 값은 60 * input180 이 아닙니다.
Grimmy

@ 그림 그래, 내 바보를 무시합니다. 테스트 스위트에서 잘못된 결과를 보았지만 물론 실수했습니다. 직장에서 긴 하루를 보낸 후 저녁에 코드 골프를해서는 안됩니다 ..>.>
Kevin Cruijssen


1

MathGolf , 26 바이트

╟*rJrN▐3╒*mÅ~*╡ak.ε*mÉa─Σ-

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

Kevin Cruijssen 덕분에 -2 바이트

설명

╟*r                          push [0, ..., 60*input-1]
   Jr                        push [0, ..., 20]
     N▐                      append 25 to the end of the list
       3╒                    push [1, 2, 3]
         *                   cartesian product
          mÅ                 explicit map
            ~                evaluate string, dump array, negate integer
             *               pop a, b : push(a*b)
              ╡              discard from right of string/array
               a             wrap in array
                k            push input to TOS
                 .           pop a, b : push(b*a) (repeats inner array input times)
                  ε*          reduce list with multiplication (cartesian power)
                    mÉ       explicit map with 3 operators
                      a      wrap in array (needed to handle n=1)
                       ─     flatten array
                        Σ    sum(list), digit sum(int)
                         -   remove possible scores from [0, 60*input-1]

-2 변경하여 바이트 3╒*mÅ~*N_∞α+N▐3╒*mÅ~*╡. (PS : 설명 헤더에 " 입력 3 "에 대해 왜 언급 하십니까?)
Kevin Cruijssen

잘 했어, 내 노트북에 다시 오면 바꿔 줄게! 답을 쓰기 시작했을 때 31 비트가 더 복잡했습니다. 자세한 설명을 추가하고 싶었지만 게시물에서 해결책을 찾았습니다
maxb

1

Wolfram Language (Mathematica) , 69 바이트

Complement[Range[60#],Tr/@{Array[1##&,{4,21},0,##&],25,50}~Tuples~#]&

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

lirtosiast의 답변을 기반으로합니다 .

Array세 번째 인수는 오프셋 (기본값 1)을 지정하고 네 번째 인수는 대신 사용할 헤드를 지정합니다 List. ##&는와 동일 Sequence하므로 및 의 외부 곱의 멤버를 포함 Array[1##&,{4,21},0,##&]하는 (평평한) Sequence을 반환합니다 .0..30..20


0

, 36 바이트

I⁺E…wvtsqpmjgkhea_[YS⎇⊖θ⁹¦¹⁷℅ι×⁶⁰⁻θ²

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @Rod의 알고리즘을 사용합니다. 무차별 대입은 60 바이트를 차지했을 것입니다. 입력이 1보다 큰 경우 문자열을 9 자로 자른 다음 문자의 서수를 취하고 60의 적절한 배수를 추가하여 작동합니다.


0

C # (Visual C # 대화식 컴파일러) , 305 바이트

(a,b)=>(int)Math.Pow(a,b);f=n=>{var l=new List<int>(new int[21].SelectMany((_,x)=>new[]{x,x*2,x*3})){25,50};int a=l.Count,b,c,d,e=P(a,n),f;var r=new int[e];for(b=e;b>0;b--)for(c=0;c<n;c++){d=b;while(d>P(a,c+1))d-=P(a,c+1);f=(d/P(a,c))-1;r[b-1]+=l[f>0?f:0];}return Enumerable.Range(0,l.Max()*n).Except(r);}

글쎄, C #에서 가능한 모든 조합을 계산하는 쉬운 방법은없는 것 같습니다. 그래서이 코드의 재난은 내가 다룰 수있는 전부입니다.

또한 완료하는 데 약 30 초가 걸립니다 ...

더 나은 솔루션을보고 싶습니다.

P=(a,b)=>(int)Math.Pow(a,b);
F=n=>
{
    var l=new List<int>(new int[21].SelectMany((_,x)=>new[]{x,x*2,x*3})){25,50};
    int a=l.Count,b,c,d,e=P(a,n),f;
    var r=new int[e];
    for(b=e;b>0;b--)
        for(c=0;c<n;c++)
        {
            d=b;
            while(d>P(a,c+1))
                d-=P(a,c+1);
            f=(d/P(a,c))-1;
            r[b-1]+=l[f>0?f:0];
        }
    return Enumerable.Range(0,l.Max()*n).Except(r);
}

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


실제 골프 답변을 게시하지 않은 것 같습니다. 보통 사람들은 롤링되지 않은 형태를 골프 골 아래에 놓습니다.
Veskah

@Veskah 잘, 나는 골프 골프를 이해하기 쉬운 경우에 보통 그것을 게시합니다, 그러나 이것은 너무 길기 때문에 어쨌든 tio 링크에서 찾을 수 있기 때문에 나는 그것을하지 않을 것이지만 그럼에도 불구하고 당신이 옳다고 생각합니다
Innat3


0

펄 5 -n , 96 93 91 바이트

$"=',';@b=map{$_,$_*2,$_*3,25,50}0..20;map$r[eval]=1,glob"+{@b}"x$_;map$r[$_]||say,0..$_*60

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

런타임보다는 코드 길이에 맞게 최적화되었으므로 속도가 느립니다. 조회 해시에 대해 많은 중복 항목을 생성합니다. @b어레이를 실행하면 uniq속도가 크게되지만 5 바이트가 더 필요하므로 그렇게하지 않았습니다.


0

Wolfram Language (Mathematica) , 81 바이트

Complement[Range[60#-1],Total/@Tuples[Flatten[{Array[Times,{3,20}],0,25,50}],#]]&

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

Mathematica는을 포함하여 몇 가지 관련 내장을 가지고 FrobeniusSolve있으며의 형태는 제한되어 IntegerPartitions있지만 그 중 어느 것도 무차별 대치보다 짧지 않습니다.


이것은 틀렸다 – 돌려 주어야한다{163,166,169,172,173,175,176,178,179}
attinat

1
@attinat 수정되었습니다.
lirtosiast


@attinat 직접 게시하십시오.
lirtosiast
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.