1 + 1 = 10, 1 + 2 = 3


26

เขียนฟังก์ชั่นหรือโปรแกรมที่สามารถทำได้ง่าย ๆ ทางคณิตศาสตร์ (การบวกการลบการคูณและการหาร) ในทั้งฐาน 10 และฐาน 2

ฟังก์ชั่นจะรับนิพจน์ทางคณิตศาสตร์เป็นอินพุตและเอาต์พุตผลลัพธ์ที่ถูกต้องในฐานที่ถูกต้อง อินพุตจะเป็นnตัวเลขคั่นด้วยตัวดำเนินการหนึ่งหรือหลายตัว ( + - * /)

หากค่าอินพุตทั้งหมดมีเพียง 0 และ 1 ค่าทั้งหมดจะถือว่าเป็นไบนารี ถ้าอย่างน้อยหนึ่งหลักคือ2-9ค่าทั้งหมดจะถือว่าเป็นฐาน 10

กฎ:

  • คุณสามารถสมมติว่าจะมีผู้ให้บริการเพียงรายเดียวระหว่างหมายเลข ( 10*-1จะไม่ปรากฏขึ้น)
  • คุณสามารถสรุปได้ว่าจะไม่มีวงเล็บ
  • ผู้ปฏิบัติงานปกติมาก่อน (ลองใช้นิพจน์ในเครื่องคิดเลขของ Google หากคุณมีข้อสงสัย)
  • คุณไม่สามารถสรุปได้ว่าจะมีจำนวนเต็มเท่านั้น
  • จะไม่มีเลขศูนย์นำหน้าในอินพุตหรือเอาต์พุต
  • คุณสามารถสันนิษฐานได้ว่าป้อนข้อมูลที่ถูกต้องเท่านั้น
  • คุณสามารถสมมติว่าค่าอินพุตทั้งหมดเป็นค่าบวก (แต่ตัวดำเนินการลบอาจทำให้เอาต์พุตเป็นลบได้1-2=-1และ10-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
เสียงโหวต ... ทำไม
Stewie Griffin

คำตอบ:


5

Japtap, 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 ไบต์
nicael

บันทึกอีก 5 ไบต์: OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)อาจเป็นไปได้ที่จะทำให้มันสร้างรหัส Japt แทนที่จะเป็น JS จากนั้นใช้Ovเพื่อประเมินสิ่งนั้น
ETHproductions

Yup 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 - ลืมเกี่ยวกับลอย
2 - ลอยอีกปัญหา: แยกวิเคราะห์ชั้นไบนารีดังนั้นฉันต้องคูณด้วย 1e14 แล้วหารด้วย 16384
3 - หวังว่าจะบรรลุภารกิจที่ได้รับตอนนี้เริ่มเล่นกอล์ฟ: D
4 - มีข้อผิดพลาดกับการหาร


10
106 ^ 3 ไบต์? นั่นเป็นมากกว่าล้าน!
ผลิตภัณฑ์ ETH

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)=>valใน 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
รหัสของคุณพูดว่า "สวัสดี" กับผู้อ่าน!
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

ch 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]']

Ungolfed

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.