Знайдіть число в константі Чамперновна


35

Вступ

У базі 10 константа Шамперновна визначається об'єднанням поданих послідовних цілих чисел. У базі 10: 0.1234567891011121314151617...тощо.

Ви можете бачити, що перша поява 15запуску починається з 20thдесяткової:

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

Перше поява 45старту починається з 4thдесяткової:

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

Отже, завдання легке. Враховуючи невід'ємне ціле число, виведіть позицію цілого числа в константі Шамперновна.

Правила

  • Ви можете надати функцію або програму
  • Це , тому подання з найменшою кількістю байтів виграє!

Тестові справи

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чи щось?
Erik the 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 байт завдяки Conor O'Brien.


Я думаю, ви можете перемістити y=частину до y=b=" "; збільшення пробілу подібно до збільшення нуля. ( a=prompt(y=b=" ");...)
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Приємна знахідка.
SuperJedi224

4

Хаскелл, 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)

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


3

PowerShell, 39 44 байт

[Редагувати: моє припущення не відповідає

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

Ви завжди знайдете х, коли будуєте рядок константи Шамперновна в останній момент, коли додасте х в кінець, тому масив з 1-х завжди матиме відповідь у ньому. Питання стає "чи відбувається це раніше?" . Цей код

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 :(
Девід

@David Тепер це робить. Дякуємо, що помітили! Це коштувало лише 3 байти :-)
Луїс Мендо

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

@Giuseppe Дякую за голову! Оновлено, з належним кредитом (і з заміткою на "мові, що подає повідомлення"; я не є великим прихильником нового правила )
Луїс Мендо

Я не заперечую над тим правилом ( хоча прапори зводить мене з розуму); Я в основному коментував тут, оскільки помітив, що Ysпотрібно змінити, щоб Vвикористовувати його в найсучаснішій версії перекладача. Мене завжди вражає, наскільки покращилася мова!
Джузеппе

2

PowerShell, 54 50 байт

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

Дякуємо TesselilingHeckler за ідею заміни 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] як рядки, шукайте х як рядок, перетворюйте на одноосновну індексацію, повертайте перший хіт.

Перевірка тестових випадків:

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

1

Математика, 101 байт

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

1

Хаскелл , 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.