Ne kadar şeker yiyebilirsin?


14

Fikir için TNB'deki Geobits'e kredi

Yeterince detayı olmayan bir yazı son zamanlarda ilginç bir oyun ortaya koydu:

2 çocuk bir dizi şeker önünde oturur. Her şeker parçası mevcut toplam şeker miktarı xile 1 ila numaralandırılmıştır x. Her sayının tam olarak 1 oluşumu vardır.

Oyunun amacı, çocukların şeker yemeleri ve yedikleri şekerlerin son bir puana ulaşmaları için daha yüksek puan kazanmalarıdır.

Ancak orijinal yazı, şekerin nasıl seçildiği gibi önemli bilgileri kaçırdı, bu yüzden hikayemizdeki çocuklar büyük çocuğun önce gitmesine karar verdi ve şekerin yarısına kadar yiyebilir, ancak bir kez sıranın sonunu duyurduğunda, fikrini değiştiremez.

Bu oyundaki çocuklardan biri şekerden hoşlanmıyor, bu yüzden olabildiğince az yemek istiyor ve bir keresinde babasının bir kez kod yazmasını izledi ve bundan ne kadar şeker elde etmek için kazandığı becerileri kullanabileceğini zaferi sağlamak için yemek yemeye devam ederken, yine de mümkün olduğunca az yemek yiyor.

Meydan okuma

Toplam şeker sayısı göz önüne alındığında, rakibiniz kalan tüm şekerleri yerse bile x, programınız veya işleviniz zaferi sağlamak için yemesi gereken en az miktarda şeker nüretmelidir.

Doğal olarak daha büyük sayılar daha büyük sayılar yapar, bu yüzden ona ne kadar verirseniz verin, en nbüyük sayıları yiyecektir .

Kurallar

  • xher zaman olacaktır pozitif aralıkta tamsayı 0 < x! <= lnerede ldilinizin numarası işleme yetenekleri üst sınırıdır
  • Çocuk hep yemek olacağı garanti edilir nörneğin, büyük sayılar x = 5ve n = 2o yiyeceğiz 4ve5

Test senaryoları

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

puanlama

Ne yazık ki, cesur yarışmacımızın kodunu yazacak bir şeyi yok, bu yüzden şeker parçalarını kodun karakterlerine yerleştirmek zorunda, sonuç olarak kodunuzun mümkün olduğunca küçük olması gerekiyor, bayttaki en küçük kod kazanıyor!


14
Ne kadar şeker yiyebilirim? Hepsini. Tüm şekerlemeler.
AdmBorkBork

3
Yeni başlık: "Ne kadar şeker yemen gerekiyor?"
Sparr

@Skidsdev O x = 0zamandan beri 0! = 1mi ilgilenilmeli ? (Belki xde Pozitif Tamsayı olarak belirtilmelidir?)
Kronokidal

@Chronocidal "pozitif" tamsayı eklendi
Skidsdev

Yere 10 bin parça şeker attım. Küçük bir figür yere bir delik açtı ve benim yüzümden dev bir şeker mağarası buldu. ):
moonheart08

Yanıtlar:


9

Python 3 , 76 bayt

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)

Çevrimiçi deneyin!

şekeri yemek için hala kazanmak için toplam şeker sayısı ,doğru olmalı, yani .nxx!(xn)!>(xn)!x!>((xn)!)2

-1 ___ 'dan Skidsdev

-3 -6 BMO dan

Sparr'dan -3

Düzeltmek için +6 x = 1


1
En iyi işlevifrom math import factorial as F
Skidsdev

1
Bu özyinelemeyi kısa devre davranışı kullanarak yeniden yazabilirsiniz, örn. ikincisi için n*(F(x)>F(x-n)**2)or f(x,n+1). Benzer şekilde x<2or x*F(x-1)ithalattan daha kısa olan ilk için.
ბიმო

1
Bunların üçü de güzel öneriler, teşekkürler. (Ve eklendi)
nedla2004

1
-3 bayt ile import math;F=math.factorialgitmek için muhtemelen python ipuçları meta bulmak gerekir ...
Sparr

2
@Sparr: Ama F=lambda x:x<2or x*F(x-1)üç bayt daha az mı?
ბიმო

5

JavaScript (ES6), 53 bayt

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

