Послідовність автономних чисел


22

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

Завдання

Ви можете вибрати будь-який із трьох перелічених нижче методів:

  • Враховуючи ціле n , виведіть n- е (або 0, або 1-індексоване) автономне число.
  • Враховуючи ціле n , виведіть перші n автономних чисел.
  • Друкуйте послідовність нескінченно.

Приклади

  • 133322 - це автономне число, оскільки 3 з'являється під час пробігу трьох 3 -х, 1 - одинарний, а 2 - у пробігу двох 2 -х.

  • З іншого боку, 35553355 не є, оскільки, хоча 5 і 3 трапляються відповідно п'ять і три рази, вони не утворюють прогонів суміжних цифр.

  • 44422 не є самодостатнім, оскільки 4 трапляється лише три рази.

  • 12222333 теж не є, тому що 2 з'являється в пробігу чотирьох 2 -х, і це не може розглядатися як два окремих прогони двох 2 -х.

Не дивно, що це OEIS A140057 , і його перші кілька термінів:

1, 22, 122, 221, 333, 1221, 1333, 3331, 4444, 13331, 14444, 22122, 22333, 33322, 44441, 55555, 122122, 122333, 133322, 144441, 155555

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

Відповіді:


8

Python 2 , 104 94 83 байт

-10 байт завдяки містеру Xcoder
-11 байт завдяки Джонатану Аллану

i=0
while 1:
 if`i`==''.join(d*int(d)for c,d in zip(`-i`,`i`)if d!=c):print i
 i+=1

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


... насправді це прийнятно, оскільки воно впаде один раз iстає довгим ? Можливо, це доведеться використовуватиstr (хоча я ніколи не впевнений у цих речах).
Джонатан Аллан

1
@JonathanAllan - цікаве питання. Зазвичай ми маємо право припустити , що воно знаходиться в межах стандартного целочисленного типу, що не довго , але Python не робить це відмінність дуже ясно ...
FlipTack

6

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

Друкує послідовність нескінченно

Do[##&&Print@t&@@(#==Tr[1^{##}]&@@@Split@IntegerDigits@t),{t,∞}]

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

У TIO вам потрібно припинити виконання, щоб побачити результат, але в Mathematica працює добре.

-12 байт від Мартіна Ендера


6

05AB1E , 9 байт

Повертає n-й додаток послідовності, 1-індексований.

µNÔNγ€gJQ

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

Пояснення

µ           # loop over increasing N until counter equals input
 NÔ         # push N with consecutive equal elements deduplicated
   Nγ       # push N grouped into runs of consecutive equal elements
     €g     # get the length of each run
       J    # join to a number
        Q   # check for equality
            # if true, implicitly increment counter

Можливе джерело натхнення з мого 10-байтового підходу:µNγD€gs€ÙQ
Містер Xcoder

6

JavaScript (ES6), 76 71 68 байт

Повертає n-й додаток послідовності, індексований 0.

f=(n,k)=>+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||n--?f(n,-~k):k

Примітка : Як завжди в роботі з рекурсивними функціями, діапазон введення залежить від підтримки оптимізації викликів Tail та розміру стека вашого двигуна.

Демо


Alt версія, 65 байт

Не приймає жодних даних і друкує результати по alert()одному.

f=k=>f(-~k,+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||alert(k))

Спробуйте в Інтернеті! (Зупиняється, як тільки перевищується максимальний розмір стека.)



2

CJam , 20 байт

1{_Abe`::=:*{_p}&)}h

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

Пояснення:

1                       push 1
 {                }h    while TOS is truthy (i.e. forever):            example iteration: 14444
  _                       duplicate                                                       14444 14444       
   Ab                     convert to base 10 (get decimal digits)                         14444 [1 4 4 4 4]
     e`                   run-length encode (array of two-element arrays)                 14444 [[1 1] [4 4]]
       :                  map over the array:
        :                   fold between the two array elements with:
         =                    equality                                                    14444 [1 1]
          :               fold between the array elements with:
           *                multiplication (a.k.a. logical AND for 1 or 0)                14444 1
            {  }&         if this yields a result of 1:
             _              duplicate the number and                                      14444 14444
              p             print it                                                      14444 (output 14444)
                 )        increment the number                                            14445


2

Брахілог , 10 байт

≜ℕẹḅ⟨l=h⟩ᵐ

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

Нескінченно генерує елементи послідовності через свою вхідну змінну. (Якщо насправді доводиться робити друк самостійно, додайте &ẉ⊥.) Це, по суті, код для вирішення відповідної з попередньою формою, щоб спершу застосувати найменші рішення:

        ᵐ    For every
  ḅ          run of
 ẹ           digits in
             the input variable
ℕ            (which is a non-negative integer),
   ⟨l  ⟩     its length
   ⟨  h⟩     and its first element
   ⟨ = ⟩     are equal.

Я очікував, що це займе лише 9 байт, але, здається, вимагає явного розділення цифр числа на прогони.


1

JavaScript 4, 83 80 байт

for(i=0;;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)

for(i=0;i<1000;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)


"Javascript 1"? Чи існує така назва мови?
користувач202729

Я маю на увазі, що він працює з моменту появи JavaScript, не впевнений, чи ім’я правильне
l4m2

вибачте, що здається, що не працює в js1. Я прочитав і не знайшов заміни
l4m2


1

R , 56 байт

function(n)all((r=rle(el(strsplit(c(n,''),''))))$l==r$v)

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

Використовує кодування довжини запуску на розділене число. Повертає істину, якщо всі довжини рівні значенням.

Примітка: я завантажив methodsбібліотеку в TIO, щоб приступити elдо роботи.





0

Java 10, 121 байт

Лямбда від intдо int. Функція приймає індекс n і повертає n- е (1-індексоване) значення послідовності.

n->{int x=0,m=1;for(;n>0;n-=m,m=1)for(var p:(++x+"").split("(?<=(.))(?!\\1)"))m=p.length()==p.charAt(0)-48?m:0;return x;}

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

Безумовно

n -> {
    int x = 0, m = 1;
    for (; n > 0; n -= m, m = 1)
        for (var p : (++x + "").split("(?<=(.))(?!\\1)"))
            m = p.length() == p.charAt(0) - 48 ? m : 0;
    return x;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.