1 + 1 = 10,1 + 2 = 3


26

在以10为底和以2为底的基础上编写一个函数或程序,使其无法执行简单的算术运算(加,减,乘和除)。

该函数将以数学表达式作为输入,并以正确的底数输出正确的结果。输入的n数字将由一个或多个运算符(+ - * /)分隔。

如果所有输入值仅包含0和1,则将所有值视为二进制。如果至少一位数字为2-9,则所有值均被视为以10为底。

规则:

  • 您可以假设数字之间只有一个运算符(10*-1不会出现)
  • 您可以假设没有括号。
  • 普通运算符优先级(如果您有疑问,请尝试在Google计算器中使用表达式)。
  • 您不能假设只会有整数
  • 输入或输出中将没有前导零
  • 您可以假设只会提供有效的输入
  • 您可以假设所有输入值均为正(但减号运算符可能使负输出成为可能,1-2=-110-100=-10
  • 不接受REPL
  • 您可以选择将输入作为单独的参数或作为单个参数,但是输入必须以正确的顺序进行。
    • 也就是说,用户可以代表1-2与输入参数1-2,但不12-
  • 您必须接受+ - * /输入中的符号,不能接受plusminus等等。
  • 您必须支持浮点值(或不超过您的语言的最大限制,但是不支持仅整数)。
  • eval 被接受

例子:

1+1
10

1010+10-1
1011

102+10-1
111

1+2+3
6

10*10*10
1000

11*11*11
11011

10*11*12+1
1321

10.1*10.1
110.01

20.2*20.2
408.04

10/5
2

110/10
11

Also accepted (optional line or comma-separated input):
10
+
10
-
1
11    <-- This is the output

这是代码高尔夫,所以最短的代码(以字节为单位)将获胜。


在的情况下110/10,可以11.0接受吗?
isaacg '16

@isaacg是的,没关系:-)
Stewie Griffin

5
下票...为什么?
Stewie Griffin

Answers:


5

Japt,77 72 62 60 62 * 60 59 51字节

OvUf"[2-9]" ?U:"({Ur"[\\d.]+""º$&e14+P n2 /2pE¹"})¤

说明(与JS答案大致相同):

Ov                       //eval...
  Uf"[2-9]"              //if input contains the digits 2 to 9
    U:                   //then it's base 10, just compute
    Ur"[\\d.]+"          //otherwise replace all the numbers
    "º$&e14+P n2 /2pE¹"  //with their base 10 equivalents
                         //I.e., take every number, multiple by 10^14, convert to
                         //base 10 and divide by 2^14
                         // º and ¹ are multiple brackets
    ¤                    //means "s2", i.e. convert the result to binary

在线尝试!


*划分不正确


截至5天前,JS eval已分配给Ox。我会看看它是否可以进一步缩短。
ETHproductions 2016年

@Eth谢谢,这节省了5个字节。
nicael

节省了5个字节:OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)可能可以使其生成Japt代码而不是JS,然后使用该代码Ov进行评估。
ETHproductions 2013年

是的,为62个字节:) OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2~~[...]是必需的,因为字符串中不匹配的括号会使transpiler混乱
ETHproductions 2013年

1
51:OvUf"[2-9]" ?U:"({Ur"[\\d.]+""º$&e14+P n2 /2pE¹"})¤
ETHproductions 2016年

9

的JavaScript ES6,87 97 1 100 2 106 3 102 101 98 100 4 93 88 86字节

e=>eval(e.match`[2-9]`?e:`(${e.replace(/[\d.]+/g,"('0b'+$&e14)/16384")}).toString(2)`)

演示+说明:

function c(e){
    return eval(                        
      e.match`[2-9]`?                  //check if there are numbers 2 to 9
        e:                             //if there're, just compute the result
        "("+                           
         e.replace(                    //otherwise replace...
           /[\d.]+/g,                  //any number...
           "(('0b'+$&e14)/16384)"    //...with itself converted to base 10
         )
        +").toString(2)"               //compute the result and convert it to binary
    )
}

document.write(
   c("1.1*1.1")+"<br>"+
   c("1010+10-1")+"<br>"+
   c("102+10-1")+"<br>"+
   c("1+2+3")+"<br>"+
   c("10*10*10")+"<br>"+
   c("11*11*11")+"<br>"+
   c("10*11*12+1")+"<br>"+
   c("10.1*10.1")+"<br>"+
   c("20.2*20.2")+"<br>"+
   c("10/5")+"<br>"+
   c(`10
      +
      10
      -
      1`)
)


