Eklemeden ekle (veya 4 temel aritmetik işlecin herhangi biri)


40

Sorun:

Amacınız aşağıdaki matematik operatörlerin herhangi kullanmadan iki giriş numaralarını eklemektir: +,-,*,/.

Ek olarak, bu matematik operatörlerini değiştirmek için tasarlanan yerleşik işlevleri kullanamazsınız.

puanlama:

En küçük kod (bayt sayısı ile) kazanır.

Güncelleme

Gördüğüm programların çoğu ya sayılarını içeren iki diziyi birleştiriyor ya da first numberkarakter yapıyor, second numberkarakter ekliyor , sonra hepsini sayıyor.

En kısa dizi sayacı: 8 karakterli APL, Tobia tarafından

En kısa dizi birleştirme: 4 karakterli Golfscript, Doorknob

En kısa logaritmik çözüm: 19 karakterli TI-89 Basic, Quincunx

Entegrasyon çözümü: Michael Stern tarafından 45 karakterli Mathematica

Havalı, benim görüşüme göre: javascript bitwise operatörleri, dave tarafından


Yüzer mi olacak?
Ismael Miguel,

7
Negatif sayıları olacak mı? (Şu anda, tüm cevaplar sayıların pozitif olacağını varsaymaktadır, bu yüzden muhtemelen bunu değiştirmemelisiniz)
Doorknob

4
Peki ya matematiksel çözümler? Bunları listelemeyi unuttun! Bu bütünleşir ve bu logaritma ile oynar
Justin

3
Neden daha uzun çözümlerden birini kabul ettin? En kısa çözümler ( bu ve bu ) kabul etmezken olumsuz sayıları kabul ettiği için mi? Öyleyse, cevabım negatif sayıları (kayan noktaları da destekliyor) destekliyor ve bundan daha kısa. Bu soruyu kod-golf olarak etiketlediniz , bu nedenle en kısa çözümü kabul etmek zorundasınız .
Justin,

2
"Sayı" yı tanımlayın. Herhangi bir tamsayı? Negatif olmayan tamsayılar? 10 üssü olmak zorundalar mı?
SuperJedi224

Yanıtlar:


2

Smalltalk, 21 13

Aşağıdakilerin tümü yalnızca pozitif tamsayılar üzerinde çalışır. Ciddi bir cevap için diğer Smalltalk cevabına bakınız .

versiyon 1

büyük bir tamsayıya geçip yüksek bit dizini için sorma (hatalı, ST dizini 1 tabanlı, bu yüzden ek bir sağa kaymaya ihtiyacım var):

(((1<<a)<<b)>>1)highBit

versiyon 2

benzer ve hatta biraz daha kısa (Smalltalk öncelik kuralları nedeniyle ve doğru bir kaymaya gerek yok):

1<<a<<b log:2 

Sürüm 3


a ve b iki sayıları verilen “koleksiyon-birleştirici-talep edici boyut” temasının bir başka çeşidi ,

((Array new:a),(Array new:b)) size

Intervals'ı koleksiyon olarak kullanarak daha hafıza dostu bir sürüm elde ettik ;-) 21 karakter:

((1to:a),(1to:b))size

Ancak, yoğun sayıdaki çatırtı için önerilmez.

version4

Eğlenceniz için, hafıza için zaman ayırmak istiyorsanız, şunu deneyin:

Time secondsToRun:[
   Delay waitForSeconds:a.
   Delay waitForSeconds:b.
]

hangi genellikle yeterince doğru (ancak hiçbir garanti ;-)))

version5

bir dosyaya yaz ve boyutunu sor

(
    [
        't' asFilename 
            writingFileDo:[:s |
                a timesRepeat:[ 'x' printOn:s ].
                b timesRepeat:[ 'x' printOn:s ]];
            fileSize 
    ] ensure:[
        't' asFilename delete
    ]
) print

45

Javascript (25)

while(y)x^=y,y=(y&x^y)<<1

Bu, yalnızca bitsel işlemleri kullanarak iki değişken x ve y ekler ve sonucu x olarak saklar.

Bu da negatif sayılarla çalışır.