Çevrimiçi deneyin!

Çalışma aralığı

İlginç bir şekilde, çocuk ürünleri arasındaki farklar her zaman IEEE 754 kodlamasına özgü hassasiyet kaybının bir sorun olmadığı kadar büyüktür.

0n170

Nasıl?

pq

  1. p=n!q=1

  2. qp

    • pn
    • qn
    • n

Sonuç, gerekli yineleme sayısıdır. (Her yinelemede, 'diğer çocuktan bir sonraki en yüksek şekeri alırız.')

Yorumlananlar

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

Jöle , 9 bayt

ḊPÐƤ<!€TL

Çevrimiçi deneyin! Veya test takımına bakın .

Nasıl?

Ḋ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
etkileyici ancak açıklanırsa daha eğitici olur
18'de Setop

O olacak ... :)
Jonathan Allan

@Setop - eklendi.
Jonathan Allan

beğen! ve ton faktöriyel ile tüm çözümlere kıyasla hızlı olmalı
Setop

Hayır, hala tüm bu ürünleri ve faktörleri hesaplıyor (diğer çözümlerden daha fazlası).
Jonathan Allan

3

R , 70 41 38 bayt

-29 çünkü Dennis tüm iç fonksiyonları biliyor

-3 tarama () girişine geçme

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

Çevrimiçi deneyin!

Nedla2004 Python3 cevap oldukça basit R uygulaması .

1-elleçlemenin daha temiz bir uygulaması olduğunu hissediyorum ve kıvırcık parantezlerini kaybetmek istiyorum.

Kızgınım hangi yaklaşımı kullanmaya geri dönmedim, daha az katı kullandığım bir delilik, ama yine de bir cumprod()işlev olduğunu bilmediğim bir gerginlik bile . Dennis tarafından büyük optimizasyon.


3

APL (Dyalog Unicode) , 10 bayt

+/!≤2*⍨!∘⍳

Çevrimiçi deneyin!

Dennis Limanı'nın cevabı . Bunun için Dennis'e teşekkürler.

Nasıl:

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

Bu cevap kesinlikle benim tarafımdan yapılmadığından, orijinal cevabımı aşağıda tutacağım.


APL (Dyalog Unicode) , 14 12 11 bayt

(+/!>×\)⌽∘⍳

Çevrimiçi deneyin!

Önek tacit işlevi. Temelde Jonathan'ın cevabının bir Dyalog limanı .

Sohbetteki yardım için ngn ve H.PWiz'e teşekkürler. Bana bir bayt kurtardığı için ngn'e teşekkürler.

Dennis'e orijinal kodumun yanlış olduğunu işaret ettiği için teşekkürler. Görünüşe göre beni 2 bayt kurtardı.

Kullanır ⎕IO←0.

Nasıl:

+/(!>×\)∘⌽∘⍳  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
Eğer +/parantez içinde geçer, bir bileşimler ihmal edilebilir:(+/!>×\)⌽∘⍳
ngn


2

Jöle , 7 bayt

R!²<!ċ0

Çevrimiçi deneyin!

Nasıl çalışır

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.

2

Python 3 , 183 176149 bayt

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]

Çevrimiçi deneyin!

Diğer çözümlerden çok daha hızlı - O (N²) yerine 0 (N) çarpımı - ancak kod boyutunu küçültmeyi başaramıyorum.

-27 Jo King'den



1

05AB1E , 15 11 bayt

E!IN-!n›iNq

Çevrimiçi deneyin!

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 sunumumla aynı yaklaşımı kullanır . 05AB1E için çok yeni yani kod veya açıklama ile ilgili herhangi bir ipucu büyük beğeni topluyor.

Kevin Cruijssen sayesinde -4 bayt


Güzel cevap! Sen golf 3 bayt can böyle girdi bozmadan 1. İf-ifadesi doğruysa, dizini Nyığına iter ve programdan çıkar (bu dizinin örtük olarak çıktısını alır). Girdi 1için if-deyimi falsey olacaktır, ancak girdisini 1dolaylı olarak bu tek yinelemeli döngüden sonra çıktı olarak verecektir .
Kevin Cruijssen

