Ada cara yang bagus untuk melakukan perkalian panjang untuk dua bilangan bulat tanpa harus melakukan apa pun selain menghitung, yang sesekali dibagikan di internet. Anda menulis digit setiap angka sebagai sekelompok garis miring, dengan dua angka pada sudut 90 derajat. Kemudian Anda bisa menghitung simpang pada kolom terpisah yang muncul. Diagram mungkin akan memperjelas hal ini. Berikut ini contoh untuk menghitung 21 * 32
:
Jika Anda mencari "perkalian panjang visual / grafis", Anda akan menemukan lebih banyak contoh.
Dalam tantangan ini, Anda harus membuat diagram ini menggunakan seni ASCII. Untuk contoh yang sama, hasilnya akan terlihat seperti ini:
\ /
X /
\ / X /
\ X / X
X X / \ /
/ X X X /
/ X \ / X
/ \ X / \
X X
/ X \
/ \
Mungkin paling mudah untuk mengetahui aturan konstruksi untuk ini dari beberapa contoh (lihat di bawah), tetapi di sini beberapa detail:
- Segmen berpotongan adalah
X
, segmen non-garis berpotongan adalah/
atau\
. - Harus ada tepat satu segmen setelah persimpangan terluar.
- Harus ada tepat satu segmen antara persimpangan yang memiliki digit berbeda. Jika ada nol digit, ini akan menghasilkan berturut
/
- turut atau\
segmen. - Anda harus mendukung input positif apa pun (setidaknya hingga batas yang masuk akal seperti 2 16 atau 2 32 ), dan angka apa pun dari
0
hingga9
. Namun, Anda dapat berasumsi bahwa tidak ada yang memimpin maupun yang tertinggal0
. - Anda tidak boleh mencetak spasi putih terkemuka di luar angkasa atau memimpin atau mengikuti garis kosong.
- Anda dapat mencetak trailing whitespace tetapi tidak boleh melebihi kotak bounded aligned diagram.
- Anda dapat secara opsional mencetak satu baris baru.
- Anda dapat memilih dalam urutan mana Anda mengambil dua nomor input. Namun, Anda harus mendukung angka sembarang untuk salah satu orientasi, sehingga Anda tidak dapat memilih sesuatu seperti "Jumlah yang lebih besar diberikan terlebih dahulu".
- Jika Anda mengambil input sebagai string, Anda dapat menggunakan pemisah non-digit di antara kedua angka tersebut.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Ini adalah kode golf, jawaban terpendek (dalam byte) menang.
Contohnya
1*1
\ /
X
/ \
2*61
\ /
\ X /
X X /
/ X X /
/ X X /
/ X X /
/ X X
/ X \ /
/ \ X
X \
/ \
45*1
\ /
\ X
\ X \
\ X \
\ X \
X \
\ / \
\ X
\ X \
\ X \
X \
/ \
21001*209
\ /
X /
/ X
/ / \
\ / / \ /
X / X /
\ / X / X /
\ X / \ / / X /
X X \ / / / X /
/ X \ X / / / X /
/ \ \ / X / / / X /
\ X / X / / / X /
X X / X / / / X /
/ X X / X / / / X
/ X X / X / / / \
/ X X / X / /
/ X X / X /
/ X X / X
/ X X / \
/ X X
/ X \
/ \
Jawaban:
Pyth - 79 byte
Terjemahan dari jawaban @ AlexeyBurdin. Mungkin bisa bermain golf lebih banyak.
Mengambil input sebagai dua angka, baris baru dipisahkan. Penjelasan segera hadir.
Cobalah online di sini .
sumber
python, 303
Saya pikir itu cukup dapat dibaca manusia.
Verifikasi:
sumber
reversed
sama dengan[::-1]
, Anda dapat meletakkan isi loop for ke dalam satu baris untuk menghemat lekukan,len(a)+len(b)
lebih pendek daripadasum(map(len,[a,b]))
, tidak digunakanxrange
dalam golf, ruang dalam) for
dapat dihapus, dan karena Anda menggunakan python2, Anda bisa menggabungkan spasi dan tab di lekukan.276
dari golf sintaksis sederhana: gist.github.com/Maltysen/e8231c0a9b585e2a4941e=enumerate
di awal untuk golf 4 karakterPython 3, 205 byte
Ekspresi cukup panjang jadi saya pikir ada cukup banyak ruang untuk perbaikan, tapi tetap saja ...
Membawa input yang dipisahkan ruang melalui STDIN, mis
Ada ruang trailing yang mungkin pada beberapa garis, tetapi
A+B-2
memastikan bahwa semua ruang trailing berada di dalam kotak pembatas.sumber
C #, 451 byte
Diformat agar mudah dibaca, fungsi dalam konteks:
Bitwise OR hanya untuk bersenang-senang, tetapi penambahan akan bekerja juga.
sumber
JavaScript ( ES6 ) 271
Saya yakin ada solusi yang membangun output baris demi baris, mengutak-atik matematika dan koordinat x, y (x + y == k, xy == k ...). Tapi aku masih belum bisa memahaminya.
Jadi di sini adalah solusi yang hanya menggambar garis satu per satu.
Jalankan cuplikan di Firefox untuk menguji.
sumber
VC ++
(289)280Pemakaian
Hasil
sumber
---48
?...)-- - 48)...
.Kanvas , 41 byte
Coba di sini!
sumber
C (329 b)
COBALAH
sumber
R , 294 byte
Cobalah online!
sumber
Jelly , 58 byte
Cobalah online!
Penjelasan
Program lengkap yang menggunakan dua angka sebagai daftar dua bilangan bulat dan mengembalikan sebuah string.
Tautan bantuan 1: memutar matriks
Tautan bantuan 2: buat templat baris dan kolom
Tautan utama
sumber