Skor panah tidak mungkin

39

Saya terkejut tidak menemukan ini ditanyakan, meskipun ada pertanyaan besar pada pemeriksaan anak panah: Anak panah bertemu Codegolf

Tantangan Anda adalah menghitung skor mana yang tidak mungkin dengan panah 'n' di bawah skor maksimum untuk panah 'n'. Misalnya untuk n = 3, skor maksimum yang mungkin adalah 180 sehingga Anda akan mengembalikan [163,166,169,172,173,175,176,178,179]

Untuk ringkasan aturan tulang kosong:

Skor yang mungkin untuk satu panah adalah:

  • 0 (kangen)
  • 1-20, 25, 50
  • dua kali lipat atau tiga kali lipat 1-20

Aturan:

  • aturan golf kode standar berlaku
  • Anda harus mengambil satu parameter 'n' dengan cara apa pun yang bahasa Anda memungkinkan dan mengembalikan daftar / array semua skor unik di bawah skor maksimum yang tidak dapat dicetak dengan n panah. Anda juga dapat mencetak nilai-nilai ini ke konsol.
  • urutan hasil tidak penting
  • kode terpendek dalam byte menang
beirtipol
sumber
1
Permintaan maaf untuk memformat, menulis di telepon!
beirtipol
agak terkait ; Saya pikir ada satu lagi tentang menemukan nilai yang hilang dari rentang tetapi saya tidak bisa menemukannya.
Giuseppe
1
Permintaan maaf yang tulus, saya menarik output dari jawaban atas pertanyaan dasar 3 anak panah tetapi tidak memverifikasi! Saya akan memperbarui pertanyaan!
beirtipol
2
jangan khawatir :-) Terlihat bagus untuk saya!
Giuseppe

Jawaban:

32

Python 3 , 80 79 59 57 byte

-1 byte, terima kasih kepada Arnauld
-20 byte, terima kasih kepada ArBo
-2 byte, berkat negatif tujuh

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

Cobalah online!

tongkat
sumber
26
Aku, errr, apa ?!
beirtipol
2
@ beirtipol ada pola pada angka setelah panah ke-2 (well, pada panah ke-1 juga, tetapi ada angka lain), ini menghitung angka berdasarkan pola ini.
Batang
4
Ah, dimainkan dengan baik, memang dimainkan dengan baik
beirtipol
8
@EriktheOutgolfer Jika Anda mengompresi, Anda mungkin juga memampatkan semuanya;) 59 byte
ArBo
2
@negativeseven mengalahkan saya ke 60 hal, akan mencobanya :) Temuan bagus untuk menjaga bytestrings terpisah, tidak memikirkan itu.
ArBo
14

Perl 6 , 42 byte

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

Cobalah online!

Solusi brute force yang menghitung semua nilai panah yang mungkin.

Jo King
sumber
9

JavaScript (ES6),  55  54 byte

Disimpan 1 byte berkat @Shaggy

Berdasarkan pola yang digunakan oleh Rod .

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

Cobalah online!

Arnauld
sumber
1
s=60*n-> n*=60untuk menyimpan byte.
Shaggy
@Shaggy Terima kasih. :) Saya melewatkan yang itu karena versi awal saya (tidak dipublikasikan) di mana digunakan kembali nanti. n
Arnauld
9

Perl 6 , 39 byte (37 karakter)

Ini jelas menggunakan palu besar tetapi berhasil. (Itu tidak hanya brutal memaksanya, brutal juga brutal memaksanya)

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

Cobalah online!

Berikut penjelasannya:

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

The X* ^4lintas multiplier menghasilkan banyak nilai ganda (akan ada 20 + nol terlibat dan bahwa ini sebelum melakukan penambahan lintas), tapi itu tidak menyebabkan masalah karena kita menggunakan set perbedaan yang bekerja dengan nilai-nilai yang unik.

Saat ini gagal untuk $n == 1(yang seharusnya mengembalikan set kosong), tetapi ada masalah yang diajukan dan kemungkinan akan bekerja di versi mendatang. Versi JoKing sedikit lebih lama, tetapi berfungsi untuk $n == 1Rakudo saat ini.

