Jogo de números anexados

16

Jogo de números anexados

Escreva uma função / programa que utilize 2 parâmetros inteiros, parâmetros inteiros ou variáveis ​​inteiras , um número inicial e uma contagem máxima de iterações. O código deve executar o exemplo de jogo a seguir para construir um novo número e repetir até que o número fique com um único dígito. por exemplo.

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

Basicamente, pegue cada dígito individual e adicione-o ao seu vizinho, acrescentando também o resultado da próxima adição.

A contagem máxima de iterações é para proteger loops infinitos e, quando o máximo for atingido, o código deverá despejar as últimas 5 etapas numéricas. A mesma saída deve ocorrer ao terminar, atingindo um único dígito. Se ocorrerem menos de 5 etapas, apenas produza os números válidos.

A saída deve aparecer como ( Step: Number) incluindo as últimas 5 etapas das etapas concluídas ou finalizadas:

func(3541, 50) produziria esse formato exato de saída:

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

func(3541, 5) produziria:

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

Todo o cálculo é:

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

Se houver menos de 5 etapas, imprima essas etapas.

Use apenas bibliotecas integradas, os parâmetros podem ser de qualquer lugar (o que for mais fácil para o seu idioma preferido). Não há limite para o tamanho máximo inteiro e, se houver estouros, deixe travar.

Dado que isso não é muito difícil do ponto de vista de um quebra-cabeça, darei até 25 de domingo, 20:00 (UTC + 8), para que as submissões sejam consideradas para a resposta aceita, quando o menor de qualquer idioma será o vencedor.

EDITAR:

Parabéns a Howard por vencer com uma resposta de 48 GolfScript .

Menção especial ao 2º lugar marinus com uma resposta de 66 APL .

Meu favorito pessoal (sendo influenciado pelo JavaScript) foi a resposta do core1024 .

Matt
fonte
Eu não entendo, é func(3541, 5)suposto imprimir 5 etapas ou 10?
20414 Tal
5 passos. Ele deve parar quando atingir a iteração 5, não executar mais iterações e imprimir as últimas 5 etapas. Acabei de incluir o conjunto completo de etapas para mostrar o processo de cálculo completo para essa entrada específica.
20514 Matt

Respostas:

4

GolfScript, 48 46 caracteres

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

Obrigado a Peter Taylor por uma melhoria de dois caracteres.

Espera os dois números na pilha. Experimente online .

Exemplos:

> 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
fonte
Há uma economia moderada adicionando um flip depois .,,e transformando o mapa final em apenas {': '*}%.
Peter Taylor
10

APL (66)

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

O argumento da esquerda é a contagem máxima de iterações e o argumento da direita é o número inicial.

Explicação:

  • ∆←⍺{... }⍕⍵: passe o argumento esquerdo como um número e o argumento certo como uma sequência para a função que calcula a lista de números e armazene-a em :
    • (1<⍴⍵)∧⍺>0:: se a quantidade de dígitos for maior que 1 e a quantidade de iterações restantes for maior que 0:
      • ⍎¨⍵: avalie cada dígito
      • 2+/: soma cada par
      • ⍕¨: formate cada número como uma sequência
      • ∆←,/: concatenar as cordas e armazenar em
      • ∆,(⍺-1)∇⊃∆: return , seguido pelo resultado da aplicação dessa função com menos uma iteração permitida
    • ⋄⍬: caso contrário, retorne a lista vazia
  • ∆,⍪⍳⍴∆: emparelhe cada elemento com seu índice em
  • {... }/: para cada par:
    • (⍕⍵),': ',⍺: retorna uma string com o índice, seguido por :, seguido pelo número
  • ↑¯5↑: transforme a lista de strings em uma matriz para que sejam exibidas em linhas separadas e pegue os últimos 5 itens

Teste:

      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
fonte
Esse identificador exibe menos de 5 etapas corretamente? Por exemplo 3 {...} 3541.
algorithmshark
@algorithmshark Ele faz agora (ele deu linhas extras com :primeiro)
marinus
5

Mathematica, 172 caracteres