1
@ dave, bir süre geçiyorsanız, iki karakter daha kaydedebilirsiniz while(y)x^=y,y=(y&x^y)<<1!
Dom Hastings


3
@ user3125280, Sorun "ekleme yapmadan ekleme yap" (biraz saçma değil) değil, "temel matematik operatörleri olmadan ekleme yap" değil
Brian S

8
@ user3125280, özür dilerim, ancak yorumumdan yorumladığınız herhangi bir edepsizlik tasarlanmamıştır. Yine de, XOR'un "temel aritmetik" kategorisinde PLUS ile gruplandırılması konusunda hemfikir olan çok fazla insan bulmakta zorlanacağınızı düşünüyorum. Hemfikir olan kişileri bulmanın ötesinde, OP açıkça hangi operatörlere izin verilmediğini söyler ve XOR da onlardan biri değildir. Ergo, bu geçerli bir cevap.
Brian S

3
for(;y;y=(y&x^y)<<1)x^=y1 byte daha kısa :)
William Barbosa

22

C - 38 bayt

main(){return printf("%*c%*c",3,0,4);}

Burada biraz hile yapıyorum, OP herhangi bir matematik operatörü kullanmadığını söyledi .

*İçinde printf()karakter yazdırmak için kullanılan genişliği alan bir değişken alınan bu biçim araçlarının printf(), bu durumda, 3 ve 4 bir dönüş değeri printf()baskılı karakterleri sayısıdır. Bu yüzden ' 'alan genişliği 3 olan, alan genişliği 4 olan toplam 3 + 4 karakter yazıyor.

Dönüş değeri, printf()çağrıya eklenen numaralardır .


3
3 ve 4 parametre yapmalısınız ve fonksiyonun olması gerekmez main. Yazdırmak umurumda değil eğer Ayrıca, birini yerine geçebilir ' 'ile 0ve ikinci ihmal.
ugoren

17

Python - 49 bayt

Değişkenler konulmak suretiyle giriş varsayarsak xve y.

from math import*
print log(log((e**e**x)**e**y))

Bu 61 baytlık çözüm tam bir programdır:

from math import*
print log(log((e**e**input())**e**input()))

Üskü yasaklamadığınız göz önüne alındığında, bunu göndermek zorunda kaldım. Logaritma özelliklerini kullanarak ifadeyi basitleştirdiğinizde, basitçe elde edersiniz print input() + input().

Bu hem negatif hem de kayan nokta sayılarını destekler.

Not: Gnibbler'in tavsiyelerine uydum ve bu cevabı üçe böldüm . Bu Mathematica çözümü ve bu da TI-89 Temel çözüm .


Javascript ile buna benzer bir şey yapmaya çalışıyordum, fakat son birkaç yıldır gördüğümden ve bulmak için interneti aradığımdan beri formülün ne olduğunu unuttum.
Victor Stafusa

4
@Victor Ben formülü kendim hazırladım. Matematiği çok net hatırlıyorum.
Justin,

1
Mathematica'nız çok yakın, yerleşik sembolleri büyük harf kullanmanız yeterli. Günlük [Günlük [(E ^ E ^ x) ^ (E ^ y)]] işlevi çalışır (dış işlev kaydırma için @ gösterimini kullanırsanız 23 karakter veya 22).
Michael Stern,

“Eğer x ve y değişkenlerine yerleştirerek girdi almayı kabul edersem ..” Yapabileceğini düşünüyorum - diğerleri de öyle yapar.
blabla999

@MichaelStern: Parantezleri atlayarak iki karakter daha kaydedebilirsiniz E^y. Kullanarak Log[Log[(E^E^x)^E^y]]iyi iş gibi görünüyor.
alexwlchan

14

JavaScript [25 bayt]

~eval([1,~x,~y].join(''))

1
Cevabınız kötü görünüyor (ve zayıf oy veren), ama aslında güzel bir cevap. Lütfen indirimlerden kurtulmak için bunu silin ve bunu açıklayan bir metinle tekrarlayın. Yeni cevabını değiştireceğim.
Victor Stafusa,

1
Şimdi gerçekten iyi görünüyor, hoşuma gitti. Kesinlikle daha fazla değer kazanmaya değer.
VizioN

13

Mathematica, 21 bayt

