Teman saya dan saya sedang mengerjakan laboratorium di kelas Ilmu Komputer AP kami dan memutuskan untuk membuat kode golf satu masalah karena kami masih memiliki setengah kelas gratis setelah kami selesai. Ini pertanyaannya:
Diberi angka n, apakah n dapat dibagi dengan masing-masing digitnya?
Sebagai contoh, 128 akan lulus tes ini - itu dapat dibagi dengan 1,2, dan 8. Setiap angka dengan nol secara otomatis mendiskualifikasi angka tersebut. Meskipun Anda dapat menggunakan bahasa lain dan memposting solusi jika Anda suka, kami sangat tertarik melihat bagaimana orang yang kompak dapat membuat program di Jawa, karena itu adalah bahasa yang kami gunakan di kelas. Sejauh ini, kami berdua memiliki 51. Ini kode saya saat ini:
public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters
// Breakdown:
// for(int p=n; Saves one semicolon to put declaration into for loop
// n%10>0;) Basic check-for-zero
// n/= Pretty simple, discarding one number off of n at a time
// p%(n%10)>0? If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10; Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1 If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.
Persyaratan
Tanda tangan metode dapat menjadi apa pun yang Anda inginkan. Hitung saja fungsi tubuhnya. Namun, pastikan bahwa metode mengembalikan nilai boolean dan hanya meneruskan dalam satu parameter numerik (bukan string).
Kode harus dapat melewati semua kasus ini (agar tetap benar dengan arah pertanyaan asli, hanya nilai boolean true dan false yang dihitung jika bahasa mendukung booleans. Jika dan hanya jika bahasa Anda tidak memiliki variabel boolean Anda dapat mewakili false dengan 0 dan true dengan sembarang bilangan nol (lebih disukai 1 atau -1):
128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false
Juga, kami tidak menghitung spasi putih, jadi jangan ragu untuk melakukan hal yang sama, kecuali spasi putih sangat penting untuk kerja program (jadi baris baru di Jawa tidak masuk hitungan, tetapi satu ruang antara int
dan x=1
tidak dihitung.) Semoga beruntung !
true
danfalse
atau apakah nilai kebenaran / kepalsuan juga baik? 3.java
Tag tidak benar-benar berlaku di sini, karena tantangan itu sendiri tidak terkait dengan Java.0
digit yang merupakan kelipatan dari masing-masing), saya membayangkan sebagian besar jawaban hanya akan lebih lama dengan cara yang tidak menarik untuk menyertakan cek untuk itu. Jadi saya suka masalah yang ditimbulkan oleh judul lebih baik (dapat dibagi dengan digit-digitnya, daripada kelipatan digitnya, yang tidak termasuk 0).Jawaban:
Perl 6, 13
Menggunakan variabel implisit
$_
-$_ %% .comb.all
setara dengan$_ %% all($_.comb)
.%%
adalah operator "habis dibagi", dancomb
tanpa argumen tambahan mengembalikan daftar karakter dalam sebuah string. Sebagai contoh, jika argumennya adalah 123, maka fungsinya mengevaluasiyang mana
persimpangan autothreading membuatnya
yang mana
yang salah dalam konteks boolean karena ini merupakan persimpangan "semua" dan jelas tidak semua elemennya benar.
Seharusnya dimungkinkan untuk memaksa nilai balik ke
Bool
dan menyembunyikan persimpangan dari penelepon dengan membuat tanda tangan fungsisub golf($_ --> Bool())
, tetapi paksaan dalam tanda tangan fungsi belum berfungsi di Rakudo. Nilai kembali masih benar atau salah, hanya saja tidakTrue
atauFalse
.sumber
Bool
tambahkan sajaso
ke bagian depan kodeso$_%%.comb.all
.C # dan Sistem.Linq - 26/40
Sesuai aturan, tidak termasuk metode deklarasi itu sendiri.
Menunjukkan itu sekali lagi, C # adalah pilihan terbaik ketika Java sedang dipertimbangkan ... I nak, I nak!
Sayangnya, fungsi ini (dan banyak di jawaban lain) tidak akan menghasilkan hasil yang benar untuk input negatif. Kami dapat memperbaiki ini, tetapi solusinya kehilangan banyak daya tariknya (dan panjangnya mencapai 46 karakter):
Sunting : mencukur satu karakter dengan saran Tim.
Sunting : dengan pengenalan anggota bertubuh ekspresi di C # 6, kita dapat menguraikan ini lebih jauh dengan memotong
return
:untuk total 26 karakter (menurut saya,
=>
seharusnya tidak dimasukkan lebih dari kawat gigi akan menjadi). Versi yang menangani angka negatif juga dapat dipersingkat.sumber
.0
? Tidak perlu apa pun selain modulus integer.i % 0
dengani
bilangan bulat memberikan aDivideByZeroException
.48d
sama dengan48.0
, tetapi satu karakter kurang (d untuk ganda).&
, justru karena&
tidak mengalami hubungan pendek - Anda akan mendapatkan pembagian dengan pengecualian nol pada%
. Kita dapat memperbaikinya dengan membuatnya menjadi ganda (dengand
), tetapi kemudian kita kehilangan satu karakter lagi.APL (
(ternyata tanda kurung tidak masuk hitungan)1311)Penjelasan:
⍎¨⍕⍵
: mengevaluasi setiap karakter dalam representasi string⍵
⍵|⍨
: untuk masing-masing, cari modulo dan⍵
0∧.=
: lihat apakah semua itu sama dengan0
Testcases:
sumber
X%0
? tanpa melempar?0|X
memberiX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 karakter
Cek apakah nomor memiliki sisa nol modulo digitnya, dan output negasi itu. Nol digit ditangani dengan aneh: karena komputasi
%0
menyebabkan kesalahan, digit0
diganti dengan.3
, yang tampaknya selalu memberikan hasil bukan nol karena ketidakakuratan floating point.Badan fungsi adalah 32 karakter.
sumber
Perl - 27 byte
Tidak menghitung fungsi tanda tangan, seperti yang diinstruksikan.
Penggunaan sampel:
Output sampel:
Mengatasi spesifikasi masalah: "Hanya nilai true dan false boolean yang dihitung. Nilai kebenaran / falsey tidak dihitung."
Output:
'Benar' dan 'Salah' didefinisikan sebagai
1
dan""
.Erratum:
Seperti yang ditunjukkan oleh Brad Gilbert , perl mendefinisikan true sebagai skalar yang merupakan integer
1
dan string"1"
secara bersamaan, dan false sebagai skalar yang merupakan integer0
dan string""
secara bersamaan.sumber
$_
:pop=~s///ger<1
. Saya tidak tahu apakah OP akan menyetujui itu1
dan""
merupakan hasil yang valid. Jika tidak, maka bisa diperbaiki dengan dua byte lagi: cukup tambahkan|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
adalah 26 byte termasuk tanda|0
dan-p
. Anda tidak harus menggunakan fungsi.dualvar(1,'1')
dandualvar(0,'')
.SVIV
(int),SVNV
(ganda), danSVPV
(string).'abc'
angka (dengan asumsi Anda telahuse warnings;
mengaktifkannya.)CJam,
1110 byteIni mendefinisikan fungsi bernama
F
dan membuang blok dari tumpukan.Cobalah online.
Uji kasus
Bagaimana itu bekerja
sumber
JavaScript ES6,
393228 byteTerima kasih core1024 untuk saran untuk mengganti
(""+v).split("")
dengan[...""+v]
, dan openorclose untuk menyarankan penggunaanevery
fungsi.Jawabannya saat ini tidak mengandung sedikit pun kode saya: O
Solusi sebelumnya
==""
bukan cara yang valid untuk memeriksa apakah array kosong, karena[""]==""
kembalitrue
, tetapi array dijamin mengandung string yang tidak kosong, jadi array ini berfungsi di sini.Sisanya adalah konversi tipe steno yang cukup standar dalam JavaScript.
sumber
(""+v).split("")
dengan[...""+v]
.every
metode ini?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
kembaliNaN
danNaN == false
, maka dalam nomor kasus Anda yang berisi 0, seperti10
, dapat kembalitrue
.Java 8, 46 Bytes (metode tubuh)
Menggunakan Jeroen Mostert yang mengkonversi ke trik ganda.
sumber
Pyth, 12 byte
Ini memfilter karakter dalam string menjadi nol (
!vT
) atau tidak membagi input (%vzvT
), kemudian mengambil logika bukan dari daftar yang dihasilkan.Coba di sini.
sumber
Ruby, 44 byte (badan fungsi: 37)
Mungkin memiliki potensi untuk bermain golf lebih lanjut.
Input diambil melalui fungsi
f
. Contoh penggunaan:sumber
.to_i
ke.hex
, karena angka satu digit sama dengan basis 16, dan dapat berubah==0
menjadi<1
.Python -
59504947 byteSaya yakin ada cara yang lebih cepat ... oh well.
Sunting - Terima kasih kepada FryAmTheEggman untuk tips golfnya.
Sunting 2 - FryAmTheEggman mungkin telah menulis ini pada saat ini, oops
Sunting 3 - Angkat tangan jika Anda bahkan tidak tahu genexps adalah sesuatu. ...Hanya aku?
sumber
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. Dan tidak ada masalah :)all
metode.1>n%int(c)
bekerjaall(c>'0'and 0==n%int(c)for c in`n`)
tidak persis sama, dengan 2 char lebih sedikit dan bahkan menyimpan alokasi daftar.Pyth 11
Ini menggabungkan jawaban @ isaacg dan @ xnor . Ini memfilter digit dari input dengan memeriksa nilai
input % (eval(current_digit) or .3)
. Kemudian memeriksa apakah string yang dihasilkan kosong atau tidak.Datang di varian lain dengan panjang yang sama:
Cobalah online.
sumber
Bash + coreutils, 44 byte
Definisi fungsi penuh adalah:
Saya tidak yakin bagaimana cara menilai ini karena fungsi shell biasanya menggunakan satu set
{}
atau()
untuk memuat fungsi body. Saya menemukan di sini saya juga bisa menggunakan ganda(())
untuk memuat fungsi tubuh yang menyebabkan ekspansi aritmatika yang saya butuhkan di sini. Jadi untuk saat ini saya menghitung hanya sepasang kurung itu - diskusi lebih lanjut tentang ini disambut baik.Keluaran:
sumber
true
/false
?J - 14 char
Fungsi tubuh adalah bagian setelah
=:
. Jika kita ingin meminimalkan jumlah karakter untuk seluruh fungsi, itu adalah 15 karakter*/@(0=,.&.":|])
.,.&.":
adalah cara terpendek dalam J untuk memperluas sebagai angka ke dalam daftar angka desimalnya: konversikan ke string, pisahkan digit, dan ubah setiap digit kembali menjadi angka.,.&.":|]
mengambil nomor input (]
) modulo (|
) digit tersebut.0*/@:=
mengembalikan true jika semua hasil adalah 0, yang lain memberikan false.sumber
Java -
121102977978 byteSaya hanya tahu ini akan musnah nanti. Baiklah.
Aku akan kembali.
sumber
Haskell -
1005438Masih belajar, kritik dihargai
sumber
length
s, mereka tidak perlu. 2) Gantit
dengan definisinya. 3)elem y s
tidak perlu. 4)/='0'
dapat dipindahkan ke filter kiri, di tempatelem y s
. 5) Dalam hal ini,/='0'
sama dengan>'0'
, karena setiap huruf adalah angka. 6) Masukkanmod
backticks, sehingga menjadi infix. 7) Letakkan semuanya dalam satu baris.s==filter(...)s
Anda harus menggunakanall(...)s
. sekarang, karenas
hanya muncul sekali dalam ekspresi, Anda dapat menggantinya dengan definisi dan dropnyawhere
. juga, bukannya==0
Anda bisa menggunakan<1
.all(\y->...)$show x
denganand[...|y<-show x]
.CJam, 15 byte
Ini adalah blok, hal yang paling dekat dengan fungsi di CJam. Saya hanya menghitung tubuh (yaitu menghilangkan kawat gigi). Anda dapat menggunakannya sebagai berikut:
Atau jika Anda ingin menguji serangkaian input, Anda bisa melakukannya
Blok itu pergi
0
(falsy) atau1
(benar) di tumpukan untuk menunjukkan hasilnya. (CJam tidak memiliki tipe Boolean.)Uji di sini.
Penjelasan:
Alternatif, juga 15 byte
Penjelasan
sumber
CJam, 15 byte
{}
adalah hal yang paling dekat dengan fungsi di CJam. Saya hanya menghitung tubuh fungsiGunakan seperti ini:
Untuk mendapatkan
1
(jika nomornya dapat dibagi) atau0
(jika jumlahnya tidak dapat dibagi dengan digit-digitnya).Cobalah online di sini
Penjelasan
sumber
Ab
membagi angka? Tampaknya hanya mengubahnya menjadi basis 10. Juga, bagaimana% tahu mod dengan angka, dan bukan hanya angka berikutnya, karena tampaknya angka berikutnya akan berada di tumpukan berikutnya?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
cukup ambil dua angka terakhir (dalam hal ini) dan hitung mod. Dua angka terakhir di sini adalah angka dan digit aktual (selalu)C89, 43 byte
C89 tidak memiliki tipe boolean. Semoga itu berhasil. Saya juga menggunakan parameter kedua untuk meneruskan salinan nomor asli melalui tumpukan, tetapi definisi bisa apa saja. Untuk mendapatkan hasil yang benar, Anda hanya perlu memanggil fungsi dengan nilai yang sama untuk kedua parameter (
d(128, 128)
).SUNTING: Suntingan yang disarankan diterapkan oleh pengguna anonim
sumber
C11 - 44 Bytes di badan fungsi
Versi C lain, non rekursif dan tanpa pengecualian floating point.
Ini juga akan berfungsi dalam C ++, Java, dan sebagian besar bahasa mirip-C lainnya.
Diedit untuk memasukkan peningkatan komentar primo.
sumber
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
satu byte lebih pendek dari kode OP.Julia
322523Ditingkatkan menggunakan digit
Juga memperbaiki masalah dengan angka negatif
Metode lama
Semua digit dibagi jika jumlah semua sisanya adalah 0. Seperti yang lain, memiliki masalah dengan angka negatif.
Keluaran
Metode yang ditingkatkan juga menangani BigInt
namun
karena
sumber
C / C ++, 58 byte (44 dalam tubuh)
Meminta Perilaku Tidak Terdefinisi (lihat komentar)
true
danfalse
yang 1 dan 0, tetapi merasa bebas untuk menambahkan satu karakter ke tanda tangan untuk kembalibool
.Dan untuk bersenang-senang, versi rekursif yang lebih kecil jika Anda mengizinkan panggilan formulir
r(128,128)
Sunting : Sekarang tidak diizinkan oleh aturan:
C / C ++, 53 byte (33 dalam tubuh)
sumber
R:
726765Fungsinya
Terima kasih kepada @AlexA dan @plannapus untuk penghematannya
Uji coba
sumber
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
bukannyatoString(a)
memberikan hasil yang sama.GNU Awk: 53 karakter
Bagian yang dihitung:
Seluruh fungsi:
Karena Awk tidak memiliki nilai boolean, mengembalikan 1 tor true dan 0 untuk false.
sumber
JavaScript (ES6) 30
Berfungsi dengan satu parameter numerik. Menggunakan% dan pengurangan, tidak perlu huruf khusus '0' karena 0% 0 adalah NaN dalam JavaScript.
Edit Disimpan 1 char thx DocMax
Hanya untuk bersenang-senang, menyalahgunakan aturan tentang tidak menghitung tanda tangan fungsi, 4
Uji di konsol FireFox / FireBug
Keluaran
sumber
of(t=n+'')
hanyaof t=n+''
dengan menghemat 1.PHP: 85 byte (64 byte pada badan)
Agar fungsi ini berfungsi, cukup masukkan string atau angka.
0
akan kembali dengan benar salah.Kode:
Tolong, JANGAN TETAP PARAMETER 2ND!
Javascript: 76 byte (61 byte pada tubuh)
Ini adalah penulisan ulang fungsi sebelumnya.
Tidak banyak berubah di antara kedua versi.
Ini kodenya:
Polyglot: Javascript + PHP 187
217byte (7684 byte tanpa boilerplate):Kenapa saya membuatnya?
Karena alasan dan mungkin karena aku bisa!
Abaikan saja kesalahan pada PHP: tetap berfungsi!Tidak lagi diperlukan, ini diperbaiki dengan menghapus 3 byte.
Inilah mahakarya:
Anda dapat menjalankan kode ini baik di konsol Anda maupun pada penerjemah PHP!
Versi lama:
sumber
Oktaf, 33 (39 termasuk pengaturan fungsi)
Menggunakan konversi numerik ke matriks:
Bagilah angka secara elemen dengan matriks X, di mana X dibuat dengan mengubah angka menjadi string dan kurangi 48 untuk beralih dari nilai ASCII ke angka lagi. Ambil modulo 1 untuk mendapatkan bagian desimal dari setiap divisi, konfirmasikan bahwa semua ini nol (jika ada NaN karena / 0, jumlahnya akan menjadi NaN dan karenanya bukan nol).
Masukan sampel menggunakan www.octave-online.net:
Keluaran:
sumber
f(123)
, yang dapat dibagi oleh 1, 2 dan 3). Tetapi itu bekerja untuk kasus-kasus uji yang disediakan.MATLAB - 39 karakter
sumber
BASH - 117 karakter
tes
sumber
PHP -
747164 KarakterGolf:
Kurang Golf:
Hasil tes:
(Kode)
(Keluaran)
sumber