Isso é longo demais, graças aos nomes das funções do Mathematica e ao feio manuseio de cordas (o "jogo" real é apenas 76 desses personagens), mas aqui está assim:

""<>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]

Ele espera o número de entrada na variável ne o número máximo de iterações em m.

Com menos golfe:

"" <> 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
fonte
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}

Não sou 100% claro sobre as regras de entrada, mas se nposso usar como uma sequência, posso salvar 5 caracteres e, se posso usar variáveis ​​predefinidas e escrever um programa em vez de uma função, posso salvar outras 9.

Cria uma função fque pode ser chamada da seguinte maneira:

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
fonte
2
Interessante observação de que 4 ou mais "9" s produz um resultado divergente
Digital Trauma
4

J - 96 92 char

Eu resolvi isso primeiro, assumindo que todos os jogos terminavam, e isso voltou a me morder durante os testes. Argumento à esquerda é o número de etapas, argumento à direita é a posição inicial, que pode ser fornecida como um número ou uma string.

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

Isso é um pouco demais e complicado para degolfar satisfatoriamente, então vou dizer o seguinte:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Esta parte executa o jogo pelo número especificado de etapas. 2+/\é responsável por adicionar cada par de dígitos e <@>:@[em conjunto com os ^:controles que capturam as etapas intermediárias do jogo.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Esta parte formata todos os resultados como step: result. ({.~,i.0:)é garantir que não tomemos muitos passos, #\sejam os números dos passos e o (,': '&,)&":"0bit adicione dois pontos e espaço.
  • (-@(<.5<.#){.])Essa parte corta as etapas relevantes de cinco ou menos da lista completa. <.significa 'mínimo de'.

Funciona, mas se você começar com um número grande o suficiente, os resultados do jogo começam a crescer rapidamente, o que faz com que J mude de números inteiros para duplos imprecisos. aqui estão alguns exemplos:

   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
algoritmshark
fonte
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])}

Ungolfed

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

Perl, 86 84

Com novas linhas para facilitar a leitura:

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

+ Editar: Não há desculpa para não usar a -nopção de linha de comando e a pontuação é 82 = 81 + 1 :

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

E, como possível excesso de número inteiro está bom, é 81 = 80 + 1

$.=$_;
print+(map$.=~s/.(?=(.|))/~$1?$&+$1:''/eg>1?"$_: $.$/":(),/ /..$')[-5..-1]
user2846289
fonte
Eu aprendi novas coisas. Impressionante!
core1024
2

Javascript, 247 278 288 307 Characters

 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,''))}

Formatado

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, ''))
}

Editar 1 : ternário removido

Editar 2 : lógica invertida para "pular" 0 índice

Editar 3 : Retrocedendo chamadas recursivas.

Violino

Origineil
fonte
Não se preocupe, nada para ver aqui. Pensei que estava imprimindo primeiro 5, mas deveria com o seu violino. Bom trabalho :)
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

Resultado:

$ ./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
fonte
2

JavaScript (Rascunho do 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'))

Exemplos:

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
fonte
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])}
Lanche
fonte
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]

Ungolfed:

<> =~ / /;
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 esteja tudo bem que imprima algumas linhas vazias extras se a coisa toda demorar menos de 5 etapas.

Tal
fonte
Substitua (('')x5, @o, "$i: $s")por (@o, "$i: $s")e join"\n", @o[-5..0]com join"\n", @o[-5..-1]. Então você estará com 3 bytes à frente;) #
core1024
Não tenho nenhum problema com linhas vazias extras.
Matt
@ core1024 Obrigado :) Eu ia te dar uma dica também, mas você já se livrou dessa parte longa "a menos"
Tal
1

Caracteres   Java      524 405 365 [414 bytes]

Versão Golfed: 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);}}

Versão legível:

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
fonte
Você pode reduzir isso usando 1 caractere para nomes de variáveis ​​e funções.
Lex Webb
Concluído ... também mudou a lógica para interromper a recursão usando num <= 9 em vez de digits.length == 1 (visto apenas neste segmento ... não me atingiu antes).
User12345
você pode reduzir o comprimento do nome do argumento no método principal, que fornecerá 3 caracteres adicionais
user902383
Você não precisa converter string para array de caracteres, você pode acessar um único caractere de string usando chatAtmétodo
user902383
11
ea última coisa, você não precisa de converter o seu personagem para cordas e, em seguida, analisá-lo, em vez Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");você poderia fazer(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'))}

