Um 1, Dois 1, Um 2 Um 1

16

Desafio:

Crie um programa que receba a entrada de um número inteiro diferente de zero positivo e produza os 4 números seguintes na sequência descrita abaixo.

Nota: Não é necessário verificar se a entrada é realmente um número inteiro diferente de zero.

Seqüência:

Todo número nesta sequência (exceto o primeiro, que é a entrada) deve ser composto por n dígitos, onde n é um número par. Se dividirmos o número em n / 2 pares, para cada par, o primeiro dígito deve ser a quantidade de vezes que o segundo dígito apareceu no número anterior

Explicação visual :
considere este exemplo "iniciador de sequência" ou entrada 6577
O próximo número na sequência deve se parecer com este 161527
Porque a entrada possui 1 "6", 1 "5" e 2 "7" s.

Se a entrada tiver muitos dígitos (mais de 9 de um único dígito), não seria possível obter uma saída correta.
Exemplo: 111111111111(12 1's) O
próximo número na sequência deve descrever 12 1's. Assim, dividimos em 9 1 e 3 1 (soma 9 + 3 = 12)
Próximo número:9131

Você deve iterar 4 vezes para a entrada e produzi-la (retorne uma lista / matriz de 4 números inteiros ou produza-os separando-os com um espaço, novas linhas também são aceitáveis)

"O número pode ser escrito de várias maneiras, como eu o escrevo?" :
Se você pensar bem, a entrada de exemplo 6577também pode ser escrita como 271516 (dois 7's, um 5, um seis). No entanto, esta é uma saída inválida. Você deve repetir o número da esquerda para a direita. Assim, 161527. Se fosse, 7657você repetiria a quantidade de 7, então a quantidade de 6 e a quantidade de 5, portanto a saída válida seria271615

Exemplo de E / S:

Entrada: 75
Saída:1715 211715 12311715 4112131715

Entrada: 1
Saída:11 21 1211 3112

Entrada: 111111111111(12
1s ) Saída:9131 192113 31191213 23411912


Isso é diferente da pergunta "Diga o que você vê", porque as seqüências são diferentes: https://oeis.org/A005150 <- Este retorna números como este:
Entrada: 1211 Saída: 111221
Enquanto a sequência que estou pedindo faria
Entrada: 1211 Saída: 3112

As duas sequências são diferentes e requerem algoritmos diferentes.
Minha sequência solicitada: https://oeis.org/A063850 Sequência
"Possível duplicado": https://oeis.org/A005150


Especificação importante:

Como não foi claro o suficiente para algumas pessoas que tentaram responder a essa pergunta, a saída correta para k chars em que k> 9 não é "kc" (onde c é char), mas 9c (k-9) c etc. 12 1 não é 121(12 1), mas 9131(9 1, (12-9) 1 e assim por diante)

Em caso de dúvida, seu código está errado se um número com dígitos ímpares (como 121), deve gerar números de dígitos pares devido à natureza da sequência.


Isso é portanto, codifique com menos bytes ganhos.

P. Ktinos
fonte
Testcase proposto: 1111111111111111111(19 1 do )
Emigna
Mais intimamente relacionado (ainda não é enganador).
ETHproductions
Podemos produzir como uma lista de números inteiros separados por vírgula? A saída pode começar com o número inteiro de entrada (e, portanto, ter comprimento 5)?
Greg Martin
No seu último caso de teste, o último número não deveria ser em 23411912vez de 23411219?
Greg Martin
@GregMartin Indeed. Obrigado por apontar. Mas não, você não tem permissão para retornar uma lista de números inteiros ou números inteiros de saída separados por qualquer coisa, além de novas linhas ou espaços. E não, você não deve saída a entrada
P. Ktinos

Respostas:

6

PowerShell , 111 104 bytes

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

Experimente online!

briantist
fonte
Desde que você não utilize $iem seu loop, porque não basta circuito diretamente como$z=$args;0..3|%{...
AdmBorkBork
@AdmBorkBork Pensei nisso, mas achei que demoraria mais tempo depois de ter que atribuir $args(e originalmente pensei que iria usar $i). Eu estava indo para medir, mas então a questão foi encerrada.
Briantist
@AdmBorkBork ... aaaand editada (obrigado)
briantist
5

Python 2 , 116 bytes

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

Experimente online!

Cajado
fonte
A saída para 19 unidades 1111111111111111111está incorreta. Deveria ser, 919111mas dá919121
CSharpie
Saída incorreta para muitos valores. Exemplo: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , Com a entrada 11de saída deve ser 21 1211 3112 132112, eu não entendo porque ele gera 111como a primeira iteração que faz com que toda a cadeia de ir mal
P. Ktinos
@ P.Ktinos o formato de entrada estava errado, ele precisa ser uma string (deve ser a sobra dos testes que eu estava fazendo). Corrigido o link
Rod
4

05AB1E , 30 23 21 bytes

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

Experimente online!

Explicação

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
fonte
@MagicOctopusUrn: Isso não funciona para números com mais de 9 repetições de um dígito, como o exemplo no meu link TIO, por exemplo.
Emigna
Ohhh ... entendi agora.
Magic Octopus Urn
1

Mathematica, 117 bytes

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

Parece que não deve demorar tanto.

Greg Martin
fonte
1

Bytes em 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();
        }
    }
}

Experimente aqui (digite a entrada no quadro inferior uma vez compilada e pressione ENTER)

CSharpie
fonte
0

Gelatina , 27 bytes

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

Experimente online!

Os s sucessivos não podem ser aninhados porque as cadeias não podem ser aninhadas.

Aninhamento com link separado: 27 bytes.

Imprimir em vez de acumulação: 27 bytes.

Explicação

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
fonte
0

PHP, 141 bytes

for($a=$argn;$i++<4;$a=$o,print$a._,$o="")foreach(array_count_values(str_split($a))as$n=>$c)$o.=str_repeat("9$n",$c/9^0).($c%9?($c%9).$n:"");

Experimente online!

Jörg Hülsermann
fonte