Champernowne'nin sıfırları nerede?


23

Birlikte sırayla birleştirilen tüm negatif olmayan ondalık tam sayıların sonsuz dizesini düşünün ( Champernowne sabitine benzer şekilde ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Bu sonsuz dizeye (0 tabanlı) dizin ekleyen olumsuz olmayan bir tamsayı alan bir program veya işlev yazın. Bir çıkış truthy basamaklı dizine, değer 0, aksi halde çıkış falsy değer basamaklı 1-9 ise.

Bayt cinsinden en kısa kod kazanır.

İlk 25 truthy üreten girdi:

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

Programınız bellek verimli ise, ancak bu bir gereklilik değildir.



Programın veya bu işlevin dizinin basamağını dizinden döndürmesi daha iyi değil mi?
RosLuP


Bu sorunun ne sorduğunu anlayamıyorum lol birileri açıklayabilir mi
Shaun Wild

Yanıtlar:


12

Haskell, 25 bayt

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

Kullanım örneği: (<'1').((show=<<[0..])!!) 312->True


7

05AB1E , 5 bayt

Kod:

ÝJ¹è_

Açıklama:

Ý      # 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 kodlamasını kullanır . Çevrimiçi deneyin!


7

Mathematica, 42 40 bayt

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

Anonim işlev Ya da giriş ve döner gibi bir dizi alır Trueya da Falseçıkış olarak. Daha uzun, ama daha verimli (?) Bir çözüm:

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

5

CJam, 9 bayt

{_),s=~!}

Bu bir tamsayı alan ve buna göre 0 veya 1 döndüren adsız bir bloktur (fonksiyon).

Açıklama:

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

Çevrimiçi tercüman . Not ~bir blok değerlendirir. Alternatif olarak, ilk 1000 sayıyı gerçeğe uygun değerler için filtrelemek için kullanılan bu test takımını çalıştırabilirsiniz ,.


4

MATL, 11 bayt

Qt:qVXzw)U~

Çevrimiçi Deneyin!

Açıklama :

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

Fatalize sayesinde 2 bayt.

y@ec:?m0

Çevrimiçi deneyin!

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 bayttan tasarruf etmek için çok çalışır.
Ağustos’u

@Fatalize Diğer kaç operatör vektörleştiriyor?
Sızdıran Rahibe,

Sadece #0, #1, #+, #_, #>ve #<vectorize gibi @eyapar. Mesela vektörleştiren +veya *tekrarlayan bir şekilde en düşük liste seviyesine vektörleştirmeyen ve giriş yapısının yapısına bağlı olarak aynı şeyi yapmayan tahminlerden bazıları .
16'da

4

Perl 6 , 26 25 bayt

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

Girdi olarak bir sayı alan ve a Trueveya döndüren bir lambda False.

Bellek koruyan.

Nasıl çalışır

  1. 0..* - 0'dan sonsuzluğa kadar olan aralığı oluşturun.
  2. map(|*.comb, )- Her sayıyı dize gösteriminin karakterleriyle değiştirerek ve yeni bir tembel diziyi döndürerek aralığı tembelce yineleyin. |Yeni dizisi düzleşmiş tutar.
  3. [$_]- Elemanı (dolaylı olarak bildirilmiş) lambda parametresi tarafından tanımlanan endekste alın $_.
  4. +- Bir sayıya zorla. (Bu adım gereklidir, çünkü bir dizgiyi doğrudan bir boole kodlamak zor, dizge boş olmadığı sürece her zaman True verir.)
  5. ! - Bir boole zorla ve aldırma.

( çevrimiçi deneyin )

EDIT: b2gills sayesinde -1 bayt.


İçin Sizse kısaltabilirsiniz {!+map(|*.comb,0..*)[$_]}ben ile geldi {!+({|($++).comb}...*)[$_]}zaten P6 cevap olmadığını görmek isteyen önce. !+değiştirilebilir1>
Brad Gilbert b2gills

4

Jöle , 6 bayt

RDF⁸ị¬

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

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 bayt

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

Test et Repl.it .

Nasıl çalışır

N girişi için , n + 1'%d'*-~n biçimindeki dizgiyi tekrar eder .

(*range(n),n)[0, ..., n - 1] aralığını açar ve dizgiyi verir (0, ..., n) .

...%...% d' nin her oluşumunu aralıktaki karşılık gelen tamsayı ile değiştirir, 01234567891011 ... n dizesini verir .

