Введение
В базе 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
0 <= x <= 99
, но теоретически это должно работать для целых чисел выше, чем99
.Ответы:
Пиф, 10
Объединяет первые
input + 10
числа, а затем находит индекс на основе 0 плюс один. Дополнительные десять нужны только для 0.Тестирование
источник
2015-12-17 15:01:23Z
или что-то?LabVIEW, 29 примитивов LabVIEW
Это использует строки на данный момент. Он сопоставляет входные данные в виде шаблона и выводит смещение - (входная длина -1).
источник
Javascript, 57 байт
Сохранено 1 байт благодаря Конору О'Брайену.
источник
y=
часть вy=b=" "
; увеличение пробела похоже на увеличение нуля. (a=prompt(y=b=" ");...
)Haskell, 62 байта
Пример использования:
(#(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
Руби, 28
Включает 0 в начале, так что совпадения индексируются 1, но используется
\B
для требования, чтобы совпадение не было в начале строки.источник
Japt, 11 байт
Первоначально это было избиение Pyth, но, очевидно, это не сработало для ввода
0
.Попробуйте онлайн!
Как это работает
источник
q
в коде символ, а не символ логического отрицания¬
?¬
является ярлыком дляq
(этоq
со следующим пробелом). Это часто приводит к путанице, поэтому я выровнял более короткую версию с полной.Луа, 54 байта
Примечание.
В настоящее время эта программа печатает как первое вхождение первого символа строки, так и точку, где она заканчивается. Если это не разрешено, это будет стоить еще несколько байтов.Я хотел бы подать ходатайство о бонусе, потому что моя программа распечатывает как первую, так и последнюю позицию введенного номера.источник
MATL , 22 байта
Возьмите input (
i
), сделайте вектор 1 для input + 10 (10+:
), преобразуйте вектор в строку (Ys
) и удалите пробелы, что больно, (t' '=~)
). Затем преобразуйте входные данные в строку (Ys
), найдите, где входная строка находится в строке чисел (Xf
), и возьмите первое местоположение (1)
).t
«S иw
» s манипулируют стек (дублировать и своп, соответственно).источник
PowerShell,
3944 байта[Правка: мое предположение не выполняется, построение массива из 1-0 не находит 0 в месте 11. Вместо этого, сборка из 1-x + 10 также обрабатывает 0, теперь 44 байта]
Вы всегда найдете x при построении строки константы Champernowne в самый последний момент, когда вы добавите x в конец, поэтому в массиве из 1-x всегда будет ответ. Возникает вопрос: "Это произойдет раньше, чем это?" , Этот код
генерирует диапазон чисел, преобразует его в строку и ищет параметр внутри нее. Поскольку PowerShell - это объектно-ориентированная оболочка, параметр на самом деле является
[int]
типом, поэтому попытка сохранить два символа с помощью.IndexOf($i)
будет искать в строке целое число и ничего не найти. Вот почему я использую интерполяцию строк"$i"
.источник
.IndexOf()
очевидно, имеет более высокие операционные предпочтения, чем унарное-join
форсирование паренов и кавычек. : - /MATL (выпуск 1.0.1), 22 байта
пример
объяснение
MATL (выпуск 20.8.0), 16 байт (языковой выпуск заданий)
Благодарим @Giuseppe за эту версию программы (слегка измененную)
Попробуйте онлайн!
объяснение
источник
G
содержит входные данные (и неявные входные данные), я думаю, этот ответ может быть значительно сокращен, иYs
вV
любом случае все это необходимо изменить ; Я придумал10+:"@Vv]!GVXf1)
для 16 байтов.Ys
нужно перейти наV
использование в самой современной версии интерпретатора. Я всегда впечатлен тем, насколько улучшился язык!PowerShell,
5450 байтСпасибо 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){}$x
51 байт. (но я опубликовал свой 39-байтовый ответ как собственный ответ, потому что это совершенно другой подход: P).$c
конкатенацию в петлю, чтобы поставить точку с запятой в гольф. Сейчас на 50.JavaScript (ES6), 40 байт
Использует рекурсивную функцию,
f
чтобы избежать циклов. Метод поиска работает так же,indexOf
за исключением того, что он принимает RegExp в качестве параметра, что не имеет значения для этой задачи.Добавление
" "
дляn=0
случая (ноль - ложь в JS) заставляет+
выполнять конкатенацию строк вместо сложения и корректирует индексирование на основе нуля.источник
Питон 3, 54.
источник
CJam, 11 байт
Проверьте это здесь.
Я нахожу позицию
N
в строке01234...N
для учета индексации на основе 1. Наконец я исправляю0
, применяя логическое ИЛИ с 11.источник
Серьезно, 13 байтов
Принимает ввод как целое число. Содержит непечатные, поэтому hexdump:
Попробуйте онлайн
Объяснение:
источник
𝔼𝕊𝕄𝕚𝕟 13 символов / 22 байта
Try it here (Firefox only).
источник
k4, 21 байт
Тот же алгоритм, что и у всех остальных: объединить в
[1..10+x]
виде строк, найти x в виде строки, преобразовать в индексирование по одному, вернуть первое попадание.Проверка тестовых случаев:
источник
Mathematica, 101 байт
источник
Haskell ,
827355 байтовМигрировал из дубликата
Попробуйте онлайн!
объяснение
Сначала мы определимся
!
.x!b
усекаетb
до первого появленияx
. Он делает это, проверяя,b
начинается ли сx
(or$zipWith(==)x b
), возвращаяx
ли он, и перемещая его вниз по строке в противном случае. Затем мы определяем нашу основную функцию. Наша основная функция - это функция без точек, которая принимает константу (show=<<[1..]
) и усекает ее до первого появленияx
. Это принимаетx
как строку.источник
05AB1E , 6 байтов (не конкурирует)
Попробуйте онлайн!
источник
JavaScript (ES6),
503938 байтПопытайся
источник
Желе , 5 байт
Попробуйте онлайн!
источник
Stax , 6 байт
Запустите и отладьте его
источник
Perl 6 , 26 байт
Попробуйте онлайн!
Находит индекс элемента в объединенном диапазоне от 0 до этого элемента или,
11
если число равно нулюисточник
Perl 5 , 42 + 1 (-p) = 43 байта
Попробуйте онлайн!
объяснение
источник
Perl 6 / Rakudo 29 байтов
Определяет функцию с одним входом ($ ^ a). Звоните так:
Добавляем
$
анонимную переменную, увеличиваемую$++
до тех пор , пока$^a
не найдем ввод , а затем подсчитываем количество символов перед ним. Требование хотя бы 1 символа перед этим.+
в регулярном выражении полезно исключает случай 0-> 0источник
J, 30 байт
Вероятно, может быть немного больше, особенно в конкатенации первых n + 10 целых чисел.
Объяснение:
Обратите внимание, что это 0-индексированный. Примеры:
источник
Шелуха , 6 байт
Попробуйте онлайн!
источник