คุณกินขนมได้เท่าไหร่


14

ให้เครดิตกับ Geobits ใน TNB สำหรับแนวคิดนี้

โพสต์โดยไม่ได้รายละเอียดที่เพียงพอเมื่อเร็ว ๆ นี้ posited เกมที่น่าสนใจ:

เด็ก 2 คนนั่งอยู่หน้าลูกอม ขนมแต่ละชิ้นมีหมายเลข 1 ถึงxด้วยxจำนวนขนมทั้งหมด แต่ละหมายเลขมีการเกิดขึ้น 1 รายการ

เป้าหมายของเกมคือให้เด็ก ๆ กินขนมและเพิ่มคุณค่าของขนมที่พวกเขากินเพื่อให้ได้คะแนนสุดท้ายโดยมีคะแนนชนะสูงกว่า

อย่างไรก็ตามโพสต์ดั้งเดิมพลาดข้อมูลสำคัญเช่นวิธีเลือกขนมดังนั้นเด็ก ๆ ในเรื่องของเราจึงตัดสินใจว่าเด็กโตจะไปก่อนและสามารถกินลูกกวาดได้ถึงครึ่งอย่างไรก็ตามเมื่อเขาประกาศจบเทิร์นของเขา เขาเปลี่ยนใจไม่ได้

เด็กคนหนึ่งในเกมนี้ไม่ชอบขนมดังนั้นเขาจึงอยากกินให้น้อยที่สุดเท่าที่จะเป็นไปได้และเขาเคยดูพ่อของเขาเขียนโค้ดบางครั้งและเขาสามารถใช้ทักษะที่ได้รับจากการทำขนมเท่าไหร่ เขาต้องการที่จะกินเพื่อให้แน่ใจว่าชัยชนะในขณะที่ยังคงกินน้อยที่สุด

ความท้าทาย

เมื่อกำหนดจำนวนขนมxทั้งหมดโปรแกรมหรือฟังก์ชั่นของคุณควรให้ปริมาณขนมที่น้อยที่สุดที่เขาต้องกินเพื่อให้ได้ชัยชนะnแม้ว่าฝ่ายตรงข้ามจะกินขนมที่เหลือทั้งหมด

ตัวเลขที่ใหญ่กว่าย่อมสร้างตัวเลขที่มากขึ้นดังนั้นไม่ว่าคุณจะให้เขาจำนวนเท่าใดเขาก็จะกิน nตัวเลขที่ใหญ่ที่สุด

กฎระเบียบ

  • xจะเป็นจำนวนเต็มบวกเสมอในช่วง0 < x! <= lที่lขีด จำกัด สูงสุดของความสามารถในการจัดการหมายเลขภาษาของคุณ
  • รับประกันได้ว่าเด็กจะกินnตัวเลขที่ใหญ่ที่สุดเสมอเช่นx = 5และn = 2เขาจะกิน4และ5

กรณีทดสอบ

x = 1
n = 1
(1 > 0)

x = 2
n = 1
(2 > 1)

x = 4
n = 2
(3 * 4 == 12 > 1 * 2 == 2)

x = 5
n = 2
(4 * 5 == 20 > 1 * 2 * 3 == 6)

x = 100
n = 42
(product([59..100]) > product([1..58]))

x = 500
n = 220
(product([281..500]) > product([1..280]))

เกณฑ์การให้คะแนน

น่าเสียดายที่ผู้เข้าแข่งขันที่กล้าหาญของเราไม่มีอะไรจะเขียนโค้ดด้วยดังนั้นเขาจึงต้องจัดเรียงขนมเป็นตัวอักษรของรหัสดังนั้นรหัสของคุณจะต้องมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้


14
ฉันกินขนมได้มากแค่ไหน? ทั้งหมดของมัน. ของหวานทั้งหมด
AdmBorkBork

3
ชื่อใหม่: "คุณต้องการกินขนมมากแค่ไหน"
Sparr

