Juego de Números Anexos

16

Juego de Números Anexos

Escriba una función / programa que tome 2 parámetros enteros parámetros enteros o variables enteras , un número de inicio y un recuento máximo de iteraciones. El código debe realizar el siguiente ejemplo de juego para construir un nuevo número y repetirlo hasta que quede un solo dígito. p.ej.

3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1

Básicamente, tomar cada dígito individual y agregarlo a su vecino, y luego agregar el resultado de la próxima adición también.

El recuento máximo de iteraciones es para proteger bucles infinitos, y cuando se alcanza el máximo, el código debe volcar los últimos 5 pasos numéricos. Debe producirse la misma salida al finalizar al alcanzar un solo dígito. Si ocurrieron menos de 5 pasos, solo envíe los números válidos.

La salida debería aparecer como ( Step: Number) incluyendo los últimos 5 pasos de los pasos terminados o terminados:

func(3541, 50) produciría este formato de salida exacto:

6: 1411
7: 552
8: 107
9: 17
10: 8

func(3541, 5) produciría:

1: 895
2: 1714
3: 885
4: 1613
5: 774

Todo el cálculo es:

1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8

Si hay menos de 5 pasos, simplemente imprima los pasos dados.

Solo use bibliotecas incorporadas, los parámetros pueden ser desde cualquier lugar (lo que sea más fácil para el idioma que elija). No hay límite en el tamaño entero máximo, y si hay desbordamientos, déjelo bloquearse.

Dado que esto no es demasiado difícil desde el punto de vista del rompecabezas, daré hasta el domingo 25 a las 8 p.m. (UTC + 8) para que las propuestas sean consideradas para la respuesta aceptada, en cuyo punto el más corto de cualquier idioma será el ganador.

EDITAR:

Felicitaciones a Howard, que ganó con una respuesta de 48 GolfScript .

Mención especial al 2do lugar marinus con una respuesta de 66 APL .

Mi favorito personal (sesgado hacia JavaScript) fue la respuesta de core1024 .

Mate
fuente
No entiendo, ¿se func(3541, 5)supone que imprima 5 pasos o 10?
Tal
5 pasos Debe detenerse cuando llegue a la iteración 5, no realizar más iteraciones e imprimir los últimos 5 pasos. Acabo de incluir el conjunto completo de pasos para mostrar el proceso de cálculo completo para esa entrada en particular.
Matt

Respuestas:

4

GolfScript, 48 46 caracteres

