Điểm phi tiêu bất khả thi


39

Tôi đã rất ngạc nhiên khi không tìm thấy câu hỏi này, mặc dù có một câu hỏi rất hay về kiểm tra phi tiêu: Phi tiêu gặp Codegolf

Thử thách của bạn là tính toán điểm số nào là không thể với phi tiêu 'n' dưới điểm tối đa cho phi tiêu 'n'. Ví dụ: với n = 3, số điểm tối đa có thể là 180, do đó bạn sẽ trả về [163,166,169,172,173,175,176,178,179]

Đối với một bản tóm tắt quy tắc xương trần:

Điểm có thể cho một phi tiêu duy nhất là:

  • 0 (bỏ lỡ)
  • 1-20, 25, 50
  • gấp đôi hoặc gấp ba từ 1-20

Quy tắc:

  • quy tắc golf tiêu chuẩn áp dụng
  • bạn phải lấy một tham số 'n' bằng bất cứ cách nào ngôn ngữ của bạn cho phép và trả về một danh sách / mảng của tất cả các điểm số duy nhất dưới điểm tối đa không thể ghi được bằng n phi tiêu. Bạn cũng có thể in các giá trị này lên bàn điều khiển.
  • thứ tự kết quả là không quan trọng
  • mã ngắn nhất tính bằng byte

1
Xin lỗi vì định dạng, viết trên điện thoại!
beirtipol

phần nào liên quan ; Tôi nghĩ rằng có một cái khác về việc tìm kiếm các giá trị bị thiếu trong một phạm vi nhưng dường như tôi không thể tìm thấy nó.
Giuseppe

1
Xin lỗi chân thành, tôi đã rút những kết quả đó từ một câu trả lời cho câu hỏi cơ bản của 3 phi tiêu nhưng không xác minh! Tôi sẽ cập nhật câu hỏi!
beirtipol

2
không phải lo lắng :-) Có vẻ tốt với tôi!
Giuseppe

Câu trả lời:


32

Python 3 , 80 79 59 57 byte

-1 byte nhờ Arnauld
-20 byte nhờ ArBo
-2 byte nhờ bảy âm

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

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


26
Tôi, errr, cái gì?!
beirtipol

2
@beirtipol có một mẫu trên các số sau phi tiêu thứ 2 (ừ, cũng là trên phi tiêu thứ 1, nhưng có một số khác), điều này tính toán các số dựa trên mẫu này.
Rod

4
Ah, chơi tốt, chơi thật tốt
beirtipol

8
@EriktheOutgolfer Nếu bạn đang nén, bạn cũng có thể nén mọi thứ;) 59 byte
ArBo

2
@negativeeven đánh bại tôi đến 60 điều, sẽ thử điều đó :) Tìm kiếm tốt về việc giữ các bytestrings cách nhau mặc dù, đã không nghĩ về điều đó.
ArBo


9

JavaScript (ES6),  55  54 byte

Đã lưu 1 byte nhờ @Shaggy

Dựa trên mô hình được sử dụng bởi Rod .

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

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


1
s=60*n-> n*=60để lưu một byte.
Xù xì

@Shaggy Cảm ơn. :) Tôi đã bỏ lỡ cái đó vì phiên bản ban đầu (chưa xuất bản) của tôi, nơi được sử dụng lại sau này. n
Arnauld

9

Perl 6 , 39 byte (37 ký tự)

Điều này chắc chắn là sử dụng búa tạ lớn nhưng nó hoạt động. (Nó không chỉ vũ phu nó, nó tàn bạo cưỡng bức nó)

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

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

Đây là một lời giải thích về nó:

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

Hệ X* ^4số chéo tạo ra rất nhiều giá trị trùng lặp (sẽ có hơn 20 số không tham gia và đó là trước khi thực hiện bổ sung chéo), nhưng điều đó không gây ra bất kỳ vấn đề nào vì chúng tôi sử dụng sự khác biệt được thiết lập với các giá trị duy nhất.

Điều này hiện không thành công $n == 1(sẽ trả về một tập hợp trống), nhưng có một vấn đề được đệ trình và có khả năng sẽ hoạt động trong các phiên bản trong tương lai. Phiên bản của JoKing dài hơn một chút, nhưng hoạt động $n == 1trong Rakudo hiện tại.


1
Ồ, thật khó xử ... Các byte bổ sung của tôi là từ việc khắc phục sự cố n = 1 (mặc dù bạn có thể sử dụng $ _ thay vì $ ^ n cho -1)
Jo King