pengguna0721090601
sumber
1
Wow, canggung ... Bytes tambahan saya berasal dari memperbaiki masalah n = 1 (meskipun Anda dapat menggunakan $ _ bukannya $ ^ n untuk -1)
Jo King
1
@JoKing ha, saya tidak berpikir ada yang salah dengan dua orang mendapatkan jawaban yang hampir sama (terutama karena Anda bekerja dalam versi saat ini versus milik saya yang saat ini teoritis) Juga, terima kasih pada $ _, total brainfart di pihak saya
user0721090601
8

MATL , 25 23 byte

Terima kasih kepada @Giuseppe , yang memperbaiki kesalahan dan golf 2 byte!

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

Cobalah online!

Penjelasan

Pendekatan kekerasan.

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
Luis Mendo
sumber
Versi Anda tidak berfungsi n=2, jadi saya memperbaikinya dan beralih dari byte ke boot! Cobalah online!
Giuseppe
Oh, menemukan byte lain dengan menata ulang hal-hal :-) 23 byte
Giuseppe
@ Giuseppe Hai, terima kasih banyak!
Luis Mendo
7

J , 48 45 byte

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

Cobalah online!

-3 byte terima kasih kepada FrownyFrog

Mencoba solusi brute force, tetapi tidak dapat mengalahkan terjemahan ide Rod ini.

Jonah
sumber
tyvm seperti biasa, @FrownyFrog
Jonah
bahkan lebih pendek626b66jh
FrownyFrog
basis apa yang digunakan dan bagaimana J tahu menggunakannya?
Jonah
ah, ty. Saya sudah lupa b"pembatas" di sana dan sedang membacanya sebagai bagian dari nomor ....
Jonah
6

R , 64 byte

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

Cobalah online!

Port jawaban yang luar biasa ditemukan oleh 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))

Cobalah online!

Brute force menghasilkan semua skor yang mungkin dengan npanah, kemudian mengambil perbedaan set yang sesuai.

Kredit untuk solusi Octave OrangeCherries untuk mengingatkan saya pada combn.

5 byte lebih banyak berkat saran Robin Ryder untuk menggunakan %o%.

Giuseppe
sumber
Very sorry about that, I should have double checked the example!
beirtipol
1
Nice use of the FUN argument of combn! You can get 68 bytes with %o% instead of x*3,x*2.
Robin Ryder
@RobinRyder duh. I even tried figuring out how to do broadcasting multiplication on the Octave answer!
Giuseppe
4

Octave, 91 bytes 73 bytes 71 Bytes

Another brute force method.

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

Down to 73 Bytes thanks to Giuseppe
Down to 71 Bytes by replacing nchoosek with combnk

Try it online!

OrangeCherries
sumber
3

Pyth, 22 bytes

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

Try it online!

Times out in TIO for inputs greater than 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
Sok
sumber
Not shorter, but if you change U4 to S3 the performance is improved a bit because both cartesian products don't have to deal with all those additional useless 0s. Input 3 outputs in ~13 seconds instead of ~30 in that case (although input 4 still times out, and this is code golf, so doesn't matter that much ;p).
Kevin Cruijssen
@KevinCruijssen Very good point, I hadn't considered that I was including a 0 on both sides of the cartesian product. If I find any more golfs or reasons to edit I'll be sure to include that, thanks!
Sok
Too bad there isn't a 0-based inclusive range builtin in Pyth.. I tried this -S*60QsM^*MP*S3aU21 25, but that space between 21 and 25 is a bit annoying.. With a 0-based inclusive range yT could be used instead of 21, kinda like this: -S*60QsM^*MP*S3a}ZyT25 (but then without the Z of course, with the } replaced with the 0-based inclusive range). Maybe you see something to golf in this alternative approach of adding the 25 to the list, and removing the 75 after the first cartesian product?
Kevin Cruijssen
2

Stax, 24 bytes

¿ß☺o↕αg╠╩╬ò▼í¬«¥↕▄í■♣▓î►

Run and debug it

It's pretty slow for n=3, and gets worse from there.

recursive
sumber
2

Python 2, 125 bytes

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*

Try it online!


Python 3, 126 125 122 bytes

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*

Try it online!

-3 bytes, thanks to Rod

