お菓子はどれくらい食べられますか?


14

TNBのGeobitsのアイデアの功績

ポスト十分な詳細なしでは最近、面白いゲームを仮定しました:

2人の子供がキャンディーの前に座っています。キャンディの各部分は、1と番号付けされるxと、xキャンディ本の合計量です。各番号のオカレンスは1つだけです。

ゲームの目標は、子供たちがキャンディーを食べ、食べたキャンディーの値を掛けて最終スコアを獲得し、より高いスコアを獲得することです。

しかし、元の投稿ではキャンディーの選択方法などの重要な情報が欠落していたため、ストーリーの子供たちは、年長の子供が最初に行き、キャンディーの半分まで食べることができると決めましたが、ターンの終わりを発表すると、彼は心を変えることはできません。

このゲームの子供の一人はキャンディーが好きではないので、彼はできるだけ食べたくないので、父親が一度コードを書くのを見たことがあり、それから得たスキルを使ってキャンディーの量を計算できると考えていますできるだけ少ない量を食べながら、勝利を確実にするために食べる必要があります。

チャレンジ

キャンディの総数を考えると、xプログラムまたは関数はn、相手が残りのキャンディをすべて食べたとしても、勝利を確実にするために食べる必要があるキャンディの最小量を出力する必要があります。

当然のことながら、数字が大きいほど数字が大きくなるので、どんな量を与えても、n最大の数字を食べます。

ルール

  • xこれからもずっと正の範囲の整数あなたの言語の数処理能力の上限であります0 < x! <= ll
  • 子供は常にn最大の数を食べることが保証されています、例えば、x = 5n = 2、彼は食べる45

テストケース

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
新しいタイトル:「どのくらいのキャンディを食べる必要がありますか?」
スパー

@Skidsdev x = 0も処理する必要があります0! = 1。(おそらくx正の整数としても指定する必要がありますか?)
Chronocidal

@Chronocidalが「正の」整数を追加
Skidsdev

私は地面に1万個のキャンディを投げました。小さな人物が地面に穴を掘り、私のために巨大なキャンディー洞窟を見つけました。):
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キャンディーを食べるためにまだ勝つという事実とキャンディーの総数がxxであることに依存しています!x!(xn)!>(xn)!x!>((xn)!)2を意味するtrueでなければなりません>xn2

-1 from Skidsdev

BMOから-3 -6

-3からSparr

+6修正 x = 1


1
top関数をfrom math import factorial as F
Skidsdev

1
これらの再帰は、短絡動作を使用して書き換えることができます。2番目の場合:n*(F(x)>F(x-n)**2)or f(x,n+1)。同様x<2or x*F(x-1)に、インポートよりも短い最初のものについて。
ბიმო

1
これらの3つはすべて良い提案です、ありがとう。(および追加)
nedla2004

1
-3でバイトimport math;F=math.factorial...私はおそらく言及するのpythonのヒントメタを探しに行くべき
SPARR

2
@Sparr:しかしF=lambda x:x<2or x*F(x-1)、3バイト少ないですか?
ბიმო

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。さらに、仮数と指数の両方がオーバーフローし(+ Infinityを生成)、BigInts(+1バイト)が必要になります。

どうやって?

してみましょうp他の子供のお菓子の製品であるとしましょうq私たち自身のキャンディ製品です。

  1. p=n!から始めます!(他の子供のためのすべてのお菓子)とq=1(私たちにとっては何もありません)。

  2. 私たちは、次のようになるまで動作を繰り返すqp

    • pnで割るn
    • qnを掛けるn
    • 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


@Setop-追加されました。
ジョナサンアラン

いいね !そして、それは、多くの階乗を持つすべてのソリューションと比較しなければなりません
Setop

いや、まだそれらすべての製品と階乗を計算します(他のソリューションよりも)。
ジョナサンアラン

3

R70 41 38バイト

-29デニスはすべての内部機能を知っているため

-3 scan()入力への切り替え

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

オンラインでお試しください!

nedla2004のPython3 answer非常にシンプルなR実装。

1ハンドリングのよりクリーンな実装があるように感じます。中括弧を失いたいと思います。

