คะแนนปาเป้าที่เป็นไปไม่ได้


39

ฉันรู้สึกประหลาดใจที่ไม่พบคำถามนี้ แต่มีคำถามที่ยอดเยี่ยมเกี่ยวกับการชำระเงินปาเป้า: ปาเป้าพบ Codegolf

ความท้าทายของคุณคือการคำนวณว่าไม่สามารถทำคะแนนใดได้ด้วยลูกดอก 'n' ต่ำกว่าคะแนนสูงสุดของลูกดอก 'n' เช่นสำหรับ n = 3 คะแนนสูงสุดที่เป็นไปได้คือ 180 ดังนั้นคุณจะกลับมา [163,166,169,172,172,173,175,176,176,178,179]

สำหรับการสรุปกฎของกระดูกข้อเปลือย:

คะแนนที่เป็นไปได้สำหรับโผเดียวคือ:

  • 0 (พลาด)
  • 1-20, 25, 50
  • สองหรือสามเท่าของ 1-20

กฎ:

  • ใช้กฎกติกากอล์ฟมาตรฐาน
  • คุณต้องใช้พารามิเตอร์ 'n' เพียงอย่างเดียวในวิธีที่ภาษาของคุณอนุญาตและส่งคืนรายการ / อาร์เรย์ของคะแนนเฉพาะทั้งหมดต่ำกว่าคะแนนสูงสุดซึ่งไม่สามารถทำคะแนนได้ด้วย n ปาเป้า คุณยังสามารถพิมพ์ค่าเหล่านี้ไปยังคอนโซล
  • ลำดับของผลลัพธ์นั้นไม่สำคัญ
  • โค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ

1
ขอโทษสำหรับการจัดรูปแบบการเขียนบนโทรศัพท์!
beirtipol

ค่อนข้างที่เกี่ยวข้อง ; ฉันคิดว่ามีอีกอย่างหนึ่งเกี่ยวกับการค้นหาค่าที่หายไปจากช่วง แต่ฉันไม่สามารถหาได้
Giuseppe

1
ขอโทษด้วยความจริงใจฉันดึงผลลัพธ์เหล่านั้นออกมาจากคำตอบของคำถามพื้นฐาน 3 ลูกดอก แต่ไม่ได้ตรวจสอบ! ฉันจะอัพเดทคำถาม!
beirtipol

2
ไม่ต้องกังวล :-) ดูดีสำหรับฉัน!
จูเซปเป้

คำตอบ:


32

Python 3 , 80 79 59 57 ไบต์

-1 ไบต์ขอบคุณ Arnauld
-20 ไบต์ขอบคุณ ArBo
-2 ไบต์ขอบคุณลบ 7

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 สิ่งกำลังจะลองทำ :) พบกับการแยกแยะความแตกต่าง bytestrings แม้ว่าไม่เคยคิดอย่างนั้น
ArBo


9

JavaScript (ES6),  55  54 ไบต์

บันทึก 1 ไบต์ขอบคุณ @Shaggy

ขึ้นอยู่กับรูปแบบที่ใช้โดยร็อด

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

ลองออนไลน์!


1
s=60*n-> n*=60เพื่อบันทึกไบต์
Shaggy

@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 ศูนย์ที่เกี่ยวข้องและว่าก่อนที่จะทำนอกเหนือข้าม) แต่ที่ไม่ก่อให้เกิดปัญหาใด ๆ เนื่องจากเราใช้ความแตกต่างชุดซึ่งทำงานร่วมกับค่าที่ไม่ซ้ำกัน

ปัจจุบันนี้ล้มเหลวสำหรับ$n == 1(ซึ่งควรส่งคืนชุดว่าง) แต่มีปัญหาที่ยื่นและน่าจะใช้ได้ในเวอร์ชันในอนาคต รุ่นของ JoKingยาวขึ้นเล็กน้อย แต่ใช้งานได้$n == 1ใน Rakudo ปัจจุบัน


