1 + 1 = 10, 1 + 2 = 3


26

Her iki tabanda (10) ve tabanda (2) basit aritmetik (toplama, çıkarma, çarpma ve bölme) yapabilecek bir fonksiyon veya program yazın.

İşlev, girdi olarak matematiksel bir ifade alır ve doğru sonucu doğru temelde çıkarır. Giriş, nbir veya birkaç operatörle ( + - * /) ayrılan sayılar olacaktır .

Tüm giriş değerleri sadece 0 ve 1 içeriyorsa, tüm değerler ikili olarak kabul edilir. En az bir rakam ise 2-9, tüm değerlerin 10 taban olduğu kabul edilir.

Kurallar:

  • Sayılar arasında yalnızca bir operatör olacağını varsayabilirsiniz ( 10*-1görünmez)
  • Parantez olmayacağını varsayabilirsiniz.
  • Normal operatör önceliği (şüpheniz varsa, google hesap makinesindeki ifadeyi deneyin).
  • Sadece tamsayılar olacağını varsayamazsınız.
  • Girdi veya çıktıda baştaki sıfır olmayacak
  • Sadece geçerli girdi verileceğini varsayabilirsin
  • Tüm giriş değerlerinin pozitif olduğunu varsayabilirsiniz (ancak eksi operatörü negatif çıkışı mümkün kılabilir 1-2=-1ve 10-100=-10)
  • REPL kabul edilmedi
  • Ayrı argümanlar olarak veya tek argüman olarak girdi kaldırmayı tercih edebilir, fakat giriş vardır doğru sırada olması.
    • Yani sen temsil edebilir 1-2girdi argümanlarla 1, -, 2ancak 1, 2, -.
  • Sen sembolleri kabul etmelidir + - * /girişinde değil plus, minusvs.
  • Kayan nokta değerlerini desteklemelisiniz (veya dilinizin maksimum sınırına kadar, ancak yalnızca tamsayılar desteklenmiyor).
  • eval kabul edildi

Örnekler:

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

Bu kod golf, yani bayt cinsinden en kısa kod kazanacak.


Halinde 110/10, bir 11.0kabul edilebilir?
isaacg,

@isaacg evet, sorun değil :-)
Stewie Griffin,

5
Olumsuz oy neden?
Stewie Griffin,

Yanıtlar:


5

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

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

Açıklama (az ya da çok JS cevapları ile aynı):

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

Çevrimiçi deneyin!


* düzgün bölünmedi


İtibariyle 5 gün önce , JS en evalatanır Ox. Daha da kısaltılabilir mi göreceğim.
ETHProductions,

@Eth Teşekkürler, bu 5 bayt kazandırır.
nicael

5 bayt daha kaydedildi: OxUf"[2-9]" ?U:`({Ur"\\d+(\\.\\d+)?""(($&e14+P).n(2)/16384)"}).s(2)Muhtemelen JS yerine Japt kodu oluşturmasını sağlamak, sonra Ovbunu değerlendirmek için kullanmak mümkündür .
ETHproductions

Yup, 62 bytes :) OvUf"[2-9]" ?U:Ur"\\d+(\\.\\d+)?""~~[$&e14+P n2 /16384]" +" s2Bu ~~[...]zorunludur çünkü transpiler ile bir dizgede yanlış parantez uyuşmaz .
ETHproductions

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

9

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

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

Demo + açıklama:

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 - yüzdürmeyi unuttum
2 - yine yüzdürme sorunu: ayrıştırma katları ikili, bu yüzden 1e14 ile çarpıp sonra 16384 ile bölmek zorundayım
3 - verilen görevi başardığına inanıyorum, şimdi golf : D
4 - bölme ile ilgili bir hata oluştu


10
106 ^ 3 bayt? Bu bir milyondan fazla!
ETHProductions,

2
@ Böyle bir yorumun geleceğini biliyordum; D
nicael

Değişebilirsin e.match(/[2-9]/g)için e.match`[2-9]`.
kullanici81655 15

@user Thanks :)
nicael

@nicael ('0b'+$&*1e14)/1638bu olmalıdır çalışmak ama% 100 emin değilim
Downgoat

5

Jolf, 31 bayt, rekabetçi olmayan

Bu zorluğun esin kaynağı olan makul sayıda fonksiyon ekledim ve dolayısıyla rakipsiz olduğu düşünülüyor. Mutluyum çünkü nihayetinde unary fonksiyonlarını uyguladım ( (H,S,n)=>valES6'daki gibi , ancak ES5'te destekleniyorum!)

? 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)

Test paketi , kendi girişi deneyin , ya da manuel girişi ayarlayın .


4
Kodunuz okuyucularına "merhaba" diyor!
Cyoce

Vay. Bunu farketmedim! : D
Conor O'Brien

5

Bash, 60 bayt

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

Örnek Çalıştırma:

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

@ Pietu1998 dc, meydan okumaya izin verilmeyen işlemlerin tersine cilalanmasını gerektiriyordu.
Tyzoid

3

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

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

Try it here (Firefox only).

açıklama

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

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

Örnek

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

PS > .\Calc.ps1 20.2*20.2
408,04
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.