Số 0 của Champernowne ở đâu?


23

Hãy xem xét chuỗi vô hạn của tất cả các số nguyên thập phân không âm được nối với nhau theo thứ tự (gần giống với hằng số Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Viết chương trình hoặc hàm lấy một số nguyên không âm mà lập chỉ mục (dựa trên 0) vào chuỗi vô hạn này. Sản lượng một truthy giá trị nếu các chữ số được lập chỉ mục là 0, nếu không ra một falsy giá trị nếu các chữ số là 1-9.

Mã ngắn nhất tính bằng byte thắng.

25 đầu vào sản xuất trung thực đầu tiên là:

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

Kudos nếu chương trình của bạn là bộ nhớ hiệu quả, nhưng đây không phải là một yêu cầu.



chương trình hoặc hàm đó trả về chữ số của mảng đó từ chỉ mục của nó không tốt hơn [không chỉ khi đó là 0 hay không]?
RosLuP


Tôi không thể hiểu câu hỏi này là gì, ai cũng có thể giải thích nó
Shaun Wild

Câu trả lời:


12

Haskell, 25 byte

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

Ví dụ sử dụng: (<'1').((show=<<[0..])!!) 312->True


7

05AB1E , 5 byte

Mã số:

ÝJ¹è_

Giải trình:

Ý      # 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).

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến!


7

Toán học, 42 40 byte

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

Chức năng ẩn danh. Lấy một số làm đầu vào và trả về Truehoặc Falselà đầu ra. Một giải pháp dài hơn nhưng hiệu quả hơn (?):

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

5

CJam, 9 byte

{_),s=~!}

Đây là một khối (hàm) chưa được đặt tên, lấy một số nguyên và trả về 0 hoặc 1 tương ứng.

Giải trình:

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

Phiên dịch trực tuyến . Lưu ý rằng ~đánh giá một khối. Thay vào đó, bạn có thể chạy bộ thử nghiệm này sử dụng ,để lọc 1000 số đầu tiên cho các giá trị trung thực.


4

MATL, 11 byte

Qt:qVXzw)U~

Hãy thử trực tuyến!

Giải thích :

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

2 byte nhờ Fatalize.

y@ec:?m0

Hãy thử trực tuyến!

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.

@evector hóa như vậy y@ec:?m0hoạt động, để tiết kiệm 2 byte.
Gây tử vong

@Firthize Có bao nhiêu toán tử khác vector hóa?
Nữ tu bị rò rỉ

Chỉ #0, #1, #+, #_, #>#<vectorize như @evậy. Một số vị từ mà vector hóa như +hoặc *không vector hóa đệ quy đến mức danh sách thấp nhất và không thực hiện điều tương tự tùy thuộc vào cấu trúc của đầu vào.
Gây tử vong

4

Perl 6 , 26 25 byte

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

Một lambda lấy một số làm đầu vào và trả về một Truehoặc False.

Bộ nhớ hiệu quả.

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

  1. 0..* - Xây dựng phạm vi từ 0 đến vô cùng.
  2. map(|*.comb, )- Nhanh chóng lặp lại phạm vi, thay thế mỗi số bằng các ký tự đại diện chuỗi của nó và trả về một chuỗi lười biếng mới. Việc |giữ cho chuỗi mới được làm phẳng.
  3. [$_]- Lấy phần tử tại chỉ mục được xác định bởi tham số lambda (được khai báo ngầm) $_.
  4. +- Ép buộc nó vào một số. (Bước này là cần thiết vì việc ép buộc một chuỗi trực tiếp vào boolean luôn cho True trừ khi chuỗi đó trống.)
  5. ! - Ép buộc nó vào một boolean và phủ nhận nó.

( thử trực tuyến )

EDIT: -1 byte nhờ b2gills.


Bạn có thể rút ngắn của bạn để {!+map(|*.comb,0..*)[$_]}tôi đến với {!+({|($++).comb}...*)[$_]}trước khi tìm kiếm để xem nếu có đã là một câu trả lời P6. !+có thể được thay thế bởi1>
Brad Gilbert b2gills


4

Python 3.5, 40 byte

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

Thử nghiệm nó trên repl.it .

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

Đối với đầu vào n , '%d'*-~nlặp lại chuỗi định dạng n + 1 lần.

(*range(n),n)giải nén phạm vi [0, ..., n - 1] và mang lại bộ dữ liệu (0, ..., n) .

...%...thay thế mỗi lần xuất hiện của % d bằng số nguyên tương ứng trong phạm vi, thu được chuỗi 01234567891011 ... n .

(...)[n]<'1'chọn ký tự ở chỉ số n và kiểm tra nếu nó nhỏ hơn ký tự 1 .


