Eklenen Sayılar Oyunu


16

Eklenen Sayılar Oyunu

2 tamsayı parametresi tamsayı parametresi veya tamsayı değişkeni , bir başlangıç ​​sayısı ve bir maksimum yineleme sayısı alan bir işlev / program yazın . Kod, yeni bir sayı oluşturmak için aşağıdaki oyun örneğini gerçekleştirmeli ve sayı tek bir basamak kalıncaya kadar tekrar etmelidir. Örneğin.

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

Temel olarak, her bir basamağı almak ve komşusuna eklemek, ardından bir sonraki eklemenin sonucunu eklemek.

Maksimum yineleme sayısı sonsuz döngüleri korumaktır ve maksimum değere ulaşıldığında kodun son 5 sayı adımını dökmesi gerekir. Aynı çıktı, tek bir basamağa ulaşarak bitirirken gerçekleşmelidir. 5 adımdan az meydana gelirse, yalnızca geçerli sayıları girin.

Çıktı Step: Number, bitmiş veya sonlandırılmış adımların son 5 adımı dahil ( ) gibi görünmelidir :

func(3541, 50) tam çıktı biçimini üretir:

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

func(3541, 5) üretecek:

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

Tüm hesaplama şu şekildedir:

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

5'ten az adım varsa, atılan adımları yazdırmanız yeterlidir.

Sadece yerleşik kütüphaneleri kullanın, parametreler her yerden olabilir (seçtiğiniz dil için en kolay olanı). Maksimum tamsayı boyutunda sınır yoktur ve taşmalar varsa çökmesine izin verin.

Bu bir bulmaca açısından çok zor olmadığı göz önüne alındığında, kabul edilen cevap için gönderimlerin dikkate alınması için 25 Pazar, 20:00 (UTC + 8) tarihine kadar vereceğim, bu noktada herhangi bir dilin en kısa olanı kazanacak.

DÜZENLE:

48 GolfScript cevabını kazanan Howard'ı tebrik ediyoruz .

66 APL cevabı ile 2. sıra marinus özel bir söz .

(JavaScript karşı önyargılı) Benim kişisel favori core1024 aitti cevap .


Anlamıyorum, func(3541, 5)5 veya 10 adım basmam gerekiyor mu?
Tal

5 adım. Yineleme 5'e çarptığında durmalı, daha fazla yineleme yapmamalı ve son 5 adımı yazdırmalıdır. Ben sadece belirli bir girdi için tam hesaplama sürecini göstermek için adımların tamamını dahil ettim.
Mat

Yanıtlar:


4

GolfScript, 48 46 karakter

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

Peter Taylor'a iki karakterlik bir gelişme için teşekkürler .

Yığında her iki sayıyı da bekler. Çevrimiçi deneyin .

Örnekler:

> 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

Sonra bir flip ekleyerek .,,ve son haritayı adil hale getirerek orta derecede bir tasarruf var {': '*}%.
Peter Taylor

10

APL (66)

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

Sol argüman maksimum iterasyon sayısı ve sağ argüman başlangıç ​​sayısıdır.

Açıklama:

  • ∆←⍺{... }⍕⍵: sayılar listesini hesaplayan işleve sol bağımsız değişkeni sayı, sağ bağımsız değişkeni dize olarak iletir ve depolar :
    • (1<⍴⍵)∧⍺>0:: basamak sayısı 1'den fazlaysa ve kalan yineleme miktarı şundan fazla ise 0:
      • ⍎¨⍵: her basamağı değerlendirin
      • 2+/: her çifti topla
      • ⍕¨: her sayıyı bir dize olarak biçimlendirme
      • ∆←,/: dizeleri birleştir ve
      • ∆,(⍺-1)∇⊃∆: Dönüş için bu fonksiyonu uygulanması sonucu, ardından bir daha az yineleme izin verildi
    • ⋄⍬: değilse, boş listeyi döndür
  • ∆,⍪⍳⍴∆: öğesinin her bir öğesini dizinindeki
  • {... }/: her bir çift için:
    • (⍕⍵),': ',⍺: dizini içeren bir dize, ardından gelen ve :ardından gelen bir sayı döndürür
  • ↑¯5↑: dize listesini ayrı satırlarda görüntülenmeleri için bir matrise dönüştürün ve son 5 öğeyi alın

Ölçek:

      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  

Bu işlem, 5 adımdan daha az göstergeleri düzgün şekilde ele alıyor mu? Örn 3 {...} 3541.
algorithmmshark

@algorithmshark Şimdi ( :ilk önce fazladan çizgiler verdi )
marinus

