Kadang-kadang, ketika saya iseng mencoba faktor apa pun nomor muncul di depan saya in, setelah beberapa saat saya menyadari itu lebih mudah daripada yang saya pikirkan. Ambil 2156
contoh: akhirnya terjadi kepada saya bahwa baik 21
dan 56
merupakan kelipatan dari 7
, dan begitu tentu 2156 = 21 x 100 + 56
juga merupakan kelipatan 7
.
Tugas Anda adalah menulis beberapa kode yang mengidentifikasi angka-angka yang lebih mudah difaktorkan karena kebetulan seperti ini.
Lebih tepatnya:
Tulis program atau fungsi yang mengambil bilangan bulat positif n
sebagai input, dan mengembalikan nilai kebenaran jika ada pembagi d
(lebih besar dari 1
) sehingga n
dapat dipotong menjadi dua untuk menghasilkan dua bilangan bulat positif, masing-masing merupakan kelipatan dari d
; mengembalikan nilai yang salah jika tidak.
- "Cincang dua" berarti apa yang Anda pikirkan: representasi basis-10 yang biasa
n
dipartisi pada beberapa titik menjadi setengah bagian depan dan setengah belakang untuk menghasilkan dua bilangan bulat basis-10 lainnya. Tidak apa-apa jika bilangan bulat kedua memiliki nol di depan (tetapi perhatikan bahwa itu harus bilangan bulat positif, jadi pisahkan1230
menjadi123
dan0
tidak valid). - Nilai kebenaran dan kepalsuan dapat bergantung pada input. Misalnya, jika ada bilangan bulat bukan kebenaran dalam bahasa pilihan Anda, maka Anda dipersilakan untuk mengembalikan pembagi
d
atau salah satu "bagian" darin
(ataun
itu sendiri dalam hal ini). - Misalnya, setiap angka genap dengan setidaknya dua digit di set
{2, 4, 6, 8}
akan menghasilkan nilai yang benar: hanya membaginya setelah angka genap pertama. Sebagai contoh, setiap bilangan priman
akan menghasilkan nilai palsu, seperti halnya bilangan satu digit. - Perhatikan bahwa cukup untuk mempertimbangkan pembagi utama
d
. - Anda dapat berasumsi bahwa input tersebut valid (yaitu, bilangan bulat positif).
Ini adalah kode-golf , jadi kode terpendek dalam byte menang. Tetapi solusi dalam semua bahasa dipersilahkan, sehingga kami dapat mengusahakan kode terpendek di setiap bahasa, bukan hanya kode terpendek secara keseluruhan.
Uji kasus
(Anda hanya perlu menampilkan nilai yang benar atau salah; penjelasan di bawah ini hanya dengan penjelasan.) Beberapa input yang menghasilkan nilai yang benar adalah:
39 (3 divides both 3 and 9)
64 (2 divides both 6 and 4)
497 (7 divides both 49 and 7)
990 (splitting into 99 and 0 is invalid; but 9 divides both 9 and 90)
2233 (11 divides both 22 and 33)
9156 (3 divides both 9 and 156; or, 7 divides both 91 and 56)
11791 (13 divides both 117 and 91)
91015 (5 divides both 910 and 15)
1912496621 (23 divides both 1912496 and 621; some splittings are multiples of 7 as well)
9372679892 (2473 divides both 937267 and 9892; some splittings are multiples of 2 as well)
Beberapa input yang menghasilkan nilai palsu adalah:
52
61
130 (note that 13 and 0 is not a valid splitting)
691
899
2397
9029
26315
77300 (neither 7730 and 0 nor 773 and 00 are valid splittings)
2242593803
¹ ya saya benar-benar melakukan ini
sumber
;(11+)+,\1+;
Brachylog (2), 8 byte
Cobalah online!
Penjelasan
Jelas, jika nomor yang sama (lebih besar dari 1) membagi kedua bagian, bilangan prima yang sama akan membagi keduanya. Mewajibkan faktor untuk prima dengan rapi tidak mengizinkan 1 sebagai faktor. Ini juga mencegah literal
0
dipilih sebagai segmen nomor (karena0
tidak memiliki faktorisasi utama, dan akan menyebabkanḋ
kegagalan).Tidak perlu memeriksa terhadap nol internal yang cocok; jika pemisahan
x
dan0y
valid,x0
dany
akan bekerja dengan baik (dan sebaliknya, jikax0
dany
bekerja, maka kami memiliki solusi yang berfungsi terlepas dari apakahx
dan0y
akan bekerja atau tidak).Program lengkap Brachylog, seperti ini, mengembalikan Boolean;
true.
jika ada beberapa cara untuk menjalankannya tanpa kegagalan (yaitu membuat pilihan sedemikian rupa sehingga tidak ada kesalahan terjadi),false.
jika semua jalur mengarah ke kegagalan. Itulah yang kami inginkan di sini.sumber
Jelly ,
14121110 byteTerima kasih kepada @JonathanAllan untuk bermain golf 1 byte!
Cobalah online!
Bagaimana itu bekerja
sumber
D
, sepertimake_digits
berlaku untukŒṖ
.Mathematica,
6362 byte(1 byte terima kasih kepada Greg Martin)
Ini adalah fungsi yang mengambil integer sebagai input dan mengembalikan
True
atauFalse
. Jika Anda mengujinya dalam jumlah besar, bawalah buku untuk dibaca sambil menunggu.Penjelasan:
Floor@{Mod[#,t=10^n],#/t}
membagi secara hitung input menjadin
digit terakhir dan digit yang tersisam-n
(di manam
jumlah total digit).Table[1~Max~#&/@...,{n,#}]
melakukan ini untuk setiapn
hingga nomor input. (Ini terlalu besar. Kita hanya perlu melakukan ini hingga jumlah digit input, tetapi cara ini menyimpan byte dan masih memberikan hasil yang benar.)1~Max~#&/@
Bit menghilangkan nol, jadi angka seperti130 -> {13,0}
tidak masuk hitungan sebagaiTrue
.1<Max@@GCD@@@...
menemukan pembagi umum terbesar dari masing-masing pasangan ini, dan memeriksa apakah ada pembagi ini lebih dari 1. Jika ya, kami telah menemukan cara untuk memperhitungkan faktor dengan memisahkannya.sumber
{#~Mod~10^n,#/10^n}
atau{Mod[#,t=10^n],#/t}
.#~Mod~10^n
, tetapi tampaknya mendapatkan tanda kurung sepertiMod[#,10]^n
bukanMod[#,10^n]
. Saya tidak memikirkan saran kedua Anda!Mod[#,10]^n
Haskell , 57 byte
Cobalah online! Penggunaan:,
(#1) 2156
mengembalikanTrue
atauFalse
sumber
C,
145142139138135 bytesumber
JavaScript (ES6),
747170 byteMengambil input sebagai string, yang berguna untuk cuplikan. Sunting: Disimpan 3 byte berkat @ user81655.
sumber
(c,i)
->c
,i+1
->++i
,t=''
->i=t=''
, trik ini berguna setiap kali Anda perlu menggunakan indeks 1 berbasis dan memiliki tempat untuk menginisialisasinyai
untuk0
.t=''
bisat=0
, karena menambahkanc
coerces ke string.i
, jadi saya tidak perlu indeks berbasis 1, tapi kemudian saya bermain golf irisan pertamat+=c
.f=(x,y,z)=>z?x%y?g(y,x%y):y:x?f(x,y,1)>1||f(x.slice(1),~~y+x[0]):0
. Saya menggabungkan fungsi GCD Anda denganf
juga. Mungkin bisa bermain golf lebih lanjut. Saran terakhir, aku janji! : Pgcd
fungsi saya yang terlalu disederhanakan tidak bekerja kapanx=0
, dan mengatasinya dan kesalahan ketik Anda membawa saya ke 72 byte, jadi untungnya saya kemudian bisa bermain golf sejauh 2 byte.Python 3,
133118117 byteTentu bukan yang terpendek, mungkin bisa dipersingkat sedikit. Bekerja
O(n)
tepat waktu. Input diambil dalam format\d+
dan output diberikan dalam format(True|False)
sesuai standar nilai boolean Python-3 byte berkat Dead Possum
-15 byte berkat ovs
-1 byte terima kasih kepada Orang Ini
sumber
from fractions import*
akan menghemat 3 byteany
ke dalamall
? Jika itu masalahnya, Anda dapat mengubah semua bagiani(j[k:])and i(j[:k])
itu agar semuanya menjadi 125 byte. Ini adalah perbaikanany(i(j[k:])*i(j[:k])*~-gcd(i(j[k:]),i(j[:k]))for k in range(1,len(j)))
)) for
QBIC ,
9190 bytePenjelasan:
sumber
Python 3 ,
7069 byteCobalah online!
sumber
Perl 5 , 46 byte
43 byte kode + 3 byte untuk
-p
flag.Cobalah online! atau coba versi modifikasi ini yang memungkinkan banyak input.
Anda mungkin tidak ingin mencoba ini pada input terbesar, karena mungkin butuh waktu (sangat lama).
Penjelasan:
Kami beralih melalui setiap posisi dalam kata dengan
s~~~g
, dengan$`
berisi angka sebelum dan$'
angka sesudahnya. Jika$`*$'
benar (itu berarti tidak ada yang kosong, dan tidak ada yang ada0
), maka kami memeriksa apakah angka antara 2 dan$`
membagi keduanya (dengangrep!(...),2..$`
). Jika demikian,$\|=..
akan ditetapkan$\
ke nilai bukan nol, yang dicetak secara implisit di akhir berkat-p
benderanya.sumber
$<backquote>
dalam penurunan harga SE, saya akan berterima kasih jika Anda memberi tahu saya caranya.<code>
...</code>
(daripada`
...`
), lalu keluar dari backquotes sebagai\`
. Juga, komentar ini sangat menyakitkan untuk ditulis, karena harus diloloskan ganda (dan dua set aturan pelarian berbeda!).Python 2 , 69 byte
Menggunakan rekursi sebagai ganti built-in GCD.
Cobalah online!
Bagaimana itu bekerja
Ketika f dipanggil dengan satu hingga tiga argumen ( d default ke 10 , k ke 2 ), ia pertama-tama memeriksa nilai ekspresi
k<d<n
. Jika ketidaksetaraan k <d dan d <n keduanya bertahan, ekspresi berikutand
dijalankan dan nilainya dikembalikan; jika tidak, f hanya akan mengembalikan False .Dalam kasus sebelumnya, kita mulai dengan mengevaluasi ekspresi
n/d%k+n%d%k<1<n%d
.d akan selalu menjadi kekuatan sepuluh, jadi
n/d
dann%d
secara efektif membagi angka desimal pada n menjadi dua irisan. Irisan ini dapat dibagi oleh k jika dan hanya jikan/d%k+n%d%k
bernilai 0 , yang diuji dengan membandingkan hasilnya dengan 1 .Karena bagian dari persyaratan adalah bahwa kedua irisan harus mewakili bilangan bulat positif, nilainya
n%d
juga dibandingkan dengan 1 . Perhatikan bahwa 1 tidak memiliki pembagi utama, sehingga perbandingan yang lebih mahal dengan 0 tidak diperlukan. Juga, perhatikan bahwa d <n sudah memastikan yangn/d
akan mengevaluasi ke bilangan bulat positif.Akhirnya secara rekursif semua
f(n,d,k+1)
(mencoba pembagi umum potensial berikutnya) danf(n,10*d)
(mencoba pemisahan) dan mengembalikan logika ATAU dari ketiga hasil. Ini berarti f akan mengembalikan True jika (dan hanya jika) k adalah pembagi umum n / d dan n% d atau yang sama berlaku untuk nilai k yang lebih besar dan / atau kekuatan yang lebih tinggi dari sepuluh d .sumber