Tambah tanpa tambahan (atau salah satu dari 4 operator aritmatika dasar)

40

Masalah:

Tujuan Anda adalah untuk menambahkan dua angka masukan tanpa menggunakan salah satu operator matematika berikut: +,-,*,/.

Selain itu, Anda tidak dapat menggunakan fungsi bawaan yang dirancang untuk menggantikan operator matematika tersebut.

Mencetak:

Kode terkecil (dalam jumlah byte) menang.

Memperbarui

Sebagian besar program yang saya lihat menggabungkan dua array yang berisi angka-angka mereka, atau membuat first numberkarakter, menambahkan second numberkarakter, lalu menghitung semuanya.

Penghitung array terpendek: APL dengan 8 karakter, oleh Tobia

Rangkaian array tersingkat : Golfscript dengan 4 karakter, oleh Doorknob

Solusi logaritmik terpendek: TI-89 Basic dengan 19 karakter, oleh Quincunx

Solusi integrasi: Mathematica dengan 45 karakter, oleh Michael Stern

Paling keren, menurut saya: operator bitwise dalam javascript, oleh dave

Dokter
sumber
Apakah akan mengapung?
Ismael Miguel
7
Apakah akan memiliki angka negatif? (Saat ini, semua jawaban menganggap bahwa angka-angka akan positif, sehingga Anda mungkin tidak boleh mengubahnya)
Gagang Pintu
4
Bagaimana dengan solusi matematika? Anda lupa mendaftar itu! Ini terintegrasi, dan ini dimainkan dengan logaritma
Justin
3
Mengapa Anda menerima salah satu solusi yang lebih lama? Apakah karena menerima angka negatif sedangkan solusi terpendek ( ini dan ini ) tidak? Jika demikian, jawaban saya mendukung angka negatif (juga mendukung floating point) dan lebih pendek dari yang ini. Anda menandai pertanyaan ini sebagai kode-golf , sehingga Anda wajib menerima solusi terpendek .
Justin
2
Tentukan "angka". Ada bilangan bulat? Bilangan bulat non-negatif? Apakah mereka harus menjadi basis-10?
SuperJedi224

Jawaban:

2

Smalltalk, 21 13

Semua yang berikut ini hanya bekerja pada bilangan bulat positif. Lihat jawaban Smalltalk lainnya untuk yang serius.

versi 1

bergeser ke bilangan bulat besar dan meminta indeks bit tinggi (buruk, pengindeksan ST berbasis 1, jadi saya perlu pergeseran kanan tambahan):

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

versi2

serupa, dan bahkan sedikit lebih pendek (karena aturan diutamakan Smalltalk, dan tidak ada pergeseran yang tepat diperlukan):

1<<a<<b log:2 

versi3

variasi lain dari tema "koleksi-menyatukan-meminta ukuran",
diberi dua angka a dan b,

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

menggunakan Interval sebagai koleksi, kami mendapatkan versi yang lebih ramah memori ;-) dalam 21 karakter:

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

tidak direkomendasikan untuk angka berat, meskipun.

versi4

Untuk hiburan Anda, jika Anda ingin menukar waktu dengan ingatan, cobalah:

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

yang biasanya cukup akurat (tetapi tidak ada jaminan ;-)))

versi5

menulis ke file dan meminta ukurannya

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

Javascript (25)

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

Ini menambahkan dua variabel x dan y, hanya menggunakan operasi bitwise, dan menyimpan hasilnya dalam x.

Ini bekerja dengan angka negatif juga.

dave
sumber
1
@Dave, jika Anda beralih ke sementara, Anda dapat menyimpan dua karakter lagi dengan while(y)x^=y,y=(y&x^y)<<1!
Dom Hastings
1
Versi kode yang lebih mudah dibaca: Tambahkan dua angka tanpa menggunakan operator aritmatika .
Franck Dernoncourt
3
@ user3125280, Masalahnya bukan "melakukan penambahan tanpa melakukan penambahan" (yang agak tidak masuk akal), melainkan "melakukan penambahan tanpa operator matematika dasar"
Brian S
8
@ user3125280, maaf, tapi kekasaran apa pun yang Anda artikan dari komentar saya tidak dimaksudkan. Saya pikir Anda akan mengalami kesulitan menemukan sangat banyak orang yang setuju bahwa XOR harus dikelompokkan dengan PLUS dalam kategori "aritmatika dasar," sekalipun. Bahkan di luar menemukan orang yang setuju, OP secara eksplisit menyebut operator apa yang tidak diizinkan, dan XOR bukan salah satunya. Ergo, ini jawaban yang valid.
Brian S
3
for(;y;y=(y&x^y)<<1)x^=ylebih pendek 1 byte :)
William Barbosa
22

