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


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 байтов благодаря
Джонатану Аллану -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 это интересный вопрос. Обычно нам разрешают предположить, что он находится внутри стандартного целочисленного типа, а не long , но Python не делает это различие очень ясным ...
FlipTack

6

Mathematica, 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
Mr. 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

NB : Как всегда с рекурсивными функциями, диапазон ввода зависит от поддержки Tail Call Optimization и размера стека вашего движка.

демонстрация


Чередующийся версия, 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"? Есть ли такое название языка?
user202729

Я имею в виду, что это работает, так как появляется JavaScript, не уверен, что имя правильное
l4m2

извините, кажется, не работает в js1. Я прочитал и не нашел замены
l4m2


1

R , 56 байт

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

Попробуйте онлайн!

Использует кодирование длины серии для разделенного числа. Возвращает true, если все длины равны значениям.

Примечание: я загрузил 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;}

Попробуйте онлайн

Ungolfed

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.