Berapa banyak permen yang bisa kamu makan?

14

Kredit untuk Geobits di TNB untuk ide itu

Sebuah posting tanpa detail yang cukup baru-baru ini mengemukakan permainan yang menarik:

2 anak duduk di depan sederet permen. Setiap potongan permen diberi nomor 1 x, dengan xjumlah total permen yang ada. Ada persis 1 kemunculan setiap angka.

Tujuan permainan ini adalah agar anak-anak makan permen dan melipatgandakan nilai permen yang mereka makan untuk mencapai skor akhir, dengan skor yang lebih tinggi menang.

Namun posting asli melewatkan informasi penting, seperti bagaimana permen dipilih, sehingga anak-anak dalam cerita kami memutuskan bahwa anak yang lebih tua harus pergi duluan, dan dapat memakan hingga setengah permen, namun begitu ia mengumumkan akhir gilirannya, dia tidak bisa mengubah pikirannya.

Salah satu anak dalam permainan ini tidak suka permen, jadi dia ingin makan sesedikit mungkin, dan dia pernah melihat ayahnya menulis beberapa kode sekali, dan angka dia bisa menggunakan keterampilan yang diperoleh dari itu untuk mengetahui berapa banyak permen dia perlu makan untuk memastikan kemenangan, sementara masih makan sesedikit mungkin.

Tantangan

Mengingat jumlah total permen x, program atau fungsi Anda harus menghasilkan jumlah permen terkecil yang harus ia makan untuk memastikan kemenangan n,, bahkan jika lawannya memakan semua sisa permen.

Secara alami jumlah yang lebih besar menghasilkan angka yang lebih besar, jadi berapa pun jumlah yang akan Anda berikan kepadanya, ia akan memakan jumlah nterbesar.

Aturan

  • xakan selalu menjadi bilangan bulat positif dalam rentang di 0 < x! <= lmana lbatas atas kemampuan penanganan angka bahasa Anda
  • Dijamin bahwa anak akan selalu makan jumlah nterbesar, misalnya untuk x = 5dan n = 2, dia akan makan 4dan5

Uji kasus

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]))

Mencetak gol

Sayangnya, kontestan pemberani kami tidak memiliki apa pun untuk menulis kodenya, jadi ia harus mengatur potongan-potongan permen ke dalam karakter kode, sebagai akibatnya, kode Anda harus sekecil mungkin, kode terkecil dalam byte menang!

Skidsdev
sumber
14
Berapa banyak permen yang bisa saya makan? Semua itu. Semua permen.
AdmBorkBork
3
Judul baru: "Berapa banyak permen yang perlu kamu makan?"
Sparr
@ Skidsdev x = 0Juga harus ditangani, karena 0! = 1? (Mungkin xjuga harus ditetapkan sebagai
bilangan bulat
@Chronocidal menambahkan integer "positif"
Skidsdev
Saya melemparkan 10 ribu permen ke tanah. Sesosok kecil menggali lubang ke tanah dan menemukan gua permen raksasa karena saya. ):
moonheart08

Jawaban:

9

Python 3 , 76 byte

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)

Cobalah online!

Bergantung pada fakta bahwa untuk memakan n permen tetap menang dan jumlah total permen menjadi x , x!(xn)!>(xn)!pasti benar, yang berartix!>((xn)!)2.

-1 dari Skidsdev

-3 -6 dari BMO

-3 dari Sparr

+6 untuk memperbaikinya x = 1

nedla2004
sumber
1
Anda dapat menyimpan 1 byte dengan mengganti fungsi teratas denganfrom math import factorial as F
Skidsdev
1
Anda dapat menulis ulang rekursi ini menggunakan perilaku hubungan arus pendek, misalnya. untuk yang kedua: n*(F(x)>F(x-n)**2)or f(x,n+1). Demikian pula x<2or x*F(x-1)untuk yang pertama yang lebih pendek dari impor.
ბიმო
1
Ketiganya adalah saran yang bagus, terima kasih. (Dan ditambahkan)
nedla2004
1
-3 byte import math;F=math.factorialyang saya mungkin harus mencari meta tips python menyebutkan ...
Sparr
2
@Parr: Tapi F=lambda x:x<2or x*F(x-1)apakah tiga byte lebih sedikit?
ბიმო
5

JavaScript (ES6), 53 byte

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

Cobalah online!

Jarak kerja

Menariknya, perbedaan antara produk anak-anak selalu cukup besar sehingga hilangnya presisi yang melekat pada pengkodean IEEE 754 tidak menjadi masalah.

Sebagai hasilnya, ia bekerja untuk 0n170 . Di luar itu, mantissa dan eksponen berlebih (menghasilkan + Infinity ) dan kami membutuhkan BigInts (+1 byte).

Bagaimana?

