シャンペルノーンのゼロはどこにありますか?


23

順番に連結されたすべての非負の10進整数の無限ストリングを考えます(チャンペルノーンの定数に似ています):

0123456789101112131415161718192021222324252627282930...979899100101102103...

この無限の文字列にインデックスを付ける(0から始まる)非負の整数を取り込むプログラムまたは関数を作成します。出力truthyの桁がインデックス付け場合、値は0であり、そうでなければ出力falsy値桁が1-9である場合。

バイト単位の最短コードが優先されます。

最初の25の真実を生成する入力は次のとおりです。

0
11
31
51
71
91
111
131
151
171
191
192
194
197
200
203
206
209
212
215
218
222
252
282
312

プログラムのメモリ効率が良い場合は称賛に値しますが、これは要件ではありません。



プログラムまたはその関数がインデックスからその配列の数字を返すのは、それが[それが0であるかどうかだけでなく]良くありませんか?
RosLuP


私はこの質問が何を求めているのか理解できません誰かがそれを説明できますか?
ショーンワイルド

回答:


12

Haskell、25バイト

(<'1').((show=<<[0..])!!)

使用例:(<'1').((show=<<[0..])!!) 312->True



7

Mathematica、42 40バイト

(0@@Join@@IntegerDigits@Range@#)[[#]]<1&

匿名関数。入力として数値を受け取り、出力TrueまたはFalse出力として返します。より長く、さらに効率的な(?)ソリューション:

RealDigits[ChampernowneNumber[],10,1,-#][[1,1]]<1&

5

CJam、9バイト

{_),s=~!}

これは、整数を受け取り、それに応じて0または1を返す名前のないブロック(関数)です。

説明:

{       }        Defines a block
 _               Copy input n
  ),             Increment n and take range
    s            Convert to string - for a list of numbers this concatenates
                 the digits
     =           Index, getting nth digit
      ~          Evaluate the digit character into a number
       !         Logical negation

オンライン通訳~ブロックを評価することに注意してください。別の方法として、最初の1000個の数値をフィルタリングして真理値を求めるこのテストスイートを実行でき,ます。


4

MATL、11バイト

Qt:qVXzw)U~

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

説明

    % Implicitly grab input as an integer (N)
Qt  % Add 1 and duplicate
:q  % Create an array from [0 ... N]
V   % Convert each entry to a string (places spaces between each number)
Xz  % Remove all whitespace
w)  % Get the N+1 element of the string (since MATL uses 1-based indexing natively)
U~  % Convert the result back to a number and negate which yields TRUE if it was '0' and
    % FALSE otherwise

4

Brachylog10 8バイト

Fatalizeのおかげで2バイト。

y@ec:?m0

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

y@ec:?m0

y         range from 0 to Input, inclusive,
 @e       the digits of every number in that range,
   c      concatenated
    :?m   the Input-th digit
       0  is zero.

@eベクトル化するのでy@ec:?m0、2バイトを節約できます。
16

@Fatalize他にいくつの演算子がベクトル化されますか?
リーキー修道女

のみ#0#1#+#_#>#<のようにベクトル化@eしません。最下位のリストレベルに再帰的にベクトル化する、+または*ベクトル化しない述語の一部は、入力の構造に応じて同じことを実行しません。
16

4

Perl 6の26の 25バイト

{!+map(|*.comb,0..*)[$_]}

入力として数値を取り、Trueor を返すラムダFalse

メモリ効率。

使い方

  1. 0..* – 0から無限の範囲を構築します。
  2. map(|*.comb, )–範囲を遅延反復し、各数値をその文字列表現の文字で置き換え、新しい遅延シーケンスを返します。|新しいシーケンスを平らに保ちます。
  3. [$_]–(暗黙的に宣言された)lambdaパラメーターで定義されたインデックスの要素を取得します$_
  4. +–数値に強制します。(文字列がブール値に直接強制されると、文字列が空でない限り常にTrueが得られるため、この手順が必要です。)
  5. ! –ブール値に強制し、否定します。

オンラインで試してみてください

編集:b2gillsのおかげで-1バイト。


P6の回答が既にあるかどうかを確認{!+map(|*.comb,0..*)[$_]}する{!+({|($++).comb}...*)[$_]}前に、私が思いついたものに短縮できます。!+に置き換えることができます1>
ブラッドギルバートb2gills