Bunu Mathematica'da yapmanın birkaç yolu var. Birincisi, Biriktirme işlevini kullanın ve çıktıdaki son sayı dışında her şeyi atın. Aşağıda benim diğer çözüm seçildiğinde, ben girdi numaraları değişkenler içindedir farz ave b. 21 bayt.

Last@Accumulate@{a, b}

Daha eğlenceli, 45 karakter olmasına rağmen, bir çizgiyi tanımlamak ve onun altına entegre etmek için sayıları kullanın.

Integrate[Fit[{{0, a}, {2, b}}, {x, 1}, x], {x, 0, 2}]

Bir bonus olarak, her iki çözüm de tüm karmaşık sayılar için işe yarar, burada sadece başka bazı çözümler için olduğu gibi sadece pozitif tamsayılar değil.


2
Entegrasyonu seviyorum! (Buna rağmen, kesinlikle konuşmak bir şey ekler). +1
blabla999

1. çözüm geçersiz. Meydan yazarı alıntı: "Ayrıca, olamaz kullandığınız herhangi bir yerleşik olanlar matematik operatörleri yerine tasarlanmıştır fonksiyonlar.". Bu çözümü vermişti: function _(){return array_sum(func_get_args());}. Aşağı çekmek zorunda kaldım, çünkü "düzeltmek" için kısa bir yol bulamadım.
Ismael Miguel,

@Ismael Miguel Accumulate [], Plus yerine kullanılmak üzere tasarlanmamıştır. Çıktıları arasında bir sayılar listesi toplamı verir ve ben bundan faydalanırım.
Michael Stern,

Ancak bu listedeki tüm öğelerin toplamını yapar, değil mi? Olursa, bence array_sum(), aynı şeyi yapan php'de kullanmak kadar geçersiz .
Ismael Miguel,

3
@Ismael Miguel Toplam [] adlı bir diziyi toplayan bir Mathematica işlevi vardır. Bu işlevi kullanmak için belirtilen kurallara aykırı olacağını kabul ediyorum, ancak yapmadım. Birikim [{a, b}] çıktısı a + b değil.
Michael Stern

12

GolfScript, 6 4 karakter / bayt

10, 5(=> 15) Şeklinde giriniz .

~,+,

+Dizi birleştirme değil, bir yer.

Nasıl çalıştığı, ,sayının ( 0,1,...,n-2,n-1) olduğu uzunlukta bir dizi oluşturmak için kullanılır . Bu her iki sayı için de yapılır, ardından diziler birleştirilir. ,elde edilen dizinin uzunluğunu bulmak için tekrar farklı bir amaç için kullanılır.

Şimdi, işte hile . Bunu gerçekten seviyorum çünkü giriş formatını kötüye kullanıyor. O görünüyor bu giriş GolfScript kodu olarak yürütülmektedir beri sadece, gerçekten ama, bir dizi giren ilk defa karşılaştığımız gibi ,zaten benim için yapılır! (Eski 6 karakterlik sürüm, (takas dizisini) ortadan kaldırarak 2 karakteri tıraşladığım ~,\,+,giriş biçimindeydi ).10 5\,

Eski versiyon (12) :

Bir fonksiyon yaratır f.

{n*\n*+,}:f;

*Ve +sırasıyla dize tekrarı ve birleştirme değil, aritmetik fonksiyonlar bulunmaktadır.

Açıklama: nbir karakterli bir karakter dizisi (yeni satır) oluşturur. Bu daha sonra tekrarlanır a, sonra aynı şey yapılır b. Dizeler birleştirilir ve ,dize uzunluğu için kullanılır.


Negatif sayılar için de işe yarıyor mu?
Michael Stern,

@MichaelStern Hayır, ancak bu soruda hiç bahsedilmedi. Hmm, bir yorum ekledim. Diğer cevapların çoğunda (aslında hepsi de ) pozitif olduğu varsayılmaktadır.
Doorknob

Mathematica çözümüme bakın. Doğru dilde, negatif sayılar için çözümler mümkündür.
Michael Stern,

Her yerde bu sitede @MichaelStern LOL @ "doğru dil"…
Tobia,

10

C, 29 27 Bayt

