Gioco di numeri aggiunti


16

Gioco di numeri aggiunti

Scrivi una funzione / programma che accetta 2 parametri interi, parametri interi o variabili intere , un numero iniziale e un conteggio massimo di iterazioni. Il codice dovrebbe eseguire il seguente esempio di gioco per costruire un nuovo numero e ripetere fino a quando il numero è a una sola cifra. per esempio.

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

Fondamentalmente, prendendo ogni singola cifra e aggiungendola al suo vicino, quindi aggiungendo anche il risultato della prossima aggiunta.

Il conteggio massimo di iterazioni serve a salvaguardare infiniti loop e, quando viene raggiunto il numero massimo, il codice dovrebbe eseguire il dump degli ultimi 5 passaggi numerici. Lo stesso risultato dovrebbe verificarsi al termine raggiungendo una singola cifra. Se si verificano meno di 5 passaggi, emettere solo i numeri validi.

L'output dovrebbe apparire come ( Step: Number) inclusi gli ultimi 5 passaggi dei passaggi finiti o terminati:

func(3541, 50) produrrebbe questo esatto formato di output:

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

func(3541, 5) produrrebbe:

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

L'intero calcolo è:

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

Se ci sono meno di 5 passaggi, basta stampare quei passaggi.

Usa solo librerie integrate, i parametri possono essere ovunque (qualunque sia la più semplice per la tua lingua preferita). Nessun limite per le dimensioni massime dei numeri interi e, in caso di overflow, lasciare che si blocchi.

Dato che questo non è troppo difficile da un punto di vista enigmistico, darò fino a domenica 25, 20:00 (UTC + 8) affinché gli invii vengano considerati per la risposta accettata, a quel punto il più breve di qualsiasi lingua sarà il vincitore.

MODIFICARE:

Congratulazioni a Howard, vincendo con una risposta GolfScript 48 .

Menzione speciale al 2 ° posto marinus con una risposta 66 APL .

Il mio preferito personale (essendo di parte verso JavaScript) era la risposta di core1024 .


Non capisco, func(3541, 5)dovrebbe stampare 5 passaggi o 10?
Tal,

5 passaggi. Dovrebbe arrestarsi quando raggiunge l'iterazione 5, non eseguire più iterazioni e stampare gli ultimi 5 passaggi. Ho appena incluso la serie completa di passaggi per mostrare l'intero processo di calcolo per quel particolare input.
Matt,

Risposte:


4

GolfScript, 48 46 caratteri

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

Grazie a Peter Taylor per un miglioramento di due personaggi.

Si aspetta entrambi i numeri in pila. Prova online .

Esempi:

> 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

C'è un moderato risparmio aggiungendo un capovolgimento dopo .,,e trasformando la mappa finale in solo {': '*}%.
Peter Taylor,

10

APL (66)

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

L'argomento sinistro è il conteggio massimo di iterazioni e l'argomento destro è il numero iniziale.

Spiegazione:

  • ∆←⍺{...}⍕⍵ : passa l'argomento sinistro come numero e l'argomento destro come stringa alla funzione che calcola l'elenco di numeri e memorizzalo in :
    • (1<⍴⍵)∧⍺>0:: se la quantità di cifre è maggiore di 1 e la quantità di iterazioni rimaste è maggiore di 0 :
      • ⍎¨⍵: valuta ogni cifra
      • 2+/: somma ogni coppia
      • ⍕¨: formatta ogni numero come una stringa
      • ∆←,/: concatena le stringhe e archivia
      • ∆,(⍺-1)∇⊃∆: return , seguito dal risultato dell'applicazione di questa funzione con una iterazione in meno consentita
    • ⋄⍬: in caso contrario, restituisce l'elenco vuoto
  • ∆,⍪⍳⍴∆: accoppia ogni elemento di con il suo indice in
  • {... }/: per ogni coppia:
    • (⍕⍵),': ',⍺: restituisce una stringa con l'indice, seguita da :, seguita dal numero
  • ↑¯5↑: trasforma l'elenco delle stringhe in una matrice in modo che vengano visualizzate su righe separate e prendano gli ultimi 5 elementi

Test:

      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  

Questo handle visualizza correttamente meno di 5 passaggi? Es 3 {...} 3541.
algoritmo