4

Python 3.5、40バイト

lambda n:('%d'*-~n%(*range(n),n))[n]<'1'

repl.itでテストします

使い方

入力nに対して'%d'*-~nフォーマット文字列n + 1回を繰り返します。

(*range(n),n)範囲[0、...、n-1]をアンパックし、タプル(0、...、n)を生成します。

...%...%dの各オカレンスを範囲内の対応する整数で置き換え、ストリング01234567891011 ... nを生成します。

(...)[n]<'1'インデックスnの文字を選択し、文字1より小さいかどうかをテストします。


3

Python 3、44バイト

lambda n:''.join(map(str,range(n+1)))[n]<'1'

引数を介して入力を受け取り、必要に応じて、TrueまたはFalseを返す匿名関数。

使い方

lambda n      Anonymous function with input n
range(n+1)    Yield the range [0, n]...
map(str,...)  ...convert all elements to string...
''.join(..)   ...concatenate...
...[n]        ...yield nth character...
:...<'1'      ...return True if int(character)==0 else return False

Ideoneでお試しください


3

Pyth、8 7バイト

-1バイトの@LeakyNunに感謝

!s@jkUh

これが、Pythでのゴルフの最初の試みです。

印刷TrueまたはFalse適切な完全なプログラム。

オンラインで試す

最初の25の真実の入力

使い方

!s@jkUh    Program. Input: Q
      hQ   Head. Yield Q+1
     U     Unary range. Yield [0, Q]
   jk      Join. Join on empty string
  @     Q  Index. Yield string[Q]
 s         Integer. Convert to integer
!          Logical negation. 0 -> True, all other digits -> False
           Print. Print result implicitly

3

SILOS、141バイト

readIO
i+1
lblL
c=C
p=1
lblc
p*10
c/10
if c c
p/10
lbln
m=C
m/p
m%10
p/10
i-1
if i C
GOTO H
lblC
if p n
C+1
GOTO L
lblH
m/m
m-1
m|
printInt m

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

5つの整数のみを使用し、最大メモリ効率\ o /

説明

Champernowneの定数の入力と同じ数の数字を生成します。

メインループでは、次のことを行います。

  • 0に達するまでfloor_divを10で繰り返して現在の数の長さを見つけ、使用されている分割数をカウントします。
  • 分割数を保存する代わりに、10をその数の累乗で保存します。
  • 各桁をそのように繰り返します。s 100の桁1234は、(1234/10)%10where によって得られ/ます。
  • 生成された数字ごとに、入力から1を取得し、入力がゼロに達したかどうかを確認します。
  • 入力がゼロに達した場合、現在の数字が0であるかどうかを確認してから停止します。

3

JavaScript(ES6)、45バイト+称賛

f=(n,s='0')=>s[n]?!+s[n]:f(n-s.length,-~s+'')

私の最高の非称賛バージョンは34バイトでした:

n=>!+(g=s=>s[n]||g(s+i++))('',i=0)

1
P:私は挑戦の名声があった実現するまで名声がライブラリだと思った
コナー・オブライエン

1

JavaScript(ES6)、47バイト

n=>[...Array(n+1)].reduce((a,_,i)=>a+i,'')[n]<1


1

Javascript(ES6)、42 33バイト

n=>!+(r=i=>i>n?'':i+r(i+1))(0)[n]

例:

let f =
n=>!+(r=i=>i>n?'':i+r(i+1))(0)[n]

// test all integers in [0, 312]
for(var n = 0, list = []; n <= 312; n++) {
  f(n) && list.push(n);
}
console.log(list.join(','));


1

Groovy、56バイト

def f(n){def s=''<<'';(0..n).each{s<<it};!(s[n] as int)}

特別なことは何もありませんが、私はいくつか新しいことを試しています。

def f(n) {
  def s = ''<<''           // declare a StringBuffer
  (0..n).each { s << it }
  !(s[n] as int)           // Groovy considers a non-null char truthy, so we have to cast 
}

1

Perl、24バイト

+1を含む -p

STDINの入力で実行:

zero.pl <<< 31

ゼロの場合は1を出力します。

zero.pl

$_=!(map/./g,0..$_)[$_]

1

PHP、36バイト