1
@JoKing ha, tôi không nghĩ có gì sai khi hai người nhận được câu trả lời gần như giống nhau (đặc biệt là vì bạn làm việc trong các phiên bản hiện tại so với lý thuyết của tôi hiện tại) Ngoài ra, nhờ vào $ _, tổng số bộ não của tôi
user0721090601


8

MATL , 25 23 byte

Cảm ơn @Giuseppe , người đã sửa lỗi và đánh gôn 2 byte!

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

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

Giải trình

Phương pháp vũ phu.

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

Phiên bản của bạn không hoạt động n=2, vì vậy tôi đã sửa nó và bỏ đi một byte để khởi động! Hãy thử trực tuyến!
Giuseppe

Ồ, tìm thấy một byte khác bằng cách sắp xếp lại mọi thứ :-) 23 byte
Giuseppe

@Giuseppe Này, cảm ơn bạn rất nhiều!
Luis Mendo

7

J , 48 45 byte

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

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

-3 byte nhờ FrownyFrog

Đã thử một giải pháp vũ phu, nhưng không thể đánh bại bản dịch ý tưởng này của Rod.


tyvm như mọi khi, @FrownyFrog
Jonah

thậm chí ngắn hơn626b66jh
FrownyFrog

cơ sở nào đang được sử dụng và làm thế nào để J biết sử dụng nó?
Giô-na


à, ty Tôi đã quên cái b"dấu phân cách" ở đó và đang đọc nó như một phần của con số ....
Jonah

6

R , 64 byte

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

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

Cổng câu trả lời tuyệt vời được tìm thấy bởi Rod .

R , 85 73 68 byte

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

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

Brute force tạo ra tất cả các điểm có thể bằng nphi tiêu, sau đó lấy chênh lệch thiết lập phù hợp.

Tín dụng cho giải pháp Octave của OrangeCherries để nhắc nhở tôi combn.

5 nhiều byte nhờ Robin Ryder đề nghị sử dụng 's %o%.


Rất xin lỗi về điều đó, tôi nên kiểm tra lại ví dụ!
beirtipol

1
Sử dụng tốt các FUNđối số của combn! Bạn có thể nhận được 68 byte với %o%thay vì x*3,x*2.
Robin Ryder

@RobinRyder duh. Tôi thậm chí đã cố gắng tìm ra cách thực hiện phép nhân phát sóng trên câu trả lời Octave!
Giuseppe

4

Octave , 91 byte 73 byte 71 byte

Một phương pháp vũ phu khác.

@(n)setdiff(0:60*n,sum(combnk(repmat([x=0:20,x*2,x*3,25,50],1,n),n),2))

Giảm xuống 73 Byte nhờ Giuseppe
Giảm xuống 71 Byte bằng cách thay thế nchoosek bằng combnk

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


3

Bình thường , 22 byte

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

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

Lần ra trong TIO cho đầu vào lớn hơn 3.

-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

Không ngắn hơn, nhưng nếu bạn thay đổi U4để S3hiệu suất được cải thiện một chút vì cả hai Tích Descartes không phải đối phó với tất cả những 0s vô ích bổ sung. Đầu vào 3 đầu ra trong ~ 13 giây thay vì ~ 30 trong trường hợp đó (mặc dù đầu vào 4 vẫn hết thời gian và đây là mã golf, vì vậy không quan trọng lắm; p).
Kevin Cruijssen

@KevinCruijssen Điểm rất tốt, tôi đã không nghĩ rằng tôi đã bao gồm 0 trên cả hai mặt của sản phẩm cartesian. Nếu tôi tìm thấy bất kỳ sân golf hoặc lý do để chỉnh sửa, tôi chắc chắn sẽ bao gồm điều đó, cảm ơn!
Sok

Quá tệ, không có phạm vi bao gồm dựa trên 0 trong Pyth .. Tôi đã thử điều này -S*60QsM^*MP*S3aU21 25, nhưng khoảng trống giữa 2125hơi khó chịu .. Với phạm vi bao gồm dựa trên 0 yTcó thể được sử dụng thay vì 21, như thế này: -S*60QsM^*MP*S3a}ZyT25( nhưng sau đó không có Zkhóa học, với sự }thay thế bằng phạm vi bao gồm dựa trên 0). Có thể bạn thấy một cái gì đó để chơi golf trong phương pháp thay thế này của việc thêm 25danh sách và loại bỏ 75sau sản phẩm cartesian đầu tiên?
Kevin Cruijssen



