Найти число в константе Champernowne


35

Введение

В базе 10 константа Champernowne определяется путем конкатенации представлений последовательных целых чисел. В базе 10: 0.1234567891011121314151617...и так далее.

Вы можете видеть, что первое появление 15начинается с 20thдесятичной дроби:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
                     ^
0.1234567891011121314151617181920212223242526272829303132333435363738...
                     ^^
                     15 = position 20

Первое появление 45начинается с 4thдесятичной дроби:

  Position
  0000000001111111111222222222233333333334444444444555555555566666666
  1234567890123456789012345678901234567890123456789012345678901234567
     ^               
0.1234567891011121314151617181920212223242526272829303132333435363738...
     ^^
     45 = position 4

Итак, задача проста. Если задано неотрицательное целое число, выведите целое число в константу Champernowne.

правила

  • Вы можете предоставить функцию или программу
  • Это , поэтому выигрывает представление с наименьшим количеством байтов!

Контрольные примеры

Input: 20
Output: 30

Input: 333
Output: 56

Input: 0
Output: 11 (note that the 0 before the decimal point is ignored)

Input: 2930
Output: 48

На какую самую высокую должность нам нужно работать? Например, будет ли когда-либо число 987654321123456877654234354675.
Морган Трепп

@MorganThrapp Я, вероятно, протестирую целые числа в диапазоне 0 <= x <= 99, но теоретически это должно работать для целых чисел выше, чем 99.
Аднан

Ответы:


8

Пиф, 10