İşaretçi aritmetiğini kullanarak:

f(x,y)char*x;{return&x[y];}

x işaretçi olarak tanımlanır, ancak arayan bir tamsayı geçmelidir.

Anonim bir kullanıcı şunu önerdi - ayrıca 27 bayt, ancak parametreler tamsayılar:

f(x,y){return&x[(char*)y];}

İlk biçim , 32 bit intve şu andaki intişaretçilerde 64 bit bulunan ortak sistemlerde iki saniye geçiyorsa, muhtemelen kötü kırılıyor . İkincisi bu sorunu önler.
KKH

@hvd, Her ikisi de çalışır, en azından Linux 64bit'te. Tam sayı parametreleri, yine de makine kayıt büyüklüğüne genişletilir.
ta ugoren

Ah, yeterince adil, bunun ortak bir durum olacağına karar verdi. Yine de işe yaramayan somut bir örnek bulabilirsem tekrar yorumlayacağım. :)
HVD

8

Brainf * ck, 9 36

,>,[-<+>]

++[->,[->>[>]+[<]<]<]>>>[<[->+<]>>]<

Bu basit bir ekleme kullanmadan çalışır; geçer ve 1'lerin izini bırakır ve sonra onları sayar

Not: Yalnızca tek artışlar +ve -bunlar sadece beyninde * ck olmadan bunlar yapılamaz. Gerçekten toplama / çıkarma değil, bu yüzden hala önemli olduğuna inanıyorum.


-1. Bu basit bir ektir. Eğer toplama, çarpma vb. Olmayan bir şey yaptıysanız, o zaman sayılır, ancak olduğu gibi, bu sayılmaz.
Justin,

@ Quincunx Ben düzelttim; Şiirler arasında gidip izlerini bırakarak, sonra da
süpürdüm

3
Ters. İyi iş.
Justin,

6

J (6)

Succ işlevini kullanamadığımızı söylemediniz:

>:@[&0

Kullanımı:

   9>:@[&0(8)
17

Sadece >:8 üzerinden 9 tekrar yapar .

Liste birleştirme yaklaşımı da çalışır: #@,&(#&0). Ve - kurallara aykırı olduğunu biliyorum - bu cevabın en J-ish çözümü olmadan gitmesine izin veremem: *&.^(üstelleştirme altında çarpma).


5

Postscript, 41

Fonksiyonu, 41 baytlık bir ifade ile tanımlarız:

/a{0 moveto 0 rmoveto currentpoint pop}def

Sonra buna örneğin diyoruz:

gs -q -dBATCH -c '/a{0 moveto 0 rmoveto currentpoint pop}def' -c '10 15 a ='

Hangi verir

25.0

Çoğu rakiplerin aksine, negatifleri ve yüzmeleri kolayca idare eder :-)



4

Küçük konuşma (şimdi ciddi), 123 118 105 (*)

İki kere cevap verdiğim için üzgünüm, fakat bunu ciddi bir cevap olarak kabul ederken, diğeri daha çok mizah gibiydi. Aşağıdakiler aslında şu anda tam şu anda tüm makinelerimizde (donanımda olsa da) yürütülmektedir. Başka kimsenin aklına gelmemiş olması garip ...

İki yarım eklentiyi birleştirerek ve kelimelerin tüm bitlerini paralel olarak yaparak, (a, b; s cinsinden girişler) girişleri okunabilir versiyonunu alıyoruz:

  s := a bitXor: b.            
  c := (a & b)<<1.             

  [c ~= 0] whileTrue:[        
     cn := s & c.
     s := s bitXor: c.
     c := cn<<1.
     c := c & 16rFFFFFFFF.
     s := s & 16rFFFFFFFF.
  ].
  s           

Döngü taşıma yayılımı içindir. Maskeler, imzalanmış tam sayıların kullanılmasını sağlar (onlarsız, yalnızca imzasız numaralar bulunur). Ayrıca, uzunluğu 32bit işlemi için olan kelime uzunluğunu da tanımlarlar. 68bit ilaveyi tercih ediyorsanız, 16rFFFFFFFFFFFFFFFFFFF olarak değiştirin.

golf versiyonu (123 karakter) (m tuşunu kullanarak yeniden uzun maskeyi önler):

[:a :b||s c n m|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&m:=16rFFFFFFFF.s:=s&m].s]