(...)[n]<'1'endeksine seçer karakterini n ve testler karakteri küçükse 1 .


3

Python 3, 44 bayt

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

Girdiyi argüman yoluyla alan ve döndüren Trueveya Falseuygun şekilde adlandırılan anonim bir işlev .

Nasıl çalışır

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'da dene


3

Pyth, 8 7 bayt

-1 bayt için @LeakyNun'a teşekkürler

!s@jkUh

Bu benim Pyth'ta golf oynamaya ilk girişimdi.

Yazdırır Trueveya Falseuygun bir tam program .

Çevrimiçi deneyin

İlk 25 truthy girişi

Nasıl çalışır

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

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

Çevrimiçi deneyin!

Yalnızca 5 tam sayı kullanır, maksimum bellek verimliliği \ o /

açıklama

Champernowne sabitindeki girdi kadar rakam üretiyoruz.

Ana döngüde aşağıdakileri yaparız:

  • Geçerli sayının tabanını, 0'a ulaşıncaya kadar art arda 10'a bölünerek ayırın ve ardından kullanılan bölüm sayısını sayın.
  • Bölüm sayısını depolamak yerine, bu sayı gücüne 10 depo koyarız.
  • Her basamaktan şöyle tekrarlayın: 100s basamağı kat bölümünün nerede olduğu 1234ile elde edilir .(1234/10)%10/
  • Üretilen her basamak için giriş sıfıra ulaşıp ulaşmadığını kontrol ederken girişten 1 alınız.
  • Giriş sıfıra ulaşırsa, geçerli basamağın 0 olup olmadığını kontrol edin ve sonra durur.

3

JavaScript (ES6), 45 bayt + Kudos

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

En iyi Kudos olmayan versiyonum 34 byte idi:

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

1
P: Ben meydan üzerinde şeref olduğunu fark edene kadar şeref kütüphane olduğunu düşündüm
Conor O'Brien

1

JavaScript (ES6), 47 bayt

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


1

Javascript (ES6), 42 33 bayt

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

Örnek:

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 bayt

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

Hiçbir şey fantezi, ama bazı yeni şeyler deniyorum.

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 bayt

İçin +1 içerir -p

STDIN'de giriş ile çalıştırın:

zero.pl <<< 31

1'i sıfır için yazdır

zero.pl

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

1

PHP, 36 bayt

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

Baskı 1Champernowne argümanı-inci ondalık ise 0, başka baskı '' (boş dize).


1

Ruby, 35 23 bayt

Bu, birleştiren [0..n], nth dizinini alan ve o char'in "0"(daha az "1") olup olmadığını kontrol eden anonim bir işlevdir . Golf önerileri kabul edilir.

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

Aslında 9 8 bayt

Bu cevap aralığı birleştirir, th indeksini [0..n]alır nve bu char olup olmadığını kontrol eder "0". Golf önerileri kabul edilir. Çevrimiçi deneyin!

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

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

Çıktı boş değil (truthy) veya boş (sahte). İdeone üzerinde test et .



1

R, 61 57 bayt

4 plan için @plannapus'a teşekkürler.

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

0: n sayısının bir vektörünü oluşturur (0 indeksleme için), bunlardan bir dize oluşturur, nth değerini dizeden çeker (0 indeksleme için ayarlama). Sayıya dönüştürür ve 0 ise test eder.



0

C, 154 bayt

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

değeri hesaplayan fonksiyon f (n, 0,0,0), burada n ise giriş indeksidir. Bu dizindeki değerin "return! c" yi değiştirerek "return c" deki dizinin değerini o dizindeki değerden hesaplayabilir ... nasıl anlamıyorum ama işe yarıyor gibi görünüyor.

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 bayt

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

Ungolfed:

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

Eski:

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

Ungolfed yaşlı:

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
}

Peki !s[n]yerine s[n]==0?
Conor O'Brien,

@ ConorO'Brien Benim için çalışmıyor. Benim fonksiyonum a (31) = true, siz ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) ise bir (31) = false döndürür.
Paul Schmitz

hm. benim hatam.
Conor O'Brien,

0

CoffeeScript, 56 bayt

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 bayt

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

exit 0 zsh de geçerlidir


0

C #, 71 bayt

İlk başta kısa olduğunu düşündüm, ama sonra 11'in altındaki rakamlar girildiği zaman n+=11atmasını önlemek için eklemek zorunda kaldımSystem.IndexOutOfRangeException

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.