Biarkan p menjadi produk permen anak lain dan biarkan q menjadi produk permen kami sendiri.

  1. Kita mulai dengan p=n!(semua permen untuk anak lain) dan q=1 (tidak ada untuk kita).

  2. Kami ulangi operasi berikut sampai qp :

    • bagi p dengan n
    • kalikan q dengan n
    • penurunan n

Hasilnya adalah jumlah iterasi yang diperlukan. (Pada setiap iterasi, kami 'mengambil permen tertinggi berikutnya dari anak lain'.)

Berkomentar

Ini diimplementasikan sebagai fungsi rekursif tunggal yang menghitung n!dan kemudian memasuki loop yang dijelaskan di atas.

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
Arnauld
sumber
4

Jelly , 9 byte

ḊPÐƤ<!€TL

Cobalah online! Atau lihat test-suite .

Bagaimana?

Ḋ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
Jonathan Allan
sumber
1
itu mengesankan tetapi akan lebih mendidik jika dijelaskan
Setop
Itu akan menjadi ... :)
Jonathan Allan
@Setop - ditambahkan.
Jonathan Allan
suka itu ! dan itu harus cepat dibandingkan dengan semua solusi dengan banyak faktorial
Setop
Nah, masih menghitung semua produk dan faktorial (lebih dari beberapa solusi lain).
Jonathan Allan
3

R , 70 41 38 byte

-29 karena Dennis tahu semua fungsi internal

-3 Berpindah untuk memindai input ()

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

Cobalah online!

Implementasi R dari jawaban Python3 nedla2004 yang cukup sederhana .

Saya merasa ada implementasi yang lebih bersih dari penanganan 1, dan saya ingin kehilangan kurung kurawal.

Aku marah, aku tidak kembali menggunakan pendekatan mana, lebih marah yang aku gunakan kurang ketat, tapi bahkan lebih marah lagi aku tidak tahu ada cumprod()fungsi. Optimasi hebat oleh Dennis.

Kriminal kriminal
sumber
3

APL (Dyalog Unicode) , 10 byte

+/!≤2*⍨!∘⍳

Cobalah online!

Jawaban Port of Dennis . Terima kasih, well, Dennis untuk itu.

Bagaimana:

+/!≤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.

Karena jawaban ini tidak sepenuhnya dibuat oleh saya, saya akan menyimpan jawaban asli saya di bawah.


APL (Dyalog Unicode) , 14 12 11 byte

(+/!>×\)⌽∘⍳

Cobalah online!

Awalan fungsi diam-diam. Pada dasarnya port Dyalog dari jawaban Jonathan .

Terima kasih kepada ngn dan H.PWiz untuk bantuan dalam obrolan. Terima kasih kepada ngn juga karena telah menyelamatkan saya satu byte.

Terima kasih kepada Dennis karena menunjukkan bahwa kode asli saya salah. Ternyata itu menyelamatkan saya 2 byte.

Penggunaan ⎕IO←0.

Bagaimana:

+/(!>×\)∘⌽∘⍳  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.
J. Sallé
sumber
1
jika +/masuk ke dalam tanda kurung, satu komposisi dapat dihilangkan:(+/!>×\)⌽∘⍳
ngn
2

Haskell , 52 51 byte

nx!(xn)!n(xn)!n

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

Cobalah online!

cacat
sumber
2

Jelly , 7 byte

R!²<!ċ0

Cobalah online!

Bagaimana itu bekerja

R!²<!ċ0  Main link. Argument: n

R        Range; yield [1, ..., n].
 !       Map factorial over the range.
  ²      Take the squares of the factorials.
    !    Compute the factorial of n.
   <     Compare the squares with the factorial of n.
     ċ0  Count the number of zeroes.
Dennis
sumber
2

Python 3 , 183 176 149 byte

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]

Cobalah online!

Ini jauh lebih cepat daripada beberapa solusi lain - 0 (N) perkalian bukan O (N²) - tapi saya tidak bisa mengurangi ukuran kode.

-27 dari Jo King

Setop
sumber
1

05AB1E , 15 11 byte

E!IN-!n›iNq

Cobalah online!

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

Menggunakan pendekatan yang sama dengan Python saya pengiriman . Sangat baru untuk 05AB1E sehingga tips tentang kode atau penjelasan sangat dihargai.

-4 byte terima kasih kepada Kevin Cruijssen

