Di mana nol Champernowne?


23

Pertimbangkan string tak hingga dari semua bilangan desimal non negatif yang digabungkan bersama-sama secara berurutan (mirip dengan konstanta Champernowne ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Tulis program atau fungsi yang menggunakan bilangan bulat negatif yang mengindeks (berbasis-0) ke dalam string tak hingga ini. Output truthy nilai jika digit diindeks adalah 0, jika tidak output falsy nilai jika digit adalah 1-9.

Kode terpendek dalam byte menang.

25 input pertama yang menghasilkan kebenaran adalah:

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

Puji jika program Anda efisien memori, tetapi ini bukan keharusan.



bukankah lebih baik program atau fungsi itu mengembalikan digit array itu dari indeksnya [tidak hanya jika itu 0 atau tidak]?
RosLuP


Saya tidak mengerti apa yang ditanyakan oleh pertanyaan ini. Dapatkah seseorang menjelaskannya
Shaun Wild,

Jawaban:


12

Haskell, 25 byte

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

Contoh penggunaan: (<'1').((show=<<[0..])!!) 312->True


7

05AB1E , 5 byte

Kode:

ÝJ¹è_

Penjelasan:

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

Menggunakan pengkodean CP-1252 . Cobalah online!


7

Mathematica, 42 40 byte

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

Fungsi anonim. Mengambil angka sebagai input dan mengembalikan salah satu Trueatau Falsesebagai output. Solusi (?) Yang lebih lama, namun lebih efisien:

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

5

CJam, 9 byte

{_),s=~!}

Ini adalah blok tanpa nama (fungsi) yang mengambil bilangan bulat dan mengembalikan 0 atau 1 sesuai.

Penjelasan:

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

Penerjemah online . Perhatikan bahwa ~mengevaluasi blok. Alternatif, Anda dapat menjalankan suite tes ini yang digunakan ,untuk memfilter 1000 angka pertama untuk nilai-nilai kebenaran.


4

MATL, 11 byte

Qt:qVXzw)U~

Cobalah secara Online!

Penjelasan :

    % 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 berkat Fatalize.

y@ec:?m0

Cobalah online!

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.

@evectorizes jadi y@ec:?m0berfungsi, untuk menyimpan 2 byte.
Fatalkan

@Fatalize Berapa operator lain yang membuat vektor?
Leaky Nun

Hanya #0, #1, #+, #_, #>dan #<vectorize seperti @etidak. Beberapa predikat yang membuat vektorisasi seperti +atau *tidak membuat vektorisasi secara rekursif ke level daftar terendah, dan tidak melakukan hal yang sama tergantung pada struktur input.
Fatalkan

4

Perl 6 , 26 25 byte

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

Lambda yang mengambil nomor sebagai input dan mengembalikan a Trueatau False.

Hemat memori.

Bagaimana itu bekerja

  1. 0..* - Bangun kisaran dari 0 hingga tak terbatas.
  2. map(|*.comb, )- Lazily iterate range, mengganti setiap angka dengan karakter dari representasi string, dan mengembalikan urutan malas baru. The |membuat urutan baru diratakan.
  3. [$_]- Ambil elemen pada indeks yang ditentukan oleh parameter lambda (dinyatakan secara implisit) $_.
  4. +- Paksa ke nomor. (Langkah ini diperlukan karena memaksa string secara langsung ke boolean selalu memberikan True kecuali string tersebut kosong.)
  5. ! - Memaksa ke boolean dan meniadakannya.

( coba online )

EDIT: -1 byte berkat b2gills.


Anda dapat mempersingkat milik Anda sebelum {!+map(|*.comb,0..*)[$_]}saya menemukan {!+({|($++).comb}...*)[$_]}sebelum melihat apakah sudah ada jawaban P6. !+dapat digantikan oleh1>
Brad Gilbert b2gills

4

Jelly , 6 byte

RDF⁸ị¬

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

RDF⁸ị¬  Main link. Argument: n

R       Range; yield [1, ..., n].
 D      Decimal; convert all integers in that range to base 10 arrays.
  F     Flatten the result.
   ⁸ị   Extract the digit at index n (1-based).
        This returns 0 if the array is empty (n = 0).
     ¬  Logical NOT; return 1 if the digit is 0, 0 if not.

4

Python 3.5, 40 byte

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

Mengujinya pada repl.it .

Bagaimana itu bekerja

Untuk input n , '%d'*-~nulangi format string n + 1 kali.

(*range(n),n)membuka kemasan kisaran [0, ..., n - 1] dan menghasilkan tupel (0, ..., n) .

...%...mengganti setiap kemunculan % d dengan bilangan bulat yang sesuai dalam kisaran, menghasilkan string 01234567891011 ... n .

