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 .


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

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  

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
    ]

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

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

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

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]

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


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
$ 

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"

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

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.


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

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

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


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

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

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

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

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

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

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 }

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"


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!


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.