Що це за побудований номер стартера?


14

Ряд мов програмування будують великі цілі числа за допомогою "об'єднання" цифри до кінця наявного числа. Наприклад, Лабіринт або Адапт . Зв'язуючи цифру з кінцем, я маю на увазі, що якщо існуюче число 45 , а цифра 7 , число результатів 457(45×10+7) .

Побудоване число - це число, яке можна побудувати таким чином за допомогою використання кратних одноцифрових чисел: 1,2,3,4,5,6,7,8,9 AKA елемент в одній з цих 9 послідовностей:

1,12,123,1234,12345,
2,24,246,2468,24690,
3,36,369,3702,37035,
4,48,492,4936,49380,
5,60,615,6170,61725,
6,72,738,7404,74070,
7,84,861,8638,86415,
8,96,984,9872,98760,
9,108,1107,11106,111105,

Щоб навести приклад побудови послідовностей, ось як побудована послідовність для a=3 :

u1=a=3=3u2=10×u1+2×a=30+6=36u3=10×u2+3×a=360+9=369u4=10×u3+4×a=3690+12=3702u5=10×u4+5×a=37020+15=37035u6=10×u5+6×a=370350+18=370368
u33=10×u32+33×a=37260+99=37359u34=10×u33+34×a=37359+102=373692

u33 іu34 включені для демонстрації, колиn×a100 . Дужебагатоцифр, виділених простором.

Можливо, ще не зрозуміло, як будуються ці послідовності, тому ось два різних способи їх зрозуміти:

  • Кожна послідовність починається з однозначної цифри. Наступний член знайдемо, взявши наступне кратне число цієї цифри, помноживши попередній додаток на 10 і додавши кратне. У послідовних умовах:

    un=10×un1+n×a,u1=a

    де a - це однозначна цифра (від 1 до 9 )


  • Кожен з 9 елементів у будь-якій точці послідовності (наприклад, візьмемо n=3 ) є кратними 123 від 1 до 9 , де 123 будується un+1=10×un+n (1,12,123,,123456789,1234567900,12345679011,)

    Отже, перші значення - 1×1,2,3,,8,9 , другі - 12×1,2,3,,8,9 , треті 123×1,2,3,,8,9 тощо.

Ваше завдання - взяти побудоване число як вхідне та вивести початкову цифру, використану для його побудови. Ви можете припустити, що вхід завжди буде побудованим числом і буде більше 0 . Це може бути одна цифра, яка відображає себе назад.

Ви можете приймати інформацію будь-яким розумним способом, включаючи список цифр, як рядок тощо. Доцільно (хоча і не рекомендується) брати дані в одинаковому порядку або будь-яку іншу базу на ваш вибір.

Це тому найкоротший код виграє!

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

       u_n        => a
 37035            => 3
 6172839506165    => 5
 5                => 5
 246913580244     => 2
 987654312        => 8
 61728395061720   => 5
 1111104          => 9
 11111103         => 9
 111111102        => 9
 2469134          => 2
 98760            => 8
 8641975308641962 => 7

або як два списки:

[37035, 6172839506165, 5, 246913580244, 987654312, 61728395061720, 1111104, 11111103, 111111102, 2469134, 98760, 8641975308641962]
[3, 5, 5, 2, 8, 5, 9, 9, 9, 2, 8, 7]

Коли я опублікував цей виклик, я не розумів, що його можна настільки спростити методом, який використовується у відповіді Грімі , і тому був би дуже зацікавлений у відповідях, які мають більш математичний підхід до вирішення цього питання, а не «цифра». трюк (Очевидно, всі достовірні відповіді однаково справедливі, саме те, що мені було б цікаво бачити).


Пісочний пост . У мене в Jelly є 9-байтне рішення, якщо хтось хоче це спростувати.
caird coinheringaahing

Відповіді:


26

05AB1E , 7 5 4 байти

>9*н

Спробуйте в Інтернеті!

>            # input + 1
 9*          # * 9
   н         # take the first digit

6
Хм, це не добре підходить для цього виклику, якщо його можна буде спростити так легко
птахів coinheringaahing

9
У вас є приблизно 1 байт коду на 800 байт пояснення виклику. : p
Арнольд

1
Як ви придумали рішення і чому воно правильне?
Джоель

7
@Joel (n-1) термін послідовності, що починається з a, є a * (((10**n - 1) / 9 - n) / 9). Помножте це на 9 і додайте a*n, і ви отримаєте a * ((10**n - 1) / 9), також цифру, повторену n разів. Виходить додавання 9 замість a*nробіт для n = 1, а для більшого n постійна різниця є незначною поруч із експоненціальним зростанням.
Grimmy

3
@Grimy Дякую за пояснення. Можливо, ви можете помістити це у свій пост.
Джоель





2

Вугілля деревне , 7 байт

§I×⁹⊕N⁰

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. @ Метод Гримі. Ось математичний підхід на 27 байт:

NθW¬№Eχ×κ↨υχθ⊞υLυI⌕Eχ×ι↨υχθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Збої на недійсних введеннях. Пояснення:

Nθ

Введіть побудоване число.

W¬№Eχ×κ↨υχθ

Інтерпретуйте список як число в базі 10, помножте на всі числа від 0до 9і подивіться, чи з’являється побудоване число.

⊞υLυ

Притисніть довжину списку до себе. Отже, список стає такою формою [0, 1, 2, ..., n].

I⌕Eχ×ι↨υχθ

Відтворіть побудовані числа, але цього разу знайдіть і виведіть індекс, при якому з'явилося вхідне число.



2

Пробіл , 108 байт

