不可能なダーツスコア


39

ダーツのチェックアウトには素晴らしい質問がありますが、これがすでに質問されていないことに驚きました:ダーツとコードゴルフの出会い

あなたの挑戦は、「n」ダーツの最大スコアを下回る「n」ダーツでは不可能なスコアを計算することです。たとえば、n = 3の場合、可能な最大スコアは180なので、[163,166,169,172,173,175,176,178,179]を返します

最低限のルールの概要:

1本のダーツで可能なスコアは次のとおりです。

  • 0(ミス)
  • 1-20、25、50
  • 1〜20のダブルまたはトリプル

ルール:

  • 標準コードのゴルフ規則が適用されます
  • 言語で許可されている方法で単一のパラメーター「n」を取り、nダーツでは得られない最大スコア以下のすべての一意のスコアのリスト/配列を返す必要があります。これらの値をコンソールに出力することもできます。
  • 結果の順序は重要ではありません
  • バイト単位の最短コードが勝つ

1
書式設定、電話での書き込みに謝罪!
beirtipol

やや関連する ; 範囲から欠損値を見つけることについては別のものがあったと思いますが、私はそれを見つけることができないようです。
ジュゼッペ

1
心からおaび申し上げますが、3本のダーツの基本的な質問に対する答えからこれらの出力を引き出しましたが、確認しませんでした!質問を更新します!
beirtipol

2
心配いりません:-)
ジュゼッペ

回答:


32

Pythonの380の 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 2番目のダーツの後の数字にパターンがあり(1番目のダーツにもありますが、別の数字があります)、このパターンに基づいて数字を計算します。
ロッド

4
ああ、よくやった、よくやった
beirtipol

8
@EriktheOutgolfer圧縮する場合は、すべてを圧縮することもできます;)59バイト
ArBo

2
@negativesevenは私を60の事に打ち負かし、それを試そうとしていました:)しかし、バイトストリングを分離したままにしておくと、それを考えていませんでした。
ArBo



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の問題を修正することからです(ただし、-1には$ ^ nの代わりに$ _を使用できます)
Jo King

1
ヘクタール@JoKing、私は、また、(あなたが現在理論だ鉱山対現在のバージョンで動作し、特に以来)私の部分に$ _、総brainfartのおかげでほぼ同じ答えを得る二人で何も間違ってないと思う
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バイト
ジュゼッペ

@ジュゼッペねえ、どうもありがとう!
ルイスメンド

7

J48 45バイト

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

オンラインでお試しください!

FrownyFrogのおかげで-3バイト

ブルートフォースの解決策を試みましたが、ロッドのアイデアのこの翻訳を打ち負かすことができませんでした。


いつものようにtyvm、@ FrownyFrog
ジョナ

さらに短く626b66jh
FrownyFrog

J
ジョナ


ああ、タイ。私は忘れて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のOctaveソリューション感謝しcombnます。

Robin Ryderの使用提案のおかげで、さらに5バイト増えました%o%


それについて非常に残念、私は例を再確認する必要があります!
beirtipol

1
FUN引数の素晴らしい使用法combn!の代わりに68バイトを取得できます。%o%x*3,x*2
ロビンライダー

@RobinRyder当たり前。Octaveの回答でブロードキャストの乗算を行う方法を考えてみました!
ジュゼッペ


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は〜30秒ではなく〜13秒で出力されます(入力4はまだタイムアウトしますが、これはコードゴルフなので、それほど重要ではありません; p)。
ケビンクルーッセン

@KevinCruijssen非常に良い点、デカルト積の両側に0を含めるとは考えていませんでした。編集するゴルフやその他の理由を見つけたら、必ずそれを含めてください、ありがとう!
ソク

残念Pythで0ベースの包括範囲の組み込みがありません..私はこれを試してみました-S*60QsM^*MP*S3aU21 25が、間のスペース21250ベースの包括的な範囲で少し迷惑..ですがyTの代わりに使用することができ21ちょっとこのように、: -S*60QsM^*MP*S3a}ZyT25(ただし、Zもちろん、}0から始まる範囲に置き換えられます)。25リストに追加し75、最初のデカルト積の後に削除するというこの代替アプローチでゴルフに何かを見るかもしれませんか?
ケビンクルーイッセン



2

05AB1E21 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

@Grimyええ、私の愚かさは無視してください。テストスイートで間違った結果を見ましたが、もちろん自分で間違いを犯しました。私は...>仕事で長い一日を過ごした後、夕方にcodegolfべきではありません>。
ケビンCruijssen


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:説明ヘッダーに「for input 3」と記載するのはなぜですか?)
Kevin Cruijssen

良い仕事です。ラップトップに戻ったら変更します!私は完全な説明を追加したいので、私は、私はより複雑になった答えを、書き始めたときに31-byterがあったが、その後私はポストで解決策を見つけた
MAXB

1

Wolfram言語(Mathematica)、69バイト

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

オンラインでお試しください!

lirtosiastの答えに基づいています

Array3番目の引数はオフセット(デフォルトは1)を指定し、4番目の引数はの代わりに使用するヘッドを指定しますList##&同等であるSequenceので、Array[1##&,{4,21},0,##&]戻り値(平坦化)Sequenceの外積のメンバーを含む0..3とします0..20


0

、36バイト

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

オンラインでお試しください!リンクは、コードの詳細バージョンです。@Rodのアルゴリズムを使用します。ブルートフォースは60バイトかかりました。入力が1より大きい場合に文字列を9文字に切り捨て、次に文字の序数を取り、60の適切な倍数を追加することにより機能します。


0

C#(Visual C#Interactive Compiler)、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、それは理解できるのですが、これが長すぎる少しだったので、私はそれがとにかくョリンクで見つけることができますので、それを行うにはポイントを見ていない場合、私は通常、golfed 1を投稿し、私はあなたが右のそれにもかかわらず、だと思います
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バイトのコストがかかるため、実行しませんでした。


0

Wolfram言語(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修正済み。
リトシアスト


@attinat自分で投稿してください。
リルトシアスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.