5

Mathematica, 172 karakter

Bu, Mathematica'nın işlev adları ve çirkin dize işleme (gerçek "oyun" bu karakterlerden sadece 76'sı) sayesinde çok uzun, ama yine de burada:

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

Değişkendeki girdi sayısını nve içindeki maksimum yineleme sayısını bekler m.

Daha az golf ile:

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

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}

Ben giriş kuralları% 100 net değilim, ama ben nbir dize olarak alabilir 5 karakter kaydedebilirsiniz ve önceden tanımlanmış değişkenleri kullanmak ve bir işlev yerine bir program yazabilir, başka bir 9 kaydedebilirsiniz.

fAşağıdaki gibi çağrılabilen bir işlev oluşturur :

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
4 veya daha fazla "9" lerin farklı bir sonuç verdiğine dair ilginç gözlem
Digital Trauma

4

J - 96 92 karakter

Tüm oyunların sona erdiğini varsayarak bunu çözmüştüm ve bu test sırasında beni kıçtan ısırmaya geri döndü. Sol argüman adım sayısı, sağ argüman bir sayı veya dize olarak verilebilen başlangıç ​​konumudur.

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

Bu biraz fazla golf ve degolf tatmin edici bir şekilde kıvrık, bu yüzden şunu söyleyeceğim:

  • (<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)Bu bölüm oyunu belirtilen sayıda adımda çalıştırır. 2+/\her bir basamak çiftini eklemekten ve oyunun ara adımlarını yakalayan kontrollerle <@>:@[birlikte sorumludur ^:.
  • (#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".Bu bölüm tüm sonuçları olarak biçimlendirir step: result. ({.~,i.0:)çok fazla adım atmadığımızdan emin olmak #\, adım sayılarıdır ve (,': '&,)&":"0bit iki nokta üst üste ve boşluk ekler.
  • (-@(<.5<.#){.])Bu bölüm ilgili beş veya daha az adımı tam listeden çıkarır. <."minimum" anlamına gelir.

Çalışır, ancak yeterince büyük bir sayı ile başlarsanız, oyunun sonuçları hızla büyür, bu da J'nin tamsayılardan kesin olmayanlara geçmesini sağlar. İşte bazı örnekler:

   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

Okunabilirlik için yeni satırlarla:

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

+ Düzenle:-n Komut satırı anahtarını kullanmamanın mazereti yoktur ve puan 82 = 81 + 1'dir :

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

Ve olası tamsayı taşması tamam, 81 = 80 + 1

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

Yeni şeyler öğrendim. Müthiş!
core1024

2

JavaScript, 247 278 288 307 Karakterler

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

biçimlendirilmiş

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

Düzenleme 1 : Üçgen kaldırıldı

Düzenleme 2 : "Atlama" 0 dizini için döndürülmüş mantık

Edit 3 : Tekrarlanan arama yeniden düzenlendi.

Vaktini boşa harcamak


Endişelenme, burada görülecek bir şey yok. İlk 5 baskı olduğunu düşündüm ama keman ile gerekir. İyi iş :)
Matt

2

Bash + coreutils, 115 bayt

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

Çıktı:

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

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

Örnekler:

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 bayt

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 bayt

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

Umarım her şey 5 adımdan az sürerse ekstra boş satırlar basar.


Değiştir (('')x5, @o, "$i: $s")ile (@o, "$i: $s")ve join"\n", @o[-5..0]ile join"\n", @o[-5..-1]. O zaman 3 bayt önde olacaksınız;)
core1024

Fazladan boş çizgilerle bir sorunum yok.
Mat

@ core1024 Teşekkürler :) Ben de size bir ipucu verecektim, ama zaten bu uzun "sürece" bölümünden kurtuldunuz
Tal

1

Java      524   405 365 karakter [414 bayt]

Golf versiyonu: 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);}}

Okunabilir sürüm:

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

Değişken ve işlev adları için 1 karakter kullanarak bunu küçültebilirsiniz.
Lex Webb

Bitti ... ayrıca digits.length == 1 yerine num <= 9 kullanarak özyinelemeyi durdurmak için mantığı değiştirdi (sadece bu iş parçacığında görüldü ... daha önce bana vurmadı).
user12345

ana yöntemdeki argüman adının uzunluğunu azaltabilirsiniz, bu size ek 3 karakter sağlar
user902383

dizeyi karakter dizisine dönüştürmenize gerek yoktur, chatAtyöntemi kullanarak dizeden tek karaktere erişebilirsiniz
user902383