C - 38 byte

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

Saya sedikit curang di sini, OP mengatakan untuk tidak menggunakan operator matematika .

The *dalam printf()format yang berarti bahwa bidang lebar digunakan untuk mencetak karakter diambil dari sebuah argumen dari printf(), dalam hal ini, 3 dan 4. Nilai kembali dari printf()adalah jumlah karakter yang dicetak. Jadi itu mencetak satu ' 'dengan lebar bidang 3, dan satu dengan lebar bidang 4, membuat total 3 + 4 karakter.

Nilai kembali adalah nomor yang ditambahkan dalam printf()panggilan.

syb0rg
sumber
3
Anda harus membuat 3 dan 4 parameter, dan fungsinya tidak harus seperti itu main. Juga, jika Anda tidak peduli dengan apa yang Anda cetak, Anda dapat menggantinya ' 'dengan 0dan menghilangkan yang kedua.
ugoren
17

Python - 49 byte

Mengasumsikan input oleh penempatan dalam variabel xdan y.

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

Ini 61 byte solusi adalah program penuh:

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

Mengingat Anda tidak melarang eksponensial, saya harus memposting ini. Saat Anda menyederhanakan ekspresi menggunakan properti logaritma, Anda cukup mendapatkannya print input() + input().

Ini mendukung angka negatif dan angka mengambang.

Catatan: Saya mengikuti saran gnibbler dan membagi jawaban ini menjadi tiga. Ini adalah solusi Mathematica , dan ini adalah solusi Dasar TI-89 .

Justin
sumber
Saya mencoba melakukan sesuatu yang mirip dengan javascript, tetapi lupa apa rumusnya sejak beberapa tahun terakhir saya melihatnya dan mencari di internet untuk menemukannya.
Victor Stafusa
4
@ Viktor Saya membuat formula sendiri. Saya ingat matematika dengan sangat jelas.
Justin
1
Mathematica Anda sangat dekat, Anda hanya perlu menggunakan huruf besar simbol bawaan. Log [Log [(E ^ E ^ x) ^ (E ^ y)]]] berfungsi (23 karakter, atau 22 jika Anda menggunakan notasi @ untuk pembungkus fungsi luar).
Michael Stern
"Jika saya diizinkan untuk menerima input dengan penempatan dalam variabel x dan y .." Saya pikir Anda bisa - orang lain juga melakukannya.
blabla999
@MichaelStern: Anda dapat menyimpan dua karakter lagi dengan melewatkan tanda kurung E^y. Menggunakan Log[Log[(E^E^x)^E^y]]tampaknya berfungsi dengan baik.
alexwlchan
14

JavaScript [25 byte]

~eval([1,~x,~y].join(''))
Andrew Templeton
sumber
1
Jawaban Anda terlihat buruk (dan menarik-downvote), tetapi sebenarnya jawaban yang bagus. Hapus yang ini untuk menyingkirkan downvotes dan posting ulang ini dengan beberapa teks yang menjelaskannya. Saya akan mengubah jawaban baru Anda.
Victor Stafusa
1
Sekarang terlihat sangat bagus, saya menyukainya. Tentunya bernilai lebih banyak upvotes.
VisioN
13

Mathematica, 21 byte

Ada sejumlah cara untuk melakukan ini di Mathematica. Pertama, gunakan fungsi Akumulasi dan lemparkan semuanya kecuali angka terakhir pada output. Seperti dengan solusi saya yang lain di bawah ini, saya berasumsi nomor input dalam variabel adan b. 21 byte

Last@Accumulate@{a, b}

Lebih menyenangkan, meskipun 45 karakter, gunakan angka-angka untuk menentukan garis dan berintegrasi di bawahnya.

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