@Skidsdev ควรx = 0จัดการด้วยเช่นกัน0! = 1ใช่ไหม ( xควรระบุว่าเป็นจำนวนเต็มบวกด้วยหรือไม่)
Chronocidal

@Chronocidal เพิ่มจำนวนเต็ม "positive"
Skidsdev

ฉันโยนขนม 10k ลงบนพื้น มีร่างเล็ก ๆ คนหนึ่งขุดหลุมลงไปในพื้นดินและพบถ้ำขนมยักษ์เพราะฉัน ):
moonheart08

คำตอบ:


9

Python 3 , 76 ไบต์

F=lambda x:x<2or x*F(x-1)
f=lambda x,n=1:x<2or n*(F(x)>F(x-n)**2)or f(x,n+1)

ลองออนไลน์!

อาศัยอยู่กับความจริงที่ว่าสำหรับการรับประทานอาหารnลูกอมยังคงชนะและจำนวนรวมของลูกอมเป็นx , x!(xn)!>(xn)!จะต้องเป็นจริงซึ่งหมายความว่าx!>((xn)!)2 .

-1 จาก Skidsdev

-3 -6 จาก BMO

-3 จาก Sparr

+6 เพื่อแก้ไข x = 1


1
คุณสามารถบันทึก 1 ไบต์โดยแทนที่ฟังก์ชันด้านบนด้วยfrom math import factorial as F
Skidsdev

1
คุณสามารถเขียนการสอบถามซ้ำเหล่านี้โดยใช้พฤติกรรมการลัดวงจรเช่น สำหรับคนที่สอง: n*(F(x)>F(x-n)**2)or f(x,n+1). ในทำนองเดียวกันx<2or x*F(x-1)สำหรับอันแรกซึ่งสั้นกว่าการนำเข้า
ბიმო

1
ทั้งสามคนนี้เป็นคำแนะนำที่ดีขอบคุณ (และเพิ่ม)
nedla2004

1
-3 ไบต์import math;F=math.factorialซึ่งฉันควรจะไปหา meta เคล็ดลับหลามที่จะพูดถึง ...
Sparr

2
@Sparr: แต่F=lambda x:x<2or x*F(x-1)น้อยกว่าสามไบต์?
ბიმო

5

JavaScript (ES6), 53 ไบต์

n=>(g=p=>x<n?g(p*++x):q<p&&1+g(p/n,q*=n--))(q=x=1)||n

ลองออนไลน์!

ช่วงการทำงาน

ที่น่าสนใจความแตกต่างระหว่างผลิตภัณฑ์ของเด็ก ๆ นั้นใหญ่พอที่การสูญเสียความแม่นยำในการเข้ารหัส IEEE 754 นั้นไม่ใช่ปัญหา

เป็นผลให้การทำงานสำหรับ0n170 170 นอกเหนือจากนั้นทั้ง mantissa และล้นแบบ exponent (ให้+ อนันต์ ) และเราต้องการ BigInts (+1 byte)

อย่างไร?

ให้pเป็นผลิตภัณฑ์ลูกกวาดของเด็กคนอื่นและให้qเป็นผลิตภัณฑ์ลูกกวาดของเราเอง

  1. เราเริ่มต้นด้วยp=n!(ขนมสำหรับเด็กคนอื่น ๆ ) และq=1 (ไม่มีอะไรให้เรา)

  2. เราทำซ้ำการดำเนินการต่อไปนี้จนกระทั่งqp :

    • หารpด้วยn
    • คูณQด้วยn
    • การลดลงn

ผลลัพธ์คือจำนวนการวนซ้ำที่ต้องการ (ในการทำซ้ำแต่ละครั้งเรา 'นำขนมที่สูงที่สุดถัดไปจากเด็กคนอื่น')

แสดงความคิดเห็น

