Ambil bilangan bulat positif X
. Nomor ini adalah bagian dari urutan yang kami minati jika jumlah semua digit X
adalah pembagi X
, dan jika produk dari semua digit X
adalah pembagi X
.
Sebagai contoh, 135
adalah angka seperti itu karena 1 + 3 + 5 = 9
yang membelah 135 = 9 * 15
dan 1 * 3 * 5 = 15
yang juga membelah 135
.
Ini adalah urutan A038186 dalam OEIS.
Tugas Anda: diberi bilangan bulat N
, output N
bilangan bulat positif th dengan properti tersebut.
Masukan dan keluaran
Angka bisa
0
-indeks atau1
-indeks; tolong tunjukkan jawaban yang Anda gunakan.Input dapat diambil melalui
STDIN
, sebagai argumen fungsi, atau yang serupa.Output dapat dicetak ke
STDOUT
, dikembalikan dari fungsi, atau yang serupa.
Uji kasus
Kasus uji di bawah ini adalah 1
-indeks.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
sumber
0
.Jawaban:
05AB1E ,
1312 byteTerima kasih kepada Emigna karena telah menghemat satu byte!
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
µNNSONSP‚ÖP½
berfungsi juga bukan?Pyke, 14 byte (tidak kompetitif) (1-diindeks)
Coba di sini!
Ya Tuhan apa yang banyak fitur baru.
Di antaranya tidak kompetitif
I
mana ia hanya akan memeriksa apakah item pertama pada stack itu benardigits
- mengembalikan daftar angka dalam angka@
digunakan untuk mendapatkan item ke-n dari daftar yang tak terbatasDari yang digunakan untuk pertama kalinya:
Hapus 2 byte terakhir untuk mendapatkan semua angka-angka ini.
sumber
C #, 118 byte
Program lengkap dengan fungsi dan uji kasus yang tidak dikoleksi:
sumber
for(int x=0,c=0;;)
menghemat 1 byte.Jelly , 13 byte
Berbasis 1.
TryItOnline!
Bagaimana?
sumber
Perl 6 , 44 byte (0-diindeks)
Penjelasan:
Infinite list ftw!
sumber
*
berarti lebih banyak byte.//0
digrep
blok.//0
karena biasanya diterima dalam codegolf untuk mencetak ke stderr.//0
Sebenarnya , 20 byte
Implementasi naif definisi urutan. Selamat datang saran bermain golf! Cobalah online!
Tidak melakukanolf
sumber
Ubur-ubur , 45 byte
Cobalah online!
Penjelasan
Sejauh ini, ini adalah program yang paling rumit (dan juga yang terpanjang) yang saya tulis di Jellyfish sejauh ini. Saya tidak tahu apakah saya akan dapat memecah ini dengan cara yang dimengerti, tapi saya rasa saya harus mencoba.
Ubur-ubur menyediakan operator iterasi yang cukup umum
\
,, yang banyak membantu dengan "menemukan sesuatu yang ke- N ". Salah satu semantiknya adalah "beralih fungsi pada nilai sampai fungsi tes terpisah memberikan sesuatu yang benar" (pada kenyataannya, fungsi tes menerima elemen saat ini dan yang terakhir, tetapi kami hanya akan membuatnya melihat elemen saat ini) . Kita dapat menggunakan ini untuk mengimplementasikan fungsi "angka valid berikutnya". Kelebihan lainnya\
adalah "beralih fungsi pada nilai awal N kali". Kita dapat menggunakan fungsi sebelumnya dan mengulanginya pada0
N kali, di mana N adalah input. Semua itu diatur cukup ringkas dengan bagian kode ini:(Alasan mengapa
0
, input aktual ke fungsi yang dihasilkan, ada di sana agak rumit dan saya tidak akan membahasnya di sini.)Masalah dengan semua ini adalah, bahwa kita tidak akan meneruskan nilai saat ini ke fungsi tes secara manual. The
\
Operator akan melakukan ini untuk kita. Jadi kita sekarang telah membangun fungsi unary tunggal (melalui komposisi, kait, garpu dan currying) yang mengambil angka dan memberi tahu kita apakah itu nomor yang valid (yaitu yang dibagi dengan jumlah digit dan produk digit). Ini cukup non-sepele ketika Anda tidak bisa merujuk ke argumen. Pernah. Ini keindahan ini:Ini
(
adalah pengait unary , yang artinya memanggil fungsi di bawah (f
) pada inputnya (nilai saat inix
), dan kemudian meneruskan keduanya ke fungsi pengujian di sebelah kanan (g
), yang dihitungnyag(f(x), x)
.Dalam kasus kami,
f(x)
adalah fungsi komposit lain yang memperoleh pasangan dengan produk digit dan jumlah digitx
. Itu berartig
akan menjadi fungsi yang memiliki ketiga nilai untuk memeriksa apakahx
valid.Kami akan mulai dengan melihat bagaimana
f
menghitung jumlah digit dan produk digit. Ini adalahf
:&
juga komposisi (tetapi sebaliknya).~
adalah currying sehingga10~b
memberikan fungsi yang menghitung angka desimal angka, dan karena kita meneruskannya ke&
dari kanan, itulah hal pertama yang akan terjadi pada inputx
. Sisanya menggunakan daftar angka ini untuk menghitung jumlah dan produk mereka.Untuk menghitung jumlah, kita dapat melipat tambahan di atasnya, yaitu
/+
. Demikian juga, untuk menghitung produk kami melipat gandakan dengan itu/*
. Untuk menggabungkan kedua hasil ini menjadi sepasang, kami menggunakan sepasang kait,(
dan)
. Struktur ini adalah:(Dimana
f
dan manag
adalah produk dan jumlah, masing-masing.) Mari kita coba mencari tahu mengapa ini memberi kita sepasangf(x)
dang(x)
. Perhatikan bahwa hook kanan)
hanya memiliki satu argumen. Dalam hal ini, argumen lain disiratkan sebagai;
argumen yang membungkus pasangannya. Selanjutnya, kait juga dapat digunakan sebagai fungsi biner (yang akan menjadi kasus di sini) dalam hal ini mereka hanya menerapkan fungsi dalam hanya untuk satu argumen. Jadi sebenarnya)
pada satu fungsig
memberikan fungsi yang menghitung[x, g(y)]
. Menggunakan ini di hook kiri, bersama denganf
, kita dapatkan[f(x), g(y)]
. Ini, pada gilirannya digunakan dalam konteks unary, yang berarti bahwa itu sebenarnya dipanggil denganx == y
dan akhirnya kita sesuai dengan yang[f(x), g(x)]
diperlukan. Fiuh.Hanya menyisakan satu hal, yang merupakan fungsi pengujian kami sebelumnya
g
. Ingatlah bahwa itu akan disebut sebagai dig([p, s], x)
manax
masih nilai input saat ini,p
adalah produk digitnya dans
jumlah digitnya. Ini adalahg
:Untuk menguji kemampuan membagi, kami jelas akan menggunakan modulo, yang ada
|
di Jellyfish. Agak luar biasa, ia mengambil operan kanan modulo operannya kiri, yang berarti bahwa argumeng
sudah dalam urutan yang benar (fungsi aritmatika seperti ini secara otomatis memasukkan daftar, jadi ini akan menghitung dua moduli terpisah secara gratis) . Nomor kami dapat dibagi oleh produk dan jumlah, jika hasilnya adalah nol. Untuk memeriksa apakah itu masalahnya, kami memperlakukan pasangan sebagai daftar digit basis-2 (d
). Hasil dari ini adalah nol, hanya ketika kedua elemen dari pasangan adalah nol, sehingga kita dapat meniadakan hasil dari ini (N
) untuk mendapatkan nilai kebenaran apakah kedua nilai membagi input. Catat itu|
,d
danN
semua disusun dengan sepasang&
s.Sayangnya, itu bukan cerita lengkapnya. Bagaimana jika produk digitnya nol? Pembagian dan modulo dengan nol keduanya menghasilkan nol di Jellyfish. Walaupun ini mungkin tampak seperti konvensi yang agak aneh, sebenarnya ternyata agak berguna (karena kita tidak perlu memeriksa nol sebelum melakukan modulo). Namun itu juga berarti kita bisa mendapatkan false positive, jika jumlah digit memang membagi input, tetapi produk digit adalah nol (mis. Input
10
).Kami dapat memperbaikinya dengan mengalikan hasil pembagian kami dengan produk digit (jadi jika produk digit adalah nol, itu akan mengubah nilai kebenaran kami menjadi nol juga). Ternyata lebih mudah untuk melipatgandakan hasil pembagian dengan pasangan produk dan jumlah, dan mengekstrak hasil dari produk sesudahnya.
Untuk mengalikan hasil dengan pasangan, kita perlu mengembalikan nilai sebelumnya (pasangan). Ini dilakukan dengan garpu (
]
). Garpu agak seperti kait pada steroid. Jika Anda memberi mereka dua fungsif
dang
, mereka mewakili fungsi biner yang menghitungf(a, g(a, b))
. Dalam kasus kami,a
adalah pasangan produk / jumlah,b
adalah nilai input saat ini,g
adalah uji keterbagian kami, danf
merupakan perkalian. Jadi semua ini menghitung[p, s] * ([p, s] % x == [0, 0])
.Yang tersisa sekarang adalah mengekstraksi nilai pertama ini, yang merupakan nilai akhir dari fungsi tes yang digunakan dalam iterator. Ini sesederhana membuat (
&
) fork dengan fungsi kepala<
, yang mengembalikan nilai pertama dari daftar.sumber
R,
132115 byteVersi baru berkat @Billywob komentar yang bagus!
Tidak Terkumpul:
Karena R berperilaku strangley denganNA
s, saya harus menambahkan seluruhifelse(is.na(...))
bagian!Atau gunakan
na.omit(...)
sumber
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
menyimpan beberapa byte oleh:el(...)
alih-alih[[1]]
, menggunakanc(b,"")
alih-alihpaste(b)
, meniadakan ekspresi logis dengan!
alih-alih==0
dan melewatkan tanda kurung keriting padaif
pernyataan. Dugaan saya adalah bahwa seharusnya ada cara yang lebih mudah untuk menanganiNA
masalah ini tetapi tidak dapat menemukan sesuatu yang pintar.0
ke ekspresi yang dievaluasi dalamif
pernyataan. Namun, ini mengembalikan peringatan ketika produk tidak sama dengan0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Brachylog , 22 byte
Cobalah online!
Penjelasan
sumber
JavaScript (ES6), 78
Kurang golf
sumber
Pyth, 18 byte
Cobalah online: Demonstrasi
Penjelasan:
sumber
JavaScript (ES6), 72 byte
Demo
Ini cenderung lambat untuk nilai yang lebih tinggi, jadi saya membatasi sampai 20 di sini.
Tampilkan cuplikan kode
sumber
Haskell,
94857271 byte1-diindeks.
Terima kasih kepada @Zgarb karena telah menghemat 13 byte!
Terima kasih kepada @nimi karena telah menghemat satu byte!
sumber
(==)=<<map(gcd n)$[sum k,product k]
harus menyimpan beberapa byte.[sum k,product k]
bisa sajamap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 byte
Panjang dan tidak efisien ...
Cobalah online!
Bagaimana itu bekerja
sumber
JavaScript (ES6), 70 byte
Ini ternyata sedikit seperti jawaban @ Arnauld, tetapi rekursi tampaknya 2 byte lebih pendek. Bekerja di Chrome, meskipun sangat lambat pada input yang lebih dari 30 atau lebih (50 membutuhkan waktu 6 detik).
sumber
Python 2,
122110 Bytes1 diindeks, Anda perlu menggunakan juru bahasa Python dengan batas rekursi yang cukup tinggi.
sumber
Bertanya-tanya, 33 byte
Diindeks nol. Pemakaian:
Penjelasan
Lebih mudah dibaca:
Pada dasarnya mendapatkan daftar nomor tak terbatas yang dapat dibagi dengan jumlah digital dan produknya dengan memfilter daftar nomor tak terbatas seluruh melalui predikat. Maka
n
item ke-10 hanya diambil dari daftar.sumber
Julia, 81 byte
Ini adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, berikan nama. Pendekatannya adalah yang jelas: periksa setiap angka sampai kita menemukan
n
ketentuan urutannya. Theall
cek diperlukan untuk memastikan kita tidak mendapatkanDivisionError
dari%
ketika produk dari angka adalah 0.Tidak Disatukan:
Cobalah online! (termasuk semua kasus uji)
sumber
prod(d)
untukp
atau sesuatu dan kemudian menggantiall(d.>0)
denganp>0
. Dan Anda dapat menyimpan yang lain dengan memindahkannyai%sum(d)
ke sisi lain1
yaitup<1>i%sum(d)
.C89,
381226195170169 byte1-diindeks (jawaban persis sama seperti pada tantangan).
Diasumsikan 4-byte (32 bit)
int
(kebanyakan arsitektur modern) .Saya benar-benar percaya ini tidak bisa lebih pendek.
Fungsi
int g (int)
bocor memori dan mengakses memori yang tidak diinisialisasi satu kali per panggilan tetapi tidak membuat kesalahan dan mengembalikan nomor yang benar.Program lengkap yang mengambil input unary (
./prog $(seq 1 10)
untuk 10) dengan ungolfed (agak):Jawaban lama:
C99, 381 byte
Ini mungkin bisa lebih banyak golf.
Program lengkap:
sumber
int
untuk semuanya, karena ini adalah tipe integer default.C, 110 byte
Tidak digabungkan dan digunakan:
sumber
Python3,
13480 BytesVersi baru berkat Flp.Tkc
Kode baru, saya ingat cara bermain golf untuk faktorialKode itu sendiri tidak seperti golf, lebih seperti golf brute forceg (x) adalah fungsi yang mengembalikan True jika x cocok dengan kriteria.
sumber
<1
sebagai ganti==0
. Anda tidak perluis True
, maksud dari pernyataan if adalah untuk memeriksa apakah kondisinya benar. Anda dapat menggunakan cara pintas backtick Python 2 untukstr/repr
mencukur beberapa byte. Ada juga banyak ruang kosong yang tidak dibutuhkan di sini.h+=g(str(k))
menambahkan 1 jika Benar, 0 jika Salah.x
(backtick) dengan Python 2 adalah samarepr(x)
ataustr(x)
dengan Python 3 :)PHP, 96 byte
Dibutuhkan
n
sebagai argumen baris perintah.Golf
Tidak disatukan
sumber
PowerShell v2 +, 84 byte
Solusi berulang. Mengambil input
$n
dan memasukkan satufor
loop selama$n
bukan nol. Setiap iterasi, kami kurangi dari$n
hasil pernyataan Boolean, dijelaskan di bawah ini:Jadi, hanya jika
$a%(sum)
dan$a%(product)
yang kedua sama dengan nol akan Selain juga menjadi nol, dan dengan demikian Boolean-tidak akan menjadi Benar dan karena itu$n
decremented.Setelah kami keluar dari loop (yaitu, kami menekan n istilah ), kita cukup menempatkan
$a
pada pipeline, dan output tersirat.Contohnya
Catatan: Ini melempar banyak kesalahan "Mencoba membagi dengan nol" ke STDERR, yang diabaikan secara default. Saya telah secara eksplisit menambahkan
2>$null
contoh di bawah ini untuk membersihkan output. Ini juga sangat lambat begitu mencapai sekitar30
atau lebih, dan50
membutuhkan sekitar 45 detik pada mesin saya.sumber
BASH, 125 byte
sumber