2

05AB1E , 21 20 18 byte

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

-3 byte nhờ @Grimy .

Thời gian ra khá nhanh, đầu vào càng cao do tích hợp sản phẩm cartesian ã.

Hãy thử trực tuyến hoặc xác minh một vài trường hợp thử nghiệm .

Giải trình:

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)

Trên lưu ý đó, tối đa là 60 * input, không phải 180.
Grimmy

@Grimy Vâng, bỏ qua sự ngu ngốc của tôi .. Tôi đã thấy kết quả không chính xác trong bộ thử nghiệm, nhưng tất nhiên tôi chỉ tự mắc lỗi. Tôi không nên cá tuyết vào buổi tối sau một ngày dài làm việc ..>.>
Kevin Cruijssen


1

MathGolf , 26 byte

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

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

-2 byte nhờ Kevin Cruijssen

Giải trình

╟*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 byte bằng cách thay đổi 3╒*mÅ~*N_∞α+thành N▐3╒*mÅ~*╡. (PS: Tại sao bạn lại đề cập " cho đầu vào 3 " trong tiêu đề giải thích của mình?)
Kevin Cruijssen

Làm tốt lắm, tôi sẽ thay đổi nó khi tôi quay lại máy tính xách tay của mình! Tôi đã có 31-byter khi tôi bắt đầu viết câu trả lời, nó phức tạp hơn, vì vậy tôi muốn thêm một lời giải thích kỹ lưỡng, nhưng sau đó tôi đã tìm thấy giải pháp trong bài đăng
maxb

1

Ngôn ngữ Wolfram (Mathicala) , 69 byte

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

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

Dựa trên câu trả lời của lirtosiast .

ArrayĐối số thứ ba chỉ định phần bù (mặc định 1) và đối số thứ tư của nó chỉ định phần đầu sẽ sử dụng thay vì List. ##&tương đương với Sequence, do đó Array[1##&,{4,21},0,##&]trả về một (làm phẳng) Sequencecó chứa các thành viên của sản phẩm bên ngoài 0..30..20.


0

Than , 36 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Sử dụng thuật toán của @ Rod; lực lượng vũ phu sẽ mất 60 byte. Hoạt động bằng cách cắt ngắn chuỗi thành 9 ký tự nếu đầu vào lớn hơn 1, sau đó lấy thứ tự của các ký tự và thêm bội số thích hợp của 60.


0

C # (Trình biên dịch tương tác Visual C #) , 305 byte

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

Chà, dường như không có cách nào dễ dàng để tính toán tất cả các kết hợp có thể có trong C #, vì vậy thảm họa mã này là tất cả những gì tôi có thể nghĩ ra.

Thêm vào đó, mất khoảng 30 giây để hoàn thành ...

Rất thích nhìn thấy một giải pháp tốt hơn.

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

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


Có vẻ như bạn quên đăng câu trả lời golf thực tế của bạn. Thông thường mọi người đặt hình thức không được kiểm soát của nó bên dưới hình thức chơi golf.
Veskah

@Veskah tốt, tôi thường đăng bài đánh gôn nếu nó dễ hiểu, nhưng vì bài này quá lâu nên tôi không thấy có gì để làm điều đó vì dù sao nó cũng có thể được tìm thấy trong liên kết tio, nhưng tôi đoán bạn vẫn đúng
Innat3


0

Perl 5 -n , 96 93 91 byte

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

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

Nó được tối ưu hóa cho độ dài mã thay vì thời gian chạy, vì vậy nó khá chậm. Nó tạo ra rất nhiều mục dư thừa cho hàm băm tra cứu của nó. Chạy @bmảng thông qua tăng uniqtốc đáng kể, nhưng tốn thêm 5 byte, vì vậy tôi đã không làm điều đó.


0

Ngôn ngữ Wolfram (Mathicala) , 81 byte

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

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

Mathematica có một vài nội dung liên quan bao gồm FrobeniusSolvevà hình thức hạn chế IntegerPartitions, nhưng không có phần nào trong số chúng ngắn hơn lực lượng vũ phu.


Điều này là không chính xác - nó sẽ trở lại{163,166,169,172,173,175,176,178,179}
attinat

1
@attinat Đã sửa.
lirtosiast


@attinat Đăng bài cho mình.
lirtosiast
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.