Champernowne의 0은 어디에 있습니까?


23

음이 아닌 모든 10 진 정수의 무한 문자열을 순서대로 연결하는 것을 고려하십시오 ( Champernowne 상수에 해당 ).

0123456789101112131415161718192021222324252627282930...979899100101102103...

이 무한 문자열에 색인 (0부터 시작)이 아닌 음이 아닌 정수를 사용하는 프로그램 또는 함수를 작성하십시오. A 출력 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

프로그램이 메모리 효율적이라면이 방법이 필요하지만 필수 사항은 아닙니다.



프로그램이나 함수가 인덱스에서 해당 배열의 숫자를 반환하는 것이 낫지 않습니까?
RosLuP


나는 그것을 설명이 질문은 모든 롤 캔 누군가에 요구하고 무엇을 이해할 수 없다
숀 와일드

답변:


12

하스켈, 25 바이트

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

사용 예 : (<'1').((show=<<[0..])!!) 312->True


7

05AB1E , 5 바이트

암호:

ÝJ¹è_

설명:

Ý      # Get the list [0 .. input].
 J     # Join the list.
  ¹    # Get the first input again.
   è   # Get the character on that index.
    _  # Logical negate (0 -> 1, everything else -> 0).

CP-1252 인코딩을 사용합니다 . 온라인으로 사용해보십시오!


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

Brachylog , 10 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.

@ey@ec:?m02 바이트를 절약하기 위해 그렇게 작동합니다.
Fatalize

@Fatalize 얼마나 많은 다른 연산자가 벡터화합니까?
Leaky Nun

#0, #1, #+, #_, #>#<벡터화 같이 @e한다. 벡터화 +하거나 표시 *하지 않는 일부 술어는 재귀 적으로 가장 낮은 목록 레벨로 벡터화하고 입력 구조에 따라 동일한 기능을 수행하지 않습니다.
Fatalize

4

펄 6 , 26 25 바이트

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

입력으로 번호를 받아 반환 람다 True또는False .

메모리 효율적입니다.

작동 원리

  1. 0..* – 0에서 무한대의 범위를 구성하십시오.
  2. map(|*.comb, )– 범위를 느리게 반복하여 각 숫자를 문자열 표현의 문자로 바꾸고 새로운 지연 시퀀스를 반환합니다. 는 |새로운 시퀀스를 평평하게 유지합니다.
  3. [$_]– (암시 적으로 선언 된) lambda 매개 변수로 정의 된 색인에서 요소를 가져옵니다 $_.
  4. +– 숫자로 강제 변환하십시오. (이 단계는 문자열을 부울에 직접 강제 변환하면 문자열이 비어 있지 않으면 항상 True를 제공하므로 필요합니다.)
  5. ! – 그것을 부울로 강제하고 부정하십시오.

( 온라인 시도 )

편집 : b2gills 덕분에 -1 바이트.


이미 P6 답변이 있는지 확인하기 전에 {!+map(|*.comb,0..*)[$_]}내가 생각해 낸 것을 단축 할 수 있습니다 {!+({|($++).comb}...*)[$_]}. !+다음으로 대체 가능1>
Brad Gilbert b2gills


4

파이썬 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

파이썬 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을 그 수만큼 저장합니다.
  • 예컨대 각 디지트를 반복 처리 다음 100의 숫자는 S 1234에 의해 얻어진다 (1234/10)%10여기서 /바닥 분할된다.
  • 생성 된 각 숫자에 대해 입력에서 1을 가져오고 입력이 0에 도달했는지 확인하십시오.
  • 입력이 0에 도달하면 현재 숫자가 0인지 확인한 다음 정지합니다.

3

자바 스크립트 (ES6), 45 바이트 + Kudos

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
도전에 대한 찬사가 있다는 것을 깨달을 때까지 나는 kudos가 도서관이라고 생각했다. : P
Conor O'Brien

1

자바 스크립트 (ES6), 47 바이트

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


1

자바 스크립트 (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

그루비, 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

펄, 24 바이트

에 +1 포함 -p

STDIN의 입력으로 실행 :

zero.pl <<< 31

0으로 1을 인쇄하고 그렇지 않으면 아무것도 인쇄하지 않습니다

zero.pl

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

1

PHP, 36 바이트

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

인쇄 1Champernowne 인수 번째 소수 인 경우 0, 다른 인쇄 ''(빈 문자열).


1

루비, 35 23 바이트

이 함수는를 연결 [0..n]하고 n인덱스를 가져와 해당 문자가 "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 바이트

이 대답은 범위를 연결하고 th 인덱스를 [0..n]취하여 n해당 문자가 있는지 확인합니다 "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

배쉬, 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

자바 스크립트 (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를 반환합니다.
Paul Schmitz

흠. 내 실수.
Conor O'Brien

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

zsh, 31 바이트

exit ${${(j..):-{0..$1}}[$1+1]}

exit 0 zsh에서 사실입니다


0

C #, 71 바이트

처음에는 짧았다 고 생각했지만 11 미만의 숫자가 입력되었을 때 시간 이 걸리지 n+=11않도록 추가 해야했습니다.System.IndexOutOfRangeException

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.