Angka yang tidak dapat dikecualikan

8

Diberikan bilangan bulat N, Nhasilkan angka positif th Kdengan properti berikut dalam basis desimal:

Untuk setiap digit Ipada posisi Pdari K, jumlah terbentuk dari Kdengan menghapus Pdigit th (yaitu I) habis dibagi I.

Contoh dan komentar

324 adalah nomor seperti itu:

  • 3 membagi 24
  • 2 membagi 34
  • 4 membagi 32

Catatan 1: kami berasumsi bahwa angka kosong dapat dibagi oleh apa pun, misalnya 0. Oleh karena itu 1, 2, 3, 4, 5, 6, 7, 8dan 9berlaku.

Catatan 2: K tidak dapat berisi angka 0, karena Anda tidak dapat membaginya dengan 0.

Masukan dan keluaran

  • Anda dapat mengambil input sebagai argumen fungsi, melalui STDIN, dll.
  • Anda dapat mengembalikan output dari suatu fungsi, melalui STDOUT, dll.
  • Anda dapat mengindeks angka-angka itu mulai dari 0(dalam hal ini N >= 0) atau dari 1(dalam hal ini N > 0), mana yang lebih cocok untuk Anda.

Uji kasus

Contoh-contoh itu diindeks dari 0, jadi jika Anda diindeks dari 1, lalu tambahkan 1ke angka di Nkolom.

N    Output
0    1
4    5
8    9
15   77
16   88
23   155
42   742
47   1113
121  4244
144  6888
164  9999

Mencetak gol

Ini adalah , jadi jawaban tersingkat dalam byte menang.

Fatalisasi
sumber
Berikut ini adalah implementasi oleh @LeakyNun dan oleh @FryAmTheEggman (keduanya dalam Python) jika Anda ingin lebih banyak test case.
Fatalkan tanggal
Terkait .
AdmBorkBork

Jawaban:

4

Jelly , 21 19 byte

DLR©œ^€®ịDḌḍ@DPȧµ#Ṫ

Input diindeks 1. Cobalah online!

Bagaimana itu bekerja

DLR©œ^€®ịDḌḍ@DPȧµ#Ṫ  Main link. No arguments.

                µ    Convert the chain to the left into a link.
                 #   Read n from STDIN and execute the link to the left for
                     k = 0, 1, 2, ... until n value return a truthy value.
D                      Convert D to base 10 (digit array).
 LR                    Construct the range from 1 to the length of the digit array.
   ©                   Copy the range to the register.
       ®               Yield the value of the register.
    œ^€                Take the multiset difference of each element of the range
                       and the range itself.
        ịD             Index into the digit array.
          Ḍ            Convert each list of digits to integer.
                       This yields all numbers with one suppressed digit.
           ḍ@D         Test each of these numbers for divisibility by the
                       suppressed digit from the digit array.
              P        Take the product of the resulting Booleans.
               ȧ       Logical AND with k (k would return 1).
                  Ṫ  Tail; extract the last (nth) element.
Dennis
sumber
4

Pyth, 20

e.f!s.e.x%s.D`Zksb1`

Cobalah di sini atau jalankan Test Suite

N diindeks 1 untuk jawaban ini.

Sebagian besar menggunakan logika yang sama dengan skrip python saya. Perbedaan penting digunakan .Duntuk menghapus digit dari string selama pengujian dan menggunakan penanganan pengecualian untuk menangani nol digit.

FryAmTheEggman
sumber
2

Pyth, 26 byte

