Ada pertanyaan di situs yang meminta untuk mengimplementasikan divisi tanpa menggunakan divisi.
Dalam kasus saya, saya meminta Anda untuk melakukan hal yang sama, tetapi hanya menggunakan tambahan.
Apa artinya ini pada dasarnya: penjumlahan adalah satu-satunya operator atau fungsi yang diizinkan yang beroperasi pada angka dan mengembalikan angka lainnya (yaitu tidak ada pengurangan, perkalian, eksponensial, inversi bitwise, dll.). Hal-hal seperti jika pernyataan, penugasan dan operator perbandingan, dan untuk loop masih diizinkan, asalkan di dalamnya, Anda masih menggunakan tambahan.
Tugas Anda adalah membangun fungsi divide(a, b)
yang mengambil dua bilangan bulat positif a
dan b
dan mengembalikan hasil a
yang dibagi dengan b
dan dibulatkan ke nol, tetapi menggunakan penjumlahan dan tidak ada operator aritmatika lainnya, dan tidak ada data lain yang membangun selain angka.
Kode yang menang akan menjadi salah satu yang membutuhkan operasi tambahan paling sedikit harus dilakukan selama set input mana a
bervariasi dari 1
ke 200
dan b
bervariasi dari 1
ke a
.
Untuk melacak hal ini, Anda dapat membuat versi alternatif dari kode Anda yang menggantikan setiap instance a + b
dengan add(a, b)
dan program add
untuk menambah add_used
variabel global serta mengembalikan jumlah dari dua angka.
sumber
Jawaban:
Aturan menulis itu sulit, aturan-aturan ini khususnya mengandung insentif untuk menghindari penambahan di semua biaya.
Apakah ada hadiah untuk jawaban paling konyol?
JavaScript - 0 tambahan
Sekarang dengan metode fallback yang melakukan solusi besar untuk ukuran lebih besar
a
dan lebih besarb
, dan struktur yang sedikit lebih kompak agar tidak menembus batas karakter. (Pfff, 30000 karakter. Apa ini? Twitter?) Masih tidak ada penambahan dalam cakupan yang diukur.sumber
a
1 hingga 200, ia hanya mengatakan akan menilai skor berdasarkan total penambahan dari rentang input tersebut. Itu masih harus bekerja untuk bilangan bulat di atas 200.Tcl, 0 tambahan
Mengapa tidak menggunakan string?
sumber
Append
mirip dengan penambahan, tetapi tidak persis sama. SayaJoined
daftar, menggunakan logika serupa berdasarkan penghitungan.Haskell 0 tambahan, 29 byte
ini mendefinisikan kembali operator divisi (
/
). ini bekerja dengan membuat daftar0
hingga tak terhingga di mana setiap item diulangim
kali, dan kemudian memilih elemen ke-n dari daftar (menggunakan indeks berbasis 0).sumber
([0..]>>=replicate m)!!n
. hampir samaGunakan implementasi ini di java, 199206 tambahan
Berikut ini adalah fungsi pembantu
sumber
Python - 0 tambahan
Ini menggunakan iterator dengan panjang
a
, dan mengkonsumsinya dalam kelompokb
sampaiStopIteration
dinaikkan. Pada titik inij
berisi hasilnya.sumber
Solusi saya adalah kode C / C ++ dan itu membuat banyak tambahan (200402), tapi tetap ...
Dan hasilnya adalah:
sumber
Python, 320703 tambahan
Seperti biasa, jawaban referensi tempat terakhir. Ini hanya menambah
1
"quotient" danb
variabel "remultiplication" sampai hita
.Berikut adalah kode debug:
sumber
Tcl, 0 tambahan.
Yah, saya harus menemukan cara yang tidak menggunakan struktur data lain tetapi masih bukan yang Anda inginkan:
Menggunakan ukuran tumpukan saat ini dari untaian hijau yang berbeda.
sumber
C ++, 100201
sumber
a < b
hasilnya seharusnya0
, bukan kesalahan.break
seharusnyacontinue
.Mathematica 100201 tambahan
Ini menambahkan pembagi,,
b
kec
(yang diinisialisasi pada 0) selama total berjalan kurang dari atau sama dengan dividena
,. Ini juga menambahkan nilai saat inic
ke daftar,t
,, tanpa melakukan operasi aritmatika.Ketika
While
loop mengakhiri fungsi menghasilkan panjangt
, yang akan sesuai persis dengan hasil bagi pembagian bilangan bulat. Demikian jumlah penambahan untuk yang diberikandivide[a,b]
akan sama dengan hasil bagi.100201 adalah jumlah dari quotients dalam tabel 200 dengan 200. Itu sudah berapa kali
c
bertambahb
. Tidak diperlukan tambahan lain. Hanya bilangan bulat positif yang digunakan.Ini lebih efisien untuk membuat tabel pencarian, setelah itu setiap pencarian akan hampir instan.
Pemakaian
sumber
n++
hal itu? Sepertinya tambahan untuk saya.n++
, yang sama sekali tidak perlu. Dari apa yang bisa saya katakan, (saya tidak tahu TCL), solusi saya adalah seperti milik Anda, tetapi menyimpan elemen bersama-sama dalam beberapa set daripada dalam string.no other data constructs besides numbers
?Selain R - 0
Menggunakan daur ulang vektor R.
Baris kedua menciptakan matriks panjang yang
a
diisi oleh vektor panjangb
yang didaur ulang hingga mencapai panjanga
.Baris ketiga membelah matriks berdasarkan nilainya dan mengembalikan panjang elemen terakhir (maka hasil pembagian integer
a
olehb
).Mengisi matriks dengan vektor yang panjangnya bukan kelipatan dari panjang matriksnya akan memberikan peringatan, tetapi jika kita menekan peringatan sebelumnya (baris 1) itu berfungsi.
Untuk memberikan contoh nyata jika kita membagi 5 dengan 3,
A
akan menjadi vektor yang mengandung 1 2 3 1 2 (yaitu 1 2 3 didaur ulang hingga panjang 5). Hasil dari operasi pemisahan akan menjadi daftar dengan elemen pertama yang mengandung 1 1, 2 2 2 dan 3 ketiga (karena hanya ada satu 3 inA
). Karena itu hasilnya 1.sumber
Di Ruby,
Saya tidak tahu TCL, tapi saya menduga ini adalah pendekatan yang sama dengan jawaban @Johannes (pertama).
sumber
d = 'x' * 5
=> "xxxxx".a << b
menambahkan stringb
ke stringa
. Di sini,d = "xxx"
dand << 'x'
menghasilkand = "xxxx"
.Java: 92.987 tambahan
Saya menggunakan rekursi biner, itu
a/b == 2 * a/(2b) + maybe 1
. Untuk itu pembagi dan sisanya diperlukan. Biasanya akan ada pengurangan a% (2b) - b, tetapi itu diselesaikan dengan memegang sisanya sebagai(rem, remNegative)
. Dan2b = b+b
tentu saja.sumber
sumber
C # - 0 tambahan
Mengisi daftar bilangan bulat dengan waktu yang
1..b
berulanga
. Jumlah kalib
muncul (kecuali untuk kejadian dengan indeks>a
) adalah hasilnya.Saya tidak yakin apakah daftar diizinkan oleh aturan, tapi saya mengirimkan ini dalam semangat posting lain yang tidak menganggap serius semua aturan (setelah semua, tidak menggunakan penambahan sama sekali pada dasarnya melewati tantang semuanya).
sumber
C - 85591 Tambahan
Kita mulai. Saya pikir ini mungkin optimal. Ia menggunakan teknik "pembagian terbalik" di mana melalui perkalian panjang ia membangun jumlah terbesar
q
sedemikian rupaq * b <= a
, hanya menggunakan+
dan<=
. Ini sangat, sangat cepat.Catatan:
s(a,b)
mengembalikan jumlaha+b
dan variabel penghitung kenaikanz
setiap kali penambahan dilakukan. Jika salah satua
ataub
nol, penambahan yang tidak perlu dihindari.d(a,b,p)
adalah fungsi rekursif untuk membangun bagian internal untuk perbandingan dan penambahan. Menggunakan variabel globalq
,u
danv
. Kedalaman rekursi maksimum adalah jumlah bita
, dan rekursi adalah linier daripada pohon. (Catatan:b
dalam fungsi ini adalah yang aslib
dikalikan dengan kekuatan 2.)divide(a,b)
mengembalikan lantai (a / b) sesuai kebutuhan.sumber
J, 0 tambahan, 14 byte
Terinspirasi oleh jawaban Alexei Kopylov .
Tidak menggunakan matematika sama sekali:
sumber