1
Aslında, 3 yerine 4 bayt kaydedilebilir: Çevrimiçi 11 bayt deneyin . Girdi, ilk faktöriyör için dolaylı olarak kullanılacaktır !, artık if sonucunu artık çoğaltmadık / üçe katlamadığımız için yığın boştur.
Kevin Cruijssen

1
Bu fikirler için teşekkürler. Sonunda bu baskı fikrini elde edemesem de, for döngüsünü erken bitirmeyi düşündüm. Mola, bitirme, bırakma ve kaçmayı aradıktan sonra, sadece döngülerin doğru çalışma şeklini anlamadığımı düşündüm. Bir şekilde sona erdirmek hiç aklıma gelmedi.
nedla2004

1
Cevabınız oldukça iyiydi. Mevcut bir cevabı daha da golf oynamak, daha sonra hiçbir şeyden kendiniz golf oynamak genellikle daha kolaydır. Bu zorluğu kendim yapsaydım, muhtemelen 15 veya 14 baytta bitirdim. Ben kırma fikrinizi kullanılan ve birkaç şey denedik bundan sonra yerine sonlandırmak ve örtük çıkışı ile yerini ve gördüm sonunda hangi da düzeltme test durumu olur, artık yinelenen gerek yoktu 1örtülü girişi çıkışı yığın boş olduğunda. :)
Kevin Cruijssen

1
Bilginize: Dennis ♦ 'Jelly cevabını taşıyarak 7 baytlık bir alternatif yayınladım . Her zaman olduğu gibi, Dennis ♦ Jelly kod-golf açısından sihir yapabilir ..; p
Kevin Cruijssen


0

Kömür , 20 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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

Productboş bir listede kömür Noneyerine döner 1, bu yüzden mantıksal olarak Orbunu yapmak zorunda.


Bu karakterlerin her birinin 8 bit olduğundan emin misiniz?
RosLuP

@RosLuP Kömür burada, örneğin ASCII yerine özel bir kod sayfası kullanan birçok dilden biridir. Bu, her sekiz bit değerinin özel bir sembole eşlendiği anlamına gelir; bu semboller, programlayıcının her bir baytın standart kod sayfalarından biri arasında rastgele dağılmış olduklarından biraz daha kolay yaptığını hatırlamasına yardımcı olmak için tasarlanmıştır. PPCG sohbetinde daha fazla ayrıntı istemekten çekinmeyin .
Phlarx

0

PHP , 107 bayt

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

Çevrimiçi deneyin!

x2>((x1)!)2

Bu meydan okuma için PHP gönderimindeki faktöryel işlevi kullanır (@ donutdan4114 sayesinde)



0

05AB1E , 7 bayt

L!ns!@O

Port of Dennis ♦ 'Jelly yanıtı , bu yüzden bu cevabı beğendiyseniz onu oyladığınızdan emin olun!

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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

Japt -x, 7 bayt

Liman Dennis jöle çözümü.

Pratikte sadece n=4bunun üzerinde bilimsel gösterime girene kadar çalışır .

õÊ®²¨U²

Dene

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


0

C (gcc) , 68 bayt

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

Çevrimiçi deneyin!

Düzenleme: mults'a karşı alım satım, x + n yerine 2 * x mults yapmaz

Düzenleme: makro boyunca uzun yerine int'e geri dönme. 34 ile uzun başarısız olur.

Ben C. bu var 21 yaşında başarısız.

İyi çocuğun her zaman kazanmak ya da asla kaybetmek isteyip istemediğine dair olası bir belirsizlik vardır ... ne düşünüyorsunuz?


Tipik olarak T'yi tanımlama şeklinizin herhangi bir tür olmasına izin vermiyoruz. T'ye yapılan tüm referansları kaldırarak 72 bayt alabilirsiniz, ancak i / j / b / g bildirimini iletmeniz gerekir. Çevrimiçi deneyin!
LambdaBeta

Tamam int ile sürümü koymak, hala 68 bayt olan. Yani aslında hile
yapmıyordum

T versiyonunu orada bırakmamın yanı sıra bir alternatif. Daha büyük / daha küçük türleri denemek ilginçtir. Olsa iyi teslim!
LambdaBeta

0

Python 3 , 75 bayt

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

Çevrimiçi deneyin!

74 bayt sürümü

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

ancak bu sürüm 500 için taştı ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.