Один 1, Два 1, Один 2 Один 1

16

Вызов:

Создайте программу, которая принимает входные положительные ненулевые целые числа и выводит 4 следующих числа в последовательности, описанной ниже.

Примечание: проверка, является ли входное значение на самом деле положительным ненулевым целым числом, не требуется

Последовательность:

Каждое число в этой последовательности (кроме первого, являющегося входом) должно состоять из n цифр, где n - четное число. Если мы разделим число на n / 2 пары, для каждой пары первая цифра должна быть количеством раз, когда вторая цифра появилась в предыдущем числе

Визуальное объяснение :
рассмотрим в этом примере «стартер последовательности» или ввод 6577
Следующее число в последовательности должно выглядеть следующим образом, 161527
потому что вход имеет 1 «6», 1 «5» и 2 «7» с.

Если на входе слишком много цифр (более 9 от одной цифры), вы не сможете получить правильный вывод.
Пример: 111111111111(12 1)
Следующий номер в последовательности должен описывать 12 1. Таким образом, мы разбиваем его на 9 1 и 3 1 (сумма 9 + 3 = 12).
Следующее число:9131

Вы должны выполнить итерацию 4 раза для ввода и вывести его (либо вернуть список / массив из 4 целых чисел, либо вывести его, разделив их пробелом, переводы строки также допустимы)

«Число можно записать разными способами, как мне его написать?» :
Если подумать, пример ввода 6577также можно записать как 271516 (две 7, одна 5, одна шесть). Однако это неверный вывод. Вы должны повторить число слева направо. Таким образом, 161527. Если бы 7657вы итерировали количество 7, то количество 6, а затем количество 5, таким образом, действительный результат будет271615

Пример ввода / вывода:

Вход: 75
Выход:1715 211715 12311715 4112131715

Вход: 1
Выход:11 21 1211 3112

Вход: 111111111111(12 1)
Выход:9131 192113 31191213 23411912


Это не похоже на вопрос «Скажи, что ты видишь», потому что последовательности отличаются: https://oeis.org/A005150 <- Этот возвращает числа, подобные этому:
Вход: 1211 Выход: 111221
В то время как последовательность я спрашиваю будет делать
Вход: 1211 Выход: 3112

Эти две последовательности различны и требуют разных алгоритмов.
Моя запрашиваемая последовательность: https://oeis.org/A063850
«Возможная копия»: https://oeis.org/A005150


Важная спецификация:

Поскольку для некоторых людей, которые пытались ответить на этот вопрос, было недостаточно ясно, правильный вывод для k символов, где k> 9 - это не «kc» (где c это char), а 9c (k-9) c и т. Д. Таким образом, правильный вывод для 12 1 не 121(12 1), но 9131(9 1, (12-9) 1 и т. Д.)

Если вы сомневаетесь, ваш код неверен, если он когда-либо выводит число с нечетным количеством цифр (например, 121), он должен иметь вывод четных чисел из-за характера последовательности.


Это поэтому код с наименьшим количеством байтов выигрывает.

П. Ктинос
источник
Предлагаемый тест: 1111111111111111111(19 1-е )
Emigna
Более тесно связаны (все еще не дурак, хотя).
ETHproductions
Можем ли мы вывести в виде списка целых чисел через запятую? Может ли вывод начинаться с входного целого числа (и, следовательно, иметь длину 5)?
Грег Мартин
В вашем последнем тестовом примере не должно быть последнее число 23411912вместо 23411219?
Грег Мартин
@GregMartin Действительно. Спасибо за указание. Но нет, вам не разрешено возвращать список целых чисел или выходных целых чисел, разделенных чем-либо, кроме символов новой строки или пробелов. И нет, вы не должны выводить ввод
P. Ktinos

Ответы:

6

PowerShell , 111 104 байта

$z=$args;1..4|%{($z=-join($z-split'\B'|group|%{for($c,$n=$_.Count,$_.Name;$c-gt9;$c-=9){"9$n"}"$c$n"}))}

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