Sebagai bonus, kedua solusi bekerja untuk semua bilangan kompleks, bukan hanya bilangan bulat positif yang tampaknya menjadi masalah untuk beberapa solusi lain di sini.

Michael Stern
sumber
2
Saya suka integrasi! (walaupun, secara tegas ini menambahkan sesuatu). +1
blabla999
Solusi pertama tidak valid. Mengutip penulis tantangan: "Selain itu, Anda tidak dapat menggunakan fungsi bawaan yang dirancang untuk menggantikan operator matematika tersebut.". Saya telah memberikan solusi ini: function _(){return array_sum(func_get_args());}. Saya harus menghapusnya karena saya tidak dapat menemukan cara singkat untuk "memperbaikinya".
Ismael Miguel
@Ismael Miguel Accumulate [] tidak dirancang untuk menggantikan Plus. Kebetulan memberikan jumlah daftar nomor di antara outputnya, dan saya mengambil keuntungan dari itu.
Michael Stern
Tapi itu membuat jumlah semua elemen dalam daftar itu, kan? Jika ya, menurut saya, itu sama tidak validnya dengan menggunakan array_sum()di php, yang melakukan hal yang persis sama.
Ismael Miguel
3
@Ismael Miguel Ada fungsi Mathematica yang menjumlahkan array, yang disebut Total []. Saya setuju itu akan melanggar aturan seperti yang ditentukan untuk menggunakan fungsi itu, tetapi saya tidak melakukannya. Output dari Akumulasi [{a, b}] bukan a + b.
Michael Stern
12

GolfScript, 6 4 karakter / byte

Masukan dalam bentuk 10, 5(=> 15).

~,+,

Ini +adalah rangkaian array, bukan tambahan.

Cara kerjanya adalah yang ,digunakan untuk membuat array dengan panjang angka tersebut ( 0,1,...,n-2,n-1). Ini dilakukan untuk kedua angka, maka array digabungkan. ,digunakan lagi untuk tujuan yang berbeda, untuk menemukan panjang array yang dihasilkan.

Sekarang, inilah triknya . Saya sangat suka yang ini karena menyalahgunakan format input. Ini terlihat seperti itu hanya memasukkan array, tapi benar-benar, karena input sedang dijalankan sebagai kode GolfScript, yang pertama ,sudah dilakukan untuk saya! (Versi 6-karakter lama ~,\,+,dengan format input 10 5, yang saya mencukur 2 karakter dengan menghilangkan \,(swap-array)).

Versi lama (12) :

Menciptakan suatu fungsi f.

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

Masing *-masing +adalah pengulangan dan penggabungan string, bukan fungsi aritmatika.

Penjelasan: nmembuat string satu karakter (baris baru). Ini kemudian berulang akali, maka hal yang sama dilakukan dengan b. String digabungkan, dan kemudian ,digunakan untuk panjang string.

Gagang pintu
sumber
Apakah itu berfungsi untuk angka negatif juga?
Michael Stern
@MichaelStern Tidak, tapi itu tidak pernah disebutkan dalam pertanyaan. Hmm, saya sudah menambahkan komentar. Sebagian besar (pada kenyataannya, semua ) jawaban lain juga menganggap positif.
Gagang Pintu
Lihat solusi Mathematica saya. Dalam bahasa yang tepat, solusi untuk angka negatif dimungkinkan.
Michael Stern
@MichaelStern LOL @ "bahasa yang tepat" di situs ini dari semua tempat ...
Tobia
10

C, 29 27 Bytes

Menggunakan pointer aritmatika:

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

x didefinisikan sebagai pointer, tetapi pemanggil harus melewati bilangan bulat.

Seorang pengguna anonim menyarankan yang berikut - juga 27 byte, tetapi parameternya adalah bilangan bulat:

f(x,y){return&x[(char*)y];}
ugoren
sumber
Bentuk pertama mungkin rusak parah jika melewati dua ints pada sistem sekarang-umum di mana intmemiliki 32 bit, dan pointer memiliki 64 bit. Yang kedua menghindari masalah itu.
hvd
@ DVD, Keduanya berfungsi, setidaknya di Linux 64bit. Parameter integer diperluas ke ukuran register mesin.
ugoren
Ah, cukup adil, setuju bahwa itu akan menjadi kasus umum. Akan berkomentar lagi jika saya dapat menemukan contoh konkret yang tidak berhasil. :)
hvd
8

