1 + 1 = 10, 1 + 2 = 3


26

밑 10과 밑 2 모두에서 간단한 산술 (더하기, 빼기, 곱하기 및 나누기)을 수행 할 수있는 것보다 함수 나 프로그램을 작성하십시오.

이 함수는 수학적 표현을 입력으로 받아 정확한 결과를 정확한베이스에 출력합니다. 입력은 n하나 이상의 연산자 ( + - * /)로 구분 된 숫자 입니다.

모든 입력 값에 0과 1 만 포함 된 경우 모든 값은 이진으로 간주됩니다. 하나 이상의 숫자가 인 2-9경우 모든 값은 10 진으로 간주됩니다.

규칙 :

  • 숫자 사이에 연산자가 하나만 있다고 가정 할 수 있습니다 ( 10*-1표시되지 않음)
  • 괄호가 없을 것이라고 가정 할 수 있습니다.
  • 일반적인 연산자 우선 순위 (잘 모르는 경우 Google 계산기에서 표현을 시도하십시오).
  • 정수만 있다고 가정 할 수는 없습니다.
  • 입력 또는 출력에 선행 0이 없습니다.
  • 유효한 입력 만 제공한다고 가정 할 수 있습니다
  • 모든 입력 값은 양수 가정 할 수있다 (그러나 마이너스 연산자는 음의 출력을 가능하게하는, 수 1-2=-110-100=-10)
  • REPL은 허용되지 않습니다
  • 당신은 별도의 인수로 또는 단일 인수로 입력을 선택할 수 있지만, 입력 올바른 순서로.
    • 즉 당신이 나타낼 수 1-2입력 인수 1, -, 2,하지만 1, 2, -.
  • 당신은 기호에 동의해야 + - * /입력에,하지 plus, minus
  • 부동 소수점 값을 지원해야합니다 (또는 언어의 최대 한계까지 가능하지만 정수만 지원하는 것은 허용되지 않음).
  • 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

@isaacg 예, 괜찮습니다 :-)
Stewie Griffin

5
downvote ... 왜?
Stewie Griffin

답변:


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

온라인으로 사용해보십시오!


* 제대로 나누지 않았다


현재 1 일 전 , JS의이 eval할당됩니다 Ox. 더 짧아 질 수 있는지 살펴 보겠습니다.
ETHproductions

@Eth 감사합니다. 이렇게하면 5 바이트가 절약됩니다.
nicael

5 바이트 더 절약 : OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)JS 대신 Japt 코드를 생성 한 다음이 Ov를 평가하는 데 사용할 수 있습니다.
ETHproductions

그래, 62 바이트 : OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2~~[...]있기 때문에 필요 transpiler와 문자열 혼란에 괄호를 일치하지 않는 .
ETHproductions

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

9

자바 스크립트 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 floors binary이므로 1e14를 곱한 다음 16384로 나눕니다 .3-
주어진 작업을 달성했으면 좋겠습니다. 골프를 시작하십시오 : D
4-나누는 버그가있었습니다.


10
106 ^ 3 바이트? 그것은 백만 이상입니다!
ETHproductions

2
@Eth 나는 그런 논평이 다가오고 있음을 알았다; D
nicael

당신은 변경할 수 있습니다 e.match(/[2-9]/g)e.match`[2-9]`.
user81655

@user Thanks :)
nicael

@nicael ('0b'+$&*1e14)/1638해야 작동하지만 난 100 % 확실하지 않다
Downgoat

5

Jolf, 31 바이트, 비경쟁

나는이 도전에서 영감을 얻은 상당한 양의 기능을 추가했기 때문에 경쟁이 아닌 것으로 간주됩니다. (H,S,n)=>valES6에서 와 같이 단항 기능을 마침내 구현했기 때문에 행복합니다 ( ES6에서와 같지만 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
당신의 코드는 독자들에게 "hi"라고 말합니다!
Cyoce

와우. 나는 그것을 알아 차리지 못했다! : D
코너 오브라이언

5

배쉬, 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.