pengantar
Mari kita mendefinisikan operasi aritmatika baru, yang saya sebut multiplikasi ritsleting . Untuk melipatgandakan dua bilangan bulat non-negatif, Anda menambahkan nol di depan untuk membuat panjangnya cocok, kalikan basis-10 angka yang sesuai, tambahkan nol di depan dengan hasil untuk mendapatkan angka 2 digit, menyatukannya, dan akhirnya menjatuhkan nol di depan.
Berikut ini contoh dengan A = 1276 dan B = 933024 :
1. Add leading zeros
A = 001276
B = 933024
2. Multiply digit-wise
A = 0 0 1 2 7 6
B = 9 9 3 0 2 4
-> 0 0 3 0 14 24
3. Pad to 2 digits
-> 00 00 03 00 14 24
4. Concatenate
-> 000003001424
5. Drop leading zeros
-> 3001424
Operasi diperluas ke semua bilangan bulat dengan aturan tanda yang biasa: waktu positif negatif adalah negatif, waktu negatif negatif adalah positif dan sebagainya.
Tugas
Input Anda adalah dua bilangan bulat, dan output Anda adalah kelipatan ritsleting. Anda harus dapat menangani input besar secara sewenang-wenang. Input dan / atau output dapat dalam format string (dan memang harus demikian, jika bahasa Anda tidak mendukung bilangan bulat besar secara sewenang-wenang). Catat itu-0
ini bukan input atau output yang valid.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap, dan jumlah byte terendah menang.
Uji kasus
0 0 -> 0
302 40 -> 0
302 -40 -> 0
-4352 448 -> -122016
0 6623 -> 0
0 -6623 -> 0
20643 -56721 -> -1000420803
63196 21220 -> 1203021800
1276 933024 -> 3001424
-1276 933024 -> -3001424
-1276 -933024 -> 3001424
5007204555 350073039 -> 12001545
-612137119 -8088606033 -> 816060042000327
3389903661 -6619166963 -> -18180881090018543603
-23082746128560880381 1116941217 -> -8050600723200060807
-668336881543038127783364011867 896431401738330915057436190556 -> -485448120906320001351224000900090235004021121824000900403042
402878826066336701417493206805490000415 312487283677673237790517973105761463808 -> 120004325656161618004242182118140007280900200921180018080025285400000000320040
sumber
b⁵
denganD
untuk mendapatkan 10 byte. : PPython 2, 99 byte
Banyak byte yang ada untuk memperhitungkan tanda jika input negatif. Dalam Python,
n%d
selalu non-negatif jikad
positif 1 . Menurut pendapat saya ini umumnya diinginkan, tetapi di sini tampaknya tidak nyaman: menghapus panggilanabs
akan merusak kode di atas. Sementara itup
melacak "nilai tempat" (yang, ratusan, dll.) Dan juga mengingat tanda output yang diinginkan.Kode ini pada dasarnya simetris
a
danb
kecuali dalamwhile
kondisi: kita terus berjalan sampaia
nol, dan berakhir pada waktu itu. Tentu saja jikab
nol dulu, maka kita akan menambahkan nol untuk sementara waktu sampaia
nol juga.1 Misalnya,
(-33)%10
mengembalikan7
, dan hasil bagi bilangan bulat dari(-33)/10
adalah-4
. Ini benar karena(-4)*10 + 7 = -33
. Namun, produk ritsleting(-33)
dengan33
harus berakhir di3*3 = 09
bukan7*3 = 21
.sumber
JavaScript (ES6), 44 byte
Mudahnya ini otomatis berfungsi untuk angka negatif.
sumber
f=
dalam jumlah byte. Juga,|0
ini karena saya butuh pembagian bilangan bulat, saya tidak tahu bagaimana menurut Anda Anda mendapatkan jawaban yang tepat tanpa itu.|0
. Mungkin pengalihan fungsi baru ke f tidak bekerja dan saya masih menguji versi lama dengan|0
.C, 77 byte
-2 byte untuk menghapus kawat gigi redundan (
*
asosiatif).t
= 1.100.10000, ... digunakan untuk pengisian. Selamaa
ataub
tidak nol teruslah mengalikan digit terakhir%10
dengant
dan menumpuk. Kemudian erease digit terakhir daria
danb
(/=10
) dan bergesert
dengan 2 digit (*=100
).Tidak digabungkan dan digunakan:
sumber
for(r=0;a|b;t*=100)r+=a%10*t*(b%10),a/=10,b/=10
alih-alihr=0;while(a|b)r+=t*(a%10)*(b%10),a/=10,b/=10,t*=100
Sebenarnya ,
2319 byteInput diambil sebagai dua string. Juga, tampaknya berusaha untuk mengkonversi dari basis 100, seperti yang dilakukan ais523 dalam jawaban Jelly mereka, tidak bekerja dengan baik di Sebenarnya. Akan menghemat 9 byte juga jika berhasil: / Saran Golf selamat datang! Cobalah online!
Edit: -4 byte dari mengubah bagaimana hasilnya dibangun menjadi nomor baru.
Tidak melakukanolf
sumber
Mathematica 66 Bytes
Tidak Terkumpul:
di mana% berarti hasil keluaran sebelumnya
sumber
R,
18211010786 byteTidak lagi jawaban terpanjang (terima kasih, Racket), dan bahkan lebih pendek dari solusi Python (yang jarang terjadi)! Fungsi anonim yang mengambil dua bilangan bulat sebagai input.
Begini cara kerjanya.
Penggandaan ritsleting melibatkan pemisahan angka-angka input ke dalam digit konstituennya. Kami mengambil nilai absolut dari angka dan melakukan modulo untuk menurunkan daya 10:
Jadi di sini kita mengambil satu angka
x
,, dan menerapkan modulo dengan 99 nomor lainnya (10^99
sampai10^1
). R mengulangi secara implisitx
99 kali, mengembalikan vektor (daftar) dengan 99 elemen. (x %% 10^99
,x %% 10^98
,x %% 10^97
, Dll)Kami menggunakan
10^99
melalui10^1
. Implementasi yang lebih efisien akan menggunakan nilai jumlah digit dalam jumlah terpanjang (periksa riwayat edit posting ini; versi sebelumnya melakukan ini), tetapi hanya mengambil99..1
menggunakan byte lebih sedikit.Untuk
x = 1276
ini memberi kitaSelanjutnya, kami menggunakan divisi integer dengan menurunkan kekuatan 10 untuk melengkapi angka:
Ini menghasilkan
yang merupakan representasi yang kita inginkan. Dalam kode, kami akhirnya ingin menggunakan
10^(98:0)
lagi nanti, jadi kami menetapkannya ke variabel:(Membungkus ekspresi dalam tanda kurung di R umumnya mengevaluasi ekspresi (dalam hal ini, menetapkan nilai
10^(98:0)
untuke
), dan kemudian juga mengembalikan output dari ekspresi, memungkinkan kami untuk menanamkan penugasan variabel dalam perhitungan lain.)Selanjutnya, kami melakukan penggandaan digit secara berpasangan pada input. Outputnya kemudian diisi hingga dua digit dan digabungkan. Padding ke dua digit dan penggabungan setara dengan mengalikan setiap angka dengan
10^n
, di manan
jarak dari tepi kanan, dan kemudian menjumlahkan semua angka.Terutama, karena perkalian komutatif, kita dapat melakukan perkalian dengan
10^n
sebelum kita kalikan A dengan B . Jadi, kami mengambil perhitungan sebelumnya dan mengalikannya dengan10^(98:0)
:yang setara dengan
Setelah menerapkan ini untuk A , kita kemudian akan ingin mengulang seluruh operasi ini pada B . Tapi itu membutuhkan byte yang berharga, jadi kita mendefinisikan suatu fungsi jadi kita hanya perlu menulisnya sekali:
Kami melakukan trik embedding-in-kurung kami untuk memungkinkan kami mendefinisikan dan menerapkan fungsi pada saat yang sama, untuk memanggil fungsi ini pada A dan B dan melipatgandakannya bersama-sama. (Kita bisa mendefinisikannya pada baris terpisah, tetapi karena kita akhirnya akan menempatkan semua ini ke dalam fungsi anonim, jika kita memiliki lebih dari satu baris kode maka semuanya perlu dibungkus dengan kurung kurawal, yang harganya berharga byte.)
Dan kita mengambil jumlah semua ini, dan kita hampir selesai:
Satu-satunya hal yang perlu dipertimbangkan sekarang adalah tanda input. Kami ingin mengikuti aturan perkalian reguler, jadi jika satu dan hanya satu dari A dan B negatif, hasilnya negatif. Kami menggunakan fungsi
sign
yang mengembalikan1
ketika diberi angka positif dan-1
ketika diberi angka negatif, untuk menghasilkan koefisien yang kami kalikan seluruh perhitungan kami dengan:Akhirnya, semuanya dibungkus menjadi fungsi anonim yang mengambil
a
danb
sebagai input:Hapus spasi dan itu 86 byte.
sumber
Python 3 ,
92 byte, 119 byteCobalah online!
Biaya perbaikan untuk menangani angka negatif 29 byte: /
sumber
lstrip
bagian dengan membungkus semuanya di dalamint()
dan mengembalikan nomor.Pyke, 16 byte
Coba di sini!
Di mana adalah byte
0x84
atau132
sumber
PHP, 84 byte
sedikit lebih lama dengan penggabungan string (86 byte):
sumber
Racket 325 byte
Tidak Terkumpul:
Pengujian:
Keluaran:
sumber
PowerShell ,
153151 byteCobalah online!
Kurang bermain golf:
sumber
Perl 5
-MList::Util=min
, 140 byteCobalah online!
sumber