Где нули Шамперноун?

23

Рассмотрим бесконечную строку всех неотрицательных десятичных целых чисел, соединенных вместе по порядку (сродни константе Чампернау ):

0123456789101112131415161718192021222324252627282930...979899100101102103...

Напишите программу или функцию, которая принимает неотрицательное целое число, которое индексирует (на основе 0) в этой бесконечной строке. Выведите истинное значение, если индексированная цифра 0, в противном случае выведите ложное значение, если цифра 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

Престижность, если ваша программа эффективно использует память, но это не является обязательным требованием.

Кальвин Хобби
источник
9
oeis.org/A031287
Мартин Эндер
не лучше ли, чтобы эта программа или эта функция возвращали цифру этого массива из своего индекса [не только если это 0 или нет]?
РосЛюП
Связанный: Ряд натуральных чисел
Деннис
Я не могу понять, что этот вопрос вообще задает, лол, может кто-нибудь объяснить это
Шон Уайлд

Ответы:

12

Haskell, 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&
LegionMammal978
источник
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 чисел истинные значения.

Sp3000
источник
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
Suever
источник
4

Брахилог , 10 8 байт

2 байта благодаря Fatalize.

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 байта.
Fatalize
@Fatalize Сколько других операторов векторизовать?
Утренняя монахиня
Только #0, #1, #+, #_, #>и #<векторизовать как @eделает. Некоторые из предикатов, которые векторизуются, например , рекурсивно +или *не векторизуются до самого низкого уровня списка, и не выполняют одно и то же в зависимости от структуры входных данных.
Fatalize
4

Perl 6 , 26 25 байт

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

Лямбда, которая принимает число в качестве входных данных и возвращает Trueили False.

Память эффективная.

Как это работает

  1. 0..* - Построить диапазон от 0 до бесконечности.
  2. map(|*.comb, )- Лениво итерируйте диапазон, заменяя каждое число символами его строкового представления и возвращая новую ленивую последовательность. |Сохраняет новую последовательность выравнивают.
  3. [$_]- Взять элемент по индексу, определенному (неявно объявленным) лямбда-параметром $_.
  4. +- Приведите это к числу. (Этот шаг необходим, потому что принудительное приведение строки к логическому значению всегда дает True, если строка не пуста.)
  5. ! - Привести его к логическому значению и отрицать.

( попробуйте онлайн )

РЕДАКТИРОВАТЬ: -1 байт благодаря b2gills.

SMLS
источник
Вы можете сократить свой до того, как {!+map(|*.comb,0..*)[$_]}я придумал, {!+({|($++).comb}...*)[$_]}прежде чем посмотреть, был ли уже ответ P6. !+может быть заменен1>
Брэд Гилберт b2gills
4

Желе , 6 байт

RDF⁸ị¬

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

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 байт

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

Проверьте это на repl.it .

Как это работает

Для ввода п , '%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

TheBikingViking
источник
3

Pyth, 8 7 байтов

Спасибо @LeakyNun за -1 байт

!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
TheBikingViking
источник
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.

В основном цикле мы делаем следующее:

  • Найдите длину текущего числа путем floor_divating его на 10 несколько раз, пока он не достигнет 0, а затем посчитайте количество используемых делений.
  • Вместо того, чтобы хранить количество делений, вместо этого мы сохраняем 10 для этого числа.
  • Итерация по каждой цифре как такового: в 100ы цифра 1234получается , (1234/10)%10где /это разделение пола.
  • Для каждой сгенерированной цифры возьмите 1 со входа, проверяя, достиг ли вход нуля.
  • Если вход достигает нуля, убедитесь, что текущая цифра равна 0, а затем останавливается.
Дрянная Монахиня
источник
3

JavaScript (ES6), 45 байт + слава

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

Моя лучшая версия без Kudos была 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

CPU1
источник
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(','));

Arnauld
источник
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 
}
lealand
источник
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];

Вывести, 1если десятичное число аргумента Champernowne равно 0, иначе print '' (пустая строка).

крипто-
источник
1

Рубин, 35 23 байта

Это анонимная функция, которая объединяет [0..n], берет nиндекс th и проверяет, является ли этот символ "0"(меньше "1"). Предложения по игре в гольф приветствуются.

->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").
Sherlock9
источник
1

На самом деле, 9 8 байт

Этот ответ объединяет диапазон [0..n], берет nиндекс th и проверяет, есть ли этот символ "0". Предложения по игре в гольф приветствуются. Попробуйте онлайн!

;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.
Sherlock9
источник
1

Баш, 31 28 байт

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

Вывод не пустой (правдивый) или пустой (ложный). Проверьте это на Ideone .

Деннис
источник
1

R 61 61 байт

Спасибо @plannapus за 4 байта.

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

Создает вектор чисел 0: n (для индексации 0), создает их строку, извлекает n-е значение из строки (с учетом индексации 0). Преобразует в числовые и проверяет, если это 0.

user5957401
источник
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|
*/
RosLuP
источник
0

Javascript (ES5): 61 60 байт

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

Старый:

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, а yours ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) возвращает 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

зш, 31 байт

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

exit 0 верно в зш

izabera
источник
0

C #, 71 байт

И я подумал, что сначала он был коротким, но потом мне пришлось добавить, n+=11чтобы он не выбрасывал, System.IndexOutOfRangeExceptionкогда были введены числа ниже 11

return String.Join("",Enumerable.Range(0,n+=11).ToArray())[n]=='0'?1:0;
Даниил
источник