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 number
karakter, menambahkansecond number
karakter, 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
sumber
Jawaban:
Smalltalk,
2113Semua 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):
versi2
serupa, dan bahkan sedikit lebih pendek (karena aturan diutamakan Smalltalk, dan tidak ada pergeseran yang tepat diperlukan):
versi3
variasi lain dari tema "koleksi-menyatukan-meminta ukuran",
diberi dua angka a dan b,
menggunakan Interval sebagai koleksi, kami mendapatkan versi yang lebih ramah memori ;-) dalam 21 karakter:
tidak direkomendasikan untuk angka berat, meskipun.
versi4
Untuk hiburan Anda, jika Anda ingin menukar waktu dengan ingatan, cobalah:
yang biasanya cukup akurat (tetapi tidak ada jaminan ;-)))
versi5
menulis ke file dan meminta ukurannya
sumber
Javascript (25)
Ini menambahkan dua variabel x dan y, hanya menggunakan operasi bitwise, dan menyimpan hasilnya dalam x.
Ini bekerja dengan angka negatif juga.
sumber
while(y)x^=y,y=(y&x^y)<<1
!for(;y;y=(y&x^y)<<1)x^=y
lebih pendek 1 byte :)C - 38 byte
Saya sedikit curang di sini, OP mengatakan untuk tidak menggunakan operator matematika .
The
*
dalamprintf()
format yang berarti bahwa bidang lebar digunakan untuk mencetak karakter diambil dari sebuah argumen dariprintf()
, dalam hal ini, 3 dan 4. Nilai kembali dariprintf()
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.sumber
main
. Juga, jika Anda tidak peduli dengan apa yang Anda cetak, Anda dapat menggantinya' '
dengan0
dan menghilangkan yang kedua.Python - 49 byte
Mengasumsikan input oleh penempatan dalam variabel
x
dany
.Ini 61 byte solusi adalah program penuh:
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 .
sumber
E^y
. MenggunakanLog[Log[(E^E^x)^E^y]]
tampaknya berfungsi dengan baik.JavaScript [25 byte]
sumber
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
a
danb
. 21 byteLebih menyenangkan, meskipun 45 karakter, gunakan angka-angka untuk menentukan garis dan berintegrasi di bawahnya.
Sebagai bonus, kedua solusi bekerja untuk semua bilangan kompleks, bukan hanya bilangan bulat positif yang tampaknya menjadi masalah untuk beberapa solusi lain di sini.
sumber
function _(){return array_sum(func_get_args());}
. Saya harus menghapusnya karena saya tidak dapat menemukan cara singkat untuk "memperbaikinya".array_sum()
di php, yang melakukan hal yang persis sama.GolfScript,
64 karakter / byteMasukan 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 input10 5
, yang saya mencukur 2 karakter dengan menghilangkan\,
(swap-array)).Versi lama (12) :
Menciptakan suatu fungsi
f
.Masing
*
-masing+
adalah pengulangan dan penggabungan string, bukan fungsi aritmatika.Penjelasan:
n
membuat string satu karakter (baris baru). Ini kemudian berulanga
kali, maka hal yang sama dilakukan denganb
. String digabungkan, dan kemudian,
digunakan untuk panjang string.sumber
C,
2927 BytesMenggunakan pointer aritmatika:
x
didefinisikan sebagai pointer, tetapi pemanggil harus melewati bilangan bulat.Seorang pengguna anonim menyarankan yang berikut - juga 27 byte, tetapi parameternya adalah bilangan bulat:
sumber
int
s pada sistem sekarang-umum di manaint
memiliki 32 bit, dan pointer memiliki 64 bit. Yang kedua menghindari masalah itu.Brainf * ck,
936Ini 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.sumber
J (6)
Anda tidak mengatakan kami tidak dapat menggunakan fungsi succ:
Pemakaian:
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).sumber
Catatan tambahan, 41
Kami mendefinisikan fungsi dengan ekspresi 41 byte sepanjang:
Kemudian kita menyebutnya sebagai:
Pemberian yang mana
Ini dengan mudah menangani hal negatif dan mengapung, tidak seperti kebanyakan pesaing :-)
sumber
bash, 20 karakter
sumber
Smalltalk (sekarang serius),
123 118105 (*)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:
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):
(*) 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):
ini membawa ukuran kode ke 105 karakter.
sumber
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!
sumber
≢∘∊⍳¨
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:
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
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.
sumber
Dash , 18 byte
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,
\time
dapat digunakan alih-alihtime
memaksa Bash untuk menggunakan perintah eksternal.sumber
sleep -3
saya dapat mempercepat program saya. Benar-benar kekecewaan.\time
bisa digunakan di Bash.Javascript (67)
Mungkin ada yang jauh lebih baik
sumber
joins
itu tidak perlu. TheArray
konstruktor membuat arrayundefineds
, yang dapat dihitung:a=Array;p=parseInt;r=prompt;alert(a(p(r())).concat(a(p(r()))).length)
Number
konstruktor menyimpan lebih dari 2 karakterparseInt
alert
, output masih akan pergi ke konsol, tetapi itu membuat jawabannya sedikit kurang menyenangkan. Anda juga bisa menggunakan kembaliprompt
variabel alih-alih lansiran, (konstruktor memberi peringatan pada argumen dengan prompt). Bagaimanapun, jawaban yang bagus!Ruby, 18 karakter
Dan dua varian verbose lagi, 29 karakter
Versi lain, 32 karakter
sumber
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.
sumber
Ruby 39
sumber
R 36
di mana
rep
membangun vektorx
yang diikuti olehy
dua-dua.sumber
length(rep(1:2,scan()))
TI Basic 89 - 19 byte
Jalankan ini di TI-89 Anda (Layar awal atau aplikasi pemrograman):
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.sumber
ln
1 byte di TI Basic? Selain itu, Anda dapat menjatuhkan tanda kurung penutup, menurunkannya menjadi 15 byte.Terimakasih untuk Michael Stern karena mengajari saya notasi Mathematica .
Mathematica -
2120 byteIni 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
x
dany
.Menyederhanakan ekspresi menggunakan hasil aturan log
x+y
, tapi ini valid karena menggunakan eksponensial, bukan salah satu dari 4 operator dasar.sumber
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!
sumber
C (79)
sumber
Python - 22 karakter
sumber
APL: 2
Ini mengubah angka-angka dari basis 1, jadi (n * 1 ^ 1) + (m * 1 ^ 2) yang persis n + m.
Dapat dicoba di TryApl.org
sumber
TI-BASIC, 10
Tambah
X
danY
sumber
K, 2 byte
Contoh penggunaan:
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: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:
sumber
Pyth , 29 byte
Cobalah online!
Kiriman pertama saya di sini!
Ini mengkompilasi ke:
sumber