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


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

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



не лучше ли, чтобы эта программа или эта функция возвращали цифру этого массива из своего индекса [не только если это 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&

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

Брахилог , 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.


Вы можете сократить свой до того, как {!+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


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

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

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 
}

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").

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.

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.



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

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

C #, 71 байт

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.