1
ว้าวน่าอึดอัดใจ ... ไบต์พิเศษของฉันมาจากการแก้ไขปัญหา n = 1 (แต่คุณสามารถใช้ $ _ แทน $ ^ n สำหรับ -1)
Jo King

1
@JoKing ฮ่าผมไม่คิดว่ามีอะไรผิดปกติอะไรกับคนสองคนที่ได้รับจริงคำตอบเดียวกัน (โดยเฉพาะอย่างยิ่งตั้งแต่คุณทำงานในรุ่นปัจจุบันเมื่อเทียบกับเหมืองที่ปัจจุบันทฤษฎี) นอกจากนี้ยังขอบคุณใน $ _ brainfart รวมในส่วนของฉัน
user0721090601


8

MATL , 25 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ดังนั้นฉันจะแก้ไขและออกจากไบต์เพื่อบู๊ต! ลองออนไลน์!
จูเซปเป้

โอ้พบอีก byte โดยจัดเรียงสิ่งต่าง ๆ :-) 23 bytes
Giuseppe

@Giuseppe เฮ้ขอบคุณมาก!
Luis Mendo

7

J , 48 45 ไบต์

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

ลองออนไลน์!

-3 ไบต์ขอบคุณ FrownyFrog

พยายามแก้ปัญหาโดยใช้กำลังดุร้าย แต่ไม่สามารถเอาชนะความคิดของร็อดได้


@vrownyFrog
Jonah

ยิ่งสั้น626b66jh
FrownyFrog

ฐานใดกำลังใช้อยู่และเจทราบได้อย่างไรว่าจะใช้
โยนาห์


อ้า ฉันลืมไปแล้วว่าbเป็น "ตัวคั่น" ที่นั่นและกำลังอ่านมันเป็นส่วนหนึ่งของตัวเลข ....
Jonah

6

R , 64 ไบต์

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

ลองออนไลน์!

พอร์ตคำตอบที่น่าตื่นตาตื่นใจพบโดยร็อด

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สำหรับการเตือนฉันของ

อีก 5 ไบต์ขอบคุณที่โรบินไรเดอร์%o%ข้อเสนอแนะของการใช้


เสียใจมากเกี่ยวกับเรื่องนั้นฉันควรตรวจสอบตัวอย่างซ้ำ!
beirtipol

1
ใช้FUNอาร์กิวเมนต์ของcombn! คุณจะได้รับ68 ไบต์กับแทน%o% x*3,x*2
Robin Ryder

@RobinRyder duh ฉันได้ลองหาวิธีการเพิ่มทวีคูณในคำตอบระดับแปดเสียง!
Giuseppe

4

Octave , 91 bytes 73 bytes 71 Bytes

อีกวิธีการบังคับเดรัจฉาน

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

ลงถึง73 ไบต์ขอบคุณ Giuseppe
ลงมาที่ 71 ไบต์โดยแทนที่ nchoosek ด้วย combnk

ลองออนไลน์!


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

ไม่สั้นลง แต่ถ้าคุณเปลี่ยนU4ไปS3ใช้ประสิทธิภาพจะดีขึ้นเล็กน้อยเพราะผลิตภัณฑ์คาร์ทีเซียนทั้งสองไม่จำเป็นต้องจัดการกับ 0s เพิ่มเติมที่ไร้ประโยชน์ทั้งหมด อินพุต 3 เอาต์พุตใน ~ 13 วินาทีแทนที่จะเป็น ~ 30 ในกรณีนั้น (แม้ว่าอินพุต 4 ยังคงหมดเวลาและนี่คือรหัสกอล์ฟดังนั้นจึงไม่มีความหมายอะไรมาก; p)
Kevin Cruijssen

@KevinCruijssen จุดที่ดีมากฉันไม่ได้คิดว่าฉันรวม 0 ทั้งสองด้านของผลิตภัณฑ์คาร์ทีเซียน หากฉันพบกอล์ฟหรือเหตุผลในการแก้ไขเพิ่มเติมฉันจะต้องแน่ใจว่าได้รวมสิ่งนั้นไว้ขอบคุณ!
Sok