Brainf * ck, 9 36

,>,[-<+>]

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

Ini berfungsi tanpa menggunakan penambahan sederhana; melewati dan meletakkan jejak 1 dan kemudian menghitungnya

Catatan: The +dan -hanyalah peningkatan tunggal dan tidak ada yang dapat dilakukan di brainf * ck tanpa mereka. Mereka tidak benar-benar penambahan / pengurangan jadi saya percaya ini masih diperhitungkan.

ASKASK
sumber
-1. Ini tambahan sederhana. Jika Anda melakukan sesuatu yang bukan penjumlahan, perkalian, dll, maka itu diperhitungkan, tetapi sebagaimana adanya, ini tidak masuk hitungan.
Justin
@ Quincunx saya memperbaikinya; saya melakukannya dengan melewati dan meninggalkan jejak yang kemudian menyapu dan 'mengambil' jejak itu
MEMINTA
3
Terbalik. Pekerjaan yang baik.
Justin
6

J (6)

Anda tidak mengatakan kami tidak dapat menggunakan fungsi succ:

>:@[&0

Pemakaian:

   9>:@[&0(8)
17

Itu hanya 9 pengulangan >:pada 8.

Pendekatan daftar Rangkaian bekerja, juga: #@,&(#&0). Dan - saya tahu itu melanggar aturan - saya tidak bisa membiarkan jawaban ini pergi tanpa solusi J-ish yang paling: *&.^(perkalian di bawah eksponensial).

James Wood
sumber
5

Catatan tambahan, 41

Kami mendefinisikan fungsi dengan ekspresi 41 byte sepanjang:

/a{0 moveto 0 rmoveto currentpoint pop}def

Kemudian kita menyebutnya sebagai:

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

Pemberian yang mana

25.0

Ini dengan mudah menangani hal negatif dan mengapung, tidak seperti kebanyakan pesaing :-)

pengguna2846289
sumber
4

bash, 20 karakter

(seq 10;seq 4)|wc -l
Nik O'Lai
sumber
4

Smalltalk (sekarang serius), 123 118 105 (*)

Maaf telah menjawab dua kali, tetapi anggap ini jawaban yang serius, sementara yang lain lebih seperti humor. Berikut ini sebenarnya dieksekusi tepat pada saat ini di semua mesin kami (dalam perangkat keras, meskipun). Aneh bahwa itu datang ke pikiran orang lain ...

Dengan menggabungkan dua setengah-adders, dan melakukan semua bit dari kata-kata secara paralel, kita mendapatkan (input a, b; output dalam s) versi yang dapat dibaca:

  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           

Loop untuk propagasi carry. Topeng memastikan bahwa bilangan bulat yang ditandatangani ditangani (tanpa mereka, hanya nomor yang tidak ditandatangani yang mungkin). Mereka juga menentukan panjang kata, di atas adalah untuk operasi 32bit. Jika Anda lebih suka penambahan 68bit, ubah ke 16rFFFFFFFFFFFFFFFFFFF.

versi golf (123 karakter) (menghindari topeng panjang dengan menggunakan kembali dalam m):

[: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]

(*) Dengan menggunakan -1 alih-alih 16rFFFFFFFFFF, kita dapat bermain golf lebih baik, tetapi kode tidak lagi berfungsi untuk angka presisi yang berubah-ubah, hanya untukIntegers berukuran kecil dengan kata mesin (representasi untuk bigIntegers tidak didefinisikan dalam standar Ansi):

[: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]

ini membawa ukuran kode ke 105 karakter.

blabla999
sumber
Ini kode-golf, jadi golf jawaban Anda.
Victor Stafusa
1
tidak ada peluang untuk menang, tetapi saya akan melakukannya untuk Anda ;-)
blabla999
Senang melihat jawaban Smalltalk!
Sikat gigi
4

APL, 8 dan 12

Tidak ada yang baru di sini, versi penghitungan array:

{≢∊⍳¨⍺⍵}

dan versi log ○ log:

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

Saya hanya berpikir mereka terlihat keren di APL!