TFeld
sumber
@rod Thanks, :)
TFeld
2

05AB1E, 21 20 18 bytes

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

-3 bytes thanks to @Grimy.

Times out pretty quickly the higher the input goes due to the cartesian product builtin ã.

Try it online or verify a few more test cases.

Explanation:

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)
Kevin Cruijssen
sumber
Pada catatan itu, maksimum adalah 60 * input, bukan 180.
Grimmy
@ Grim Ya, abaikan kebodohan saya .. Saya melihat hasil yang salah dalam test suite, tapi tentu saja saya sendiri membuat kesalahan. Saya tidak boleh codegolf di malam hari setelah hari yang panjang di tempat kerja ..>.>
Kevin Cruijssen
1

Jeli , 28 byte

21Ḷ×þ3R¤;25;50FœċµS€³×60¤R¤ḟ

Cobalah online!

HyperNeutrino
sumber
1

MathGolf , 26 byte

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

Cobalah online!

-2 byte terima kasih kepada Kevin Cruijssen

Penjelasan

╟*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]
maks
sumber
-2 byte dengan mengubah 3╒*mÅ~*N_∞α+ to N▐3╒*mÅ~*╡. (PS: Why do you mention "for input 3" in your explanation header?)
Kevin Cruijssen
Nice job, I'll change it when I'm back on my laptop! I had a 31-byter when I started writing the answer, which was more complicated, so I wanted to add a thorough explanation, but then I found the solution in the post
maxb
1

Wolfram Language (Mathematica), 69 bytes

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

Try it online!

Based off of lirtosiast's answer.

Array's third argument specifies the offset (default 1), and its fourth argument specifies the head to use instead of List. ##& is equivalent to Sequence, so Array[1##&,{4,21},0,##&] returns a (flattened) Sequence containing members of the outer product of 0..3 and 0..20.

attinat
sumber
0

Charcoal, 36 bytes

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

Try it online! Link is to verbose version of code. Uses @Rod's algorithm; brute force would have taken 60 bytes. Works by truncating the string to 9 characters if the input is greater than 1, then taking the ordinals of the characters and adding the appropriate multiple of 60.

Neil
sumber
0

C # (Visual C # Interactive Compiler) , 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);}

Yah, sepertinya tidak ada cara mudah untuk menghitung semua kombinasi yang mungkin dalam C #, jadi ini bencana kode yang bisa saya buat.

Ditambah lagi dibutuhkan sekitar 30-an untuk menyelesaikan ...

Senang melihat solusi yang lebih baik.

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

Cobalah online!

Innat3
sumber
Sepertinya Anda lupa memposting jawaban golf Anda yang sebenarnya. Biasanya orang meletakkan bentuknya yang tidak gulungan di bawah yang golf.
Veskah
@ Vespa yah, saya biasanya memposting yang golf jika itu bisa dipahami, tapi karena yang ini agak terlalu lama saya tidak melihat gunanya melakukannya karena toh bisa ditemukan di tautan tio, tapi saya kira Anda benar
Innat3
0

Kotlin , 118 byte

{n:Int->val i=if(n<2)listOf(23,24,31,25,37,41,44,47)
else
List(0){0}
i+List(9){n*60-listOf(17,14,11,8,7,5,4,2,1)[it]}}

Cobalah online!

JohnWells
sumber
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

Cobalah online!

Itu dioptimalkan untuk panjang kode daripada waktu berjalan, jadi agak lambat. Ini menghasilkan banyak entri berlebihan untuk hash pencariannya. Menjalankan @barray melalui uniqkecepatan sangat, tetapi biaya 5 byte lebih banyak, jadi saya tidak melakukannya.

Xcali
sumber
0

Bahasa Wolfram (Mathematica) , 81 byte

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

Cobalah online!

Mathematica memiliki beberapa builtin terkait termasuk FrobeniusSolvedan bentuk terbatas IntegerPartitions, tetapi tidak ada yang lebih pendek dari brute force.

lirtosiast
sumber
This is incorrect - it should return {163,166,169,172,173,175,176,178,179}
attinat
1
@attinat Fixed.
lirtosiast
69 bytes
attinat
@attinat Post it yourself.
lirtosiast