Diberikan bilangan bulat positif sebagai input, tugas Anda adalah menampilkan nilai kebenaran jika angka tersebut dapat dibagi dengan dua kali lipat dari jumlah digitnya, dan nilai palsu sebaliknya ( OEIS A134516 ). Dengan kata lain:
(sum_of_digits)*2 | number
Alih-alih nilai true / falsy untuk kasus benar dan salah, Anda dapat menentukan set nilai terbatas untuk kasus benar / salah, dan melengkapi nilai-nilai lainnya. Untuk contoh sederhana, Anda dapat menggunakan
0
untuk case nyata dan semua angka lain untuk case palsu (atau sebaliknya, jika Anda suka).Aturan input dan output standar berlaku. Celah Default juga berlaku.
Anda dapat mengambil input sebagai integer atau sebagai representasi string dari integer itu.
Ini adalah kode-golf , maka kode terpendek dalam byte menang!
Saya baru mengenal PPCG, jadi saya ingin Anda memposting penjelasan jika memungkinkan.
Uji Kasus
Input - Output - (Alasan) 80 - Truthy - (16 membagi 80) 100 - Truthy - (2 membagi 100) 60 - Truthy - (12 membagi 60) 18 - Truthy - (18 membagi 18) 12 - Truthy - (6 membagi 12) 4 - Falsy - (8 tidak membagi 4) 8 - Falsy - (16 tidak membagi 8) 16 - Falsy - (14 tidak membagi 16) 21 - Falsy - (6 tidak membagi 21) 78 - Falsy - (30 tidak membagi 78) 110 - Falsy - (4 tidak dide 110) 111 - Falsy - (6 tidak membagi 111) 390 - Falsy - (24 tidak membagi 390)
Jawaban:
Neim , 3 byte
Penjelasan:
Cobalah online!
Versi terperinci
sumber
JavaScript (ES6),
312927 byteMengambil input sebagai string. Mengembalikan nol untuk kebenaran dan bukan nol untuk kepalsuan.
Berkomentar
Uji kasus
Tampilkan cuplikan kode
sumber
C #, 46 byte
Versi Lengkap / Terformat:
sumber
Retina ,
3827 byte-11 byte dan memperbaiki kesalahan dengan kode terima kasih kepada @MartinEnder
Cobalah online!
Mencetak 1 jika dapat dibagi, 0 sebaliknya
Penjelasan (saya harap ini benar)
Tambahkan seluruh input, plus baris baru, ditambah input lagi
Mengonversi setiap kecocokan menjadi unary (baik seluruh baris kedua yang merupakan input asli, atau setiap digit di baris pertama)
Periksa apakah baris pertama (jumlah digit dua kali lipat) adalah pembagi dari baris kedua
sumber
MATL , 7 byte
Keluaran
0
jika dapat dibagi, bilangan bulat positif sebaliknya. Secara khusus, ini mengeluarkan sisa dari membagi angka dengan dua kali jumlah digitnya.Cobalah online!
Penjelasan
sumber
05AB1E ,
54 byte-1 byte terima kasih kepada Okx
Cobalah online!
Anda juga dapat menghapus Ö terakhir untuk mendapatkan 0 untuk truey dan sesuatu yang lain untuk falsy yang hanya menghasilkan 3 byte tetapi bagi saya yang sepertinya tidak sesuai dengan definisi.
Penjelasan
sumber
%_
denganÖ
.x86-64 Kode Mesin, 24 byte
Kode di atas mendefinisikan fungsi dalam kode mesin x86 64-bit yang menentukan apakah nilai input dapat dibagi dengan menggandakan jumlah digitnya. Fungsi ini sesuai dengan konvensi pemanggilan System V AMD64, sehingga dapat dipanggil dari hampir semua bahasa, sama seperti fungsi C.
Dibutuhkan parameter tunggal sebagai input melalui
EDI
register, sesuai dengan konvensi pemanggilan, yang merupakan bilangan bulat untuk diuji. (Ini dianggap bilangan bulat positif , konsisten dengan aturan tantangan, dan diperlukan untukCDQ
instruksi yang kami gunakan untuk bekerja dengan benar.)Ini mengembalikan hasilnya dalam
EAX
register, sekali lagi, sesuai dengan konvensi pemanggilan. Hasilnya akan 0 jika nilai masukan adalah dibagi dengan jumlah digit, dan non-nol sebaliknya. (Pada dasarnya, Boolean terbalik, persis seperti contoh yang diberikan dalam aturan tantangan.)Prototipe C-nya adalah:
Berikut adalah instruksi bahasa majelis yang tidak diseragamkan, dijelaskan dengan penjelasan singkat tentang tujuan dari setiap instruksi:
Di blok pertama, kami melakukan beberapa inisialisasi awal register:
PUSH
+POP
instruksi digunakan sebagai cara lambat tapi pendek untuk menginisialisasiESI
ke 10. Ini diperlukan karenaDIV
instruksi pada x86 memerlukan operan register. (Tidak ada bentuk yang membelah dengan nilai langsung, katakanlah, 10.)XOR
digunakan sebagai cara singkat dan cepat untuk menghapusECX
register. Register ini akan berfungsi sebagai "akumulator" di dalam loop yang akan datang.EDI
) dibuat, dan disimpanEAX
, yang akan musnah saat kita melewati loop.Kemudian, kita mulai mengulang dan menjumlahkan digit dalam nilai input. Ini didasarkan pada
DIV
instruksi x86 , yang membaginyaEDX:EAX
dengan operandnya, dan mengembalikan hasil bagiEAX
dan sisanya masukEDX
. Apa yang akan kita lakukan di sini adalah membagi nilai input dengan 10, sehingga sisanya adalah digit di tempat terakhir (yang akan kita tambahkan ke register akumulator kami,ECX
), dan hasil bagi adalah digit yang tersisa.CDQ
instruksi adalah cara singkat pengaturanEDX
ke 0. Ini sebenarnya tanda-meluas nilai dalamEAX
untukEDX:EAX
, yang adalah apa yangDIV
menggunakan sebagai dividen. Kami sebenarnya tidak perlu ekstensi-tanda di sini, karena nilai input tidak ditandatangani, tetapiCDQ
1 byte, sebagai lawan menggunakanXOR
untuk menghapusEDX
, yang akan menjadi 2 byte.DIV
ideEDX:EAX
denganESI
(10).EDX
) ditambahkan ke akumulator (ECX
).EAX
register (hasil bagi) diuji untuk melihat apakah itu adalah sama dengan 0. Jika demikian, kita telah berhasil melewati semua angka dan kami jatuh. Jika tidak, kami masih memiliki lebih banyak digit untuk dijumlahkan, jadi kami kembali ke atas loop.Akhirnya, setelah loop selesai, kami menerapkan
number % ((sum_of_digits)*2)
:The
LEA
instruksi digunakan sebagai cara singkat untuk kalikanECX
dengan 2 (atau, sama, menambahkanECX
untuk dirinya sendiri), dan menyimpan hasilnya dalam register yang berbeda (dalam hal ini,EAX
).(Kami juga bisa melakukan
add ecx, ecx
+xchg ecx, eax
; keduanya 3 byte, tetapiLEA
instruksi lebih cepat dan lebih khas.)CDQ
lagi untuk mempersiapkan pembagian. KarenaEAX
akan positif (yaitu, tidak ditandatangani), ini memiliki efek zeroingEDX
, seperti sebelumnya.EDX:EAX
dengan nilai input (salinan tanpa gangguan yang masih berada di dalamnyaEDI
). Ini setara dengan modulo, dengan sisanya dalamEDX
. (Hasil bagi juga dimasukkanEAX
, tetapi kami tidak membutuhkannya.)XCHG
(bertukar) isiEAX
danEDX
. Biasanya, Anda akan melakukannya diMOV
sini, tetapiXCHG
hanya 1 byte (walaupun lebih lambat). KarenaEDX
berisi sisa setelah pembagian, itu akan menjadi 0 jika nilainya dibagi rata atau tidak nol. Jadi, ketika kitaRET
urn,EAX
(hasilnya) adalah 0 jika nilai input dibagi dengan dua kali lipat jumlah digitnya, atau bukan nol.Semoga cukup untuk penjelasan.
Ini bukan entri terpendek, tapi hei, sepertinya itu mengalahkan hampir semua bahasa non-golf! :-)
sumber
Japt ,
74 byteMengambil input sebagai string. Output
0
untuktrue
atau angka yang lebih besar daripada0
untukfalse
, yang, dari solusi lain, akan tampak valid. Jika tidak, beri tahu saya dan saya akan mengembalikannya.Menguji
Penjelasan
Input string yang tersirat
U
."390"
Ulangi
U
dua kali."390390"
Pisahkan ke berbagai karakter individu.
["3","9","0","3","9","0"]
Kurangi dengan menjumlahkan, secara otomatis casting setiap karakter ke integer dalam proses.
24
Dapatkan sisa pembagian
U
dengan hasilnya, juga secara otomatis melakukan castingU
ke integer dalam proses. Secara implisit mengeluarkan bilangan bulat yang dihasilkan.6 (=false)
sumber
C89,
5553 byte(Terima kasih kepada Steadybox!
Dibutuhkan satu input
x
,, yang merupakan nilai untuk diuji. Mengembalikan 0 jikax
habis dibagi dua kali lipat dari jumlah digitnya, atau bukan nol.Cobalah online!
Tidak Disatukan:
Seperti yang Anda lihat, ini memanfaatkan aturan implisit-int C89. Variabel global
s
dant
secara implisit dinyatakan sebagaiint
s. (Mereka secara implisit diinisialisasi ke 0 karena mereka adalah global, tetapi kita tidak dapat mengambil keuntungan dari ini jika kita ingin fungsi tersebut dapat dipanggil beberapa kali.)Demikian pula, fungsi,,
f
mengambil parameter tunggal,x,
yang secara implisit merupakanint
, dan mengembalikan sebuahint
.Kode di dalam fungsi ini cukup mudah, meskipun
for
loop akan terlihat sangat aneh jika Anda tidak terbiasa dengan sintaks. Pada dasarnya,for
header loop di C berisi tiga bagian:Di bagian "inisialisasi", kami telah menginisialisasi variabel global kami. Ini akan berjalan sekali, sebelum loop dimasukkan.
Di bagian "kondisi loop", kami telah menentukan pada kondisi apa loop harus dilanjutkan. Sebanyak ini harus jelas.
Di bagian "kenaikan", pada dasarnya kami telah meletakkan kode arbitrer, karena ini akan berjalan di akhir setiap loop.
Tujuan yang lebih besar dari loop adalah untuk mengulangi setiap digit pada nilai input, menambahkannya ke
s
. Akhirnya, setelah loop selesai,s
digandakan dan diambil modulox
untuk melihat apakah itu dapat dibagi secara merata. (Penjelasan logika yang lebih baik dan lebih terperinci di sini dapat ditemukan dalam jawaban saya yang lain , yang menjadi dasar jawaban ini.)Versi yang bisa dibaca manusia:
sumber
t
bukant>0
sebagai kondisi loop .Brachylog , 8 byte
Cobalah online!
Penjelasan
sumber
Python 2 ,
3432 byte-2 byte terima kasih kepada @Rod
Cobalah online!
sumber
<1
.Mathematica, 26 byte
Tidak ada petunjuk mengapa
∣
memiliki prioritas lebih tinggi dari pada perkalian ...sumber
PHP , 41 byte
mencetak nol jika habis, bilangan bulat positif sebaliknya.
Cobalah online!
sumber
$a=10
, tetapi Anda lupa untuk menghitung itu terhadap jumlah byte Anda$argn
tersedia dengan-F
(dalam hal ini) atau-R
opsi-F
. Tapi itu tidak tercermin dalam TIO Anda (apakah itu mendukung gema dari STDIN?).-F
opsi bukan-R
php.net/manual/en/features.commandline.options.php Jika Anda menemukan cara yang lebih baik untuk membuat yang sama di tio seperti di commnd line let me knowExcel, 63 byte
Penjumlahan digit adalah bit yang panjang.
sumber
Perl 6 , 19 byte
Cobalah online!
sumber
Sekam ,
98 byteTerima kasih kepada Leo karena telah menghemat 1 byte.
Cobalah online!
Penjelasan
sumber
Haskell ,
383742 byteTerima kasih kepada Zgarb karena bermain golf dengan 1 byte
Cobalah online!
Mengambil input sebagai string; mengembalikan 0 jika dapat dibagi dan bukan nol sebaliknya.
sumber
(:[])
bisapure
.Python 3, 35 byte
sumber
=
dan setelah)
masukint(c)
. Selain itu karenasum
dapat menggunakan generator sebagai argumen, Anda dapat menghapus bagian[..]
dalamnya. Jika Anda memiliki pertanyaan tambahan, silakan ping saya.int(c)for c in a
bisa jugamap(int,a)
, untuk menghemat beberapa byte.lambda a:not a%(sum(map(int,str(a)))*2)
TI-BASIC,
272621 byteTerima kasih kepada @Oki
Ini dibuat lebih rumit oleh fakta bahwa tidak ada cara ringkas untuk menjumlahkan angka integer dalam TI-BASIC . Pengembalian
0
untukTrue
, dan nomor berbeda untukFalse
.Penjelasan:
sumber
10^-randIntNoRep(1,1+int(log(Ans
melakukan hal yang sama sepertiseq(10^(~A-1),A,0,log(Ans
dalam byte lebih sedikit sebagai urutan tidak masalah (Asumsikan versi 2.55MP)Braingolf ,
1312 byteCobalah online!
Output 0 untuk truey, angka lain untuk falsey.
Penjelasan
sumber
Japt , 7 byte
Pengembalian
1
untuktrue
,0
untukfalse
Cobalah online!
Penjelasan
sumber
Haskell , 49 Bytes
Pemakaian
Cobalah online!
sumber
Jawa , 66 byte
-1 byte terima kasih kepada Olivier
Tidak digabungkan & penjelasan:
sumber
int
alih-alihbyte
untuk menyimpan ... satu byte.a%i*2
yang diuraikan(a%i)*2
karena modulus dan perkalian memiliki urutan yang sama.J, 15 byte
0 menunjukkan kebenaran, bukan nol menunjukkan kepalsuan.
Penjelasan
sumber
@
atau[:
!|~2*1#.,.&.":
selama 13 byte.Ohm , 5 byte
Cobalah online!
sumber
tcl, 45
demo
sumber
0==
dengan1>
.Haskell ,
3534 byteCobalah online!
Mengembalikan '0' dalam kasus sebenarnya, sisanya sebaliknya.
Haskell , edisi pointfree oleh nimi, 34 byte
Cobalah online!
sumber
mod<*>(2*).sum.map(read.pure).show
PHP, 44 byte
Jalankan seperti ini:
Penjelasan
Iterate atas digit untuk menghitung total, kemudian output modulo seperti kebanyakan jawaban.
sumber
Java (OpenJDK 8) ,
5553 byteCobalah online!
Nilai balik
0
berarti jujur, yang lain berarti palsu.Karena komentar saya dalam jawaban Okx tidak membuat riak, saya menghapusnya dan mempostingnya sebagai jawaban ini, bahkan sedikit lebih golf.
Lebih lanjut bermain golf berkat @KrzysztofCichocki dan @Laikoni yang menunjukkan kepada saya bahwa saya tidak perlu menjawab nilai kebenaran / kepalsuan, tetapi nilai apa pun selama saya menggambarkan hasilnya.
sumber
true
.Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.
.Mini-Flak,
296292 byteCobalah online!
TIO link memiliki lebih banyak komentar dari saya, sehingga sebagian lebih mudah dibaca.
Truthy / Falsey: Truthy (habis dibagi) jika angka kedua sama dengan angka ketiga, sebaliknya falsy. Jadi perangkat kebenaran dan kepalsuan tidak terbatas, tetapi saya kira itu harus diizinkan. +10 byte jika tidak.
Catatan: Leading / trailing newlines / spasi putih tidak diizinkan dalam input.
sumber