1 + 1 = 10, 1 + 2 = 3

26

Tulis fungsi atau program daripada yang dapat dilakukan aritmatika sederhana (penjumlahan, pengurangan, penggandaan, dan pembagian) dalam basis 10 dan basis 2.

Fungsi akan mengambil ekspresi matematis sebagai input, dan mengeluarkan hasil yang benar di basis yang benar. Input akan menjadi nangka yang dipisahkan oleh satu atau beberapa operator ( + - * /).

Jika semua nilai input hanya berisi 0 dan 1, semua nilai dianggap biner. Jika setidaknya satu digit 2-9, semua nilai dianggap sebagai basis 10.

Aturan:

  • Anda dapat mengasumsikan hanya akan ada satu operator di antara angka ( 10*-1tidak akan muncul)
  • Anda dapat mengasumsikan tidak akan ada tanda kurung.
  • Diutamakan operator normal (coba ekspresi dalam kalkulator google jika Anda ragu).
  • Anda tidak dapat mengasumsikan hanya akan ada bilangan bulat
  • Tidak akan ada angka nol di depan dalam input atau output
  • Anda dapat mengasumsikan hanya input yang valid yang akan diberikan
  • Anda dapat mengasumsikan semua nilai input positif (tetapi operator minus dapat membuat output negatif menjadi mungkin, 1-2=-1dan 10-100=-10)
  • REPL tidak diterima
  • Anda dapat memilih untuk mengambil input sebagai argumen yang terpisah, atau sebagai argumen tunggal, tetapi input memiliki berada di urutan yang benar.
    • Yaitu Anda dapat mewakili 1-2dengan argumen input 1, -, 2, tapi tidak 1, 2, -.
  • Anda harus menerima simbol + - * /dalam input, bukan plus, minusdll.
  • Anda harus mendukung nilai floating point (atau hingga batas maksimum bahasa Anda, namun hanya bilangan bulat yang mendukung tidak diterima).
  • eval diterima

Contoh:

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

Ini adalah kode golf, jadi kode terpendek dalam byte akan menang.

Stewie Griffin
sumber
Dalam hal 110/10, apakah 11.0dapat diterima?
isaacg
@isaacg ya, tidak apa-apa :-)
Stewie Griffin
5
The downvote ... mengapa?
Stewie Griffin

Jawaban:

5

Japt, 77 72 62 60 62 * 60 59 51 byte

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

Penjelasan (kurang lebih sama dengan untuk jawaban 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

Cobalah online!


* tidak membagi dengan benar

nicael
sumber
Pada 5 hari yang lalu , JS evalditugaskan untuk Ox. Saya akan melihat apakah itu dapat dipersingkat.
ETHproduk
@ Terima kasih, ini menghemat 5 byte.
nicael
5 byte lebih tersimpan: OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)Mungkin dimungkinkan untuk membuatnya menghasilkan kode Japt, bukan JS, lalu gunakan Ovuntuk mengevaluasi itu.
ETHproduksi
Yup, 62 byte :) OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2Ini ~~[...]perlu karena tanda kurung tidak cocok dalam kekacauan string dengan transpiler .
ETHproduk
1
51:OvUf"[2-9]" ?U:"({Ur"[\\d.]+""º$&e14+P n2 /2pE¹"})¤
ETHproduk
9

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

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

Demo + penjelasan:

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 - lupa tentang mengapung
2 - lagi mengapung masalah: parseInt lantai biner jadi saya harus mengalikan dengan 1e14 dan kemudian membaginya dengan 16384
3 - harapan yang telah mencapai tugas yang diberikan, sekarang mulai bermain golf: D
4 - ada bug dengan pembagian

nicael
sumber
10
106 ^ 3 byte? Itu lebih dari satu juta!
ETHproduk
2
@Eth aku tahu komentar seperti itu akan datang; D
nicael
Anda bisa berubah e.match(/[2-9]/g)menjadi e.match`[2-9]`.
pengguna81655
@user, terima kasih :)
nicael
@nicael ('0b'+$&*1e14)/1638ini harus bekerja tetapi saya tidak 100% yakin
Downgoat
5

Jolf, 31 byte, tidak bersaing

Saya menambahkan sejumlah fungsi yang layak yang terinspirasi oleh tantangan ini, dan, karenanya, dianggap tidak bersaing. Saya senang karena saya akhirnya mengimplementasikan fungsi unary (seperti (H,S,n)=>valdi ES6, tetapi didukung di 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)

Suite uji , Coba input Anda sendiri , atau atur input secara manual .

Conor O'Brien
sumber
4
Kode Anda mengatakan "hai" kepada para pembacanya!
Cyoce
Wow. Saya tidak memperhatikan itu! : D
Conor O'Brien
5

Bash, 60 byte

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

Contoh Jalankan:

$ ./bin_dec_add.sh 1+1
10
$ ./bin_dec_add.sh 1+2
3
Tyzoid
sumber
@ Pietu1998 dcakan membutuhkan pemesanan polesan terbalik dari operasi, yang tidak diizinkan oleh tantangan.
Tyzoid
3

𝔼𝕊𝕄𝕚𝕟 2, 46 karakter / 72 byte

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

Try it here (Firefox only).

Penjelasan

ë(ïđ/[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
Mama Fun Roll
sumber
1

PowerShell, 107 byte

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

Tidak disatukan

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

Contoh

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

PS > .\Calc.ps1 20.2*20.2
408,04
beatcracker
sumber