นี้จะดำเนินการเป็นฟังก์ชันเวียนเดียวที่คำนวณแรกn!จากนั้นเข้าสู่ลูปที่อธิบายไว้ข้างต้น

n => (           // main function taking n
  g = p =>       // g = recursive function taking p
    x < n ?      //   if x is less than n:
      g(         //     this is the first part of the recursion:
        p * ++x  //     we're computing p = n! by multiplying p
      )          //     by x = 1 .. n
    :            //   else (second part):
      q < p &&   //     while q is less than p:
      1 + g(     //       add 1 to the final result
        p / n,   //       divide p by n
        q *= n-- //       multiply q by n; decrement n
      )          //
)(q = x = 1)     // initial call to g with p = q = x = 1
|| n             // edge cases: return n for n < 2

4

เยลลี่ขนาด 9 ไบต์

ḊPÐƤ<!€TL

ลองออนไลน์!หรือดูการทดสอบในตัว

อย่างไร?

ḊPÐƤ<!€TL - Link: integer, x                   e.g. 7
Ḋ         - dequeue (implicit range of x)           [   2,   3,   4,   5,   6,   7]
  ÐƤ      - for postfixes [all, allButFirst, ...]:
 P        -   product                               [5040,2520, 840, 210,  42,   7]
      €   - for each (in implicit range of x):
     !    -   factorial                             [   1,   2,   6,  24, 120, 720, 5040]
    <     - (left) less than (right)?               [   0,   0,   0,   0,   1,   1, 5040]
          -   -- note right always 1 longer than left giving trailing x! like the 5040 ^
       T  - truthy indices                          [                       5,   6, 7   ]
        L - length                                  3

1
น่าประทับใจ แต่น่าจะให้ความรู้มากกว่านี้หากอธิบาย
Setop

มันจะเป็น ... :)
Jonathan Allan

@Setop - เพิ่มแล้ว
Jonathan Allan

ชอบมัน ! และจะต้องเปรียบเทียบได้อย่างรวดเร็วกับโซลูชันทั้งหมดที่มีแฟคทอเรียลจำนวนมาก
Setop

ไม่ได้ยังคงคำนวณผลิตภัณฑ์และแฟคทอเรียลทั้งหมด (มากกว่าโซลูชันอื่น ๆ )
Jonathan Allan

3

R , 70 41 38 ไบต์

-29 เพราะเดนนิสรู้จักฟังก์ชันภายในทั้งหมด

-3 สลับเป็นการสแกน () อินพุต

sum(prod(x<-scan():1)<=cumprod(1:x)^2)

ลองออนไลน์!

การติดตั้ง R อย่างง่ายของคำตอบ Python3ของnedla2004คำตอบ

ฉันรู้สึกว่ามีการใช้งานการจัดการ 1 อย่างที่สะอาดยิ่งขึ้นและฉันต้องการที่จะสูญเสียวงเล็บปีกกา

ฉันบ้าฉันไม่ได้กลับไปใช้วิธีการใด ๆ แมดเดอร์ที่ฉันใช้อย่างเข้มงวดน้อยกว่า แต่แมดเดอร์ก็ยังไม่รู้ว่ามี cumprod()ฟังก์ชั่น การเพิ่มประสิทธิภาพยอดเยี่ยมโดย Dennis


3

APL (Dyalog Unicode)ขนาด 10 ไบต์

+/!≤2*⍨!∘⍳

ลองออนไลน์!

พอร์ตของ คำตอบของเดนนิส ขอบคุณเดนนิสสำหรับมัน

วิธี:

+/!≤2*⍨!∘⍳  Tacit function, takes 1 argument (E.g. 5)
           Range 1 2 3 4 5
       !∘   Factorials. Yields 1 2 6 24 120
    2*⍨     Squared. Yields 1 4 36 576 14400
  !         Factorial of the argument. Yields 120.
           Less than or equal to. Yields 0 0 0 1 1
+/          Sum the results, yielding 2.