(*) 16rFFFFFFFF yerine -1 kullanarak, daha iyi golf oynayabiliriz, ancak kod artık yalnızca kesinti numaraları için değil, yalnızca makine kelimesi boyutunda smallIntegers için çalışır (largeIntegers temsili Ansi standardında tanımlanmamıştır):

[:a :b||s c n|s:=a bitXor:b.c:=(a&b)<<1.[c~=0]whileTrue:[n:=s&c.s:=s bitXor:c.c:=n<<1.c:=c&-1.s:=s&-1].s]

Bu, kod boyutunu 105 karaktere indirir.


Bu kod golf, yani cevabınızı golf.
Victor Stafusa,

1
kazanma şansım yok, ama senin için yapacağım ;-)
blabla999

Bir Smalltalk cevabını görmek güzel!
Diş fırçası

4

APL, 8 ve 12

Burada yeni bir şey yok, dizi sayma versiyonu:

{≢∊⍳¨⍺⍵}

ve log ○ log versiyonu:

{⍟⍟(**⍺)**⍵}

Sadece APL’de harika göründüklerini düşündüm!

{≢     }       count
  ∊            all the elements in
   ⍳¨          the (two) sequences of naturals from 1 up to
     ⍺⍵        both arguments

 

{⍟⍟        }   the double logarithm of
   (**⍺)       the double exponential of ⍺
        *      raised to
         *⍵    the exponential of ⍵

2
Adil olmak gerekirse, APL'de her şey harika görünüyor.
Michael Stern

≢∘∊⍳¨
İlkini

@ Adám Evet, ancak taktik işlevlerden hoşlanmıyorum ve bunları okumayı zor buluyorum.
Tobia

@ Tobia Belki de onları sevmiyorsun, çünkü okumasını zor buldun? Bunun üzerine bir atölye çalışması yapıyorum… Üzerine dersimi gördün mü ?
Adám,

@ Adám havalı, teşekkür ederim! Kontrol edecek.
Tobia,

4

sed, 359 bayt (süslü biçimlendirme olmadan)

Geç cevap için özür dilerim ve muhtemelen buradaki en uzun cevap. Ama bunun sed ile mümkün olup olmadığını görmek istedim:

                       s/([^ ]+) ([^ ]+)/\1:0::\2:/
                       :d /^([^:]+):\1::([^:]+):/tx
                       s/(:[^:]*)9([_:])/\1_\2/g;td
s/(:[^:]*)8(_*:)/\19\2/g;s/(:[^:]*)7(_*:)/\18\2/g;s/(:[^:]*)6(_*:)/\17\2/g
s/(:[^:]*)5(_*:)/\16\2/g;s/(:[^:]*)4(_*:)/\15\2/g;s/(:[^:]*)3(_*:)/\14\2/g
s/(:[^:]*)2(_*:)/\13\2/g;s/(:[^:]*)1(_*:)/\12\2/g;s/(:[^:]*)0(_*:)/\11\2/g
                       s/:(_+:)/:1\1/g; y/_/0/; # #
                       bd;  :x  s/.*::([^:]+):/\1/;
                       # # # # # # #  # # # # # # #

Bu, sadece bir dizgede sayıları artıran https://codegolf.stackexchange.com/a/38087/11259 e benzer . Ancak bunun yerine, bir döngü içinde artış işlemlerini yapar.

Giriş, STDIN'den "x y" biçiminde alınmıştır. İlk önce "x: 0 :: y:" e dönüştürülür. Sonra ":" karakterinden sonra gelen tüm sayıları "x: x: :( x + y):" olana kadar arttırırız. Sonra nihayet döndük (x + y).

Çıktı

$ printf "%s\n" "0 0" "0 1" "1 0" "9 999" "999 9" "12345 67890" "123 1000000000000000000000"  | sed -rf add.sed
0
1
1
1008
1008
80235
1000000000000000000123
$

Bunun yalnızca doğal sayılar için işe yaradığını unutmayın. Ancak (en azından teoride) keyfi olarak büyük tamsayılar için çalışıyor. Y'de x artış işlemleri yaptığımız için, sipariş verme hızı hızlandırmak için büyük bir fark yaratabilir: x <y, x> y'den daha hızlı olacaktır.