3

Python 3, 44 byte

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

Một hàm ẩn danh nhận đầu vào thông qua đối số và trả về Truehoặc Falsekhi thích hợp.

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

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

Hãy thử nó trên Ideone


3

Bình thường, 8 7 byte

Cảm ơn @LeakyNun cho -1 byte

!s@jkUh

Đây là nỗ lực đầu tiên của tôi khi chơi golf ở Pyth.

Một chương trình đầy đủ mà in Truehoặc Falsekhi thích hợp.

Dùng thử trực tuyến

25 đầu vào trung thực đầu tiên

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

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

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

Hãy thử trực tuyến!

Chỉ sử dụng 5 số nguyên, hiệu quả bộ nhớ tối đa \ o /

Giải trình

Chúng tôi tạo ra nhiều chữ số như đầu vào trong hằng số Champernowne.

Trong vòng lặp chính, chúng tôi làm như sau:

  • Tìm độ dài của số hiện tại bằng cách liên tục chia số cho 10 cho đến khi đạt 0, sau đó đếm số lần chia được sử dụng.
  • Thay vì lưu trữ số lượng các bộ phận, thay vào đó chúng tôi lưu trữ 10 đến số lượng đó.
  • Duyệt qua mỗi chữ số như vậy: các 100s chữ số của 1234thu được bằng cách (1234/10)%10nơi /là bộ phận sàn.
  • Đối với mỗi chữ số được tạo, lấy 1 từ đầu vào, trong khi kiểm tra xem đầu vào có bằng không.
  • Nếu đầu vào bằng 0, hãy kiểm tra xem chữ số hiện tại có bằng 0 không và sau đó dừng lại.

3

JavaScript (ES6), 45 byte + Kudos

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

Phiên bản không phải Kudos tốt nhất của tôi là 34 byte:

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

1
Tôi nghĩ rằng kudos là một thư viện cho đến khi tôi nhận ra có một danh hiệu về thử thách: P
Conor O'Brien

1

JavaScript (ES6), 47 byte

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


1

Javascript (ES6), 42 33 byte

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

Thí dụ:

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 byte

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

Không có gì lạ mắt, nhưng tôi đang thử một số điều mới.

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 byte

Bao gồm +1 cho -p

Chạy với đầu vào trên STDIN:

zero.pl <<< 31

in 1 cho số không, không có gì khác

zero.pl

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

1

PHP, 36 byte

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

In 1nếu số thập phân Champernowne-số thập phân là 0, in khác '' (chuỗi trống).


1

Ruby, 35 23 byte

Đây là một hàm ẩn danh nối [0..n], lấy nchỉ số thứ và kiểm tra xem char đó có "0"(nhỏ hơn "1") không. Gợi ý chơi golf chào mừng.

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

Ungolfing

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

Trên thực tế, 9 8 byte

Câu trả lời này nối các phạm vi [0..n], lấy nchỉ số thứ và kiểm tra xem char đó có phải không "0". Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

;urεjE≈Y

Ungolfing

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

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

Đầu ra không trống (trung thực) hoặc trống (giả). Kiểm tra nó trên Ideone .



1

R, 61 57 byte

Cảm ơn @plannapus cho 4 byte.

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

Tạo một vectơ các số 0: n (cho 0 lập chỉ mục), tạo một chuỗi của chúng, kéo giá trị thứ n từ chuỗi (điều chỉnh cho 0 lập chỉ mục). Chuyển đổi thành số và kiểm tra nếu nó bằng 0.



0

C, 154 byte

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

hàm tính giá trị là f (n, 0,0,0) trong đó n là chỉ số đầu vào. nó có thể tính toán từ thay đổi chỉ mục "return! c" trong "return c" giá trị của mảng trong chỉ mục đó ... tôi không hiểu làm thế nào nhưng có vẻ như nó hoạt động tốt ....

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 byte

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

Ung dung:

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

Cũ:

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

Không già

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
}

Làm thế nào về !s[n]thay vì s[n]==0?
Conor O'Brien

@ ConorO'Brien Không làm việc cho tôi. Hàm của tôi a trả về a (31) = true, trong khi của bạn ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) trả về a (31) = false.
Paul Schmitz

hm lỗi của tôi.
Conor O'Brien

0

CoffeeScript, 56 byte

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 byte

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

exit 0 là đúng trong zsh


0

C #, 71 byte

Và tôi nghĩ lúc đầu nó ngắn, nhưng sau đó tôi phải thêm n+=11vào để ngăn nó ném System.IndexOutOfRangeExceptionkhi số dưới 11 được nhập vào

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

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.