1-忘记了浮点数
2-再次出现了浮点数问题:parseInt楼层二进制数,所以我必须乘以1e14然后除以16384
3-希望能够完成给定的任务,现在开始打高尔夫球:D
4-有一个除法错误


10
106 ^ 3个字节?超过一百万!
ETHproductions

2
@Eth我知道会有这样的评论; D
nicael

您可以更改e.match(/[2-9]/g)e.match`[2-9]`
user81655 '16

@user谢谢:)
nicael

@nicael,('0b'+$&*1e14)/1638应该可以工作,但我不确定100%
Downgoat

5

Jolf,31个字节,无竞争

我添加了受此挑战启发的大量功能,因此,它被认为是非竞争性的。我很高兴,因为我终于实现了一元函数(如(H,S,n)=>valES6中一样,但ES5中支持!)

? hi"[2-9]"~eiB~epT mpvid|m'H2H
? hi"[2-9]"                     if the input contains any of 2..9
           ~ei                   evaluate i (implicitly print)
                                else
                   _mpvid        map the input split into number groups
                          m'H2    to H as a binary float
                         |    H   (or keep H, if that doesn't work)
                 pT              join by spaces
               ~e                evaluate
              B                  convert to binary (implicitly print)

测试套件尝试您自己的输入或手动设置输入


4
您的代码对读者说“嗨”!
Cyoce

哇。我没注意到!:D
Conor O'Brien

5

Bash,60个字节

[ -z `tr -dc 2-9<<<$1` ]&&s='obase=2;ibase=2;';bc -l<<<$s$1

示例运行:

$ ./bin_dec_add.sh 1+1
10
$ ./bin_dec_add.sh 1+2
3

@ Pietu1998 dc将要求对操作进行逆向波兰语排序,但是挑战不容许这样做。
Tyzoid

3

𝔼𝕊𝕄𝕚𝕟2,46个字符/ 72个字节

ë(ïđ/[2-9]⎞?ï:`(⦃ïē/[\d.]+⌿,↪(Յ+$*ḊⁿḎ)/Ẁ²)})ⓑ`

Try it here (Firefox only).

说明

ë(ïđ/[2-9]⎞?ï:`(⦃ïē/[\d.]+⌿,↪(Յ+$*ḊⁿḎ)/Ẁ²)})ⓑ` // implicit: ï=input, Ḋ=10, Ḏ=14, Ẁ=128
ë(                                              // eval
  ïđ/[2-9]⎞?                                    // does ï have 2-9?
            ï                                   // if so, eval input
             :                                  // else, eval:
              `(⦃ïē/[\d.]+⌿,                    // replace the binary numbers
                                                // with their base 10 equivalents:
                            ↪(Յ+                // translates to `0b`
                                $*ḊⁿḎ           // matched number * 10^14
                                     )/Ẁ²       // divided by 128^2
                                         )})ⓑ` // converted to binary
                                                // implicit output

1

PowerShell,107个字节

param($e)iex(("{0}String($($e-replace'(\d+)','{0}Int32("$1",2)'),2)"-f'[Convert]::To'),$e)[$e-match'[2-9]']

不打高尔夫球

param($e) # Accept single argument
Invoke-Expression # Eval
  ( # Expression, resulting in an array of 2 elements
    (
      "{0}String( # Binary
        $( # Inline subexpression
          $e -replace'(\d+)', '{0}Int32("$1",2)'
          # "1010+10-1" becomes "{0}Int32("1010",2)+{0}Int32("10",2)-{0}Int32("1",2)"
        )
      ,2)"
      -f '[Convert]::To'
      # "{0}Int32("1010",2)+{0}Int32("10",2)-{0}Int32("1",2)" becomes
        "[Convert]::ToString([Convert]::ToInt32("1010",2)+[Convert]::ToInt32("10",2)-[Convert]::ToInt32("1",2),2)"
    ),
      $e # Plain
    )
    [$e-match'[2-9]'] # Return 1st element of array if regex matches, else 0

PS > .\Calc.ps1 1010+10-1
1011

PS > .\Calc.ps1 20.2*20.2
408,04
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.