น่าเสียดายที่ไม่มี 0 รวมอยู่ในพิสัยใน Pyth .. ฉันลองทำเช่นนี้-S*60QsM^*MP*S3aU21 25แต่ช่องว่างระหว่าง21และ25ค่อนข้างน่ารำคาญ .. ด้วยการรวม 0-based yTสามารถใช้แทนประเภท21ดังนี้: -S*60QsM^*MP*S3a}ZyT25( แต่ไม่มีZแน่นอนโดย}แทนที่ด้วยช่วงครอบคลุมแบบอิง 0) บางทีคุณอาจจะเห็นบางสิ่งบางอย่างที่จะตีกอล์ฟด้วยวิธีทางเลือกนี้ในการเพิ่ม25ลงในรายการและนำ75ผลิตภัณฑ์คาร์ทีเซียนออกจากหลัง
Kevin Cruijssen



2

05AB1E , 21 20 18 ไบต์

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

-3 ไบต์ขอบคุณที่@Grimy

ไทม์ออกมาสวยได้อย่างรวดเร็วสูงกว่าการป้อนข้อมูลไปเนื่องจากการ ãbuiltin

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

คำอธิบาย:

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 ใช่ละเว้นความโง่เขลาของฉัน .. ฉันเห็นผลลัพธ์ที่ไม่ถูกต้องในชุดทดสอบ แต่แน่นอนฉันเพิ่งทำผิดพลาดด้วยตัวเอง ฉันไม่ควร codegolf ในตอนเย็นหลังจากทำงานมาทั้งวัน ..
>>>


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]

-2 ไบต์โดยการเปลี่ยนไป3╒*mÅ~*N_∞α+ N▐3╒*mÅ~*╡(PS: ทำไมคุณถึงพูดถึง " สำหรับการป้อนข้อมูล 3 " ในส่วนหัวของคำอธิบายของคุณ?)
เควิน Cruijssen

เยี่ยมมากฉันจะเปลี่ยนมันเมื่อฉันกลับไปที่แล็ปท็อปของฉัน! ฉันมี 31 byter เมื่อฉันเริ่มเขียนคำตอบซึ่งซับซ้อนกว่าดังนั้นฉันต้องการเพิ่มคำอธิบายอย่างละเอียด แต่แล้วฉันก็พบวิธีแก้ปัญหาในโพสต์
maxb

1

ภาษา Wolfram (Mathematica) , 69 ไบต์

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

ลองออนไลน์!

ตามออกของคำตอบของ lirtosiast

Array's ระบุอาร์กิวเมนต์ที่สามชดเชย (เริ่มต้นที่ 1) Listและระบุข้อโต้แย้งที่สี่หัวที่จะใช้แทน ##&เทียบเท่ากับSequenceเพื่อArray[1##&,{4,21},0,##&]ส่งกลับ (บี้) Sequenceที่มีสมาชิกของผลิตภัณฑ์ด้านนอกของและ0..30..20


0

ถ่าน , 36 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด ใช้อัลกอริทึมของ @ Rod; กำลังดุร้ายจะใช้เวลา 60 ไบต์ ทำงานโดยตัดทอนสตริงเป็น 9 อักขระหากอินพุตมากกว่า 1 จากนั้นรับเลขลำดับของอักขระและเพิ่มตัวคูณที่เหมาะสม 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

@Veskah ดีฉันมักจะโพสต์ golfed ถ้ามันเข้าใจได้ แต่เนื่องจากอันนี้มันตาดนานเกินไปฉันไม่เห็นจุดทำเพราะมันสามารถพบได้ในลิงค์ tio ต่อไป แต่ฉันคิดว่าคุณถูก แต่
Innat3


0

Perl 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 (Mathematica) , 81 ไบต์

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

ลองออนไลน์!

Mathematica มี builtins ที่เกี่ยวข้องไม่กี่ตัวรวมถึง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.