4

Çizgi , 18 bayt

time -f%e sleep $@

GNU süresi 1.7 veya üstü gerektirir. Çıkış STDERR'ye.

Çevrimiçi deneyin!

Bunun yerleşik kül komutunun GNU zamanından farklı olması nedeniyle B külünde çalışmayacağını unutmayın .

Bir ek bayt pahasına, Bash'i harici komutu kullanmaya zorlamak \timeyerine kullanılabilir time.


Girdilerden biri negatifse ne olur?
Michael Stern,

4
Başarısız. Tıpkı diğer cevaplar gibi.
Dennis,

5
Drats! Soruyu sormadan önce sonuç vermesini umuyordum.
Tobia,

3
Evet. Ayrıca rastgele ekleyerek sleep -3programlarımı hızlandıracağımı umuyordum . Ne kadar hayal kırıklığı.
Alfe

1
@ userunknown \time, Bash'de de çalışmalıdır.
Dennis,

3

Javascript (67)

Muhtemelen çok daha iyi var

a=Array;p=Number;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)

Yüzmeye ihtiyacı olup olmadığını bilmeden kesin bir cevap vermemelisiniz Ve NaN'lerle başa çıkmayacak. Ama bu oldukça hoş bir kod!
Ismael Miguel,

Bence hepsi joinsgereksiz. Oluşturucu , sayılabilecek Arraybir dizi yapar undefineds:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Ben Reich,

@BenReich, haklısın, teşekkürler
Michael M.

@Michael Ayrıca, Numberyapıcı 2 karakterden fazla tasarruf sağlarparseInt
Ben Reich

@Michael Ayrıca, kaldırırsanız, alertçıktı hala konsola gidiyor, ancak bu cevabı biraz daha az eğlenceli hale getiriyor. Uyarıcı promptyerine değişkeni yeniden de kullanabilirsiniz (yapıcı, soruyu istemi ile uyarır). Neyse, güzel cevap!
Ben Reich

3

Yakut, 18 karakter

a.times{b=b.next}

Ve iki daha ayrıntılı değişken, 29 karakter

[*1..a].concat([*1..b]).size

Başka bir sürüm, 32 karakter

(''.rjust(a)<<''.rjust(b)).size

3

Sinek kodu oluşturmada

Evet, aslında orada bir eklenti var, ama + operatörü değil ve ekleyen bir çerçeve fonksiyonu bile değil, bunun yerine anında ekleme işlemini yapan bir yöntem üretiyoruz.

public static int Add(int i1, int i2)
{
    var dm = new DynamicMethod("add", typeof(int), new[] { typeof(int), typeof(int) });
    var ilg = dm.GetILGenerator();
    ilg.Emit(OpCodes.Ldarg_0);
    ilg.Emit(OpCodes.Ldarg_1);
    ilg.Emit(OpCodes.Add);
    ilg.Emit(OpCodes.Ret);
    var del = (Func<int, int, int>)dm.CreateDelegate(typeof(Func<int, int, int>));
    return del(i1, i2);
}


2

R 36

function(x,y)length(rep(1:2,c(x,y)))

burada ikiler tarafından izlenenlerin repbir vektörünü oluşturur .xy


2
Aynı şeyi biraz daha kısa yapan bir program yapabilirsiniz:length(rep(1:2,scan()))
Masclins

2

TI Basic 89 - 19 bayt

Bunu TI-89'unuzda çalıştırın (Ana ekran veya programlama uygulaması):

ln(ln((e^e^x)^e^y))

Bu, bu çözümdex+y olduğu gibi, hesaplama yapmak için günlük kurallarını kullanır . Bir bonus olarak, ondalık ve tam sayı için çalışır. Tüm gerçek sayılar için çalışır. Logaritma kuralları karmaşık üslerle hala geçerliyse, bu da karmaşık sayılar için de geçerlidir. Ancak, karmaşık üsler eklemeyi denediğimde hesap makinem gereksiz yere tükeniyor.


