除外可能な数値


8

整数を指定すると、次のプロパティを使用して10 番目の正数をN出力します。NK

I位置Pの各桁について、3番目の桁(つまり)を削除してK形成される数は、で割り切れる。KPII

例と備考

324 そのような数です:

  • 3 割る 24
  • 2 割る 34
  • 4 割る 32

注1:空の数値は、など、何でも割り切れると想定しています0。したがって12345678及び9有効です。

注2:で 除算できないためK、数字を含める0ことはできません0

入力と出力

  • 入力を関数の引数としてSTDIN、などを介して受け取ることができます。
  • 関数の出力はSTDOUT、などを介して返すことができます。
  • これらの番号は、0(どちらの場合N >= 0)または1N > 0どちらの場合)から、どちらか適切な方からインデックスを付けることができます。

テストケース

これらの例はからインデックスが作成される0ため、からインデックスを作成する場合は、列の数値に1追加1Nます。

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

得点

これはなので、バイト単位の最も短い答えが優先されます。


さらにテストケースが必要な場合は、@ LeakyNunおよび@FryAmTheEggman(両方ともPython)による実装を以下に示します。
16年



回答:


4

ゼリー21 19 バイト

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

入力は1インデックスです。オンラインでお試しください!

使い方

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

バース、20歳

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

ここで試すか、テストスイートを実行してください

この回答では、Nは1インデックスです。

私のPythonスクリプトとほぼ同じロジックを使用します。注目すべき違いは.D、テスト中に文字列から数字を削除するために使用され、ゼロ数字を処理するために例外処理を使用しています。


2

Pyth、26バイト

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

テストスイート。

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バイト

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

非常に非効率的です。入力は1インデックスです。Ideoneでテストするます。

代替バージョン、100バイト

上記のコードを実行おおよそ10 Xのみ整除テストXが要求されます。唯一のコストで7余分バイト、効率を置換することによってのいずれかで、飛躍的に向上させることができる*rと共に*len(`r`)、または次のようにコードをリファクタリングすることによって。

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

Ideoneでも、すべてのテストケースを簡単に処理できます。


2

JavaScript(ES6)、82 78 76バイト

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

入力は1インデックスです。フォームの文字列を作成false|'24'%3|'34'%2|'32'%4して評価することで機能します。文字列は、1桁の場合でも構文的に有効であるため使用されます。

再帰により、これは約n = 119に制限されます。88 84 82バイトの反復バージョン:

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

編集:@ Dennis♦のおかげで2バイト節約されました。


"|'$`$''%$&"2バイトを節約します。
Dennis

@Dennisありがとう、そのエッジケースを処理するためのより良い方法が必要であることがわかっていました。
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]}

NeilのJavascriptの回答に対する同様のアプローチですが、暗黙的な型変換がないため、大幅に長くなります(ただし、ブール値がによって文字列に変換されるのgsubは素晴らしいことです)。


1

Ruby、109バイト

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

フーン、246バイト

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

未ゴルフ:

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

これは本当にひどいです。これを投稿して汚いです。

k現在の数値の文字列形式に設定し、[0...(length k)-1]そのインデックスで文字列を分割するリストにマッピングします(a)。a文字を取得し、数値に解析して、0戻り値がnoの場合。の接頭辞を取得し、aそれを分割のもう半分に溶接し、数値に解析し、インデックスがそれを均等に分割しているかどうかを確認します。

++levyリストのすべての要素で関数を呼び出した場合も、yesを返します。この場合、関数++testはyesでカリー化するため、すべての文字が機能していることを確認しますk

0番目の値の場合、現在の数値を返すか、nをデクリメント(およびインクリメントx)して再帰します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.