Số không bao gồm


8

Cho một số nguyên N, xuất Nsố dương thứ th Kvới thuộc tính sau trong cơ sở thập phân:

Đối với mỗi chữ số Iở vị trí Pcủa K, số được hình thành từ Kbằng cách loại bỏ Pchữ số thứ (nghĩa là I) chia hết cho I.

Ví dụ và nhận xét

324 là một số như vậy:

  • 3 chia 24
  • 2 chia 34
  • 4 chia 32

Lưu ý 1: chúng tôi giả sử rằng số trống chia hết cho mọi thứ, như thế nào 0. Do đó 1, 2, 3, 4, 5, 6, 7, 89là hợp lệ.

Lưu ý 2: K không thể chứa chữ số 0, vì bạn không thể chia cho 0.

Đầu vào và đầu ra

  • Bạn có thể lấy đầu vào làm đối số chức năng, thông qua STDIN, v.v.
  • Bạn có thể trả lại đầu ra từ một hàm, thông qua STDOUT, v.v.
  • Bạn có thể lập chỉ mục những số đó bắt đầu từ 0(trong trường hợp nào N >= 0) hoặc từ 1(trong trường hợp đó N > 0), tùy theo số nào phù hợp với bạn hơn.

Các trường hợp thử nghiệm

Những ví dụ này được lập chỉ mục từ 0, vì vậy nếu bạn được lập chỉ mục từ 1, sau đó thêm 1vào các số trong Ncột.

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

Chấm điểm

Đây là , vì vậy câu trả lời ngắn nhất bằng byte sẽ thắng.


Dưới đây là một triển khai của @LeakyNunbởi @FryAmTheEggman (cả trong Python) nếu bạn muốn có nhiều trường hợp thử nghiệm hơn.
Gây tử vong vào



Câu trả lời:


4

Thạch , 21 19 byte

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

Đầu vào là 1 chỉ mục. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

4

Bình thường, 20

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

Dùng thử tại đây hoặc chạy Test Suite

N là 1 chỉ số cho câu trả lời này.

Sử dụng phần lớn logic giống như kịch bản python của tôi. Sự khác biệt đáng chú ý là sử dụng .Dđể xóa chữ số khỏi chuỗi trong quá trình kiểm tra và sử dụng xử lý ngoại lệ để xử lý các chữ số 0.


2

Bình thường, 26 byte

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

Bộ thử nghiệm.

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]

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

Rất kém hiệu quả. Đầu vào là 1 chỉ mục. Kiểm tra nó trên Ideone .

Phiên bản thay thế, 100 byte

Này thực hiện mã trên khoảng 10 x xét nghiệm chia hết mà chỉ có x được yêu cầu. Với chi phí chỉ có 7 byte bổ sung , hiệu quả có thể được cải thiện đáng kể, bằng cách thay thế *rbằng *len(`r`)hoặc tái cấu trúc mã như sau.

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

Điều này xử lý tất cả các trường hợp thử nghiệm một cách dễ dàng, ngay cả trên Ideone .


2

JavaScript (ES6), 82 78 76 byte

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

Đầu vào là 1 chỉ mục. Hoạt động bằng cách xây dựng một chuỗi các hình thức false|'24'%3|'34'%2|'32'%4và đánh giá nó. Chuỗi được sử dụng vì chúng vẫn còn hiệu lực về mặt cú pháp trong trường hợp một chữ số.

Đệ quy giới hạn này khoảng n = 119. Phiên bản lặp cho 88 84 82 byte:

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

Chỉnh sửa: Đã lưu 2 byte nhờ @ Dennis ♦.


"|'$`$''%$&"tiết kiệm hai byte.
Dennis

@Dennis Cảm ơn, tôi biết phải có một cách tốt hơn để xử lý trường hợp cạnh đó.
Neil

2

Hồng ngọc, 90

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

Cách tiếp cận tương tự với câu trả lời Javascript của Neil, nhưng lâu hơn đáng kể do thiếu chuyển đổi kiểu ngầm định (ngoại trừ việc booleans được chuyển đổi thành chuỗi theo gsub, điều này rất hay).


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}

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))

Ung dung:

=+  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))

Điều này ... thực sự khủng khiếp. Tôi cảm thấy bẩn vì đăng bài này.

Đặt kthành dạng chuỗi của số hiện tại, ánh xạ qua danh sách [0...(length k)-1]chia chuỗi tại chỉ mục đó ( a). Lấy aký tự, phân tích thành số và nếu nó 0trả về không. Lấy tiền tố của avà hàn nó vào nửa còn lại của phân tách, phân tích thành một số, kiểm tra xem chỉ số có chia đều không.

++levytrả về yes iff gọi hàm trên tất cả các thành phần của danh sách cũng là có. Trong trường hợp này, hàm được xử lý ++testbằng có, vì vậy nó kiểm tra tất cả các ký tự trong kcông việc.

Nếu chúng tôi ở giá trị 0, chúng tôi sẽ trả về số hiện tại hoặc nếu không chúng tôi sẽ lặp lại với n giảm (và tăng x)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.