1 + 1 = 10、1 + 2 = 3


26

基数10と基数2の両方で単純な算術演算(加算、減算、乗算、除算)を実行できる関数またはプログラムを記述します。

この関数は、数式を入力として受け取り、正しいベースで正しい結果を出力します。入力はn、1つまたは複数の演算子(+ - * /)で区切られた数字になります。

すべての入力値に0と1のみが含まれる場合、すべての値はバイナリと見なされます。少なくとも1桁がの場合2-9、すべての値は基数10と見なされます。

ルール:

  • 数字の間に演算子が1つだけあると仮定できます(表示10*-1されません)
  • 括弧がないと仮定できます。
  • 通常の演算子の優先順位(疑問がある場合は、Google計算機で式を試してください)。
  • 整数しか存在しないと仮定することはできません
  • 入力または出力に先行ゼロはありません
  • 有効な入力のみが与えられると仮定できます
  • すべての入力値が正であると仮定できます(ただし、マイナス演算子を使用すると負の出力が可能になる場合が1-2=-1あります10-100=-10
  • REPLは受け入れられません
  • 入力を個別の引数または単一の引数として選択することもできますが、入力正しい順序でなければなりません。
    • つまり、あなたは表すことができる1-2入力引数で1-2、ではなく12-
  • など+ - * /ではなく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/1011.0受け入れられますか?
isaacg

@isaacgはい、それは大丈夫です:
ウィーグリフィン

5
downvote ...なぜですか?
スティーヴィーグリフィン

回答:


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

@Ethありがとう、これで5バイト節約できます。
ニカエル

さらに5バイトを節約:OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)JSの代わりにJaptコードを生成し、それを使用Ovして評価することはおそらく可能です。
ETHproductions

うん、62バイト:) 文字列の括弧の不一致がtranspilerを混乱させるため、OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2これ~~[...]が必要です
ETHproductions

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

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 -山車を忘れてしまった
私は16384によって乗算1E14によると、その後、分割する必要がありますのでparseIntは床バイナリ:再び問題が浮かぶ- 2
3 -今度はゴルフに開始し、与えられたタスクを達成することを希望:D
-分割でのバグがありました4


10
106 ^ 3バイト?それは100万以上です!
ETHproductions

2
@Eth私はそのようなコメントが来ることを知っていた; D-
ニカエル

あなたは変更することができますe.match(/[2-9]/g)e.match`[2-9]`
user81655

@ユーザーありがとう:)
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
あなたのコードは読者に「こんにちは」と言っています!
チョイス

ワオ。気付かなかった!:D
コナーオブライエン

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では、操作の逆ポーランド順序付けが必要になりますが、これはチャレンジによって許可されません。
タイゾイド

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.