それらを最小化する[非公開]


12

あなたの仕事はものの数が最も少ないと演算子のみ使用して自然数構築することである+かを-。たとえば、7という数字を書く1+1+1+1+1+1+1=7こともできますが、と書くこともできます11-1-1-1-1=77前者は1を使用し、後者はのみを使用し6ます。あなたのタスクは、何らかの自然数の入力が与えられたときに使用できるものの最小数を返すことnです。

これはコードゴルフであるため、バイト単位の最短の有効なコードが優先されます。

テストケース

入力=>出力

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21

素敵な最初の挑戦。さらにテストケースを含めることをお勧めします。単一の出力がある場合、「有効な出力」は間違いですか?また、0は有効な入力であり、もしそうなら、何を出力する必要がありますか?
-xnor

これは興味深い挑戦です。出力の説明changeを追加することもできますVALID OUTPUTS。それはあなたの選択ですが、一般的には大文字の代わりに太字斜体が好きです(強調ではなく叫びのように見えます)。太字は**bold text**、斜体です*italics text*### Text太字のテキストにも使用できます。とにかく、PPCGへようこそ!
-NoOneIsHere

ユーザーがコードを実行できるコンピューター読み取り可能なテーブルまたはテストケースのリストを作成する必要があります。このヒントを参照してください。
-xnor

6
この質問はcodefights.com/challengesでの現在の(アクティブな!!)ゴルフチャレンジの複製であるため、私はこの質問を終了することに投票しています。OPがコードファイトの元のチャレンジの著者でもある場合(これは疑わしい)、コードファイトのチャレンジがアクティブでなくなるまで質問を終了する必要があります。
寂部

1
@Jakube 直接リンクは役に立つかもしれませんが、私は同意します。私は閉会に投票します。
-NoOneIsHere

回答:


3

JavaScript(ES6)、127 126 87バイト

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

JavaScriptの整数制限に達した時点で約10 14 15まで動作するはずです。説明:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

これはn*9マジックを2回使用します。最初の2桁があれば、まず、それは、第二に、私は次レピュニットの長さを与えn*9ている55以上、我々は減算する必要がありnそうでなければ、我々は1を減算することによって計算される前レピュニットを(減算する必要がある、その次レピュニットから、および10で割る。これは最大10 15まで機能するはずです。


2

Pyth、19 16バイト

ffqQvs+R1Y^c3"+-

テストスイート

ブルートフォースアルゴリズム。必要な文字列は['+', '-', '']、テスト対象の1の数に等しい長さの要素を持つすべてのリストを取得し、それぞれに1を追加して、単一の文字列に連結することにより生成されます。次に、これらの文字列が評価され、入力と比較されます。これは、成功した文字列が見つかるまで繰り返されます。

先頭+またはの文字列-はテストされていますが、これは問題ではありません。ただし、入力が負の場合です。

遅くなる前に、長さ9まで実行できます。

説明:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.

2

JavaScript(ES6)、92バイト

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

説明

再帰関数。これ1により、+で区切られたのすべての可能な順列が生成されます-。これは、各桁を変換する、数字の配列にそれを回す、ベース3の数を増分することによってこれを行う0には-1+2一緒にそれらを接合次いで、空の文字列に1S。結果の文字列はeval、方程式の結果を返すJavaScriptステートメントとしてのdです。

演算子は1間にsで結合されているため(など+1+1+1+)、length - 1 1s があります。最初の演算子は無視され(+1= 1<nothing>1=で1あり、数字なので、先頭にが存在しない0ため-)、最後の演算子も無視されます(.0方程式に追加することにより)。

高出力バージョン、96バイト

他のバージョンは、再帰呼び出しスタックの制限のために、10を超える出力を返すことはできません。このバージョンでは、再帰ではなくforループが使用されるため、最大33までの出力を返すことができます。必要な時間は指数関数的に増加しますが、テストすることはお勧めしません。

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')

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