Знайдіть серіалізований цілий номер


16

Завдання

Напишіть програму, яка буде приймати (як вхід) натуральне число. Потім він буде рахуватися з 0, додаючи кожне ціле число до a String, продовжуючи лише, якщо довжинаString менше значення вводу.

Серіалізовані ціле число визначаються як повністю сформований ціле з максимальним значенням , що належить до String. За "повністю сформованим" цілим числом не повинно бути відсутніх цифр (що може статися, якщо обмеження довжиниString ).

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


Правила

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

Приклад введення | Вихідні дані

   5 | 4   (0 1 2 3 4              - Length of 5)
  11 | 9   (0 1 2 3 4 5 6 7 8 9 1  - Length of 11)
  12 | 10  (0 1 2 3 4 5 6 7 8 9 10 - Length of 12)
1024 | 377 (0 1 2 3 4 5 6 7 8 ...  - Length of 1024)

Примітки


6
запропонований тестовий випадок:11
Пруд

@Rod Додав це, сподіваємось, це полегшує розуміння!
Яків Г.

Додавання знаків лапок до рядків у прикладах може полегшити розуміння того, що це рядок.
isaacg

Тож перші N-1цифри постійної Шамперновни , з попередньою 0?
Мего

Відповіді:


8

JavaScript (ES6), 40 37 байт

f=(n,i=s='0')=>(s+=++i)[n]?i-1:f(n,i)
<input type=number min=1 value=1 oninput=o.textContent=f(this.value)><pre id=o>0

Редагувати: збережено 3 байти за допомогою довідки @Arnauld.




5

Japt , 13 байт

1n@P±X l >U}a

Перевірте це в Інтернеті!

Пояснення

1n@ P± X l >U}a
1nX{P+=X l >U}a
                   Implicit: U = input integer, P = empty string
  X{         }a    Return the first integer X in [0, 1, 2, ...] that returns a truthy value:
    P+=X             Append X to P.
         l >U        Return P.length > U.
                   This returns the first integer that can't fit into the U-char string.
1n                 Subtract 1 from the result.
                   Implicit: output result of last expression




4

Желе ,  11 10  9 байт

RD;\L€<⁸S

Монадійне посилання, що приймає додатне ціле число і повертає невід'ємне ціле число.

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

Як?

редагування ...

RD;\L€<⁸S - link: number n
R         - range -> [1,2,...10,11,...,n-1]
 D        - convert to decimal (vectorises) -> [[1],[2],...,[1,0],[1,1],...D(n-1)]
   \      - cumulative reduce by:
  ;       -   concatenation -> prefixes i.e.: [[1],[1,2],...,[1,2,...,1,0],[1,2,...,1,0,1,1],[1,2,...,1,0,1,1,...Flattened(D(n))]]
    L€    - length of €ach -> [1,2,3,...,11,13,...,length([1,2,...,1,0,1,1,...Flattened(D(n))])]
       ⁸  - chain's left argument, n
      <   - less than? (vectorises)
        S - sum (yields the number of prefixes that are less than or equal in length to n)
          -   Note: `0` is excluded from the range and all the prefixes, but including
          -         it would mean comparing to n+1 AND decrementing at the end (for a
          -         total cost of a byte)

4

Я це люблю! Використання нарізки як порівняння є геніальним.
isaacg

@isaacg Це одна з приємних особливостей для гольфу Pyth (on). У мене з'явилася ідея, коли я побачив відповідь Ніла (індексування замість нарізки, але та сама ідея). < num seqтакож була дуже корисною.
PurkkaKoodari

3

Perl 6 , 36 байт

{(0...^{([~] 0..$^a).comb>$_})[*-1]}

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

  • 0 ...^ {...}- послідовність чисел від нуля до одиниці, меншої від числа, для якого кодовий блок у дужках повертає істину. ( ...без карети повертається перший номер, для якого блок повернув справжнє.)
  • [~] 0 .. $^a- це об'єднання чисел від 0до поточного числа $^a(параметр до кодового блоку).
  • .comb- це список усіх символів (цифр) у з'єднаному рядку. Інтерпретується як число, воно оцінює довжину рядка. .charsТут було б більш природно використовувати, оскільки він оцінює безпосередньо довжину рядка, але ім'я на один символ довше.
  • $_ є аргументом функції вищого рівня.
  • [*-1] вибирає останній елемент згенерованого списку.

2

QBIC , 34 байти

{A=!p$~_lB+A|>:|_xp-1|\B=B+A]p=p+1

Пояснення

{           DO infinitely
A=!p$       Set A$ to p cast to num
            Note that p starts out as 0.
~      >:   IF the input number is exceeded by
 _l   |     the length of
   B+A      A$ and B$ combined
_xp-1|      THEN QUIT, printing the last int successfully added to B$
            The _X operator quits, (possibly) printing something if followed by a-zA-Z
            _x is slightly different, it prints the expression between the operator _x and |
\B=B+A      ELSE add A$ to B$
]           END IF
p=p+1       Raise p, and rerun






0

Java 8, 64 байти

n->{int i=0;for(String t="0";;t+=++i)if(t.length()>n)return~-i;}

Або незначні альтернативи з однаковим числом байтів:

n->{int i=0;for(String t="";;t+=i++)if(t.length()>n)return i-2;}
n->{int i=-1;for(String t="";;t+=++i)if(t.length()>n)return~-i;}

Пояснення:

Спробуйте тут.

n->{                  // Method with integer as both parameter and return-type
  int i=0;            //  Integer `i`, starting at 0
  for(String t="0";   //  String, starting at "0"
      ;               //  Loop indefinitely
       t+=++i)        //    After every iteration: append the String with `i+1`
                      //    by first increasing `i` by 1 with `++i`
    if(t.length()>n)  //   If the length of the String is larger than the input:
      return~-i;      //    Return `i-1`
                      //  End of loop (implicit / single-line body)
}                     // End of method


0

Рубін, 44 байти

Натхненний відповіддю Кева Круїссена JAVA. -4 байти завдяки G B.

->n{i,t=0,'';t+="#{i+=1}"while t.size<n;i-1}

(i + = 1; t + = i.to_s) те саме, що t + = "# {i + = 1}", лише на 4 байти довше
GB

І якщо ви це зробите, вам більше не потрібна змінна t, ви можете відняти розмір від n, а потім порівняти з 0.
GB

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