Де нулі Чамперновна?


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 чи ні]?
RosLuP


Я не можу зрозуміти, що це запитання взагалі задає, хай хтось може це пояснити
Shaun Wild

Відповіді:


12

Haskell, 25 байт

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

Приклад використання: (<'1').((show=<<[0..])!!) 312->True



7

Математика, 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 Скільки інших операторів векторизують?
Leaky Nun

Тільки #0, #1, #+, #_, #>і #<векторизовать як @eробить. Деякі предикати, які векторизують, наприклад, +або *не векторизують рекурсивно до найнижчого рівня списку, і не виконують те саме, що залежить від структури вхідних даних.
Фаталізувати

4

Perl 6 , 26 25 байт

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

Лямбда, яка приймає число в якості введення і повертає a Trueабо False.

Ефективна пам'ять.

Як це працює

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

( спробуйте в Інтернеті )

EDIT: -1 байт завдяки b2gills.


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


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

Це моя перша спроба гри в гольф у Піті.

Повна програма, яка друкує 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 /

Пояснення

Ми генеруємо стільки цифр, скільки вхід у константу Шамперновна.

У головному циклі робимо наступне:

  • Знайдіть довжину поточного числа, поділивши його на 10 раз, доки воно не досягне 0, а потім порахуйте кількість використаних поділів.
  • Замість того, щоб зберігати кількість підрозділів, ми замість цього зберігаємо 10 від цього числа.
  • Ітерайте через кожну цифру як таку: 100цифра s 1234отримується за (1234/10)%10місцем /поділу підлоги.
  • Для кожної згенерованих цифр візьміть 1 із вхідного сигналу, перевіряючи, чи досягнуто введення нуля.
  • Якщо вхід досягає нуля, перевірте, чи поточна цифра дорівнює 0, а потім зупиняється.

3

JavaScript (ES6), 45 байт + Kudos

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
Conor O'Brien

1

JavaScript (ES6), 47 байт

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


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, інакше друкуйте '' (порожній рядок).


1

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

Це анонімна функція, яка об'єднує [0..n], приймає nth-й індекс і перевіряє, чи є цей знак "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], приймає nth-й індекс і перевіряє, чи є це знаком "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 57 байт

Завдяки @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]}

Безголівки:

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?
Conor O'Brien

@ ConorO'Brien не працює для мене. Моя функція a повертає a (31) = true, тоді як ваша ( function(n){s="";while(s.length<n)s+=s.length;return !s[n]}) повертає a (31) = false.
Пол Шмітц

хм. моя помилка.
Conor O'Brien

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.