@algorithmshark Lo fa ora (ha dato righe extra con il :primo)
Marin

5

Mathematica, 172 caratteri

È troppo lungo, grazie ai nomi delle funzioni di Mathematica e alla brutta gestione delle stringhe (l'attuale "gioco" è solo 76 di quei personaggi), ma eccolo qui:

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

Si aspetta il numero di input in variabile ne il numero massimo di iterazioni in m.

Con meno 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
    ]

5

Rubino, 106 caratteri

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}

Non sono chiaro al 100% sulle regole di input, ma se posso prendere ncome stringa posso salvare 5 caratteri e se posso usare variabili predefinite e scrivere un programma invece di una funzione, posso salvarne un altro 9.

Crea una funzione fche può essere chiamata come segue:

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 osservazione del fatto che 4 o più "9" producono un risultato divergente
Digital Trauma,

4

J - 96 92 char

Per prima cosa avevo risolto supponendo che tutti i giochi fossero terminati, e questo è tornato a mordermi nel culo durante i test. L'argomento sinistro è il numero di passi, l'argomento destro è la posizione iniziale, che può essere data come un numero o una stringa.

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

Questo è un po 'troppo golfato e contorto per degradare in modo soddisfacente, quindi dirò questo:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Questa parte esegue il gioco per il numero specificato di passaggi. 2+/\è responsabile dell'aggiunta di ogni coppia di cifre e <@>:@[in combinazione con i ^:controlli che catturano i passaggi intermedi del gioco.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Questa parte formatta tutti i risultati come step: result. ({.~,i.0:)si sta assicurando che non facciamo troppi passi, #\sono i numeri dei passi e il (,': '&,)&":"0bit aggiunge i due punti e lo spazio.
  • (-@(<.5<.#){.])Questa parte elimina dall'elenco completo i passaggi cinque o meno pertinenti. <.significa "minimo di".

Funziona, ma se inizi con un numero abbastanza grande, i risultati del gioco iniziano rapidamente ad aumentare di dimensioni, il che fa passare J da numeri interi a doppi imprecisi. Ecco alcuni esempi:

   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

Con le nuove righe per la leggibilità:

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

+ Modifica: nessuna scusa per non utilizzare l' -nopzione della riga di comando, quindi il punteggio è 82 = 81 + 1 :

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

E, il possibile overflow dei numeri interi è OK, è 81 = 80 + 1

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

Ho imparato nuove cose. Eccezionale!
core1024

2

Javascript, 247 278 288 307 caratteri

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

formattato

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

Modifica 1 : ternario rimosso

Modifica 2 : logica capovolta per "saltare" l'indice 0

Modifica 3 : chiamata ricorsiva rielaborata.

Violino


Non ti preoccupare, niente da vedere qui. Pensavo stesse stampando i primi 5, ma dovrebbe essere con il violino. Bel lavoro :)
Matt,

2

Bash + coreutils, 115 byte

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

Produzione:

$ ./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 (bozza ECMAScript 6) - 134 caratteri

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

Esempi:

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 byte

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 byte

<>=~/ /;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]

Spero vada bene che stampi alcune righe vuote in più se l'intera operazione richiede meno di 5 passaggi.


Sostituisci (('')x5, @o, "$i: $s")con (@o, "$i: $s")e join"\n", @o[-5..0]con join"\n", @o[-5..-1]. Quindi sarai avanti di 3 byte;)
core1024

Non ho alcun problema con le righe vuote extra.
Matt,

@ core1024 Grazie :) Stavo per darti anche un consiglio, ma ti sei già sbarazzato di quella parte "a meno" di quel tempo
Tal

1

Java      524   405 365 caratteri [414 byte]

Versione golfizzata: 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);}}

Versione leggibile:

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

Puoi ridurlo usando 1 carattere per i nomi delle variabili e delle funzioni.
Lex Webb,

Fatto ... ha anche cambiato la logica per fermare la ricorsione usando num <= 9 invece di digits.length == 1 (Visto solo in questo thread ... non mi ha colpito prima).
user12345

potresti ridurre la lunghezza del nome dell'argomento nel tuo metodo principale, che ti darà altri 3 personaggi
user902383

non è necessario convertire la stringa in matrice di caratteri, è possibile accedere a un singolo carattere dalla stringa utilizzando il chatAtmetodo
user902383