3
lnTI Basic'te 1 byte değil mi? Ayrıca, parantez içindeki parantezleri bırakarak bunu 15 bayta düşürebilirsiniz.
9'da

2

Bana Mathematica notasyonu yazdığı için Michael Stern'e teşekkür ederim .

Mathematica - 21 20 bayt

Log@Log[(E^E^x)^E^y]

Bu, bu çözümle aynı yaklaşımı kullanır , ancak kısaltmak için Mathematica'dadır. Bu, negatif ve kayan nokta sayıları ile xve içindeki tamsayılar için çalışır y.

Günlük kurallarını kullanarak ifadeyi basitleştirmek x+y, ancak bu 4 temel işleçten birini değil, üstellemeyi kullandığı için geçerlidir.


Karmaşık sayılar için çalıştığından emin misin?
Michael Stern

2

Dize aritmetik

Her iki sayıyı da dizgelere dönüştürürüz, dize kesme ile ekleriz (carry ve her şeyi biliyorsunuz), sonra tamsayıya geri ayrıştırırız. 0,100 i1, i2 ile test edilmiş, bir cazibe gibi çalışır. Bunda bir ilave bul!

public static int Add(int i1, int i2)
{
    var s1 = new string(i1.ToString().Reverse().ToArray());
    var s2 = new string(i2.ToString().Reverse().ToArray());
    var nums = "01234567890123456789";
    var c = '0';
    var ret = new StringBuilder();
    while (s1.Length > 0 || s2.Length > 0 || c != '0')
    {
        var c1 = s1.Length > 0 ? s1[0] : '0';
        var c2 = s2.Length > 0 ? s2[0] : '0';
        var s = nums;
        s = s.Substring(int.Parse(c1.ToString()));
        s = s.Substring(int.Parse(c2.ToString()));
        s = s.Substring(int.Parse(c.ToString()));
        ret.Append(s[0]);
        if (s1.Length > 0)
            s1 = s1.Substring(1);
        if (s2.Length > 0)
            s2 = s2.Substring(1);
        c = s.Length <= 10 ? '1' : '0';
    }
    return int.Parse(new string(ret.ToString().ToCharArray().Reverse().ToArray()));
}

2

C (79)

void main(){int a,b;scanf("%d%d",&a,&b);printf("%d",printf("%*c%*c",a,0,b,0));}

2

Python - 22 karakter

len(range(x)+range(y))

1
Sanırım bu bir ek olarak sayılıyor?
Doktor

1
birleştirme
pydud

2

APL: 2

1⊥

Bu sayıları taban 1'den dönüştürür, yani (n * 1 ^ 1) + (m * 1 ^ 2) tam olarak n + m olur.

Yargılanacaklar Can TryApl.org



2

K, 2 bayt

#&

Kullanım örneği:

  #&7 212
219

"Where" işlecini (monadik &) bir giriş listesindeki numaralara uygulayın ( giriş biçimiyle ilgili özgürlük alarak). Bu, ilk sıfır sayısını ve ardından ikinci sayısını içeren bir liste üretecektir:

  &3 2
0 0 0 1 1

Normalde bu operatör, bir boole listesinin sıfır olmayan elemanlarının indekslerinin bir listesini üretmek için "topla" olarak kullanılır, ancak genelleştirilmiş form ara sıra kullanışlı olur.

O zaman sadece bu listenin sayısını (monadik #) alın.

Giriş gereklilikleri yorumum kabul edilemez ise, aşağıdaki biraz daha uzun çözüm aynı hile yapar:

{#&x,y}

2

Pyth , 29 bayt

AQW!qG0=k.&GH=HxGH=k.<k1=Gk)H

Çevrimiçi deneyin!

Buraya ilk gönderimim!

Bu derler:

assign('Q',eval_input())     # Q
assign('[G,H]',Q)            #A
while Pnot(equal(G,0)):      #  W!qG0
  assign('k',bitand(G,H))    #       =k.&GH
  assign('H',index(G,H))     #             =HxGH  (index in this case is XOR)
  assign('k',leftshift(k,1)) #                  =k.<k1
  assign('G',k)              #                        =Gk)
imp_print(H)                 #                            H

1
Siteye Hoşgeldiniz!
Buğday Sihirbazı
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.