เนื่องจากคำตอบนี้ฉันไม่ได้ทำอย่างเคร่งครัดฉันจะเก็บคำตอบดั้งเดิมไว้ด้านล่าง


APL (Dyalog Unicode) , 14 12 11 ไบต์

(+/!>×\)⌽∘⍳

ลองออนไลน์!

คำนำหน้าฟังก์ชั่นโดยปริยาย โดยทั่วไปเป็นพอร์ต Dyalog ของคำตอบของ Jonathanคำตอบที่โจนาธาน

ขอบคุณ ngn และ H.PWiz สำหรับความช่วยเหลือในการแชท ขอบคุณ ngn ที่ช่วยฉันไบต์ด้วย

ขอบคุณเดนนิสที่ชี้ให้เห็นว่ารหัสดั้งเดิมของฉันผิด ปรากฎว่าช่วยฉัน 2 ไบต์

การใช้ประโยชน์ ⎕IO←0การใช้ประโยชน์

วิธี:

+/(!>×\)∘⌽∘⍳  Tacit function, taking 1 argument (E.g. 5).
             Range 0 1 2 3 4
         ⌽∘   Then reverse, yielding 4 3 2 1 0
  (    )∘     Compose with (or: "use as argument for")
   !          Factorial (of each element in the vector), yielding 24 6 2 1 1
     ×\       Multiply scan. Yields 4 12 24 24 0
    >         Is greater than. Yields 1 0 0 0 1
+/            Finally, sum the result, yielding 2.

1
หาก+/เข้าไปในวงเล็บจะสามารถตัดการเขียนเรียงความอย่างใดอย่างหนึ่งได้:(+/!>×\)⌽∘⍳
ก.ย.

2

Haskell , 52 51 ไบต์

ใช้วิธีการตรงไปตรงมา: เราตรวจสอบว่าผลิตภัณฑ์สุดท้ายหรือไม่ n ตัวเลขซึ่งก็คือ x!(x-n)! น้อยกว่าผลิตภัณฑ์แรก n ตัวเลขคือ (x-n)! และใช้เวลาน้อยที่สุด n ซึ่งสิ่งนี้เป็นความจริง

g b=product[1..b]
f x=[n|n<-[1..],g(x-n)^2<=g x]!!0

ลองออนไลน์!



2

Python 3 , 183 176 149 ไบต์

R=reversed
def M(I,r=1):
 for i in I:r*=i;yield r
def f(x):S=[*range(1,x+1)];return([n for n,a,b in zip([0]+S,R([*M(S)]),[0,*M(R(S))])if b>a]+[x])[0]

ลองออนไลน์!

มันเร็วกว่าโซลูชันอื่น ๆ - การคูณแบบ 0 (N) แทนที่จะเป็น O (N²) - แต่ฉันไม่สามารถจัดการเพื่อลดขนาดรหัสได้

-27 จากโจคิง



1

05AB1E , 15 11 ไบต์

E!IN-!n›iNq

ลองออนไลน์!

E!IN-!n›iNq

E                For loop with N from [1 ... input]
 !               Push factorial of input    
  IN-            Push input - N (x - n)
     !           Factorial
      n          Square
       ›         Push input! > (input - N)^2 or x! > (x - n)^2
        i        If, run code after if top of stack is 1 (found minimum number of candies)
         N       Push N
          q      Quit, and as nothing has been printed, N is implicitly printed

ใช้วิธีการเดียวกับPythonของฉันส่งใหม่มากถึง 05AB1E ดังนั้นคำแนะนำใด ๆ เกี่ยวกับโค้ดหรือการอธิบายชื่นชมอย่างมาก

-4 ไบต์ต้องขอบคุณ Kevin Cruijssen