e.f&!/J`Z\0!s%VsM.DLJUJjZT

Suite uji.

e.f&!/J`Z\0!s%VsM.DLJUJjZT
e.f                          The n-th number (Z) where:
    !/J`Z\0                      Z does not contain "0"
   &                             and
           !s                    the following does not contain zero:
               sM.DLJUJ              generate the set of the digits removed
                       jZT           all the digits
             %V                      modulus in parallel
                                     if Z is 324,
                                     the first set would be [24,34,32]
                                     the second set would be [3,2,4]
                                     the third set would be [24%3, 34%2, 32%4]
Biarawati Bocor
sumber
2

Python 2, 93 byte

n=input();r=0
while n:r+=1;k=t=1;exec't&=(r/k/10*k+r%k)%(r/k%10or r)<1;k*=10;'*r;n-=t
print r

Sangat tidak efisien. Input diindeks 1. Cobalah Ideone .

Versi alternatif, 100 byte

Kode di atas melakukan kira-kira 10 x tes keterbagian di mana hanya x yang diperlukan. Pada biaya hanya 7 byte ekstra , efisiensi dapat ditingkatkan secara dramatis, baik dengan mengganti *rdengan *len(`r`)atau dengan refactoring kode sebagai berikut.

n=input();r=0
while n:
 r+=1;k=t=1
 for _ in`r`:t&=(r/k/10*k+r%k)%(r/k%10or r)<1;k*=10
 n-=t
print r

Ini menangani semua kasus uji dengan mudah, bahkan pada Ideone .

Dennis
sumber
2

JavaScript (ES6), 82 78 76 byte

f=(n,k=0)=>n?f(n-!eval(/0/.test(++k)+`${k}`.replace(/./g,"|'$`$''%$&")),k):k

Input diindeks 1. Bekerja dengan membangun string formulir false|'24'%3|'34'%2|'32'%4dan mengevaluasinya. String digunakan karena mereka masih berlaku secara sintaksis dalam kasus satu digit.

Rekursi membatasi ini menjadi sekitar n = 119. Versi berulang untuk 88 84 82 byte:

n=>{for(k=0;n;n-=!eval(/0/.test(++k)+`${k}`.replace(/./g,"|'$`$''%$&")));return l}

Sunting: Disimpan 2 byte berkat @ Dennis ♦.

Neil
sumber
"|'$`$''%$&"menghemat dua byte.
Dennis
@ Dennis Terima kasih, saya tahu harus ada cara yang lebih baik untuk menangani kasing tepi itu.
Neil
2

Ruby, 90

f=->n,s=?0{0while s.next![?0]||s[1]&&/t/=~s.gsub(/\d/){eval"#$`#$'%#$&>0"};n<1?s:f[n-1,s]}

Pendekatan yang mirip dengan jawaban Javascript Neil, tetapi secara signifikan lebih lama karena kurangnya konversi tipe implisit (kecuali bahwa boolean dapat dikonversi menjadi string oleh gsub, yang bagus).

histokrat
sumber
1

Ruby, 109 byte

->n{i=s=1;n.times{s=?0;s="#{i+=1}"while s[?0]||(0...x=s.size).any?{|i|(s[0,i]+s[i+1,x]).to_i%s[i].to_i>0}};s}
Nilai Tinta
sumber
1

Hoon , 246 byte

=+
x=0
|=
n/@
=+
k=<x>
=+
%+
levy
%+
turn
(gulf 0 (dec (lent k)))
|=
a/@
=+
(trim +(a) k)
=+
(rash (snag a p) dit)
?:
=(- 0)
|
=(0 (mod (fall (rust (weld (scag a p) q) dem) x) -))
(curr test &)
?:
=(- &)
?:
=(0 n)
x
$(n (dec n), x +(x))
$(x +(x))

Tidak Disatukan:

=+  x=0
|=  n/@
=+  k=<x>
=+  %+  levy
  %+  turn  (gulf 0 (dec (lent k)))
  |=  a/@
  =+  (trim +(a) k)
  =+  (rash (snag a p) dit)
  ?:  =(- 0)
    |
  =(0 (mod (fall (rust (weld (scag a p) q) dem) x) -))
(curr test &)
?:  =(- &)
  ?:  =(0 n)
    x
  $(n (dec n), x +(x))
$(x +(x))

Ini ... sangat mengerikan. Saya merasa kotor karena memposting ini.

Setel kke bentuk string dari angka saat ini, petakan daftar yang [0...(length k)-1]memisahkan string pada indeks itu ( a). Dapatkan akarakter, parsing ke angka, dan jika itu 0mengembalikan no. Dapatkan awalan adan las ke bagian lain dari perpecahan, parsing ke angka, periksa apakah indeks membaginya secara merata.

++levymengembalikan yes iff memanggil fungsi pada semua elemen dari daftar juga ya. Dalam hal ini, fungsi ++testdilengkungkan dengan ya, jadi memeriksa bahwa semua karakter dalam kpekerjaan.

Jika kita pada nilai 0, kita kembalikan angka saat ini, atau kita kambuh dengan n yang dikurangi (dan bertambah x )

Pengaturan rendering
sumber