1
e l'ultima cosa, non è necessario convertire il tuo personaggio in stringa e quindi analizzarlo, invece Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");potresti farlo(digits[i] + digits[i+1] - 96)
user902383

1

JavaScript 133 byte

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

L'unico problema è che il nome della funzione è lo stesso di una delle tue variabili :) Ma la tecnica è fantastica.
Matt,

Buon punto! Ho rinominato la funzione;)
core1024

1

Java, 341 caratteri 371 caratteri

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

formattato:

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

Grazie a user902383 sono stato in grado di ridurre il codice di 30 caratteri, non dividendo la stringa in una matrice usando -96 invece di "Integer.valueOf ()


potresti comunque ridurre alcuni caratteri,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

Dardo, 602 588 byte

Il dardo è probabilmente una delle peggiori lingue in cui farlo ... Avrò bisogno di trovare un modo migliore per farlo.

Comunque, ecco la mia voce:

Ingresso tramite 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 la versione ungolfed, leggermente non minificata:

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

135 129/125 125/121 byte PERL

Ha lo stesso bug della risposta di 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]}

Modifica 129 byte in funzione:

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 byte in funzione:

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 byte come script di console (senza 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 byte come script di console (senza 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]

Allargato:

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

Prova con c(372,4);:

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

Prova con c(3541,50);:

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

Credo che dovresti solo stampare gli ultimi 5 passaggi.
Tal,

Ho risolto;)
core1024

E sei ancora 3 byte davanti a me ... distruggilo! : p
Tal,

@Tal Siamo ancora adesso: 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);}

Leggibile:

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)

Produzione:

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

0

Cobra - 363

Un risultato piuttosto deprimente ... ma ehi, ho ancora battuto Java.

Esso dovrebbe essere immune da integer overflow per i casi di test pratici.

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 caratteri

Utilizzo di molte stringhe per eseguire l'attività.

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 caratteri

Versione che definisce una funzione

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

Versione leggermente non golfata:

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

esempio di utilizzo:

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

Per renderlo più leggibile, utilizzare putStr:

λ> putStr $ 3541#5
1: 1411
2: 552
3: 107
4: 17
5: 8

Devi elencare solo gli ultimi 5 passi fuori dal calcolo. Prova a putStr $ 3541#50confrontarlo con l'esempio del PO. Altrimenti sono contento che ci sia un ragazzo di Haskell qui.
core1024

@ core1024 Lo fa! Anche se li ho etichettati come sbagliati, hai ragione. Lo riparerò domani.
Flonk,

0

Groovy - 191 182 caratteri

Basato sulla soluzione di Thomas Rüping , portato su 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}

Esecuzione e output:

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

Leggermente meno golf (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]));

}

Basta allocare memoria sufficiente per memorizzare ciclicamente cinque risultati. Il ciclo esterno continua fino a quando non raggiungiamo il limite o raggiungiamo una singola cifra. Il loop interno aggiunge l'ultima cifra del numero all'ultima cifra di 1/10 del numero e aggiunge questo, moltiplicato per la potenza pertinente di 10 al risultato. Dividi il numero che prima consideri per 10 e ripeti per ottenere il totale. Quindi stampa fino agli ultimi cinque risultati.

La prossima sfida è vedere se riesco a radermi abbastanza da battere alcuni linguaggi di scripting al golf.

Modifica: ora viene compilato con un avvertimento, ma cinque caratteri rasati rimuovendo la dichiarazione "nulla"


Suggerimenti golf: f (int a, int z) -> f (a, z) e potrebbe usare t = 10 salvando altri 2 caratteri. Ma l'uso di a e a / = 10 nella stessa espressione non è definito
edc65

0

C # - 309 330 320 306 byte

Versione golfizzata:

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

Utilizzo: F (3541,50);

Versione non golfata per leggibilità:

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

Suggerimenti di miglioramento sono sempre ben accetti! ;)

Modificare: rimosso String.Empty e sostituito con "" per salvare 10 byte.

Modifica 2: Grazie a malik per il tipp con le stringhe!


Non serve .ToCharArray(). A string = char array
jzm

Oh, e un'altra cosa che puoi fare è, invece di .ToString(), fare+""
jzm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.