不可能的飞镖得分


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
不用担心:-)对我来说很好!
朱塞佩

Answers:


32

Python 3中80个 79 59 57字节

-1个字节感谢Arnauld
-20个字节感谢ArBould
-2个字节感谢负7

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

JavaScript(ES6), 55  54字节

@Shaggy节省了1个字节

基于Rod使用的模式。

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

在线尝试!


1
s=60*n-> n*=60保存一个字节。
毛茸茸的

@粗野的谢谢。:)我错过了那个,因为我的初始(未发布)版本在以后重新使用了。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多个零,这就是做交叉加成),但由于我们使用了一套差异不会引起任何问题,它具有独特的价值观的作品。

目前,此操作失败$n == 1(应该返回一个空集),但是存在一个问题,很可能在以后的版本中起作用。 JoKing的版本稍长一些,但适用$n == 1于当前的Rakudo。


1
哇,尴尬...我的多余字节来自解决n = 1问题(尽管您可以使用$ _而不是$ ^ n来表示-1)
Jo King

1
@JoKing哈,我认为两个人得到几乎相同的答案没有什么错(尤其是因为您的工作在当前版本而不是我的当前理论上)而且,我要感谢$ _,我的总脑力是
user0721090601


8

MATL25 23字节

感谢@Giuseppe,他纠正了一个错误,并打了2个字节!

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字节
朱塞佩

@Giuseppe嘿,非常感谢!
Luis Mendo

7

J48 45字节

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

在线尝试!

-3字节归功于FrownyFrog

尝试了蛮力解决方案,但未能击败Rod的想法。


tyvm一如既往,@FrownyFrog
约拿

甚至更短626b66jh
FrownyFrog

正在使用什么基础,J如何知道要使用它?
约拿(Jonah)


啊,ty。我忘了b是“分隔符”那里正在读它作为号码的一部分....
乔纳

6

R,64字节

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

在线尝试!

移植了Rod发现惊人答案

R85 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
很好地使用FUNcombn!您可以使用代替68个字节%o%x*3,x*2
罗宾·赖德

@RobinRyder duh。我什至尝试找出如何在倍频程答案上进行广播乘法!
朱塞佩

4

八度91字节 73字节 71字节

另一种蛮力方法。

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

下到73个字节由于朱塞佩
用combnk更换nchoosek下降到71个字节

在线尝试!


3

Pyth,22个字节

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

在线尝试!

在TIO中超时,输入大于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

为不短,但如果你改变U4S3性能的提高一点,因为这两个笛卡尔积不必应付所有这些额外没用0。输入3在大约13秒内输出,而不是在这种情况下大约30秒(尽管输入4仍然超时,并且这是代码高尔夫,所以没关系;; p)。
凯文·克鲁伊森

@KevinCruijssen很好,我没有想到我在笛卡尔积的两边都加了0。如果我发现更多高尔夫球或编辑原因,请确保包括在内,谢谢!
索克

太糟糕了,没有在Pyth基于0的包容范围内建..我尝试这样做-S*60QsM^*MP*S3aU21 25,但之间的空间,21并且25是有点讨厌。随着基于0包含的范围yT可以用来代替21,有点像这样:-S*60QsM^*MP*S3a}ZyT25(但Z当然不使用,而是将其}替换为基于0的包含范围)。也许您会发现以这种替代方法将高尔夫添加25到列表中,并删除75第一个笛卡尔积之后的东西吗?
凯文·克鲁伊森


2

Python 2,125个字节

lambda n:set(range(60*n))-set(map(sum,product(sum([range(0,21*j,j)for j in 1,2,3],[25,50]),repeat=n)))
from itertools import*

在线尝试!


Python 3中126个 125 122字节

lambda n:{*range(60*n)}-{*map(sum,product(sum([[i,i*2,i*3]for i in range(21)],[25,50]),repeat=n))} 
from itertools import*

在线尝试!

-3个字节,感谢Rod


@rod谢谢,:)
TF场

2

05AB1E21 20 18 字节

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

-3个字节,感谢@Grimy

由于内置了笛卡尔积,输入越高,输入超时就越快ã

在线尝试验证更多测试用例

说明:

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 * input,不是180
Grimmy

@Grimy是的,请忽略我的愚蠢。.我在测试套件中看到了不正确的结果,但是我当然只是自己犯了一个错误。在一天的忙碌之后,我不应该在晚上打高尔夫球。
>>>


1

MathGolf,26个字节

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

在线尝试!

-2个字节,感谢Kevin Cruijssen

说明

╟*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]

通过更改3╒*mÅ~*N_∞α+为-2个字节N▐3╒*mÅ~*╡。(PS:为什么在解释标题中提到“ 输入3 ”?)
Kevin Cruijssen

干得好,当我回到笔记本电脑时,我将对其进行更改!当我开始写答案时,我的回答是31次,这比较复杂,因此我想添加一个详尽的解释,但是后来我在帖子中找到了解决方案
maxb


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

Perl 5中 -n96个 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个字节,所以我没有这么做。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.