<?=!join(range(0,$a=$argv[1]))[$a];

1Champernowneの引数の10進数がの場合は印刷し、そうでない場合は0''(空の文字列)を印刷します。


1

ルビー、35 23バイト

これは、連結し[0..n]nthインデックスを取得し、そのcharが"0"(より小さい"1")かどうかをチェックする匿名関数です。ゴルフの提案を歓迎します。

->n{([*0..n]*'')[n]<?1}

アンゴルフ

->n{...}   # Create an anonymous function with parameter n.
[*0..n]    # Create an array of the range [0..n].
[...]*''   # Join the array using the empty string.
(...)[n]   # Take the char at the n-th index of the string.
<?1        # Check if the char is < "1" (that is, "0").

1

実際には、9 8バイト

この答えは範囲を連結して[0..n]nthインデックスを取って、そのcharがそうであるかどうかチェックします"0"。ゴルフの提案を歓迎します。オンラインでお試しください!

;urεjE≈Y

アンゴルフ

;          Duplicate n
 ur        Increment the duplicate and create range [0..n].
   εj      Join the range with an empty string. Stack: <string> n
     E     Take the char at the n-th index.
      ≈    int(a)
       Y   Logical NOT. If the digit is 0, then return 1, else return 0.

1

Bash、31 28バイト

seq -s "" 0 $1|egrep ^.{$1}0

出力は空ではない(真)または空(偽)です。Ideoneでテストします。



1

R、61 57バイト

4バイトの@plannapusに感謝します。

n=scan();strsplit(paste(0:n,collapse=""),"")[[1]][n+1]==0

番号0:n(0インデックス付け用)のベクトルを作成し、それらの文字列を作成し、文字列からn番目の値を引き出します(0インデックス付け用に調整)。数値に変換し、0かどうかをテストします。



0

C、154バイト

s(n,v,k,z){for(k=1;(z=n%10,n/=10)&&!v||k<v;++k); return v?z:k;}
f(n,i,j,c){for(i=0,j=0;;++i){c=s(i,0,0,0);j+=c;if(j>n){c=s(i,j-n,c,0);break;}}return !c;}

値を計算する関数はf(n、0,0,0)です。nは入力インデックスです。それは、「return c」の「return!c」を変更して、そのインデックスの配列の値を計算することができます...方法はわかりませんが、うまくいくようです...

main()
{int   i,r;
 char  a[]="0123456789101112131415161718192021222324252627282930313233343536";

 for(i=0; i<1000; ++i) 
    if(r=f(i,0,0,0))  
        printf("%u|",i);
}
/*
 154
 0|11|31|51|71|91|111|131|151|171|191|192|194|197|200|203|206|209|212|215|218|222
|252|282|312|342|372|402|432|462|491|492|494|497|500|503|506|509|512|515|518|522|552
|582|612|642|672|702|732|762|791|792|794|797|800|803|806|809|812|815|818|822|852
|882|912|942|972|
*/

0

Javascript(ES5):61 60バイト

function(b){for(s="";s.length<b;)s+=s.length;return 0==s[b]}

ゴルフをしていない:

function a(b){
  for(var s="";s.length<b;)
    s+=s.length;
  }
  return (s[b]==0);
}

古い:

function(n){s="";while(s.length<n)s+=s.length;return s[n]==0}

古いゴルフ:

function a(n){
  var str="";
  while(str.length<n)str+=str.length; //Create String as long as needed
  return str[n]==0 //Check for 0 and return
}

どの程度!s[n]の代わりにs[n]==0
コナーオブライエン

@ ConorO'Brienは私には機能しません。私の関数aはa(31)= trueをfunction(n){s="";while(s.length<n)s+=s.length;return !s[n]}返し、yours()はa(31)= falseを返します。
ポールシュミッツ

うん 私の間違い。
コナーオブライエン

0

CoffeeScript、56バイト

a=(b)->
 s=""
 while s.length<b #loop for building string with required length
  s+=s.length     #add number
 "0"==s[b]        #return, if the number at the position equals zero


0

C#、71バイト

最初は短いと思っていましたが、11未満の数字が入力されn+=11System.IndexOutOfRangeExceptionときにaがスローされないように追加する必要がありました

return String.Join("",Enumerable.Range(0,n+=11).ToArray())[n]=='0'?1:0;

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