คำตอบที่ดี! คุณสามารถกอล์ฟ 3 ไบต์เช่นนี้1โดยไม่ทำลายการป้อนข้อมูล หากข้อความสั่ง if เป็นจริงมันจะส่งดัชนีNไปยังสแต็กและออกจากโปรแกรม (แสดงผลดัชนีนั้นโดยปริยาย) สำหรับการป้อน1คำสั่ง if-if จะเป็นเท็จ แต่มันจะเอาท์พุทอินพุต1โดยปริยายหลังจากวนซ้ำเดียว
Kevin Cruijssen

1
ที่จริง 4 ไบต์สามารถบันทึกแทน 3: ลองออนไลน์11 ไบต์ อินพุตจะถูกใช้โดยปริยายสำหรับแฟคทอเรียลแรก!ตอนนี้สแต็กจะว่างเปล่าเนื่องจากเราไม่ได้ทำซ้ำ / เพิ่มขึ้นสามเท่าของ if-result
Kevin Cruijssen

1
ขอบคุณสำหรับความคิดเหล่านี้ แม้ว่าฉันจะไม่ได้รับความคิดในการพิมพ์ในตอนท้าย แต่ฉันก็คิดว่าจะจบเรื่องการวนซ้ำเร็ว หลังจากมองหาจุดหยุดจบเลิกและหลบหนีฉันแค่คิดว่าฉันไม่เข้าใจวิธีการทำงานของลูปอย่างถูกต้อง ยุติอย่างใดไม่เคยเกิดขึ้นกับฉัน
nedla2004

1
คำตอบของคุณค่อนข้างดีอยู่แล้ว โดยปกติแล้วการตีกอล์ฟจะมีคำตอบที่มีอยู่ให้ง่ายกว่าเดิมจากนั้นก็เล่นกอล์ฟด้วยตัวเองจากสิ่งใด ถ้าฉันจะทำสิ่งนี้ด้วยตัวเองฉันก็คงจะลงเอยที่ 15 หรือ 14 ไบต์เช่นกัน ฉันใช้ความคิดของคุณในการทำลายและแทนที่ด้วยผลลัพธ์ที่ถูกยกเลิกและโดยปริยายแทนหลังจากนั้นฉันลองทำบางสิ่งและในที่สุดฉันก็เห็นว่าฉันไม่ต้องการสำเนาที่ซ้ำกันอีกต่อไปซึ่งจะแก้ไขกรณีทดสอบที่1แสดงอินพุตโดยปริยาย เมื่อสแต็กว่างเปล่า :)
Kevin Cruijssen

1
FYI: ฉันได้โพสต์ทางเลือก 7 ไบต์โดยการย้ายDennis ♦ 'Jelly answer และเช่นเคยเดนนิส♦สามารถแสดงเวทย์มนตร์ในรูปแบบของเจลลี่โค้ดกอล์ฟ .. .. p
Kevin Cruijssen


0

ถ่าน 20 ไบต์

NθI⊕ΣEθ‹Π⊕…ιθ∨Π…¹⊕ι¹

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ                      Input `n`
    Σ                   Sum of
      θ                 `n`
     E                  Mapped over implicit range
        Π               Product of
           ι            Current value
          …             Range to
            θ           `n`
         ⊕              Incremented
       ‹                Less than
              Π         Product of
                ¹       Literal 1
               …        Range to
                  ι     Current value
                 ⊕      Incremented
             ∨          Logical Or
                   ¹    Literal 1
   ⊕                    Incremented
  I                     Cast to string
                        Implicitly print

Productในรายการที่ว่างเปล่าในถ่านผลตอบแทนที่Noneมากกว่า1ดังนั้นฉันจะต้องมีเหตุผลOrมัน


คุณแน่ใจหรือว่าตัวละครเหล่านี้แต่ละตัวมีขนาด 8 บิต?
RosLuP

