帮我拖延我的电脑维修!


23

真正的(悲惨的)灵感为您带来了挑战。最近,键盘上的数字行有些零星。按键1-9有时可以工作-但其他时候则无济于事。作为一个狂热的程序员,这太可怕了!(看到那个感叹号吗?这就是您知道它们现在正在起作用的方式。)我不仅经常需要数字本身,而且还需要符号!@#$%^&*(也是完全无效的一半!作为一名C程序员,我对解决这个问题更感兴趣,而不是花时间在忙于编写代码以修复笔记本电脑的忙碌工作上。在过去的几周中,慢慢地,我的代码中的所有数字文字都被替换为十六进制,这样我就不必四处寻找要复制和粘贴的数字。但是,如果没有数字键,有些数字很难输入1-9。例如,数字1不能这么简单地以十六进制形式编写,因此1我将代码中的s 替换为0xF - 0xE。受影响的唯一键1-9,所以我保持充分利用像符号+-/。但是,我不能使用乘法或括号,因为*并且(经常被打破。这导致了您的挑战。

输入项

一个整数,n以stdin或您的语言等效。如果需要,该整数可以在换行符或其他空白字符之前或之后。或者,您可以通过命令行参数接收输入。

您的程序应正确响应负输入,并且至少可以处理32位带符号整数。

输出量

您的程序应以某种可观察的形式输出最短的(以非空白字符表示)可能的方式,以n一个或多个十六进制值的和,差或除的形式写入数字。解决此问题的方法不止一种,并且没有要求您偏爱任何等长输出的要求。

输出应采用以下形式:A % A % A...where A是一个0x仅包含数字的十六进制值A-F a-f,并且%是符号之一-+/。让我们/描述整数除法,而不是浮点数。

(请注意n,按照惯例,当首先评估从左到右的除法,然后是从左到右的加法和减法时,输出结果应该是。)

测试用例

输入输出

  1. 1

    0xF - 0xE(或0xF-0xE0xB-0xA0xd - 0xc0xF/0xF

  2. 15

    0xF

  3. 255

    0xFF

  4. 30

    0xF + 0xF

计分和规则

这是代码高尔夫球。您的初步得分是源文件中的字节数。

您不得使用来源中的任何数字1-9

您可以!@#$%^&*(在来源中使用符号,但是每个符号的得分都会受到+20的惩罚。

您的程序可以由带有n参数的函数代替,只要该函数产生某种形式的可读输出即可。函数的返回值不计为输出。

不允许出现标准漏洞

最低分获胜!祝好运!

我是否在格式化/查询/明晰度方面搞砸了?让我知道!这是我第一次提交该网站!


整数大小是否有上限?另外,负数会以任意精度(即32位)表示吗?
FryAmTheEggman

@FryAmTheEggman编辑原始帖子以澄清。输入可能为负,并且您的程序应正确响应至少32位输入。谢谢!
BrainSteel


在我看来,这是一个非常可靠的规格,但是如果您需要一些反馈,我建议您将其发布在沙箱中(以应对未来的挑战),以便将其发布到主要版本上之前得到人们的反馈,然后人们开始进行研究。 。
马丁·恩德

1
整数还是浮点除法?
edc65

Answers:


5

JavaScript 287(187 + 20 * 5)295(195 + 20 * 5)338(198 + 20 * 7)

该功能检查6个允许的十六进制数字(0xA至0xF)和3个允许的运算符的每种可能组合。通过弹出窗口输出,而不返回要求的值。

我使用[]将逗号分隔的表达式分组,但无法避免5 7个用于括号的循环和函数调用。
为避免数字,在1,2,3中有变量A,B,C(这使代码更加晦涩难懂)

编辑修改后的代码,重点是避免使用'('。Removed if和显式创建RegExp

当心:此功能非常慢,它将超过FireFox中脚本的时间限制,即使对于90之类的小输入也是如此。

为了列举所有可能的表达式,我使用从3开始到永远上升的数字。编码的数字:
0,1,2是运算符+,-,/
4至9是十六进制数字A..F
3不允许
每个数字都使用正则表达式/3|[0-2]{2}/进行检查以避免数字3并具有2个连续的运算符(检查还应避免让步并领先运营商-参见代码)

结果字符串是类似0xA + 0xA - 0xD的有效JavaScript,因此我使用eval进行评估。不幸的是,'/'运算符是浮点数,而不是JavaScript中的整数,因此我不能100%确定结果是否为正确的事件类型转换,以对最终结果进行整数化(但是我很有信心,因为很小的舍入误差不能被'*'放大)

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,j=0;j?x-~~eval(L):A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',L='',w='0x')?j='':j)
      c>C?w+=' ABCDEF'[c-C]:[L+=w,w=' '+'+-/'[c]+' 0x']
  }
  alert(L)
}

还有别的

现在,一些有趣的事情。我使用了过于简化的expressione解析器来避免eval调用,有趣的是,事实证明它要快得多。

解析器确实得到了简化,在真正的解析器中,V和O应该是包含未决值堆栈和未决运算符堆栈的数组。这里V是单个挂起的值(也是返回值),而O是最多包含2个字符的字符串。P包含运算符优先级表,用于'-+ /'=>'112'

这得分275 + 4 * 20 => 355

F=x=>{
  for(A=-~0,B=A+A,i=C=A+B,D=A+C,j=0,P=''+A+A+B;j?x-V:A;)
  {
    j=++i+'0',k=0+j;
    for(c of~k.search(C+'|[0-'+B+']{'+B+'}',v=V=O=L='',w='0x')?j='':j)
      c>C?
        w+='ABCDEF'[v<<=D,v+=D+A-~c,c-D]
      :[
          P[O[0]]>=P[c]?[v=O>A?V/v|0:O>0?V+v:V-v,O=c]:O=c+O,
          L+=w,w=' '+'-+/'[c]+' 0x',V=v,v=0
      ]
  }
  alert(L)
}

测试在Firefox / FireBug控制台中,使用返回更改警报(更多有用)

;[0, 1, 15, 255, 30].forEach(x=>console.log(x,F(x)))

0 0xA-0xA
1 0xA / 0xA
15 0xF
255 0xFF
30 0xF + 0xF

不太明显(但要耐心)

;[16,40, 51, 62, 73, 84, 95].forEach(x=>console.log(x,F(x)))

16 0xBA / 0xB
40 0xA + 0xF + 0xF
51 0xDD-0xAA
62 0xEA-0xAC
73 0xA + 0xEA-0xAB
84 0xFE-0xAA
95 0xA + 0xFF-0xAA


3

Python 2:185字节+ 2 * 20 = 225

认真回答的时间太长了。但是,由于目前还没有答案,因此无论如何我都会发布。

from itertools import product as p
n=input()
l=t=0
while~l:
 l=-~l
 for i in p("0xABCDEF+-/",repeat=l):
  j=""
  for k in i:j+=k
  try:exec"t="+j
  except:0
  if t==n:print j;l=~0;break

product创建允许的字符的所有不同排列。exec尝试对其进行解码。可悲的是,从长try - catch块开始,这将返回异常。结果很好,它打印并存在。

2倍的罚款,因为在函数调用期间使用了括号。


2
这个答案可能有两个问题:(1)0不是十六进制文字;(2)涉及在Python负数司给出了不同的结果比C.
feersum
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.