[S S S N
_Push_0][S N
S _Duplicate_0][T   N
T   T   _Read_STDIN_as_integer][T   T   T   _Retrieve_input][S S S T    N
_Push_1][T  S S S _Add][S S S T S S T   N
_Push_9][T  S S N
_Multiply][S S S T  N
_Push_1][N
S S N
_Create_Label_LOOP][S S S T S T S N
_Push_10][T S S N
_Multiply][S N
S _Duplicate][S T   S S S T S N
_Copy_0-based_2nd]S N
T   Swap_top_two][T S S T   _Subtract][N
T   T   S N
_If_neg_jump_to_Label_PRINT][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    S T S N
_Push_10][T S T S _Integer_divide][T    S T S _Integer_divide][T    N
S T _Output_top_as_number]

Букви S(пробіл), T(вкладка) та N(новий рядок) додаються лише як підкреслення.
[..._some_action]додано лише як пояснення.

Порт відповіді 05AB1E @Grimy , за винятком того, що я не маю вбудованого для отримання першої цифри. ;)

Спробуйте його в режимі он-лайн (лише із необробленими пробілами, вкладками та новими рядками).

Пояснення в псевдокоді:

Integer i = STDIN as integer
i = i + 1
i = i * 9
Integer t = 1
Start LOOP:
  t = t * 10
  If(i - t < 0):
    Call function PRINT
  Go to next iteration of LOOP

function PRINT:
  t = t / 10
  i = i / t    (NOTE: Whitespace only has integer-division)
  Print i as integer to STDOUT

2

Пітон 3 , 22 байти

lambda i:str(-~i*9)[0]

Спробуйте в Інтернеті!

Порт брудного «s 05AB1E відповіді


Python 3 , 74 байти

f=lambda i,j=1,k=2,l=1:l*(i==j)or f(i,*(10*j+k*l,l+1,k+1,2,l,l+1)[i<j::2])

Спробуйте в Інтернеті!

Пояснення

Рекурсивна функція. Ітерація над послідовністю для кожної цифри l, починаючи з 1. Якщо вхід iдорівнює поточній ітерації j, відповідна цифра lповертається. В іншому випадку, якщо поточне значення jв послідовності перевищує вхідне значення i, воно збільшить цифру lі почне спочатку. Аргумент kвикористовується для збільшення коефіцієнта множення.


1

JavaScript (ES6),  16  15 байт

Завдяки @Grimy за те, що він зняв 32-бітове обмеження, яке я мав у попередній версії.

Використання магічного заклику Гримі . Вводиться як рядок.

n=>(n*9+9+n)[0]

Спробуйте в Інтернеті!


JavaScript (ES6), 53 байти

Наївний грубий підхід.

n=>(g=(k,x=i=0)=>x>n?g(k+1):x<n?g(k,++i*k+10*x):k)(1)

Спробуйте в Інтернеті!


-~n*9може бути n*9+9, що це той же самий облік, але слід позбутися 32-бітного обмеження, якщо я правильно зрозумів.
Grimmy

сила грубої сили працює на a> = 10, як14808
Nahuel Fouilleul

1
@NahuelFouilleul, якщо вважати> = 10, відповідь більше не є однозначною (14808 може бути або 4-м членом a = 12, або першим членом a = 14808). Якщо виведення будь-якого з них дозволено, n=>nпрацює для всіх входів.
Grimmy

1

Java 8, 23 байти

n->(n*9+9+"").charAt(0)

Порт @Grimy '05AB1E відповідь , так що не забудьте підтримати його!

Спробуйте в Інтернеті.

Але оскільки мені якось погано почуваються @cairdCoinheringaahing , тут грубий підхід з трохи більше дозволити собі ( 83 байти ):

n->{long r=n,a=0,u,k;for(;++a<10;r=u>n?r:a)for(k=2,u=a;u<n;)u=u*10+k++*a;return r;}

Спробуйте в Інтернеті.

Пояснення:

n->{                 // Method with long as both parameter and return-type
  long r=n,          //  Result, starting at the input in case it's already a single digit
       a=0,          //  The digit to start the sequence with
       u,            //  The last number of the sequence we're building for digit a
       k;            //  Multiplier which increments each iteration
  for(;++a<10;       //  Loop in the range [1,9] (over each digit):
      r=u>n?         //    After ever iteration: if `u` is larger than the input:
            r        //     Keep the result the same
           :         //    Else:
            a)       //     Change the result to `a`
    for(k=2,         //   Reset `k` to 2
        u=a;         //   Reset `u` to the current digit `a`
        u<n;)        //   Inner loop as long as `u` is smaller than the input
      u=             //    Change `u` to:
        u*10         //     10 times the current `u`
            +k++*a;  //     With `k` multiplied by `a` added
                     //     (after which `k` increases by 1 with `k++`)
  return r;}         //  And after we iterated over each digit, return the result


0

Желе , 8 байт

RRḌ÷@fⱮ9

Спробуйте в Інтернеті!

Повна програма, яка приймає ціле число і друкує цифру стартера. Не використовує розумний метод Гримі! Страшенно неефективний для більшого введення. Наступна версія обробляє всі тестові випадки, але на байт довше:

Желе , 9 байт

DJRḌ÷@fⱮ9

Спробуйте в Інтернеті!



0

Кег -rr , 4 байти

⑨9*÷

Спробуйте в Інтернеті!

Звичайно, використовується той же підхід, що і у відповіді 05AB1E. Також використовується новий -rr(зворотний та друкований вихідний) прапор.

Перекладає на:

from KegLib import *
from Stackd import Stack
stack = Stack()
printed = False
increment(stack)
integer(stack, 9)
maths(stack, '*')
item_split(stack)
if not printed:
    reverse(stack)
    raw(stack)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.