尽量减少那些人


12

您的任务是使用最少的个数和仅运算符+或来构建自然数-。例如,数字7可以写成1+1+1+1+1+1+1=7,但也可以写成11-1-1-1-1=7。第一个使用7,而第二个仅使用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

Answers:


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>

应该工作到大约10 14 15,此时您开始遇到JavaScript的整数限制。说明:

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两次魔法。首先,它给我的下一个循环单位的长度,其次,如果前两位n*955或者更高,那么我们就需要减去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>

说明

递归函数。生成1s的所有可能排列+,以-或不分隔。它通过递增的基-3-号码,把它变成数字的阵列,每个数字转换执行此0-1+2为空字符串,则连同连接它们1秒。结果字符串evald为JavaScript语句,该语句返回方程式的结果。

因为运算符之间用1s 联接(如+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')

听起来太复杂了,我喜欢。
巴林特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.