シリアル化された整数を見つける


16

仕事

(入力として)正の整数を取るプログラムを作成します。次に0、からカウントアップし、各整数をaに追加します。Stringその長さがString入力の値よりも小さい場合にのみ続行します。

シリアル化された整数が属する最大値と完全に形成された整数として定義されますString。「完全に形成された」ことにより、整数に欠落している数字がないはずです(の長さの制約Stringが満たされる場合に発生します)。

プログラムの出力は、それぞれの正の入力に対してシリアル化された整数でなければなりません。


ルール

  • コードゴルフなので、最短の回答(バイト単位)が勝ちます!
  • 入力は常に正になります。
  • 出力は、10進数(10進数)の整数でなければなりません。
  • プログラムには0インデックスが必要です。

入力例| 出力

   5 | 4   (0 1 2 3 4              - Length of 5)
  11 | 9   (0 1 2 3 4 5 6 7 8 9 1  - Length of 11)
  12 | 10  (0 1 2 3 4 5 6 7 8 9 10 - Length of 12)
1024 | 377 (0 1 2 3 4 5 6 7 8 ...  - Length of 1024)

ノート)


6
推奨されるテストケース:11
ロッド

@Rodが追加しました。うまくいけば理解しやすくなります!
ジェイコブG.

例の文字列に引用符を追加すると、文字列であることを理解しやすくなります。
isaacg

最初だから、N-1の桁Champernowne定数と、0プリペンド?
メゴ

回答:


8

JavaScript(ES6)、40 37バイト

f=(n,i=s='0')=>(s+=++i)[n]?i-1:f(n,i)
<input type=number min=1 value=1 oninput=o.textContent=f(this.value)><pre id=o>0

編集:@Arnauldの助けを借りて3バイトを保存しました。




5

Japt、13バイト

1n@P±X l >U}a

オンラインでテストしてください!

説明

1n@ P± X l >U}a
1nX{P+=X l >U}a
                   Implicit: U = input integer, P = empty string
  X{         }a    Return the first integer X in [0, 1, 2, ...] that returns a truthy value:
    P+=X             Append X to P.
         l >U        Return P.length > U.
                   This returns the first integer that can't fit into the U-char string.
1n                 Subtract 1 from the result.
                   Implicit: output result of last expression




4

ゼリー 11 10  9 バイト

RD;\L€<⁸S

正の整数を受け取り、非負の整数を返す単項リンク。

オンラインでお試しください!

どうやって?

編集...

RD;\L€<⁸S - link: number n
R         - range -> [1,2,...10,11,...,n-1]
 D        - convert to decimal (vectorises) -> [[1],[2],...,[1,0],[1,1],...D(n-1)]
   \      - cumulative reduce by:
  ;       -   concatenation -> prefixes i.e.: [[1],[1,2],...,[1,2,...,1,0],[1,2,...,1,0,1,1],[1,2,...,1,0,1,1,...Flattened(D(n))]]
    L€    - length of €ach -> [1,2,3,...,11,13,...,length([1,2,...,1,0,1,1,...Flattened(D(n))])]
       ⁸  - chain's left argument, n
      <   - less than? (vectorises)
        S - sum (yields the number of prefixes that are less than or equal in length to n)
          -   Note: `0` is excluded from the range and all the prefixes, but including
          -         it would mean comparing to n+1 AND decrementing at the end (for a
          -         total cost of a byte)

4

大好きです!比較としてスライスを使用するのは素晴らしいことです。
isaacg

@isaacg Pyth(on)の素晴らしいゴルフ機能の1つです。Neilの答え(スライスではなくインデックス付けですが、同じ考えです)を見たとき、私はそのアイデアを得ました。< num seqまた、非常に役に立ちました。
PurkkaKoodari

3

Perl 6、36バイト

{(0...^{([~] 0..$^a).comb>$_})[*-1]}

オンラインでお試しください!

  • 0 ...^ {...}0から中括弧内のコードブロックがtrueを返す数より1少ない数までの数字のシーケンスです。(...キャレットがないと、ブロックがtrueを返した最初の数値が返されます。)
  • [~] 0 .. $^aは、0現在の数値$^a(コードブロックのパラメーター)までの数値の連結です。
  • .comb連結文字列内のすべての文字(数字)のリストです。数値として解釈され、文字列の長さを評価します。 .chars文字列の長さを直接評価するため、ここで使用する方が自然ですが、名前は1文字長くなります。
  • $_ トップレベル関数の引数です。
  • [*-1] 生成されたリストの最後の要素を選択します。

2

QBIC、34バイト

{A=!p$~_lB+A|>:|_xp-1|\B=B+A]p=p+1

説明

{           DO infinitely
A=!p$       Set A$ to p cast to num
            Note that p starts out as 0.
~      >:   IF the input number is exceeded by
 _l   |     the length of
   B+A      A$ and B$ combined
_xp-1|      THEN QUIT, printing the last int successfully added to B$
            The _X operator quits, (possibly) printing something if followed by a-zA-Z
            _x is slightly different, it prints the expression between the operator _x and |
\B=B+A      ELSE add A$ to B$
]           END IF
p=p+1       Raise p, and rerun


2

J、26バイト

(>i:1:)([:+/\[:>.10^.1+i.)

((>i:1:)([:+/\[:>.10^.1+i.))"0 ] 5 11 12 1024 2000 20000 100000 1000000
4 9 10 377 702 5276 22221 185184




0

Java 8、64バイト

n->{int i=0;for(String t="0";;t+=++i)if(t.length()>n)return~-i;}

または、同じバイト数のわずかな代替:

n->{int i=0;for(String t="";;t+=i++)if(t.length()>n)return i-2;}
n->{int i=-1;for(String t="";;t+=++i)if(t.length()>n)return~-i;}

説明:

ここで試してみてください。

n->{                  // Method with integer as both parameter and return-type
  int i=0;            //  Integer `i`, starting at 0
  for(String t="0";   //  String, starting at "0"
      ;               //  Loop indefinitely
       t+=++i)        //    After every iteration: append the String with `i+1`
                      //    by first increasing `i` by 1 with `++i`
    if(t.length()>n)  //   If the length of the String is larger than the input:
      return~-i;      //    Return `i-1`
                      //  End of loop (implicit / single-line body)
}                     // End of method


0

ルビー、44バイト

Kevin CruijssenのJAVA回答に触発されました。G Bのおかげで-4バイト

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}

(I + = 1; T + = i.to_s)T + =と同じである"#{I + = 1}"、唯一の4バイトより長い
GB

あなたがそれを行うなら、あなたはn個のサイズを減算して、0と比較することができ、もう変数tを必要としない
GB

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