{≢     }       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 ⍵
Tobia
sumber
2
Agar adil, semuanya terlihat keren di APL.
Michael Stern
Anda bisa menjadikan yang pertama fungsi awalan ≢∘∊⍳¨
tersembunyi
@ Adám Ya, tapi saya tidak suka fungsi diam-diam dan sulit dibaca.
Tobia
@Tobia Mungkin Anda tidak menyukainya karena Anda merasa sulit dibaca? Saya menjalankan lokakarya tentang itu ... Apakah Anda melihat pelajaran saya tentang itu ?
Adám
@ Adám keren, terima kasih! Akan memeriksanya.
Tobia
4

sed, 359 byte (tanpa format mewah)

Maaf untuk jawaban yang terlambat, dan mungkin jawaban terlama di sini sejauh ini. Tapi saya ingin melihat apakah ini mungkin dengan sed:

                       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/;
                       # # # # # # #  # # # # # # #

Ini mirip dengan https://codegolf.stackexchange.com/a/38087/11259 , yang hanya menambah angka dalam sebuah string. Tetapi sebaliknya ia melakukan operasi kenaikan dalam satu lingkaran.

Input diambil dari STDIN dalam bentuk "x y". Itu pertama kali diubah menjadi "x: 0 :: y:". Lalu, kami menambah semua angka yang muncul setelah karakter ":", hingga kami mendapatkan "x: x: :( x + y):". Kemudian kami akhirnya kembali (x + y).

Keluaran

$ 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
$

Perhatikan bahwa ini hanya berfungsi untuk bilangan asli. Namun (setidaknya dalam teori) ini berfungsi untuk bilangan bulat besar yang sewenang-wenang. Karena kita sedang melakukan operasi kenaikan x pada y, pemesanan dapat membuat perbedaan besar pada kecepatan: x <y akan lebih cepat daripada x> y.

Trauma Digital
sumber
4

Dash , 18 byte

time -f%e sleep $@

Membutuhkan waktu GNU 1,7 atau lebih tinggi. Outputnya ke STDERR.

Cobalah online!

Perhatikan bahwa ini tidak akan berfungsi dalam B ash, karena perintah waktu bawaannya berbeda dari waktu GNU.

Dengan biaya satu byte tambahan, \timedapat digunakan alih-alih timememaksa Bash untuk menggunakan perintah eksternal.

Dennis
sumber
apa yang terjadi jika salah satu input negatif?
Michael Stern
4
Itu gagal. Sama seperti semua jawaban lainnya.
Dennis
5
Drat! Saya berharap itu memberikan hasil sebelum pertanyaan diajukan.
Tobia
3
Ya. Saya juga sangat berharap bahwa dengan memasukkan secara acak sleep -3saya dapat mempercepat program saya. Benar-benar kekecewaan.
Alfe
1
@userunknown juga \timebisa digunakan di Bash.
Dennis
3

Javascript (67)

Mungkin ada yang jauh lebih baik

a=Array;p=Number;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Michael M.
sumber
Anda seharusnya tidak memberikan jawaban yang pasti tanpa mengetahui apakah perlu mengapung atau tidak. Dan itu tidak akan menangani NaN. Tapi itu kode yang cukup bagus!
Ismael Miguel
Saya pikir semua joinsitu tidak perlu. The Arraykonstruktor membuat array undefineds, yang dapat dihitung:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Ben Reich
@BenReich, Anda benar, terima kasih
Michael M.
@Michael Juga, Numberkonstruktor menyimpan lebih dari 2 karakterparseInt
Ben Reich
@ Michael Juga, jika Anda menghapus alert, output masih akan pergi ke konsol, tetapi itu membuat jawabannya sedikit kurang menyenangkan. Anda juga bisa menggunakan kembali promptvariabel alih-alih lansiran, (konstruktor memberi peringatan pada argumen dengan prompt). Bagaimanapun, jawaban yang bagus!
Ben Reich
3

Ruby, 18 karakter

a.times{b=b.next}

Dan dua varian verbose lagi, 29 karakter

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

Versi lain, 32 karakter

(''.rjust(a)<<''.rjust(b)).size
Nik O'Lai
sumber
3

C # - pada pembuatan kode fly

Ya, sebenarnya ada tambahan di sana, tetapi bukan operator + dan bahkan tidak ada fungsi framework yang menambahkan, sebaliknya kita menghasilkan metode on the fly yang melakukan penambahan.

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);
}
fejesjoco
sumber
2

