Uno 1, dos 1, uno 2 uno 1

16

Desafío:

Cree un programa que tome la entrada de un entero positivo distinto de cero y genere los 4 números siguientes en la secuencia que se describe a continuación.

Nota: No es necesario verificar si la entrada es realmente un entero positivo distinto de cero

Secuencia:

Cada número en esta secuencia (aparte del primero, que es la entrada) estará compuesto de n dígitos, donde n es un número par. Si dividimos el número en n / 2 pares, para cada par, el primer dígito debería ser la cantidad de veces que el segundo dígito apareció en el número anterior

Explicación visual :
Considere este ejemplo "iniciador de secuencia" o entrada 6577
El siguiente número en la secuencia debería verse así 161527
porque la entrada tiene 1 "6", 1 "5" y 2 "7" s.

Si la entrada tiene demasiados dígitos (más de 9 de un solo dígito), no podrá obtener una salida correcta
Ejemplo: 111111111111(12 1's) El
siguiente número en secuencia debe describir 12 1's. Por lo tanto, lo dividimos en 9 1 y 3 1 (suma 9 + 3 = 12)
Siguiente número:9131

Debe iterar 4 veces para la entrada y generarla (ya sea devolver una lista / matriz de 4 enteros o generarla separándolos con un espacio, las nuevas líneas también son aceptables)

"El número se puede escribir de muchas maneras, ¿cómo lo escribo?" :
Si lo piensa, la entrada de ejemplo 6577también se puede escribir como 271516 (dos 7, uno 5, uno seis). Sin embargo, esta es una salida no válida. Debe iterar el número de izquierda a derecha. Por lo tanto, 161527. Si fuera 7657usted, iteraría la cantidad de 7, luego la cantidad de 6 y luego la cantidad de 5, por lo tanto, la salida válida sería271615

Ejemplo de E / S:

Entrada: 75
Salida:1715 211715 12311715 4112131715

Entrada: 1
Salida:11 21 1211 3112

Entrada: 111111111111(12 1's)
Salida:9131 192113 31191213 23411912


Esto es diferente a la pregunta "Di lo que ves", porque las secuencias son diferentes: https://oeis.org/A005150 <- Este devuelve números como este:
Entrada: 1211 Salida: 111221
Mientras que la secuencia que estoy pidiendo haría
Entrada: 1211 Salida: 3112

Las dos secuencias son diferentes y requieren algoritmos diferentes.
Mi secuencia solicitada: https://oeis.org/A063850 Secuencia
"Posible duplicado": https://oeis.org/A005150


Especificación importante:

Como no era lo suficientemente claro para algunas personas que intentaron responder a esta pregunta, la salida correcta para k caracteres donde k> 9 no es "kc" (donde c es char) sino 9c (k-9) c etc. Por lo tanto, salida correcta para 12 1 no es 121(12 1) sino 9131(9 1, (12-9) 1 y así sucesivamente)

Si tiene dudas, su código es incorrecto si alguna vez emite un número con una cantidad impar de dígitos (como 121), debería tener la salida de números de dígitos pares debido a la naturaleza de la secuencia.


Este es el tanto, el código con menos bytes gana.

P. Ktinos
fuente
Caso de prueba propuesto: 1111111111111111111(19 1's )
Emigna
Más estrechamente relacionado (todavía no engañado).
ETHproductions
¿Podemos generar una lista de enteros separados por comas? ¿Puede la salida comenzar con el entero de entrada (y, por lo tanto, tener una longitud 5)?
Greg Martin
En su último caso de prueba, ¿no debería ser el último número en 23411912lugar de 23411219?
Greg Martin
@GregMartin De hecho. Gracias por señalarlo. Pero no, no se le permite devolver una lista de enteros o enteros de salida separados con nada aparte de líneas nuevas o espacios. Y no, no deberías enviar la entrada
P. Ktinos

Respuestas:

6

PowerShell , 111104 bytes

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

Pruébalo en línea!

briantista
fuente
Dado que no lo usa $ien su bucle, ¿por qué no simplemente bucle directamente como$z=$args;0..3|%{...
AdmBorkBork
@AdmBorkBork Lo pensé pero sentí que sería más largo después de tener que asignar $args(y originalmente pensé que lo usaría $i). Iba a medirlo pero luego la pregunta se cerró.
briantist
@AdmBorkBork ... aaa y editado (gracias)
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

Pruébalo en línea!

varilla
fuente
La salida para 19 unidades 1111111111111111111es incorrecta. Debería ser 919111pero da919121
CSharpie 01 de
Salida incorrecta para muchos valores. Ejemplo: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , con la entrada de 11salida debería ser 21 1211 3112 132112, no entiendo por qué sale 111como la primera iteración que hace que toda la cadena vaya mal
P. Ktinos
@ P.Ktinos el formato de entrada era incorrecto, debe ser una cadena (debe ser el resto de las pruebas que estaba haciendo). Corregido el enlace
Rod
4

05AB1E , 30 23 21 bytes

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

Pruébalo en línea!

Explicación

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
fuente
@MagicOctopusUrn: Eso no funcionará para números con más de 9 repeticiones de un dígito, como el ejemplo en mi enlace TIO, por ejemplo.
Emigna
Ohhh ... lo tengo ahora.
Urna mágica del pulpo
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 no debería necesitar ser tan largo.

Greg Martin
fuente
1

C # 246 bytes

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})));}}}

Sin golf:

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

Pruébelo aquí (escriba la entrada en el marco inferior una vez que se compila y presione ENTRAR)

CSharpie
fuente
0

Jalea , 27 bytes

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

Pruébalo en línea!

El sucesivo s no pueden anidarse porque las cadenas no pueden anidarse.

Anidamiento con enlace separado: 27 bytes.

Imprimir en lugar de acumulación: 27 bytes.

Explicación

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
fuente
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:"");

Pruébalo en línea!

Jörg Hülsermann
fuente