nedla2004
sumber
Jawaban bagus! Anda dapat golf 3 byte seperti ini tanpa merusak input 1. Jika pernyataan if benar, itu akan mendorong indeks Nke stack dan keluar dari program (mengeluarkan indeks itu secara implisit). Untuk input 1, if-statement akan menjadi falsey, tetapi akan mengeluarkan inputnya 1secara implisit setelah loop iterasi tunggal.
Kevin Cruijssen
1
Sebenarnya, 4 byte dapat disimpan, bukan 3: Cobalah secara online 11 byte . Input akan digunakan secara implisit untuk faktorial pertama !, karena stack kosong karena kami tidak lagi menggandakan / melipatgandakan hasil jika.
Kevin Cruijssen
1
Terima kasih atas ide-ide ini. Meskipun saya tidak sampai pada ide ini untuk mencetak di akhir, saya memang berpikir untuk mengakhiri for for early. Setelah mencari istirahat, mengakhiri, berhenti dan melarikan diri, saya hanya berpikir saya tidak mengerti cara kerja loop dengan benar. Entah bagaimana terminasi tidak pernah terjadi pada saya.
nedla2004
1
Jawaban Anda sudah cukup bagus. Biasanya lebih mudah untuk golf jawaban yang ada lebih lanjut, kemudian untuk golf sendiri dari nol. Jika saya akan melakukan tantangan ini sendiri, saya mungkin akan berakhir pada 15 atau 14 byte juga. Saya menggunakan ide Anda untuk memecahkan dan menggantinya dengan keluaran yang berakhir dan tersirat sebagai gantinya, setelah itu saya mencoba beberapa hal, dan pada akhirnya saya melihat saya tidak perlu duplikat lagi, yang juga akan memperbaiki test case yang 1menghasilkan input secara implisit saat tumpukan kosong. :)
Kevin Cruijssen
1
FYI: Saya telah memposting alternatif 7 byte dengan mengirimkan jawaban Dennis ♦ 'Jelly. Seperti biasa, Dennis ♦ mampu melakukan sihir dalam hal bermain kode Jelly ..; p
Kevin Cruijssen
0

Arang , 20 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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

Productpada daftar kosong di Arang mengembalikan Nonedaripada 1, jadi saya harus secara logis Or.

Neil
sumber
Apakah Anda yakin masing-masing karakter ini 8 bit?
RosLuP
@RosLuP Charcoal adalah salah satu dari banyak bahasa yang mungkin Anda temukan di sini yang menggunakan halaman kode khusus alih-alih, katakanlah, ASCII. Ini berarti bahwa setiap nilai delapan-bit dipetakan ke simbol khusus; simbol-simbol ini dirancang untuk membantu programmer mengingat apa yang setiap byte lakukan sedikit lebih mudah daripada jika mereka hanya tersebar secara acak di antara salah satu halaman kode standar. Jangan sungkan untuk meminta detail lebih lanjut dalam obrolan PPCG .
Phlarx
0

PHP , 107 byte

<?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;

Cobalah online!

Menggunakan hal yang sama x2>((x-1)!)2 metode seperti yang lain telah digunakan.

Menggunakan fungsi faktorial dari pengiriman PHP untuk tantangan ini (terima kasih kepada @ donutdan4114)

NK1406
sumber
0

05AB1E , 7 byte

L!ns!@O

Port of Dennis ♦ Jelly menjawab , jadi pastikan untuk membesarkan hatinya jika Anda suka jawaban ini!

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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)
Kevin Cruijssen
sumber
0

Japt -x , 7 byte

Solusi Port of Dennis 'Jelly.

Hanya bekerja dalam praktik hingga n=4 saat kita masuk ke notasi ilmiah di atas itu.

õÊ®²¨U²

Cobalah

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

C # (.NET Core) , 93 byte

n=>{int d(int k)=>k<2?1:k*d(k-1);int a=1,b=d(n),c=n;for(;;){a*=n;b/=n--;if(a>=b)return c-n;}}

Cobalah online!

Didasarkan atas jawaban javascript @ Arnauld.

Perwujudan Ketidaktahuan
sumber
0

C (gcc) , 68 byte

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

Cobalah online!

Sunting: memperdagangkan byte terhadap mult, tidak melakukan 2 * x mult, bukan x + n

Sunting: kembali ke int alih-alih melalui makro. Akan gagal di 34 dengan lama.

Yah saya punya ini di C. Gagal di 21.

Ada kemungkinan ambiguitas, apakah anak yang baik ingin selalu menang atau tidak pernah kalah ... bagaimana menurut Anda?

Balzola
sumber
Biasanya kami tidak mengizinkan cara Anda mendefinisikan T untuk jenis apa pun. Anda bisa mendapatkan 72 byte dengan menghapus semua referensi ke T, tetapi Anda harus meneruskan menyatakan i / j / b / g.Cobalah online!
LambdaBeta
OK saya mengembalikan versi dengan int, yang masih 68 byte. Jadi saya sebenarnya tidak curang;)
Balzola
Saya akan meninggalkan versi T di sana juga sebagai alternatif. Sangat menarik untuk mencoba jenis yang lebih besar / lebih kecil. Pengajuan yang bagus!
LambdaBeta
0

Python 3 , 75 byte

f=lambda n:n<1or f(n-1)*n
n=lambda x:x-sum(f(n)**2<f(x)for n in range(1,x))

Cobalah online!

Versi 74 byte

f=lambda n:n<1or f(n-1)*n
n=lambda x:1+sum(f(n)>f(x)**.5for n in range(x))

tetapi versi ini meluap selama 500 ...

David
sumber