1
ve son olarak, karakterinizi dizeye dönüştürmeniz ve ayrıştırmanız Integer.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");gerekmez , bunun yerine bunu yapabilirsiniz(digits[i] + digits[i+1] - 96)
user902383

1

JavaScript 133 bayt

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

Tek sorun, işlev adı değişkenlerinizden biriyle aynıdır :) Ama teknik harika.
Matt

İyi bir nokta! İşlevi yeniden adlandırdım;)
core1024 22:14

1

Java, 341 karakter 371 karakter

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

biçimlendirilmiş:

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 sayesinde, "Integer.valueOf () yerine -96 kullanarak Dizeyi Array'a bölmeyerek kodu 30 karakter azaltabildim.


yine de bazı karakterleri azaltabilirsiniz,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 bayt

Dart muhtemelen bunu yapmak için en kötü dillerden biri ... Bunu yapmak için daha iyi bir yol bulmam gerekecek.

Her neyse, İşte girişim:

Konsoldan giriş

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

Ve ungolfed, biraz önemsiz versiyonu:

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 135129/125 125/121 bayt

Tal'in cevabı ile aynı hataya sahip

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

129 baytı fonksiyon olarak düzenleme:

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

Fonksiyon olarak 125 bayt:

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

Bir konsol komut dosyası olarak 125 bayt (hashbang olmadan):

($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]

Bir konsol komut dosyası olarak 121 bayt (karma olmadan):

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

Expanded:

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

Şununla test et c(372,4);:

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

Şununla test et c(3541,50);:

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

Yine de sadece son 5 adımı basmanız gerektiğine inanıyorum.
Tal

Düzeltildi;)
core1024

Ve hala benden 3 byte önündesin ... patla! : p
Tal

@Tal Şimdi bile: 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);}

Okunabilir:

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

Kullanımı:

F(3541, 50)

Çıktı:

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

0

Kobra - 363

Oldukça iç karartıcı bir sonuç ... ama hey, hala Java'yı geçiyorum.

Bu gerektiğini uygulamalı test durumları için tamsayı taşmaları karşı bağışık olması.

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 karakter

Görev yapmak için çok sayıda dizeyi kullanma.

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 karakter

Bir işlevi tanımlayan sürüm

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

Hafifçe çözülmemiş versiyon:

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

örnek kullanım:

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

Daha okunabilir hale getirmek için şunu kullanın putStr:

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

Hesaplamanın yalnızca son 5 adımını listelemeniz gerekir. Deneyin putStr $ 3541#50ve OP örneği ile karşılaştırın. Aksi takdirde burada bir Haskell adamı olduğu için memnunum.
core1024

@ core1024 Öyle! Onları yanlış etiketlememe rağmen haklısın. Bunu yarın düzeltirim.
Flonk

0

Harika - 191182 karakter

Thomas Rüping'in çözümüne dayanarak Groovy 2.2.1'e taşındı:

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}

Yürütme ve çıktı:

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

Biraz daha az 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]));

}

Beş sonucu periyodik olarak saklamak için yeterli belleği ayırın. Dış döngü, limite ulaşana veya tek bir basamağa ulaşıncaya kadar devam eder. İç döngü, sayının son basamağını sayının 1 / 10'unun son basamağına ekler ve bunu, sonuca 10'luk ilgili güçle çarparak ekler. İlk aldığınız sayıyı 10'a bölün ve toplamı almak için tekrarlayın. Sonra son beş sonuca kadar çıktı alın.

Sonraki zorluk golf bazı script dilleri yenmek için yeterince tıraş olabilir görmek için.

Düzenleme: Şimdi uyarı ile derler ancak "geçersiz" bildirimi kaldırılarak traş beş karakter


Golf ipuçları: f (int a, int z) -> f (a, z) ve t = 10 kullanarak 2 karakter daha kaydedebilir. Ancak aynı ifadede a ve a / = 10 kullanılması tanımsızdır
edc65

0

C # - 309 330 320 306 Bayt

Golf Sürümü:

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

Kullanım: F (3541,50);

Okunabilirlik için yönlendirilmemiş sürüm:

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

İyileştirme önerileri her zaman beklerim! ;)

Düzenleme: String.Empty kaldırıldı ve 10 bayt kaydetmek için "" ile değiştirildi.

Edit 2: Dizelerle bahşiş için malik'e teşekkürler!


İhtiyacınız yok .ToCharArray(). Bir dize = karakter dizisi
jzm

Oh, ve yapabileceğiniz başka bir şey yapmak yerine .ToString(),+""
jzm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.