{.`n*[~]n\{:s++s}*;~}*].,,\]zip{': '*}%1>-5>n*

Gracias a Peter Taylor por una mejora de dos personajes.

Espera ambos números en la pila. Pruebe en línea .

Ejemplos:

> 4 50

> 141 50
1: 55
2: 10
3: 1

> 3541 50
6: 1411
7: 552
8: 107
9: 17
10: 8

> 3541 5
1: 895
2: 1714
3: 885
4: 1613
5: 774
Howard
fuente
Hay un ahorro moderado al agregar un volteo después .,,y convertir el mapa final en justo {': '*}%.
Peter Taylor
10

APL (66)

{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}

El argumento izquierdo es el recuento máximo de iteraciones y el argumento derecho es el número de inicio.

Explicación:

  • ∆←⍺{... }⍕⍵: pase el argumento izquierdo como un número y el argumento derecho como una cadena a la función que calcula la lista de números, y guárdelo en :
    • (1<⍴⍵)∧⍺>0:: si la cantidad de dígitos es mayor que 1 y la cantidad de iteraciones restantes es mayor que 0:
      • ⍎¨⍵: evaluar cada dígito
      • 2+/: suma cada par
      • ⍕¨: formatea cada número como una cadena
      • ∆←,/: concatenar las cadenas y almacenar en
      • ∆,(⍺-1)∇⊃∆: return , seguido del resultado de aplicar esta función a con una iteración menos permitida
    • ⋄⍬: si no, devuelve la lista vacía
  • ∆,⍪⍳⍴∆: emparejar cada elemento de con su índice en
  • {... }/: para cada par:
    • (⍕⍵),': ',⍺: devuelve una cadena con el índice, seguido de :, seguido del número
  • ↑¯5↑: convierte la lista de cadenas en una matriz para que se muestren en líneas separadas y tome los últimos 5 elementos

Prueba:

      5{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}3541
1: 895 
2: 1714
3: 885 
4: 1613
5: 774 
      50{↑¯5↑{(⍕⍵),': ',⍺}/∆,⍪⍳⍴∆←⍺{(1<⍴⍵)∧⍺>0:∆,(⍺-1)∇⊃∆←,/⍕¨2+/⍎¨⍵⋄⍬}⍕⍵}3541
6: 1411
7: 552 
8: 107 
9: 17  
10: 8  
marinus
fuente
¿Este maneja pantallas de menos de 5 pasos correctamente? Por ej 3 {...} 3541.
algorithmshark
@algorithmshark Lo hace ahora (dio líneas adicionales con el :primero)
marinus
5

Mathematica, 172 caracteres

Esto es demasiado largo, gracias a los nombres de funciones de Mathematica y al manejo feo de cadenas (el "juego" real es solo 76 de esos caracteres), pero aquí está de todos modos:

""<>ToString/@(f=Flatten)@Take[Thread@{r=Range@Length[s=Rest@Cases[NestList[FromDigits[f@(d=IntegerDigits)[Tr/@Partition[d@#,2,1]]]&,n,m],i_/;i>0]],": "&/@r,s,"\n"&/@r},-5]

Espera el número de entrada en variable ny el número máximo de iteraciones en m.

Con menos golf:

"" <> ToString /@
  (f = Flatten)@
   Take[
    Thread@{
      r = Range@Length[
         s = Rest@Cases[
            NestList[                 
             FromDigits[
               f@(d = IntegerDigits)[Tr /@ Partition[d@#, 2, 1]]] &,
             n,
             m
             ],
            i_ /; i > 0
            ]
         ],
      ": " & /@ r,
      s,
      "\n" & /@ r
      },
    -5
    ]
Martin Ender
fuente
5

Ruby, 106 caracteres

f=->n,m{s=0
$*<<"#{s}: #{n=n.to_s.gsub(/.\B/){eval$&+?++$'[0]}.chop}"until n.to_i<10||m<s+=1
puts$*.pop 5}

No estoy 100% claro sobre las reglas de entrada, pero si puedo tomar n como una cadena puedo guardar 5 caracteres, y si puedo usar variables predefinidas y escribir un programa en lugar de una función, puedo guardar otros 9.

Crea una función fque se puede llamar de la siguiente manera:

f[3541, 6]

2: 1714
3: 885
4: 1613
5: 774
6: 1411

f[372, 50]

1: 109
2: 19
3: 10
4: 1

f[9999, 10]

6: 99999999999
7: 18181818181818181818
8: 9999999999999999999
9: 181818181818181818181818181818181818
10: 99999999999999999999999999999999999
Paul Prestidge
fuente
2
Observación interesante de que 4 o más "9" s producen un resultado divergente
Digital Trauma
4

J - 96 92 char

Primero resolví esto asumiendo que todos los juegos terminaron, y esto volvió a morderme el culo durante las pruebas. El argumento izquierdo es el número de pasos, el argumento derecho es la posición inicial, que se puede dar como un número o una cadena.

([(-@(<.5<.#){.])(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".@(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":))

Esto es demasiado complicado y complicado para degolfar satisfactoriamente, así que diré esto:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Esta parte ejecuta el juego durante el número especificado de pasos. 2+/\es responsable de agregar cada par de dígitos, y <@>:@[en conjunto con los ^:controles que capturan los pasos intermedios del juego.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Esta parte formatea todos los resultados como step: result. ({.~,i.0:)es asegurarse de que no damos demasiados pasos, #\son los números de paso y el (,': '&,)&":"0bit agrega los dos puntos y el espacio.
  • (-@(<.5<.#){.])Esta porción elimina los cinco o menos pasos relevantes de la lista completa. <.significa 'mínimo de'.

Funciona, pero si comienzas con un número lo suficientemente grande, los resultados del juego comienzan a crecer rápidamente, lo que hace que J cambie de enteros a dobles imprecisos. Aquí hay unos ejemplos:

   f =: ([(-@(<.5<.#){.])(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".@(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":))
   5 f 3541
1: 895
2: 1714
3: 885
4: 1613
5: 774
   50 f 3541
6: 1411
7: 552
8: 107
9: 17
10: 8
   100 f 372
1: 109
2: 19
3: 10
4: 1
Algoritmo de tiburón
fuente
3

Javascript 139 144 150

function f(a,n){for(r=[a+=''];n--&&a[1];r.push(a=t))for(t='',i=0;a[++i];)t+=a[i-1]- -a[i];for(i=0;r[++i];)r[i+5]||console.log(i+': '+r[i])}

Sin golf

function f(a,n)
{
  for (r=[a+='']; n-- && a[1]; r.push(a=t))
  {
    for (t = '', i = 0; a[++i]; )
    {
      t += a[i-1]- -a[i]; /* -char force conversion to number */
    }
  }   
  for (i = 0; r[++i];) r[i+5]||console.log(i+': '+r[i])
}
edc65
fuente
3

Perl, 86 84

Con nuevas líneas de legibilidad:

$s+=$_=<>;
print+(map$s=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $s$/":(),/ /..$')[-5..-1]

+ Editar: No hay excusa para no usar el -ninterruptor de línea de comando, y luego la puntuación es 82 = 81 + 1 :

$s+=$_;
print+(map$s=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $s$/":(),/ /..$')[-5..-1]

Y, si el posible desbordamiento de enteros es correcto, es 81 = 80 + 1

$.=$_;
print+(map$.=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $.$/":(),/ /..$')[-5..-1]
usuario2846289
fuente
Aprendí nuevas cosas. ¡Increíble!
core1024
2

Javascript, 247 278 288 307 Caracteres

 var t=[],q=1;function f(a,c){var x=a.toString().split(''),r='',p=parseInt;for(y in x){var i=p(y);if(i){r+=(p(x[i])+p(x[i-1])).toString();}}if(c!=0&&a>10){t.push(q+++':'+r+'\n');if(q>6){t.shift()}f(r,c-1);}console.log(t.join(',').replace(/,/g,''))}

Formateado

var t = [],
q = 1;

function f(a, c) {
 var x = a.toString().split(''),
    r = '',
    p = parseInt;
 for (y in x) {
    var i = p(y);
    if (i) {
        r += (p(x[i]) + p(x[i - 1])).toString();
    }
 }
 if (c != 0 && a > 10) {
    t.push(q+++':' + r + '\n');
    if (q > 6) {
        t.shift()
    }
    f(r, c - 1);
 }
 console.log(t.join(',').replace(/,/g, ''))
}

Edición 1 : eliminado ternario

Edición 2 : lógica invertida para "omitir" el índice 0

Edición 3 : llamadas recursivas reelaboradas.

Violín

Origineil
fuente
No te preocupes, nada que ver aquí. Pensé que estaba imprimiendo los primeros 5 pero debería hacerlo con tu violín. Buen trabajo :)
Matt
2

Bash + coreutils, 115 bytes

for((a=$1;++i<=$2&a>9;)){
a=`paste -d+ <(fold -1<<<${a%?}) <(fold -1<<<${a#?})|bc|tr -d '
'`
echo $i: $a
}|tail -n5

Salida:

$ ./appended-number.sh 3541 50
6: 1411
7: 552
8: 107
9: 17
10: 8
$ ./appended-number.sh 3541 5
1: 895
2: 1714
3: 885
4: 1613
5: 774
$ 
Trauma digital
fuente
2

JavaScript (borrador de ECMAScript 6) - 134 caracteres

f=(x,y,i=0,j=[])=>([m=''].map.call(m+x,(z,p,n)=>m+=p?+z+1*n[p-1]:m),j[i++]=i+': '+m,m.length>1&&i<y?f(m,y,i,j):j.slice(-5).join('\n'))

Ejemplos:

f(372,5)
"1: 109
2: 19
3: 10
4: 1"

f(3541,50)
"6: 1411
7: 552
8: 107
9: 17
10: 8"

f(3541,5)
"1: 895
2: 1714
3: 885
4: 1613
5: 774"
MT0
fuente
1

Javascript, 182 bytes

function f(I,T){s=[],x=1;for(;;){d=(""+I).split("");l=d.length;if(l==1||x>T)break;for(I="",i=1;i<l;)I+=+d[i-1]+ +d[i++];s.push(x+++": "+I)}s=s.slice(-5);for(i in s)console.log(s[i])}
Bocadillo
fuente
1

Perl, 166 147 138 129 bytes

<>=~/ /;for$i(1..$'){@n=split'',$s||$`;$s=join'',map{$n[$_]+$n[$_+1]}0..@n-2;@o=(@o,"$i: $s");$s<10&&last}print join$/,@o[-5..-1]

Sin golf:

<> =~ / /;
for $i (1..$') {
    @n = split'', $s||$`;
    $s = join'',map {$n[$_]+$n[$_+1]} 0..@n-2;
    @o = (@o, "$i: $s");
    $s<10 && last
}
print join$/,@o[-5..-1]

Espero que esté bien que imprima algunas líneas vacías adicionales si todo toma menos de 5 pasos.

Tal
fuente
Reemplazar (('')x5, @o, "$i: $s")con (@o, "$i: $s")y join"\n", @o[-5..0]con join"\n", @o[-5..-1]. Entonces estarás 3 bytes por delante;)
core1024
No tengo ningún problema con las líneas vacías adicionales.
Matt
@ core1024 Gracias :) Iba a darte una propina también, pero ya te deshiciste de esa larga parte "a menos que"
Tal
1

Java      524   405 365 caracteres [414 bytes]

Versión de golf: class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}

Versión legible:

class AddDigits {
static int n = 0;
List<String> steps = new ArrayList<>();

void count(int num, int count) {
    String digits = num + "";
    if (count == 0 || num <= 9) {
        int stepsSize = steps.size();
        for (int i = stepsSize >= 5 ? stepsSize - 5 : 0; i < stepsSize; i++) {
            System.out.println(steps.get(i));
        }
        return;
    }
    String line = "";
    for (int i = 0; i < digits.length() - 1; i++) {
        line += digits.charAt(i) + digits.charAt(i + 1) - 96;
    }
    steps.add(++n + ":" + line);
    count(Integer.valueOf(line), --count);
}

public static void main(String[] args) {
    new AddDigits().count(3541, 50);
}
}
user12345
fuente
Puede reducir esto usando 1 char para nombres de variables y funciones.
Lex Webb
Hecho ... también cambió la lógica para detener la recursión usando num <= 9 en lugar de digits.length == 1 (Visto solo en este hilo ... no me golpeó antes).
user12345
podría reducir la longitud del nombre del argumento en su método principal, que le dará 3 caracteres adicionales
user902383
no necesita convertir una cadena en una matriz de caracteres, puede acceder a un solo carácter desde la cadena utilizando el chatAtmétodo
user902383
1
y por último, no necesitas convertir tu personaje en cadena y luego analizarlo, en Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");su lugar podrías hacerlo(digits[i] + digits[i+1] - 96)
user902383
1

JavaScript 133 bytes

function f(n,g){for(c=r=[];g--;(n=s)&&(r[c++]=c+': '+s))for(i=s='',n+=s;n[++i];s+=n[i]-+-n[i-1]);console.log(r.slice(-5).join('\n'))}

Sin golf:

function sums(num, guard) {
    for(count = res = [];guard--;(num = sum) && (res[count++] = count + ': ' + sum))
        for(i = sum = '',num += sum;num[++i];sum += num[i] -+- num[i-1]);
    console.log(res.slice(-5).join('\n'))
}
core1024
fuente
El único problema es que el nombre de la función es el mismo que una de sus variables :) Pero la técnica es increíble.
Matt
¡Buen punto!
Cambié
1

Java, 341 caracteres 371 caracteres

 class a{public static void main(String[] a){p(3541,50);}static void p(int n,int k){Queue<String>q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}

Formateado:

class a {
public static void main(String[] a) {
    p(3541, 50);
}

static void p(int n, int k) {
    Queue<String> q = new LinkedList();
    int c = 0;
    while (n > 9 && c < k) {
        c++;
        String r = "";
        String p = "" + n;
        for (int i = 0; i < p.length() - 1; i++)
            r += ((p.charAt(i) + p.charAt(i + 1) - 96));
        n = Integer.parseInt(r);
        q.add(c + ": " + n);
        if (q.size() > 5)
            q.remove();
    }
    for (String s : q) {
        System.out.println(s);
    }
}}

Gracias al usuario 902383 pude reducir el código en 30 caracteres, al no dividir la cadena en una matriz y usar -96 en lugar de "Integer.valueOf ()

Thomas Rüping
fuente
aún podría reducir algunos caracteres,class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
user902383
0

Dart, 602 588 bytes

Dart es probablemente uno de los peores idiomas para hacer esto ... Necesito encontrar una mejor manera de hacerlo.

De todos modos, aquí está mi entrada:

Entrada a través de la consola

var steps={};void main(a){c(a[0],int.parse(a[1]));}void c(inp,m){int i=0;int n=int.parse(inp);while(++i<=m){n=addUp(n.toString());steps[i]=n;if(n<10)break;}printSteps();}int addUp(n){var ns=[];for(int i=0;i<n.length;i++){try{ns.add(n[i]+n[i+1]);}catch(e){}}return addNumbers(ns);}int addNumbers(ns){var it=ns.iterator;var s="";while(it.moveNext()){int i=0;for(var t in it.current.split('')){i+=int.parse(t);}s=s+i.toString();}return int.parse(s);}void printSteps(){int l=steps.length;for(int i=getStart(l);i<=l;i++){print("${i}:\t${steps[i]}");}}int getStart(l){int m=l-4;return m>0?m:1;}

Y la versión ungolfed, unminminified:

var steps = {};

void main(a)
{
    c(a[0], int.parse(a[1]));
}

void c(String input, int max)
{
    int i = 0;
    int n = int.parse(input);

    while(++i <= max)
    {
        n = addUp(n.toString());

        steps[i] = n;

        if(n < 10)
            break;
    }

    printSteps();
}

int addUp(String n)
{
    List numbers = [];

    for(int i = 0; i < n.length; i++)
    {
        try
        {
            numbers.add(n[i] + n[i + 1]);
        }
        catch(e){}
    }

    return addNumbers(numbers);
}

int addNumbers(List numbers)
{
    Iterator it = numbers.iterator;

    String s = "";

    while(it.moveNext())
    {
        int i = 0;
        for(String s in it.current.split(''))
        {
            i += int.parse(s);
        }

        s = s + i.toString();
    }

    return int.parse(s);
}

void printSteps()
{
    int l = steps.length;

    for(int i = getStart(l); i <= l; i++)
    {        
        print("${i}:\t${steps[i]}");
    } 
}

int getStart(int l)
{
    int m = l - 4;
    return m > 0 ? m : 1;
}
MisterBla
fuente
0

PERL 135 129/125 125/121 bytes

Tiene el mismo error que la respuesta de Tal

sub c{($e,$l)=@_;print join"\n",(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2};++$c.": ".($e=$s)}1..$l)[-5..-1]}

Edite 129 bytes como una función:

sub c{($e,$l)=@_;print join$/,(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s)}1..$l)[-5..-1]}

125 bytes como una función:

sub c{($e,$l)=@_;print+(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s).$/}1..$l)[-5..-1]}

125 bytes como un script de consola (sin el hashbang):

($e,$l)=@ARGV;print join$/,(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s)}1..$l)[-5..-1]

121 bytes como un script de consola (sin el hashbang):

($e,$l)=@ARGV;print+(grep/\d$/,map{$s="";{$e=~/(.)(.)/;redo if""ne($e=$2.$')and$s.=$1+$2}"$_: ".($e=$s).$/}1..$l)[-5..-1]

Expandido:

sub c
{
    ($e, $l) = @_;
    print +(grep /\d$/, map {
        $s="";
        {
            $e =~ /(.)(.)/;
            redo if "" ne ($e = $2.$') and $s .= $1 + $2
        }
        "$_: ".($e = $s).$/
    } 1 .. $l)[-5 .. -1]
}

Prueba con c(372,4);:

[blank line]
1: 109
2: 19
3: 10
4: 1

Prueba con c(3541,50);:

6: 1411
7: 552
8: 107
9: 17
10: 8
core1024
fuente
Sin embargo, creo que solo debes imprimir los últimos 5 pasos.
Tal
Lo solucioné;)
core1024
Y todavía estás 3 bytes por delante de mí ... ¡pásalo bien! : p
Tal
@Tal Incluso estamos ahora: D
core1024
0

C # - 269

void F(int x,int y){var o=new List<string>();var i=x+"";for(int n=1;n<y&&i.Length>1;n++){var s="";for(int z=0;z<i.Length;z++){int a=i[z]-'0';var t=a+(z+1!=i.Length?i[z+1]-'0':-a);if(t!=0)s+=t;}i=s;o.Add(n+": "+i);}foreach(var p in o.Skip(o.Count-5))Debug.WriteLine(p);}

Legible:

void F(int x,int y){
    var o=new List<string>();
    var i=x+"";
    for(int n=1;n<y&&i.Length>1;n++)
    {
        var s="";
        for(int z=0;z<i.Length;z++){
            int a=i[z]-'0';
            var t=a+(z+1!=i.Length?i[z+1]-'0':-a);
            if(t!=0)
                s+=t;
        }
        i=s;
        o.Add(n+": "+i);
    }
    //Output
    foreach(var p in o.Skip(o.Count-5))
        Debug.WriteLine(p);
}

Uso:

F(3541, 50)

Salida:

6: 1411
7: 552
8: 107
9: 17
10: 8
jzm
fuente
0

Cobra - 363

Un resultado bastante deprimente ... pero bueno, todavía vencí a Java.

Se debe ser inmune a desbordamientos de enteros para casos de pruebas prácticas.

class P
    cue init(a,b)
        base.init
        l=[]
        c=.p(a.toString)
        for x in b
            l.add("")
            y=l.count
            for i in c.count-1,l[y-1]+=(c[i]+c[i+1]).toString
            if l.last.length<2,break
            c=.p(l.last)
        z=if(y>5,y-5,0)
        for x in l[z:y],print"[z+=1]:",x
    def p(n) as List<of int>
        c=List<of int>()
        for i in n,c.add(int.parse(i.toString))
        return c
Οurous
fuente
0

Python 2.7, 174 173 158 caracteres

Usando muchas cadenas para hacer la tarea.

x,n=raw_input().split()
o,i=[],0
while int(n)>i<o>9<x:x="".join(`sum(map(int,x[j:j+2]))`for j in range(len(x)-1));i+=1;o+=[`i`+": "+x]
print"\n".join(o[-5:])

Python 2.7, 155 caracteres

Versión que define una función

def a(x,n):
 o,i,x=[],0,`x`
 while n>i<o>9<int(x):x="".join(`sum(map(int,x[j:j+2]))`for j in range(len(x)-1));i+=1;o+=[`i`+": "+x]
 print"\n".join(o[-5:])

Versión ligeramente no golfista:

x,n=map(int,raw_input().split())
o,i=[],1
while i<=n and x>9:
  x=int("".join(`sum(map(int,`x`[j:j+2]))` for j in range(len(`x`)-1)))
  o.append("%d: %d"%(i,x))
  i+=1
print "\n".join(o[-5:])
avall
fuente
0

Haskell, 154

s=show
z=zipWith
m#n=concat.z(\a b->s a++": "++b++"\n")[1..].(\x->drop(length x-n)x).takeWhile(/="").iterate((\x->z(+)x(tail x)>>=s).map(\x->read[x]))$s m

ejemplo de uso:

λ> 3541#5
"1: 1411\n2: 552\n3: 107\n4: 17\n5: 8\n"

Para hacerlo más legible, use putStr:

λ> putStr $ 3541#5
1: 1411
2: 552
3: 107
4: 17
5: 8
Flonk
fuente
Debe enumerar solo los últimos 5 pasos fuera del cálculo. Intenta putStr $ 3541#50compararlo con el ejemplo del OP. De lo contrario, me alegra que haya un chico Haskell aquí.
core1024
@ core1024 lo hace! Aunque los etiqueté mal, tienes razón. Lo arreglaré mañana.
Flonk
0

Maravilloso - 191 182 caracteres

Basado en la solución de Thomas Rüping , portada a Groovy 2.2.1:

f={it as int};n=args[0];s=f args[1];q=[];x=0;while(f(n)>9&&x<s){x++;d=n.split("");n="";for(i in 1..d.length-2)n+=f(d[i])+f(d[i+1]);q << "$x: $n"};q[-1..5].reverse().each{println it}

Ejecución y salida:

bash$ groovy Numbers.groovy 3541 50 
6: 1411
7: 552
8: 107
9: 17
10: 8

Sin golf:

f = {it as int}
n = args[0]
s = f args[1]

queue = []
stepCounter = 0

while (f(n) > 9 && stepCounter < s) {
    stepCounter++
    digits=n.split("")
    n=""
    for(i in 1..digits.length-2) {
        n += f(digits[i]) + f(digits[i+1])
    }
    queue << "$stepCounter: $n"
}

queue[-1..5].reverse().each{ println it }
Michael Easter
fuente
0

** C 186 179 174 **

f(int a,int z){for(int c,d,i,j=0,m[5];m[j++%5]=a,j<=z&&a/10;a=c)for(c=0,i=1;a/10;d=a%10+(a/=10)%10,c+=d*i,i*=d<10?10:100);for(i=j<5?0:j-5;i<j;printf("%d: %d\n",i,m[i++%5]));}

Ligeramente menos golfizado (¿mini golf?)

f(int a, int z)
{


for(int c,d,i,j=0,m[5];m[j++%5]=a,j<=z&&a/10;a=c)
    for(c=0,i=1;a/10;d=a%10+(a/=10)%10,c+=d*i,i*=d<10?10:100);

    for(i=j<5?0:j-5;i<j;printf("%d: %d\n",i,m[i++%5]));

}

Simplemente asigne suficiente memoria para almacenar cinco resultados cíclicamente. El bucle externo continúa hasta que alcanzamos el límite o alcanzamos un solo dígito. El bucle interno agrega el último dígito del número al último dígito de 1/10 del número y agrega esto, multiplicado por la potencia relevante de 10 al resultado. Divida el número que pensó primero por 10 y repita para obtener el total. Luego imprima hasta los últimos cinco resultados.

El próximo desafío es ver si puedo reducir lo suficiente como para superar algunos lenguajes de scripting en el golf.

Editar: ahora se compila con advertencia, pero se eliminan cinco caracteres al eliminar la declaración "nula"

Alquimista
fuente
Consejos de golf: f (int a, int z) -> f (a, z) y podría usar t = 10 ahorrando 2 caracteres más. Pero el uso de
ay
0

C # - 309 330 320 306 Bytes

Versión de golf:

private static void F(int aN,int aM){var s=new List<string>();var n=aN.ToString();for(int i=1;i<=aM;i++){int z=n.Length;if(z==1){break;}var a=n;n="";for(int j=0;j<z-1;j++){int r=a[j]-'0'+a[j + 1]-'0';n=n+r;}s.Add(i+": "+n);}int l=s.Count;int p=5;if(l<5){p=l;}for(int k=l-p;k<l;k++){Debug.WriteLine(s[k]);}}

Uso: F (3541,50);

Versión sin golf para facilitar la lectura:

private static void AppendNumbers(int aNum, int aMaxSteps)
    {
        var results = new List<string>();
        var numString = aNum.ToString();
        for (int i = 1; i <= aMaxSteps; i++)
        {
            int stringLength = numString.Length;
            if (stringLength == 1)
            {
                break;
            }
            var a = numString;
            numString = "";
            for (int j = 0; j < stringLength-1; j++)
            {
                int additionResult = a[j]-'0' + (a[j + 1]-'0');
                numString = numString + additionResult;
            }
            results.Add(i+": "+ numString);
        }
        int numberOfResults = results.Count;
        int p = 5;
        if (numberOfResults < 5)
        {
            p = numberOfResults;
        }
        for (int k = numberOfResults - p; k < numberOfResults; k++)
        {
            Debug.WriteLine(results[k]);
        }
    }

¡Las sugerencias de mejora son siempre bienvenidas! ;)

Editar: Se eliminó String.Empty y se reemplazó con "" para guardar 10 Bytes.

Edición 2: ¡ Gracias a malik por el consejo con las cuerdas!

tsavinho
fuente
Usted no necesita .ToCharArray(). A string = char array
jzm
Ah, y otra cosa que puedes hacer es, en lugar de .ToString()hacerlo+""
jzm