1 + 1 = 10, 1 + 2 = 3


26

Viết một hàm hoặc chương trình hơn có thể thực hiện số học đơn giản (cộng, trừ, nhân và chia) trong cả cơ sở 10 và cơ sở 2.

Hàm sẽ lấy một biểu thức toán học làm đầu vào và xuất kết quả đúng trong cơ sở chính xác. Đầu vào sẽ là các nsố được phân tách bằng một hoặc một số toán tử ( + - * /).

Nếu tất cả các giá trị đầu vào chỉ chứa 0 và 1, tất cả các giá trị được coi là nhị phân. Nếu có ít nhất một chữ số 2-9, tất cả các giá trị được coi là cơ sở 10.

Quy tắc:

  • Bạn có thể cho rằng sẽ chỉ có một toán tử giữa các số ( 10*-1sẽ không xuất hiện)
  • Bạn có thể cho rằng sẽ không có dấu ngoặc đơn.
  • Ưu tiên toán tử bình thường (thử biểu thức trong máy tính google nếu bạn nghi ngờ).
  • Bạn không thể cho rằng sẽ chỉ có số nguyên
  • Sẽ không có số 0 đứng đầu trong đầu vào hoặc đầu ra
  • Bạn chỉ có thể giả sử đầu vào hợp lệ sẽ được cung cấp
  • Bạn có thể giả sử tất cả các giá trị đầu vào là dương (nhưng toán tử trừ có thể làm cho đầu ra âm có thể 1-2=-110-100=-10)
  • REPL không được chấp nhận
  • Bạn có thể chọn để có những đầu vào như các đối số riêng biệt, hoặc như là một đối số duy nhất, nhưng đầu vào phải theo đúng thứ tự.
    • Tức là bạn có thể đại diện 1-2với các đối số đầu vào 1, -, 2, nhưng không phải 1, 2, -.
  • Bạn phải chấp nhận các ký hiệu + - * /trong đầu vào, không plus, minusv.v.
  • Bạn phải hỗ trợ các giá trị dấu phẩy động (hoặc tối đa giới hạn tối đa của ngôn ngữ của bạn, tuy nhiên chỉ hỗ trợ các số nguyên không được chấp nhận).
  • eval được chấp nhận

Ví dụ:

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

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng.


Trong trường hợp 110/10, được 11.0chấp nhận?
isaacg

@isaacg vâng, không sao đâu :-)
Stewie Griffin

5
Các downvote ... tại sao?
Stewie Griffin

Câu trả lời:


5

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

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

Giải thích (ít nhiều giống với câu trả lời của 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

Hãy thử trực tuyến!


* không phân chia đúng cách


Kể từ 5 ngày trước , JS evalđược chỉ định Ox. Tôi sẽ xem nếu nó có thể được rút ngắn hơn nữa.
Sản phẩm điện tử

@Eth Cảm ơn, điều này tiết kiệm 5 byte.
nicael

Đã lưu thêm 5 byte: OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)Có thể tạo mã Japt thay vì JS, sau đó sử dụng Ovđể đánh giá điều đó.
Sản phẩm điện tử

Yup, 62 byte :) OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2Điều ~~[...]này là cần thiết vì các dấu ngoặc đơn không khớp trong một chuỗi lộn xộn với bộ chuyển mã .
Sản phẩm ETH

1
51:OvUf"[2-9]" ?U:"({Ur"[\\d.]+""º$&e14+P n2 /2pE¹"})¤
Sản phẩm điện tử

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 + giải thích:

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 - quên về phao
2 - một lần nữa vấn đề nổi: phân tích nhị phân sàn vì vậy tôi phải nhân với 1e14 và sau đó chia cho 16384
3 - hy vọng điều đó đã đạt được nhiệm vụ nhất định, bây giờ bắt đầu chơi golf: D
4 - có lỗi khi chia


10
106 ^ 3 byte? Đó là hơn một triệu!
Sản phẩm ETH

2
@Eth Tôi biết một bình luận như vậy đang đến; D
nicael

Bạn có thể thay đổi e.match(/[2-9]/g)thành e.match`[2-9]`.
dùng81655

@user Cảm ơn :)
nicael

@nicael ('0b'+$&*1e14)/1638cái này sẽ hoạt động nhưng tôi không chắc chắn 100%
Downgoat

5

Jolf, 31 byte, không biên dịch

Tôi đã thêm một số lượng lớn các chức năng lấy cảm hứng từ thử thách này, và do đó, nó được coi là không cấu hình. Tôi rất vui vì cuối cùng tôi đã thực hiện các chức năng đơn nguyên (như (H,S,n)=>valtrong ES6, nhưng được hỗ trợ trong 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)

Kiểm tra bộ , Hãy thử đầu vào của riêng bạn , hoặc tự thiết lập các đầu vào .


4
Mã của bạn nói "xin chào" với độc giả của nó!
Cyoce

Ồ Tôi đã không nhận thấy điều đó! : D
Conor O'Brien

5

Bash, 60 byte

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

Chạy ví dụ:

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

@ Pietu1998 dcsẽ yêu cầu thứ tự đánh bóng ngược của các hoạt động, không được chấp nhận bởi thách thức.
Tyzoid

3

2, 46 ký tự / 72 byte

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

Try it here (Firefox only).

Giải trình

ë(ïđ/[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 byte

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

Bị đánh cắp

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

Thí dụ

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

PS > .\Calc.ps1 20.2*20.2
408,04
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.