Intro
Sesuatu yang saya mainkan dalam matematika rekreasional adalah konstruksi tabel pembagi untuk secara visual membandingkan / membedakan pembagi utama dari sekumpulan angka. Himpunan nomor input berada di atas sebagai label kolom, pembagi utama berada di sebelah kiri sebagai label baris, dan tanda menunjukkan di mana keduanya berbaris.
Sebagai contoh, untuk input, 6, 9, 14, 22
sebuah tabel yang mirip dengan yang berikut akan dibangun:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Ini karena 6
memiliki pembagi utama 2
dan 3
, 9
memiliki pembagi utama 3
, dan sebagainya.
Konstruksi
- Tabel ini dibangun sedemikian rupa sehingga angka-angka input membentuk label kolom yang dipisahkan oleh spasi dan dalam urutan menaik (Anda dapat mengasumsikan mereka sudah dipilah sebelumnya), dan pembagi utama terdaftar di sebelah kiri dalam urutan menaik satu per baris yang membentuk baris label.
- Perhatikan bahwa spasi utama pada pembagi utama dan nomor input mungkin diperlukan jika jumlahnya panjang yang berbeda, sehingga semua kolom memiliki lebar yang sama dan berbaris dengan tepat.
- Setiap pembagi diwakili oleh satu
*
(atau karakter ASCII lain yang sesuai pilihan Anda, asalkan karakter yang sama digunakan untuk semua kejadian). - Banyak pembagi diabaikan (mis.,
3 x 3 = 9
Tetapi hanya ada satu*
untuk persimpangan itu). - The
*
dapat ditempatkan di manapun horizontal dalam kolom, asalkan itu tidak ambigu (saya memiliki semua contoh saya dengan*
benar-blok).
Memasukkan
- Daftar bilangan bulat positif dalam format apa pun yang nyaman , masing-masing
>1
. - Anda dapat mengasumsikan bahwa input sudah dipilah sebelumnya.
- Input dijamin hanya memiliki nilai unik.
Keluaran
Representasi seni ASCII yang dihasilkan dari tabel pembagi utama.
Aturan
- Leading atau trailing newlines atau whitespace semuanya opsional, asalkan karakter itu sendiri berbaris dengan benar.
- Jika lebih pendek memiliki garis pembagi yang memisahkan judul kolom / baris dari data tabular, itu diperbolehkan juga.
- Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
- Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang dapat mencoba kode Anda!
- Celah standar dilarang.
- Ini adalah kode-golf sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.
Contohnya
6,9,14,22
6 9 14 22
2 * * *
3 * *
7 *
11 *
2,3,5,7
2 3 5 7
2 *
3 *
5 *
7 *
2,4,8,16,32
2 4 8 16 32
2 * * * * *
75,99,151,153
75 99 151 153
3 * * *
5 *
11 *
17 *
151 *
Jawaban:
Mathematica,
10190 byteTerima kasih kepada ngenisis karena telah menghemat 11 byte!
The
∣
karakter sekitar sepertiga dari jalan melalui adalah U + 2223 (3 byte). Fungsi tanpa nama dari sejumlah variabel argumen, yang masing-masing adalah bilangan nol, yang mengembalikanTableForm
objek (output yang diformat) seperti:f=#&@@@FactorInteger[1##]
mendefinisikanf
sebagai himpunan semua bilangan prima yang membagi salah satu input (ekuivalen, membagi produk mereka1##
), sedangkang
daftar terdiri dari input.Outer[If[#∣#2,Y,""]&,f,g]
membuat tabelY
s dan string kosong yang berkaitan dengan keterbagian (kami menggunakan token yang tidak ditentukanY
alih-alih string"Y"
atau"*"
untuk menyimpan dua byte). Kemudian kita gunakanTableForm[...,TableHeadings->{f,g}]
untuk memformat array yang dihasilkan dengan judul baris dan kolom yang sesuai.Pengajuan sebelumnya:
sumber
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
jika pembagi diperbolehkanp[f,]
.TableForm
keren, mudah-mudahan itu akan tetap di kotak alat saya!Jelly , 18 byte
Menggunakan
1
alih-alih*
, sebagaimana diizinkan oleh aturan.Cobalah online!
Bagaimana itu bekerja
sumber
Jelly ,
2523 byteCobalah online!
Bagaimana?
Mungkin lebih pendek untuk menggunakan
ÆE
dan menyaring baris kosong.sumber
JavaScript (ES6),
264260...179173 byteSaya pikir pendekatan ini sekarang secara permanen telah melampaui pendekatan rekursif (saat ini 178 byte):
Penggunaan
0
di tempat*
, yang diizinkan oleh tantangan.Cuplikan tes
Tampilkan cuplikan kode
sumber
|
operator dalam pernyataan if, karena Anda membandingkan 2 boolean ...i<2
cek di dalam.map
fungsi?...i<2?a:a.map(x=>x%i&&c)
menjadi...a.map(x=>i<2?x:x%i&&c)
, itu tidak lebih pendek. Jika Anda bermaksud memindahkannya ke yang lain.map
, mungkin ...Python 2 - 197 byte
Beralih ke Python 2 untuk penanganan input yang lebih mudah dan memungkinkan `` untuk konversi string. Penggunaan
gmpy2
untuk menghasilkan perdana berikutnya. Format output masih berdasarkan pada pengajuan Python 3 sebelumnya (lihat di bawah), yaitu mengisi daftarg
dengan simbol dan memformatnya.Cobalah online!
Penjelasan
Bagi mereka yang tidak ingin men-decode sendiri.
Sebelumnya
Python 3 - 251 byte
Cukup yakin seseorang bisa berbuat lebih baik. Berdasarkan jawaban ini untuk menghasilkan bilangan prima <
k
.Versi dan penjelasan yang tidak dikelompokkan akan mengikuti.
sumber
i=list(map(int,input().split(',')))
, Anda bisa melakukannyai=input()
, dan mengambil input dalam formulir[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
, dan menghapus ruangif"*" in
.Mathematica, 165 byte
Agak verbose - mungkin seseorang dapat melakukan sesuatu dengannya:
sumber
Utilitas Bash + GNU,
134133132125123 byteCobalah online!
sumber
Python 2 ,
181179 byte-2 byte berkat FlipTack
Input harus berupa tuple.
Cobalah online!
sumber
all(i%j for j in p)
berfungsi daripada menggunakanmap
?Batch, 451 byte
Penjelasan: Mulai dengan menghitung lebar bidang
w
melalui nilai input maksimumm
. Menghasilkan baris pertama dari output dengan mengisi string kosong dan memasukkan angka ke lebarw
menggunakan subrutint
. Kemudian loop melalui bilangan bulat mulai dari 2, menghasilkan garis output dengan mengisi bilangan bulat dan kemudian memanggil subrutinc
untuk mengisi string kosong atau tanda bintang yang sesuai untuk setiap nilai, namun garis yang dihasilkan kemudian dilewati jika tidak mengandung tanda bintang. Sebagai output yang dihasilkan, setiap nilai dibagi oleh integer hingga akan meninggalkan sisa, sehingga loop berakhir ketika tidak ada nilai yang lebih besar dari 1.Perhatikan bahwa
set v=
dijalankan setelah itu%v%
diganti ke dalamfor
lingkaran pada baris yang sama.sumber
Python 2 ,
157148146145143 byteMenggunakan
0
alih-alih*
, sebagaimana diizinkan oleh aturan.Cobalah online!
Latar Belakang
Untuk mengidentifikasi bilangan prima, kami menggunakan wajar teorema Wilson :
Bagaimana itu bekerja
Baris pertama mendefinisikan fungsi pembantu.
p mengambil sejumlah variabel argumen yang disimpan dalam tuple t .
The
'%%%ds '%len(`x[-1]`)
menggunakan format string untuk membangun format string;%%
adalah tanda persen literal,%d
adalah placeholder untuk bilangan bulat yanglen(`x[-1]`)
mengembalikan, yaitu jumlah digit elemen terakhir dalam x (input, belum didefinisikan), dans
literal.Jika, misalnya, elemen terakhir x memiliki tiga digit, ini menghasilkan
%3s
, yang*len(t)
berulang satu kali untuk setiap elemen x . Akhirnya,%t
terapkan format string itu ke tuple t , membangun string elemen t , dipisahkan oleh ruang dan semuanya dibenarkan dengan panjang tertentu.Baris kedua mendefinisikan pengiriman aktual: fungsi f yang mengambil daftar x sebagai input. Setelah mengganti
exec
pernyataan, yang mengeksekusi string yang mendahuluix[-1]
kali, denganfor
loop, kita mendapatkan kode berikut.Pertama, f menginisialisasi k dan m ke 1 . Perhatikan bahwa (k - 1)! = 0! = 1 = m .
Kemudian,
p(' ',*x)
cetak spasi dan bilangan bulat dalam x , menggunakan fungsi hlm .Sekarang, kita memasuki loop untuk mencetak sisa output.
Pertama,
r=[n%k and' 'for n in x]
buat daftar sisa dari setiap bilangan bulat n di x dibagi dengan k . Sisa positif, yaitu sisa yang tidak sesuai dengan kelipatan k , adalah benar dan diganti dengan spasi olehand' '
.Selanjutnya, kita membangun
m%k*r
. Sejak m = (k - 1)! , oleh akibat wajar teorema Wilson, ini hanya akan r jika k adalah prima, tetapi daftar kosong jika tidak. Jika ada setidaknya satu 0 dalam hasil, yaitu, jika k adalah bilangan prima dan setidaknya satu bilangan bulat dalam x dapat dibagi dengan k ,0in m%k*r
akan mengembalikan True danp(k,*r)
dipanggil, mencetak k dan indikator yang dapat dibagi:0
jika dibagi, spasi jika tidak .Akhirnya, kita mengalikan m dengan k² dan selisih k , jadi kualitasnya m = (k - 1)! terus bertahan.
sumber
MATL , 31 byte
Ini menggunakan
1
alih-alih*
, sebagaimana diizinkan oleh tantangan.Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan ( kedaluwarsa )
sumber
Racket 176 byte
Tidak Terkumpul:
Pengujian:
Keluaran:
sumber