Pertanyaan ini terinspirasi oleh jawaban ini . Secara kebetulan, saya biasa menggunakan Penggandaan Ethiopia ketika saya masih kecil, tetapi belum pernah tahu nama metode ini sampai saat ini.
Perkalian Ethiopia adalah metode mengalikan bilangan bulat dengan hanya menggunakan penjumlahan, penggandaan, dan separuh.
Metode:
- Ambil dua angka untuk dikalikan dan tuliskan di atas dua kolom.
- Di kolom sebelah kiri berulang kali membagi dua angka terakhir, membuang sisa, dan menulis hasilnya di bawah yang terakhir di kolom yang sama, sampai Anda menulis nilai 1.
- Di kolom kanan berulang kali gandakan angka terakhir dan tulis hasilnya di bawah ini. berhenti ketika Anda menambahkan hasil di baris yang sama dengan tempat kolom sebelah kiri menunjukkan 1.
- Periksa tabel yang dihasilkan dan buang baris mana pun yang nilainya berada di kolom kiri. Jumlahkan nilai di kolom kanan yang tetap menghasilkan hasil dari mengalikan dua angka asli bersama-sama.
Misalnya: 17 x 34
17 34
Membagi dua kolom pertama:
17 34
8
4
2
1
Menggandakan kolom kedua:
17 34
8 68
4 136
2 272
1 544
Baris pemogokan yang sel pertamanya genap, kita akan melakukan ini dengan membungkus angka-angka di sebelah kanan dalam tanda kurung siku:
17 34
8 [68]
4 [136]
2 [272]
1 544
Jumlahkan angka yang tersisa di kolom kanan:
17 34
8 [68]
4 [136]
2 [272]
1 544
=====
578
Jadi 17 dikalikan 34, dengan metode Ethiopia adalah 578.
Tugas:
Kode golf yang mengambil dua angka antara 1 dan 1000 dan melakukan tata letak dan algoritma yang sama, menampilkan produk di bawah ini.
Metode Input: Namun Anda memilih ...
Input Contoh:
19 427
Output yang dihasilkan:
19 427
9 854
4 [1708]
2 [3416]
1 6832
======
8113
Harap perhatikan penyelarasan digit. Ini paling penting dalam tata letak. Perhatikan juga bahwa garis ganda yang disusun oleh tanda sama harus dua karakter lebih panjang dari jawaban keseluruhan dan harus dibenarkan tengah.
Pengujian
Bagaimana Anda akan menguji ini? Dengan menjalankan program Anda menggunakan dua angka. Angka-angka ini dapat diekstraksi dari nomor ID pengguna Anda (ini dapat diperoleh dengan mengarahkan kursor Anda di atas avatar Anda di jendela atas). Ambil nomor Anda dan ambil tiga digit terakhir, ini akan menjadi nomor B, ambil apa pun yang tersisa di depan, yang akan menjadi nomor A. Kemudian uji A kali B.
Contoh pengujian:
Nomor ID pengguna saya adalah 8555, jadi angka saya adalah 8 dan 555. Jadi output saya akan terlihat seperti ini:
8 [555]
4 [1110]
2 [2220]
1 4440
======
4440
Pembatasan:
Tidak ada operator perkalian asli yang diizinkan untuk disimpan dalam penggunaan "penggandaan", sebagaimana disebutkan dalam algoritma. Dengan kata lain, jika Anda menggunakan operator seperti *, itu hanya dapat digunakan untuk mengalikan dengan 2 saja.
Entri yang tidak mematuhi ini tidak akan dipertimbangkan dan pengguna akan diantar keluar dari tempat itu dengan kotak kardus yang penuh dengan barang-barang mereka. Setiap entri akan memiliki kode, ditambah tes berdasarkan pada nomor ID pengguna Anda.
Ini kode golf. Jumlah byte terpendek akan menerima hadiah, kemuliaan, dan kekaguman dari rekan-rekan mereka ... (Dan mungkin sebuah Lamborghini ... Aku berkata "mungkin"!)
*
ataux
), tetapi tidak mungkin untuk mendeteksi apakah perkalian digunakan atau tidak. Kecuali bagian itu, tantangannya menarik.Jawaban:
Arang , 91 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Atur
t
ke daftar kosong dans
ke0
. (u
sudah default ke daftar kosong.)Masukkan dua angka.
Mengulang sementara
q
bukan nol.Bungkus
q
padding dan tambahkan ke daftart
.Bungkus
h
dengan bantalan atau[]
tergantung pada apakahq
itu aneh, dan tambahkan ke daftaru
.Tambahkan
h
kes
jikaq
aneh.Membagi integer
q
dengan 2.Tambahkan
h
ke dirinya sendiri.Tambahkan serangkaian
=
tanda yang sesuai ke daftaru
.Tambahkan jumlah padded
s
ke daftaru
.Putar daftar
t
dengan 180 ° dan cetak terbalik, sehingga membenarkannya.Pindahkan kursor sehingga ketika
u
dibenarkan kanan sudut kiri atas ke atas dengan sudut kanan atas yang baru saja kita capai, dan cetaku
dibenarkan kanan.sumber
Python 2 ,
203202187133 byteCobalah online!
Jika saya bisa menggunakannya
*
untuk perkalian string ('='*R
) dan sebagai 'pemilih' (b*(a%2)
bukan[0,b][a%2]
), saya mendapatkan:118 byte
Cobalah online!
Penjelasan:
sumber
Java (OpenJDK 8) ,
353316267214210 byteCobalah online!
sumber
(a,b)->{int g=0;for(;a>0;g+=a%2*b,a/=2,b*=2)System.out.printf("%1$8d%2$10s\n",a,a%2<1?"["+b+"]":" "+b+" ");System.out.printf("%1$19s%2$18s","".valueOf(new char[(int)Math.log10(g)+3]).replace("\0","=")+"\n",g+" ");}
a%2*b
menyenangkan dan sederhana, terima kasihMathematica, 264 byte
memasukkan
keluaran
sumber
s=Quotient[s,2]
:)Perl 5 , 157 byte
155 byte kode + 2 bendera baris perintah (
-nl
)Cobalah online!
sumber
JavaScript 2017, 221 byte
Sebagian besar masalah pemformatan output
Kurang golf
Uji
sumber
C, C ++,
319313301299 byte-8 Bytes berkat Zacharý
Terima kasih banyak untuk
printf
sulap yang baru saya pelajari dalam 60 menit di antara suntinganOptimasi C ++, ganti header
stdio.h
dengancstdio
danstring.h
olehcstring
, menghemat 2 byteKompilasi dengan MSVC perlu ditambahkan
#pragma warning(disable:4996)
untuk digunakansprintf
Menguji dengan ID PPCG saya:
72 x 535 =>
Itu menghormati aturan, angka disejajarkan, dan tanda-tanda yang sama akan selalu 2 char lebih besar dari angka terakhir. Contoh dengan 17 x 34 =>
sumber
#define O printf("%*d %c%*d%c\n",5,a,a%2?' ':'[',9,b,a%2?' ':']');
danvoid m(int a,int b){int r=0,i=0;O while(a>1){r+=a%2*b;a/=2;b*=2;O}r+=b;char t[20],p[20];memset(t,0,20);memset(p,0,20);sprintf(t,"%d",r);for(;i<strlen(t)+2;++i)p[i]='=';printf("%*c%*s\n%*d",5,' ',12,p,16,r);}
%
dan*
sama, jadir+=a%2*b
harus bekerja.[Bash],
144142140131128 byteLebih baik menghormati tampilan, perhatikan ada karakter spasi tambahan
Jawaban pertama
sumber
Haskell , 305 byte
Cobalah online!
The
!
Operator menciptakan dua daftar,?
menghitung produk.%
dan#
digunakan untuk tata letak ascii.sumber
C,
205201190183156150143 byteIni akan dikompilasi dengan peringatan sebagai C89, & Saya tidak percaya itu C99 yang valid, tetapi akhirnya lebih kecil dari versi HatsuPointerKun, karena menghemat byte dengan mengomit
#include
, tidak menggunakan panjang dinamis untuk mencetak karena mereka tidak dibutuhkan, & menggunakanlog10()
untuk menghitung jumlah yang=
dibutuhkan:Karena nomor saya
64586
, saya menggunakan program tes ini untuk menghitung64 * 586
:& itu keluaran:
sunting
disimpan 4 byte oleh aturan "int implisit"
edit 2
menyimpan 11 byte dengan mengubah ke
do...while()
loop & memindahkan printf ke loop dari makro. Juga harus bekerja dengan benar jikaa=1
.edit 3
menyimpan 7 byte & membuat kode berfungsi dengan benar.
edit 4
Menyimpan 26 byte dengan tipu daya printf.
sunting 5
disimpan 6 byte dengan mengecilkan padding tambahan menjadi 1 nomor.
sunting 6
disimpan 7 byte oleh tipuan printf dengan operator ternary & tidak mendeklarasikan variabel yang tidak digunakan
sumber
Excel VBA, 183 byte
Fungsi jendela langsung VBE anonim yang mengambil input dari jangkauan
[A1:B1]
dan keluaran ke konsol.Tidak disatukan
Keluaran
sumber