@RosLuP Charcoal เป็นหนึ่งในหลาย ๆ ภาษาที่คุณอาจพบที่นี่ซึ่งใช้หน้ารหัสที่กำหนดเองแทนพูด ASCII ซึ่งหมายความว่าค่าแปดบิตแต่ละค่าถูกแมปกับสัญลักษณ์ที่กำหนดเอง สัญลักษณ์เหล่านี้ได้รับการออกแบบมาเพื่อช่วยให้โปรแกรมเมอร์จดจำสิ่งที่แต่ละไบต์ทำได้ง่ายกว่าเพียงเล็กน้อยหากพวกมันถูกกระจายแบบสุ่มระหว่างหนึ่งในหน้ารหัสมาตรฐาน อย่าลังเลที่จะสอบถามรายละเอียดเพิ่มเติมในการแชท PPCG
Phlarx

0

PHP , 107 ไบต์

<?php $x=fgets(STDIN);function f($i){return $i==0?:$i*f($i-1);}$n=1;while(f($x)<f($x-$n)**2){$n++;}echo $n;

ลองออนไลน์!

ใช้เหมือนกัน x2>((x-1)!)2 วิธีการตามที่คนอื่นได้ใช้

ใช้ฟังก์ชัน factorial จากการส่ง PHP สำหรับความท้าทายนี้ (ขอบคุณ @ donutdan4114)



0

05AB1E , 7 ไบต์

L!ns!@O

คำตอบของเยลลี่ Port of Dennis ♦ดังนั้นอย่าลืมโหวตให้เขาถ้าคุณชอบคำตอบนี้!

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

คำอธิบาย:

L          # List in the range [1, (implicit) input]
 !         # Take the factorial of each
  n        # Then square each
   s!      # Take the factorial of the input
     @     # Check for each value in the list if they are larger than or equal to the
           # input-faculty (1 if truthy; 0 if falsey)
      O    # Sum, so determine the amount of truthy checks (and output implicitly)

0

Japtap -x, 7 ไบต์

วิธีการแก้ปัญหาวุ้นของพอร์ตเดนนิส

ทำงานได้จริงในทางปฏิบัติจนถึงn=4เมื่อเราเข้าสู่สัญกรณ์ทางวิทยาศาสตร์ข้างต้น

õÊ®²¨U²

ลองมัน

õ           :Range [1,input]
 Ê          :Factorial of each
  ®         :Map
   ²        :  Square
    ¨       :  Greater than or equal to
     U²     :  Input squared
            :Implicitly reduce by addition


0

C (gcc) , 68 ไบต์

n;f(x){int i=2,j=x,b=1,g=x;while(i<j)b*i>g?g*=--j:(b*=i++);n=x-j+1;}

ลองออนไลน์!

แก้ไข: ไบต์การซื้อขายกับ mults ไม่ทำ 2 * x mults แทน x + n

แก้ไข: เลื่อนกลับไปที่ int แทนที่จะผ่านมาโคร จะล้มเหลวที่ 34 ด้วยความยาว

ทีนี้ฉันมีสิ่งนี้ในค. ล้มเหลวตอนอายุ 21

มีความกำกวมที่เป็นไปได้ว่าเด็กดีต้องการชนะหรือไม่แพ้ ... คุณคิดอย่างไร?


โดยทั่วไปเราไม่อนุญาตให้วิธีที่คุณกำหนด T เป็นประเภทใด ๆ คุณสามารถรับ 72 ไบต์ได้โดยลบการอ้างอิงทั้งหมดไปที่ T แต่คุณต้องส่งต่อการประกาศยังคงเป็น i / j / b / g ลองออนไลน์!
LambdaBeta

ตกลงฉันจะคืนค่าเวอร์ชันด้วย int ซึ่งยังคงเป็น 68 ไบต์ ดังนั้นฉันจึงไม่ได้โกงจริง ๆ )
Balzola

ฉันปล่อยรุ่น T ไว้ที่นั่นรวมถึงทางเลือกอื่น มันน่าสนใจที่จะลองประเภทที่ใหญ่กว่า / เล็กกว่า แม้ว่าการส่งที่ดี!
LambdaBeta

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.