hxjkS+QT`Q

Объединяет первые input + 10числа, а затем находит индекс на основе 0 плюс один. Дополнительные десять нужны только для 0.

Тестирование


Я думаю, что неявный ввод был реализован раньше 2015-12-17 15:01:23Zили что-то?
Эрик Outgolfer

@EriktheOutgolfer Это было добавлено в 2016 году: github.com/isaacg1/pyth/commit/…
FryAmTheEggman

10

LabVIEW, 29 примитивов LabVIEW

Это использует строки на данный момент. Он сопоставляет входные данные в виде шаблона и выводит смещение - (входная длина -1).


6

Javascript, 57 байт

a=prompt();for(y=b=" ";y<a+11;)b+=++y;alert(b.indexOf(a))

Сохранено 1 байт благодаря Конору О'Брайену.


Я думаю, что вы можете переместить y=часть в y=b=" "; увеличение пробела похоже на увеличение нуля. ( a=prompt(y=b=" ");...)
Конор О'Брайен

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Хорошая находка.
SuperJedi224

4

Haskell, 62 байта

a#b|and$zipWith(==)a b=1|1<2=1+a#tail b 
(#(show=<<[1..])).show

Пример использования: (#(show=<<[1..])).show $ 2930-> 48.

Как это работает: a # bнаходит позицию aвнутри b: если aэто префикс bвозврата 1, иначе добавить 1к рекурсивному вызову с a # tail b. Функция pointfree (#(show=<<[1..])).showожидает (неназванный) аргумент nи вызывает show n # show=<<[1..].

Функция subIndexтакже выполняет свою работу #, но требуемая import Data.List.Utilsне окупается.


Я не думаю, что вам нужен.show
Волшебник Пшеницы


4

Руби, 28

->n{[*0..n+10]*''=~/\B#{n}/}

Включает 0 в начале, так что совпадения индексируются 1, но используется \Bдля требования, чтобы совпадение не было в начале строки.


4

Japt, 11 байт

Первоначально это было избиение Pyth, но, очевидно, это не сработало для ввода 0.

1+1oU+B ¬bU

Попробуйте онлайн!

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

1+1oU+B ¬ bU
1+1oU+B q bU  // Implicit: U = input integer
  1oU+B       // Generate the range [0, U+11).
        q bU  // Join and take the index of U.
1+            // Add one to get the correct result.
              // Implicit: output last expression

Почему ваш раздел "Как это работает" содержит qв коде символ, а не символ логического отрицания ¬?
Роковая

@Fatalize ¬является ярлыком для (это qсо следующим пробелом). Это часто приводит к путанице, поэтому я выровнял более короткую версию с полной.
ETHproductions

3

Луа, 54 байта

s=""for i=1,1e4 do s=s..i end print(s:find(io.read()))

Примечание. В настоящее время эта программа печатает как первое вхождение первого символа строки, так и точку, где она заканчивается. Если это не разрешено, это будет стоить еще несколько байтов. Я хотел бы подать ходатайство о бонусе, потому что моя программа распечатывает как первую, так и последнюю позицию введенного номера.


1
Вы имеете в виду начальные и конечные индексы для первого появления числа? Потому что теоретически число будет там бесконечное количество раз.
Rɪᴋᴇʀ

Да, начало и конец для первого вхождения.
Nikolai97

3

MATL , 22 байта

it10+:Yst' '=~)wYsXf1)

Возьмите input ( i), сделайте вектор 1 для input + 10 ( 10+:), преобразуйте вектор в строку ( Ys) и удалите пробелы, что больно, ( t' '=~)). Затем преобразуйте входные данные в строку ( Ys), найдите, где входная строка находится в строке чисел ( Xf), и возьмите первое местоположение ( 1)). t«S и w» s манипулируют стек (дублировать и своп, соответственно).


3

PowerShell, 39 44 байта

[Правка: мое предположение не выполняется, построение массива из 1-0 не находит 0 в месте 11. Вместо этого, сборка из 1-x + 10 также обрабатывает 0, теперь 44 байта]

param($i)(1..($i+10)-join'').IndexOf("$i")+1

Вы всегда найдете x при построении строки константы Champernowne в самый последний момент, когда вы добавите x в конец, поэтому в массиве из 1-x всегда будет ответ. Возникает вопрос: "Это произойдет раньше, чем это?" , Этот код

param($i)(1..$i-join'').IndexOf("$i")+1

e.g.

PS C:\Temp> .\Champer.ps1 20
30

генерирует диапазон чисел, преобразует его в строку и ищет параметр внутри нее. Поскольку PowerShell - это объектно-ориентированная оболочка, параметр на самом деле является [int]типом, поэтому попытка сохранить два символа с помощью .IndexOf($i)будет искать в строке целое число и ничего не найти. Вот почему я использую интерполяцию строк "$i".


1
Умный способ сделать это. Разочарование, которое, .IndexOf()очевидно, имеет более высокие операционные предпочтения, чем унарное -joinфорсирование паренов и кавычек. : - /
AdmBorkBork

3

MATL (выпуск 1.0.1), 22 байта

iXK10+:"@Ys]N$hKYsXf1)

пример

>> matl iXK10+:"@Ys]N$hKYsXf1)
> 333
56

объяснение

i       % Input
XK      % Copy to clipboard K            
10+     % Add 10. This is needed in case input is 0
:       % Vector of equally spaced values, starting from 1
"       % For each
  @Ys   %   For loop variable as a string
]       % End                            
N$h     % Horizontal concatenation of all stack contents
KYs     % Paste from clipboard K (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

MATL (выпуск 20.8.0), 16 байт (языковой выпуск заданий)

Благодарим @Giuseppe за эту версию программы (слегка измененную)

10+:"@V]&hGVXf1)

Попробуйте онлайн!

объяснение

10+     % Implicit Input. Add 10. This is needed in case input is 0 
:       % Vector of equally spaced values, starting from 1
"       % For each
  @V    %   For loop variable as a string 
]       % End
&h      % Horizontal concatenation of all stack contents
GV      % Paste from automatic clipboard G (input number) and convert to string
Xf      % Find one string within another 
1)      % First value

Я не думаю, что это обрабатывает 0 :(
Дэвид

@ Давид Теперь так и есть. Спасибо, что заметили! Это стоит всего 3 байта :-)
Luis Mendo

теперь, когда этот буфер обмена Gсодержит входные данные (и неявные входные данные), я думаю, этот ответ может быть значительно сокращен, и Ysв Vлюбом случае все это необходимо изменить ; Я придумал 10+:"@Vv]!GVXf1)для 16 байтов.
Джузеппе

@Giuseppe Спасибо за хедз-ап! Обновленный, с должным доверием (и с примечанием "языковой постдатский вызов"; я не большой поклонник нового правила )
Луис Мендо

Я не против этого правила ( хотя флаги меня сводят с ума); Я в основном комментировал здесь, так как заметил, что Ysнужно перейти на Vиспользование в самой современной версии интерпретатора. Я всегда впечатлен тем, насколько улучшился язык!
Джузеппе

2

PowerShell, 54 50 байт

for($c='';!($x=$c.IndexOf("$args")+1)){$c+=++$i}$x

Спасибо TessellatingHeckler за идею замены whileцикла на forцикл.

Выполняется через forцикл. Как и в других языках, первый оператор в цикле может создавать переменные и присваивания, поэтому он начинается с $cравного только пустой строке, ''так что мы получаем нулевое индексирование строки, совпадающее с десятичным индексированием задачи. Затем мы находимся в цикле, который проверяет, $cесть ли $argsгде-нибудь внутри него входное целое число ( ) (т. Е. Поскольку .IndexOf()возвращается, -1если строка не найдена, мы добавляем единицу к этому ( 0), а не к нему ( $TRUE), чтобы продолжить цикл). Если он не найден, мы добавляем нашу предварительно увеличенную $iпеременную - счетчик, а затем перепроверяем строку. Как только строка найдена, .IndexOf()будет возвращено положительное значение, не из которого будет$FALSEвырвавшись из петли. Наконец, мы выводим индекс с $x.


Идеально подходит для классического forцикла ... for($c='.';($x=$c.IndexOf("$args"))-lt0;$c+=++$i){}$xи сохранить 1 символ. Поскольку большинство вызовов IndexOf будут возвращать -1, добавьте один к нему и используйте логическое значение! брось, для более короткого теста. Но вам нужны парены, чтобы сделать это. Пустые $ c и +1 внутри существующих паренов, бонус короче.for($c='';!($x=$c.IndexOf("$args")+1);$c+=++$i){}$x51 байт. (но я опубликовал свой 39-байтовый ответ как собственный ответ, потому что это совершенно другой подход: P).
TessellatingHeckler

1
@TessellatingHeckler Хороший способ переписать цикл - спасибо! Я перенес $cконкатенацию в петлю, чтобы поставить точку с запятой в гольф. Сейчас на 50.
AdmBorkBork

2

JavaScript (ES6), 40 байт

x=>(f=n=>n?f(n-1)+n:" ")(x+11).search(x)

Использует рекурсивную функцию, fчтобы избежать циклов. Метод поиска работает так же, indexOfза исключением того, что он принимает RegExp в качестве параметра, что не имеет значения для этой задачи.

Добавление " " для n=0случая (ноль - ложь в JS) заставляет +выполнять конкатенацию строк вместо сложения и корректирует индексирование на основе нуля.




1

Серьезно, 13 байтов

;≈9u+R`$`MΣí

Принимает ввод как целое число. Содержит непечатные, поэтому hexdump:

0c3bf739752b526024604de4a1

Попробуйте онлайн

Объяснение:

;≈9u+R`$`MΣí
<form feed>   push str(input)
;≈9u+R        dupe, push [1,...,input+10]
      `$`MΣ   string concatenation of list
           í  get index of input


1

k4, 21 байт

{*1+(,/$1+!10+x)ss$x}

Тот же алгоритм, что и у всех остальных: объединить в [1..10+x]виде строк, найти x в виде строки, преобразовать в индексирование по одному, вернуть первое попадание.

Проверка тестовых случаев:

  &/20 4 30 56 11 48={*1+(,/$1+!10+x)ss$x}'15 45 20 333 0 2930
1b

1

Mathematica, 101 байт

(If[#==0,11,m=Min@SequencePosition[s=Flatten[(K=IntegerDigits)/@Range[0,#]],K@#];Length@s[[;;m-1]]])&

1

Haskell , 82 73 55 байтов

Мигрировал из дубликата

x!b|or$zipWith(==)x b=0
x!(_:b)=1+x!b
(!(show=<<[1..]))

Попробуйте онлайн!

объяснение

Сначала мы определимся !. x!bусекает bдо первого появления x. Он делает это, проверяя, bначинается ли с x( or$zipWith(==)x b), возвращая xли он, и перемещая его вниз по строке в противном случае. Затем мы определяем нашу основную функцию. Наша основная функция - это функция без точек, которая принимает константу ( show=<<[1..]) и усекает ее до первого появления x. Это принимает xкак строку.



1

JavaScript (ES6), 50 39 38 байт

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)

Попытайся

x=s=``
f=n=>-~s.search(n)||f(n,s+=++x)
o.innerText=f(i.value=15);oninput=_=>o.innerText=f(+i.value)
<input id=i type=number><pre id=o></pre>





0

Perl 5 , 42 + 1 (-p) = 43 байта

(join'',0..$_+10)=~/^(0.*?)$_/;$_=length$1

Попробуйте онлайн!

объяснение

(join'',0..$_+10)   #concatenate all of the numbers from 0 to 10 over the input
=~/^(0.*?)$_/;      #skip the first 0, then find the input
$_=length$1         #the length of the string preceding the input is the answer

0

Perl 6 / Rakudo 29 байтов

{$_~=$++until /(.+)$^a/;$0.chars}

Определяет функцию с одним входом ($ ^ a). Звоните так:

say {$_~=$++until /(.+)$^a/;$0.chars}(333)
> 56

Добавляем $анонимную переменную, увеличиваемую $++до тех пор , пока $^aне найдем ввод , а затем подсчитываем количество символов перед ним. Требование хотя бы 1 символа перед этим .+в регулярном выражении полезно исключает случай 0-> 0


0

J, 30 байт

{.I.(":E.[:}.' '-.~":@i.@+&11)

Вероятно, может быть немного больше, особенно в конкатенации первых n + 10 целых чисел.

Объяснение:

{.I.(":E.[:}.' '-.~":@i.@+&11)
                      i.@+&11   | Integers 0 to n+10
                   ":@          | Format list to string
             ' '-.~             | Strip spaces
           }.                   | Behead (remove leading 0)
         [:                     | Cap (previous verbs executed in order, not as a fork)
     ":E.                       | Find matches to the string n (returns a boolean vector)
  I.                            | Indexes of 1s
{.                              | Take only the first

Обратите внимание, что это 0-индексированный. Примеры:

    {.I.(":E.[:}.' '-.~":@i.@+&11) 1
0
    {.I.(":E.[:}.' '-.~":@i.@+&11) 0
10
    {.I.(":E.[:}.' '-.~":@i.@+&11) 333
55

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