(...)[n]<'1'memilih karakter pada indeks n dan menguji jika kurang dari karakter 1 .


3

Python 3, 44 byte

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

Fungsi anonim yang mengambil input melalui argumen dan mengembalikan Trueatau yang Falsesesuai.

Bagaimana itu bekerja

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

Cobalah di Ideone


3

Pyth, 8 7 byte

Terima kasih kepada @LeakyNun untuk -1 byte

!s@jkUh

Ini adalah upaya pertama saya bermain golf di Pyth.

Program lengkap yang mencetak Trueatau Falsesesuai kebutuhan.

Cobalah online

25 input jujur ​​yang pertama

Bagaimana itu bekerja

!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

Cobalah online!

Hanya menggunakan 5 bilangan bulat, efisiensi memori maksimum \ o /

Penjelasan

Kami menghasilkan digit sebanyak input dalam konstanta Champernowne.

Dalam loop utama, kami melakukan hal berikut:

  • Temukan panjang angka saat ini dengan floor_dividing dengan 10 berulang kali hingga mencapai 0, dan kemudian hitung jumlah divisi yang digunakan.
  • Alih-alih menyimpan jumlah divisi, kami menyimpan 10 pangkat angka itu saja.
  • Iterasi melalui setiap digit dengan demikian: 100digit s 1234diperoleh dengan di (1234/10)%10mana /pembagian lantai.
  • Untuk setiap digit yang dihasilkan, ambil 1 dari input, sambil memeriksa apakah input mencapai nol.
  • Jika input mencapai nol, periksa apakah digit saat ini adalah 0 dan kemudian berhenti.

3

JavaScript (ES6), 45 byte + pujian

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

Versi non-Kudos terbaik saya adalah 34 byte:

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

1
Saya pikir pujian adalah perpustakaan sampai saya menyadari ada pujian pada tantangan: 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]

Contoh:

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

Tidak ada yang mewah, tetapi saya mencoba beberapa hal baru.

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

Termasuk +1 untuk -p

Jalankan dengan input pada STDIN:

zero.pl <<< 31

cetak 1 untuk nol, tidak ada yang sebaliknya

zero.pl

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

1

PHP, 36 byte

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

Cetak 1jika argumen Champernowne-desimal adalah 0, kalau tidak cetak '' (string kosong).


1

Ruby, 35 23 byte

Ini adalah fungsi anonim yang menggabungkan [0..n], mengambil nindeks th dan memeriksa apakah karakter itu "0"(kurang dari "1"). Saran bermain golf diterima.

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

Tidak melakukanolf

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

Sebenarnya, 9 8 byte

Jawaban ini merangkum kisaran [0..n], mengambil nindeks th dan memeriksa apakah karakter itu "0". Saran bermain golf diterima. Cobalah online!

;urεjE≈Y

Tidak melakukanolf

;          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

Outputnya tidak kosong (benar) atau kosong (salah). Uji di Ideone .



1

R, 61 57 byte

Berkat @plannapus untuk 4 byte.

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

Membuat vektor angka 0: n (untuk pengindeksan 0), membuat string, menarik nilai ke-n dari string (menyesuaikan untuk pengindeksan 0). Mengonversi ke numerik dan menguji apakah itu 0.


0

GolfScript, 12 byte

~.),""*\=48=

Penjelasan:

~             Evaluate the input.
 .            Duplicate it
  )           Increment the duplicate.
   ,          Create an array from 0 to it.
    ""*       Join it with an empty string.
       \=     Get the n-th index of this string, where n is the input
         48=  Is it equal to 0?

Cobalah online atau verifikasi semua test case!


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

fungsi yang menghitung nilainya adalah f (n, 0,0,0) di mana n adalah indeks input. dapat menghitung dari indeks yang berubah "kembali! c" di "kembali c" nilai array dalam indeks itu ... saya tidak mengerti bagaimana tetapi tampaknya berfungsi ok ....

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

Tidak Disatukan:

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

Tua:

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

Tua tidak serigala:

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
}

Bagaimana kalau !s[n]bukan s[n]==0?
Conor O'Brien

@ ConorO'Brien Tidak berfungsi untuk saya. Fungsi saya mengembalikan a (31) = true, sedangkan Anda ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) mengembalikan a (31) = false.
Paul Schmitz

hm kesalahanku.
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 benar di zsh


0

C #, 71 byte

Dan saya pikir itu pendek pada awalnya, tetapi kemudian saya harus menambahkan n+=11untuk mencegahnya melempar System.IndexOutOfRangeExceptionketika angka di bawah 11 adalah input

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.