Ungolfed:

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
fonte
O único problema é que o nome da função é igual a uma de suas variáveis ​​:) Mas a técnica é incrível.
22414 Matt
Bom ponto! Eu
renomeei
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);}}}

Formatado:

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

Graças a user902383, consegui reduzir o código em 30 caracteres, não dividindo a String em uma matriz usando -96 em vez de "Integer.valueOf ()

Thomas Rüping
fonte
você ainda pode reduzir alguns 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 21/05
0

Dardo, 602 588 bytes

O dardo é provavelmente um dos piores idiomas para fazer isso ... Preciso encontrar uma maneira melhor de fazer isso.

Enfim, aqui está a minha entrada:

Entrada através do console

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

E a versão ungolfed, um pouco unminified:

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

PERL 135 129/125 125/121 bytes

Tem o mesmo bug que a resposta 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 uma função:

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 uma função:

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 um script de console (sem o 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 um script de console (sem o 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]
}

Teste com c(372,4);:

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

Teste com c(3541,50);:

6: 1411
7: 552
8: 107
9: 17
10: 8
core1024
fonte
Eu acredito que você só deve imprimir os últimos 5 passos.
Tal
Entendi fixo;)
core1024
E você ainda está 3 bytes à minha frente ... exploda! : p
Tal
@Tal Estamos quites agora: 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);}

Legível:

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)

Resultado:

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

Cobra - 363

Um resultado bastante deprimente ... mas ei, eu ainda venci o Java.

Ele deve ser imune a estouros de inteiros para casos de teste práticos.

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

Python 2.7, 174 173 158 caracteres

Usando muitas strings para executar a tarefa.

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

Versão que define uma função

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:])

Versão ligeiramente não destruída:

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

exemplo de uso:

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

Para torná-lo mais legível, use putStr:

λ> putStr $ 3541#5
1: 1411
2: 552
3: 107
4: 17
5: 8
Flonk
fonte
Você precisa listar apenas as últimas 5 etapas do cálculo. Tente putStr $ 3541#50e compare com o exemplo do OP. Caso contrário, fico feliz que tenha um sujeito Haskell aqui.
Core1024 22/05
@ core1024 Sim! Embora eu os tenha rotulado errado, você está certo. Eu vou consertar isso amanhã.
Flonk 27/05
0

Groovy - 191 182 caracteres

Com base na solução de Thomas Rüping , portada para o 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}

Execução e saída:

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

Ungolfed:

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

Um pouco menos golfe (minigolfe?)

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

}

Apenas aloque memória suficiente para armazenar cinco resultados ciclicamente. O loop externo continua até atingirmos o limite ou atingirmos um único dígito. O loop interno adiciona o último dígito do número ao último dígito de 1/10 do número e adiciona isso, multiplicado pela potência relevante de 10 ao resultado. Divida o número que você primeiro pensou por 10 e repita para obter o total. Em seguida, imprima até os últimos cinco resultados.

O próximo desafio é ver se consigo me barbear o suficiente para vencer algumas linguagens de script no golfe.

Edit: Agora compila com aviso, mas cinco caracteres são removidos removendo a declaração "void"

Alquimista
fonte
Dicas de golfe: f (int a, int z) -> f (a, z) e pode usar t = 10 economizando mais 2 caracteres. Mas usando um e a / = 10 na mesma expressão é indefinida
edc65
0

C # - 309 330 320 306 bytes

Versão Golfed:

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

Versão ungolfed para legibilidade:

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

Sugestões para melhoria são sempre bem-vindas! ;)

Edit: Removido String.Empty e substituiu-o por "" para economizar 10 bytes.

Edit 2: Graças a malik pela dica com as cordas!

tsavinho
fonte
Você não precisa .ToCharArray(). Uma string = matriz de caracteres
jzm
Ah, e outra coisa que você pode fazer é, em vez de .ToString(), faça+""
JZM