briantist
источник
Так как вы не используете $iв своем цикле, почему бы просто не зациклить прямо как$z=$args;0..3|%{...
AdmBorkBork
@AdmBorkBork Я думал об этом, но чувствовал, что это будет дольше после назначения $args(и я первоначально думал, что буду использовать $i). Я собирался измерить это, но тогда вопрос был закрыт.
бриантист
@AdmBorkBork ... ааа и отредактировано (спасибо)
briantist
5

Python 2 , 116 байт

x=input()
exec"x=''.join(x.count(n)/9*(`9`+n)+`x.count(n)%9`+n for i,n in enumerate(x)if n not in x[:i]);print x;"*4

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

прут
источник
Вывод для 19-ти 1111111111111111111некорректен. Должно быть, 919111но дает919121
CSharpie
Вывод неправильный для многих значений. Пример: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , с входным 11выводом должно быть 21 1211 3112 132112, я не понимаю, почему он выводит 111в качестве первой итерации, из-за которой вся цепочка работает плохо
P. Ktinos
@ P. Ktinos неверный формат ввода, это должна быть строка (это должен быть остаток тех тестов, которые я проводил). Исправлена ​​ссылка
Rod
4

05AB1E , 30 23 21 байт

4F©Ùv9y«®y¢9‰`U×XyJ}=

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

объяснение

4F                     # 4 times do:
  ©                    # store a copy of the current number in register
   Ùv                  # for each unique digit y in the number
     9y«               # concatenate 9 with y
        ®y¢            # count occurrences of y in current number
           9‰          # divmod by 9
             `U        # store the result of modulus in X
               ×       # repeat the number "9y" result_of_div times
                X      # push result of modulus
                 y     # push y
                  J    # join everything to one number
                   }   # end inner loop
                    =  # print the current number without popping
Emigna
источник
@MagicOctopusUrn: Это не будет работать для числа с более чем 9 повторениями цифры, как, например, пример в моей ссылке TIO.
Эминья
Оооо ... Я понял это сейчас.
Волшебная Осьминог Урна
1

Mathematica, 117 байт

Grid@{Rest@NestList[FromDigits[Join@@(Reverse/@Tally@IntegerDigits@#//.{a_,b_}/;a>9->{9,b}~Sequence~{a-9,b})]&,#,4]}&

Похоже, это не должно быть так долго.

Грег Мартин
источник
1

C # 246 байт

namespace System{using Linq;using f=String;class p{static void Main(f[] s){f p=s[0];for(int i=0,n;i++<4;Console.Write(p+" "))p=f.Concat(p.GroupBy(c=>c).SelectMany(g=>new int[(n=g.Count())/9].Select(_ =>"9"+g.Key).Concat(new[]{n%9+""+g.Key})));}}}

Ungolfed:

namespace System
{
    using Linq;
    using f = String;
    class p
    {
        static void Main(f[] s)
        {
            f p = s[0];
            for (int i = 0, n; i++ < 4; Console.Write(p + " "))

                p = f.Concat(p.GroupBy(c => c).SelectMany(g =>
                    new int[(n = g.Count()) / 9].Select(_ => "9" + g.Key).Concat(new[] { n % 9 + "" + g.Key }
                )));
            Console.ReadKey();
        }
    }
}

Попробуйте здесь (введите input в нижний фрейм после его компиляции и нажмите ENTER)

CSharpie
источник
0

Желе , 27 байт

L,Ḣ
D©®i$ÞŒgs9$€Ç€€FḌµ4µÐ¡Ḋ

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

Последовательные s не могут быть вложенными, потому что цепочки не могут быть вложенными.

Вложенность с отдельной ссылкой: 27 байт.

Печать вместо кумуляции: 27 байт.

объяснение

L,Ḣ                     - helper function, does the look-and-say. Input is a list of digits
 ,                      - return 2-tuple of:
L                       -   length of input
  Ḣ                     -   first element of input

D©®i$ÞŒgs9$€Ç€€FḌµ4µÐ¡Ḋ - main link, takes input as integer
                 µ4µÐ¡  - repeat 4 times, saving the results of each iteration:
D                       -   convert integer to list of digits
 ©                      -   save into register, for later use
  ®i$Þ                  -   sort list's elements by first occurrence in list
      Œg                -   group runs of equal elements
        s9$€            -   split each run into sets which are at most 9 elements long
            Ç€€         -   do the look-and-say with helper function
               FḌ       -   flatten and convert back into integer for next iteration
                      Ḋ - remove the first element from the list since it includes the
                           initial element
fireflame241
источник