私は厳密に満たない使用、それでもアカネまだ私がやったことありますか分からないという、アカネをどのアプローチを使用してに戻っていなかった怒っているcumprod()機能は。デニスによる最適化。


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ポート。

チャットのヘルプを提供してくれたngnとH.PWizに感謝します。1バイトも節約してくれた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
場合は+/、括弧内になり、1つの組成物を省略することができます:(+/!>×\)⌽∘⍳
NGN



2

Pythonの3183の 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]

オンラインでお試しください!

他のソリューション(O(N²)ではなく0(N)乗算)よりもはるかに高速ですが、コードサイズを小さくすることはできません。

-27ジョー・キングから



1

05AB1E15 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には非常に新しいので、コードや説明に関するヒントは大歓迎です。

Kevin Cruijssenのおかげで-4バイト


いい答え!入力を中断することなく、このような 3バイトをゴルフできます1。if文が真である場合、インデックスNをスタックにプッシュしてプログラムを終了します(そのインデックスを暗黙的に出力します)。入力1の場合、if文は偽になりますが、その1単一反復ループの後に暗黙的に入力を出力します。
ケビンクルーッセン

1
実際には、3の代わりに4バイトを保存できます:オンラインで11バイト試してください!if-resultの複製/複製が行われなくなったため、スタックは空になったため、入力は最初の階乗に暗黙的に使用されます。
ケビンCruijssen

1
これらのアイデアをありがとう。私は最後にこの印刷のアイデアに到達しませんでしたが、forループを早期に終了することを考えました。休憩、終了、終了、エスケープを探した後、ループが正しく機能する方法を理解していないと思いました。どういうわけか終了は私には決して起こらなかった。
nedla2004

1
あなたの答えはすでにかなり良かった。通常、既存の回答をさらにゴルフにかけ、それから自分で何もないところからゴルフをする方が簡単です。このチャレンジを自分で行った場合、おそらく15バイトまたは14バイトにもなっていたでしょう。私はあなたのブレークのアイデアを使用して、代わりに終了と暗黙の出力に置き換えました。その後、いくつかのことを試しましたが、最終的には重複を必要としないことがわかりました。これにより、テストケースが1暗黙的に入力を出力することも修正されますスタックが空のとき。:)
ケビンクルーイッセン



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

ProductCharcoalの空のリストでは、Noneではなくが返されるため1、論理的にOrそれをする必要があります。


これらの文字はそれぞれ8ビットですか?
RosLuP

@RosLuP Charcoalは、たとえばASCIIの代わりにカスタムコードページを使用する多くの言語の1つです。これは、各8ビット値がカスタムシンボルにマップされることを意味します。これらのシンボルは、標準化されたコードページの1つにランダムに分散されている場合よりも、各バイトの動作をプログラマーが少し簡単に覚えられるように設計されています。PPCGチャットで詳細をお気軽にお尋ねください。
Phlarx



0

05AB1E、7 バイト

L!ns!@O

デニス 'ゼリーの回答です。この回答が気に入ったら、必ず投票してください。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

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

ジャプト -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;}

オンラインでお試しください!

編集:マルチとバイトを交換し、x + nの代わりに2 * xマルチを行わない

編集:ロングスルーマクロの代わりにintに戻ります。長いと34で失敗します。

まあ私はCでこれを持っています。21で失敗します。

良い子が常に勝ちたいのか、負けないのかについて、あいまいさがあります...あなたはどう思いますか?


通常、Tを定義した方法を任意の型にすることはできません。Tへのすべての参照を削除することで72バイトを取得できますが、i / j / b / gを引き続き宣言する必要があります。オンラインでお試しください!
LambdaBeta

OK、intでバージョンを戻しました。これはまだ68バイトです。だから私は実際に不正行為ではなかった;)
バルゾラ

代わりにTバージョンをそのまま残しておきます。大きい/小さいタイプを試してみるのは面白いです。しかし、良い提出!
ラムダベータ

0

Python 3、75バイト

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

オンラインでお試しください!

74バイトバージョン

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

しかし、このバージョンは500のためにオーバーフローしました...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.