Ruby 39

f=->a,b{[*1..a].concat([*1..b]).length}
Hauleth
sumber
2

R 36

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

di mana repmembangun vektor xyang diikuti oleh ydua-dua.

flodel
sumber
2
Anda dapat membuat program yang melakukan hal yang sedikit lebih pendek:length(rep(1:2,scan()))
Masclins
2

TI Basic 89 - 19 byte

Jalankan ini di TI-89 Anda (Layar awal atau aplikasi pemrograman):

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

Ini menggunakan aturan log untuk menghitung x+y, seperti dalam solusi ini . Sebagai bonus, ini berfungsi untuk angka desimal dan bilangan bulat. Ini bekerja untuk semua bilangan real. Jika aturan logaritma masih valid dengan eksponen kompleks, maka ini berfungsi untuk bilangan kompleks juga. Namun, kalkulator saya mengeluarkan sampah ketika saya mencoba memasukkan eksponen yang kompleks.

Justin
sumber
3
Bukankah ln1 byte di TI Basic? Selain itu, Anda dapat menjatuhkan tanda kurung penutup, menurunkannya menjadi 15 byte.
6ıʇǝɥʇu
2

Terimakasih untuk Michael Stern karena mengajari saya notasi Mathematica .

Mathematica - 21 20 byte

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

Ini menggunakan pendekatan yang sama dengan solusi ini , tetapi ada di Mathematica untuk membuatnya lebih pendek. Ini berfungsi untuk angka titik negatif dan mengambang serta bilangan bulat di xdan y.

Menyederhanakan ekspresi menggunakan hasil aturan log x+y, tapi ini valid karena menggunakan eksponensial, bukan salah satu dari 4 operator dasar.

Justin
sumber
Apakah Anda yakin itu berfungsi untuk bilangan kompleks?
Michael Stern
2

C # - string aritmatika

Kami mengonversi kedua angka menjadi string, melakukan penambahan dengan memotong string (dengan carry dan semuanya, Anda tahu), lalu mengurai kembali ke integer. Diuji dengan i1, i2 di 0..200, bekerja seperti pesona. Temukan tambahan di sini!

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()));
}
fejesjoco
sumber
2

C (79)

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

Python - 22 karakter

len(range(x)+range(y))
pydud
sumber
1
Saya pikir itu dianggap sebagai tambahan?
TheDoctor
1
itu adalah rangkaian
pydud
2

APL: 2

1⊥

Ini mengubah angka-angka dari basis 1, jadi (n * 1 ^ 1) + (m * 1 ^ 2) yang persis n + m.

Dapat dicoba di TryApl.org

Moris Zucca
sumber
2

TI-BASIC, 10

Tambah XdanY

ln(ln(e^(e^(X))^e^(Y
Timtech
sumber
1
Anda yakin tahu cara menyalin solusi: codegolf.stackexchange.com/a/21033/9498
Justin
Pertama, ini tidak berfungsi karena menggunakan log (bukan ln (. Kedua, ini sebenarnya sepuluh byte jika dituliskan dalam bentuk ln (ln (e ^ (e ^ (X)) ^ e ^ (Y.
lirtosiast
2

K, 2 byte

#&

Contoh penggunaan:

  #&7 212
219

Terapkan operator "di mana" (monadik &) ke angka-angka dalam daftar input (mungkin mengambil kebebasan dengan format input). Ini akan menghasilkan daftar yang berisi angka nol pertama diikuti oleh angka kedua:

  &3 2
0 0 0 1 1

Biasanya operator ini digunakan sebagai "kumpul" untuk menghasilkan daftar indeks elemen bukan-nol dari daftar boolean, tetapi bentuk umum kadang-kadang berguna.

Maka cukup ambil hitungan daftar itu (monadik #).

Jika interpretasi saya terhadap persyaratan input tidak dapat diterima, solusi yang sedikit lebih lama berikut melakukan trik yang sama:

{#&x,y}
JohnE
sumber
2

Pyth , 29 byte

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

Cobalah online!

Kiriman pertama saya di sini!

Ini mengkompilasi ke:

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
bengdahl
sumber
1
Selamat datang di situs ini!
Wheat Wizard