46

チャレンジ

Morris Number Sequenceを出力する文字数による最短コード。Morris Number SequenceLook-and-say シーケンスとも呼ばれ、次のように始まる一連の数字です。

1, 11, 21, 1211, 111221, 312211, ...

シーケンスは無限に生成できます (つまり、特定の数を生成する必要はありません)。

I/O の期待値

プログラムは入力を受け取る必要はありません (ただし、入力を受け入れるためのボーナス ポイントがあり、任意の開始点または番号から開始するオプションが提供されます)。少なくとも、プログラムは から開始する必要があります1

出力は、少なくとも次のシーケンスであると予想されます。

1
11
21
1211
111221
312211
...

エクストラクレジット

追加のクレジットが必要な場合は、次のようにする必要があります。

$ morris 1
1
11
21
1211
111221
312211
...

$ morris 3
3
13
1113
3113
132113
...
4

41 に答える 41

15

GolfScript-41(追加クレジット:40)

1{.p`n+0:c:P;{:|P=c{c`P|:P!}if):c;}%~1}do
{~.p`n+0:c:P;{:|P=c{c`P|:P!}if):c;}%1}do

何?
シーケンス内の次の番号を取得する手順:現在の番号を文字列に変換し、改行を追加して、文字をループします。各桁について、前の桁Pが同じである場合は、カウンターをインクリメントしますc。それ以外の場合は、次の番号にとを追加cPてから、これらの変数を更新します。追加する改行により、最後の数字のグループを次の番号に追加できます。

正確な詳細は、GolfScriptのドキュメントを調べることで入手できます。(これ|は変数として使用されることに注意してください。)

于 2010-10-12T08:48:52.363 に答える
14

Haskell:115 88 85

import List
m x=do a:b<-group x;show(length b+1)++[a]
main=mapM putStrLn$iterate m"1"

これは無限のシーケンスです。私はそれがたくさん改善できることを知っています-私はHaskellにかなり慣れていません。

少し短く、mapMをインライン化し、繰り返します。

import List
m(a:b)=show(length b+1)++[a]
f x=putStrLn x>>f(group x>>=m)
main=f"1"
于 2010-10-11T19:15:06.157 に答える
13

Perl (46 文字)

$_="1$/";s/(.)\1*/length($&).$1/eg while print

追加クレジット (52 文字)

$_=(pop||1).$/;s/(.)\1*/length($&).$1/eg while print
于 2010-10-11T22:31:58.897 に答える
10

JavaScript 100 97

for(x=prompt();confirm(y=x);)for(x="";y;){for(c=0;y[c++]&&y[c]==y[0];);x+=c+y[0];y=y.substr(c--)}

(「キャンセル」をクリックして) シーケンスを中断できるようにするため、ユーザーエージェントをロックして CPU をペグしません。また、任意の正の整数から開始することもできます (追加クレジット)。

実際の例: http://jsbin.com/izeqo/2

于 2010-10-11T20:35:50.400 に答える
9

Mathematica- 625350 文字-追加のクレジットが含まれています

編集:40文字...しかし右から左へ:(

不思議なことに、右から左へのシーケンス(つまり、1,11,12,1121、..)を読むと、40文字で十分です。

NestList[Flatten[Tally /@ Split@#] &, #2, #] &

これは、Tallyがリスト{elem、counter}を生成するためです。

編集:50文字

NestList[Flatten@Reverse[Tally /@ Split@#, 3] &, #2, #] &

解剖:(コメントを上向きに読む)

NestList[               // 5-Recursively get the first N iterations
    Flatten@            // 4-Convert to one big list
       Reverse          // 3-Reverse to get {counter,element}
          [Tally /@     // 2-Count each run (generates {element,counter})
               Split@#, // 1-Split list in runs of equal elements
                 3] &,
                     #2,// Input param: Starting Number 
                     #] // Input param: Number of iterations

編集:リファクタリング

NestList[Flatten[{Length@#, #[[1]]} & /@ Split@#, 1] &, #2, #1] &

編集を終了///

NestList[Flatten@Riffle[Length /@ (c = Split@#), First /@ c] &, #2, #1] &

スペースは不要/明確にするために追加

で呼び出す

%[NumberOfRuns,{Seed}]

初めて「Riffle」を使用して、{1,2,3}と{a、b、c}を{1、a、2、b、3、c}に結合しました:)

于 2010-10-12T00:38:30.893 に答える
9

Perl、46 文字

$_=1;s/(.)\1*/$&=~y!!!c.$1/ge while print$_,$/

追加クレジット、51 文字:

$_=pop||1;s/(.)\1*/$&=~y!!!c.$1/ge while print$_,$/
于 2010-10-11T18:33:19.377 に答える
8

LINQ を使用した C# の試みと、Code Golf での最初の試みを次に示します。

C# -追加のクレジットを含む205 194 211 198 バイト (C# ボイラープレートを含む)

using System.Linq;class C{static void Main(string[]a){var v=a[0];for(;;){var r="";while(v!=""){int i=v.TakeWhile(d=>d==v[0]).Count();r+=i;r+=v[0];v=v.Remove(0,i);}System.Console.WriteLine(r);v=r;}}}

読み取り可能なバージョン:

static void Main(string[] args)
{
    string value = args[0];
    for (;;)
    {
        string result = "";
        while (value != "")
        {
            int i = value.TakeWhile(d => d == value[0]).Count();
            result += i;
            result += value[0];
            value = value.Remove(0, i);
        }
        Console.WriteLine(result);
        value = result;
    }
}

出力例:

11
21
1211
111221
312211
13112221
1113213211
...
于 2010-10-12T00:35:24.820 に答える
8

パイソン、97 102 115

空白はタブであると想定されています:

x='1'
while 1:
    print x;y=d=''
    for c in x+'_':
        if c!=d:
            if d:y+=`n`+d
            n,d=0,c
        n+=1
    x=y

例えば:

$ python morris.py | head
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
于 2010-10-11T18:34:27.633 に答える
6

ルビー — 52

s=?1;loop{puts s;s.gsub!(/(.)\1*/){"#{$&.size}"+$1}}

タスクが単純すぎて、あまりにも危険です...

于 2010-10-12T07:26:47.653 に答える
6

これが私の実装です(Prologで):

DCG を使用したプロローグ (174 文字):

m(D):-write(D),nl,m(1,write(D),T,[nl|T],_).
m(C,D,T)-->[D],{succ(C,N)},!,m(N,D,T).
m(C,D,[G,D|T])-->[N],{G=write(C),G,D,(N=nl->(M-T-O=0-[N|R]-_,N);M-T-O=1-R-N)},!,m(M,O,R).

プレーンなバニラ プロローグ、より読みやすいコード (225 文字):

m(D):-
  ((D=1->write(D),nl);true),
  m([], [1,D]).

m([], [C,D|M]):-
  write(C), write(D),nl,
  reverse([D,C|M],[N|X]),
  !,
  m([N|X],[0,N]).
m([D|T], [C,D|M]):-
  succ(C,N),
  !,
  m(T,[N,D|M]).
m([Y|T],[C,D|M]):-
  write(C), write(D),
  !,
  m(T,[1,Y,D,C|M]).

モリス数列を出力するには: m(D)。ここで、D は「開始」桁です。

于 2010-10-11T18:29:10.870 に答える
6

Perl、67 文字

-lフラグを含む。

sub f{$_=pop;print;my$n;$n.=$+[0].$1while(s/(.)\1*//);f($n)}f(1)

Perl、追加クレジット付き 72 文字

sub f{$_=pop;print;my$n;$n.=$+[0].$1while(s/(.)\1*//);f($n)}f(pop||1)
于 2010-10-11T18:37:51.577 に答える
5

C、128 文字

セグメンテーション違反を引き起こすことが保証されている静的バッファを使用します

main(){char*c,v[4096],*o,*b,d[4096]="1";for(;o=v,puts(d);strcpy(d,v))for(c=d;*c;o+=sprintf(o,"%d%c",c-b,*b))for(b=c;*++c==*b;);}
于 2010-10-11T22:19:19.897 に答える
4

Perl(追加クレジット)、47文字

$_=pop.$/;{print;s/(.)\1*/$&=~y|||c.$1/ge;redo}
于 2010-10-12T02:20:34.010 に答える
4

文字列に 1 ~ 3 の数字のみが含まれ、3 つ以上の数字の連続が含まれていない場合、その文字列を「モリス風」と呼びます。最初の文字列がモリス風である場合、それから繰り返し生成されるすべての文字列も同様にモリス風になります。同様に、最初の文字列がモリス風でない場合、生成される文字列はモリス風にはなりません。 1つ)。

その観察を考えると、モリス風のシードで始まるすべての反復は、次の一連の検索/置換操作として実行できます。

111 -> CA
11 -> バ
1 -> AA
222 -> CB
22 -> BB
2 -> AB
333 -> CC
33 -> 紀元前
3 -> AC
A -> 1
B -> 2
C -> 3

上記の置換前のシーケンスはモリス風であることに注意してください。生成された各ペアの 2 番目の文字は、前後のペアの 2 番目の文字とは異なります。したがって、同じ文字を 3 つ以上連続させることはできません。

ばらばらなモリス風のシーケンスがいくつあるのだろうか?

于 2010-10-11T22:47:24.720 に答える
4

ジャワ

「Code-Golf」での私の最初の試みで、IB CS クラスの一部でこれをまとめました。

238 コンデンス

凝縮:

String a="1",b="1",z;int i,c;while(true){System.out.println(b);for(c=0,i=0,b="",z=a.substring(0,1);i<a.length();i++){if(z.equals(a.substring(i,i+1)))c++;else{b+=Integer.toString(c)+z;z=a.substring(i,i+1);c=1;}}b+=Integer.toString(c)+z;a=b;}

適切にフォーマット:

    String a = "1", b = "1", z;
    int i, c;

    while (true) {      
      System.out.println(b);

      for (c = 0, i = 0, b = "", z = a.substring(0, 1); i < a.length(); i++) {
        if (z.equals(a.substring(i, i + 1))) c++;
        else {
          b += Integer.toString(c) + z;
          z = a.substring(i, i + 1);
          c = 1;
        }
      }

      b += Integer.toString(c) + z;
      a = b;
    }
于 2010-10-11T18:26:18.750 に答える
3

J、追加クレジット付き 44 文字

(([:,#;.1@{:,.{:#{.)@(,:0<1,[:|2-/\]))^:(<9)

残念ながら、これは 9 回の反復しか生成しませんが、反復回数<9はいくらでも微調整できます。設定するとa:無限シーケンスが生成されますが、明らかにこれは印刷できません。

使用法:

   (([:,#;.1@{:,.{:#{.)@(,:0<1,[:|2-/\]))^:(<9) 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 1 0 0 0 0 0 0 0 0 0 0
1 1 1 2 2 1 0 0 0 0 0 0 0 0
3 1 2 2 1 1 0 0 0 0 0 0 0 0
1 3 1 1 2 2 2 1 0 0 0 0 0 0
1 1 1 3 2 1 3 2 1 1 0 0 0 0
3 1 1 3 1 2 1 1 1 3 1 2 2 1

   (([:,#;.1@{:,.{:#{.)@(,:0<1,[:|2-/\]))^:(<11) 4
4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 3 2 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 3 1 2 2 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 1 1 3 1 1 2 2 2 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 3 2 1 1 3 2 1 3 2 2 1 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 3 1 2 2 1 1 3 1 2 1 1 1 3 2 2 2 1 1 4 0 0 0 0 0 0 0 0
3 1 1 3 1 1 2 2 2 1 1 3 1 1 1 2 3 1 1 3 3 2 2 1 1 4 0 0 0 0
1 3 2 1 1 3 2 1 3 2 2 1 1 3 3 1 1 2 1 3 2 1 2 3 2 2 2 1 1 4
于 2010-10-12T18:06:14.127 に答える
2

Java-167文字(クレジット付き)

(クラス/メインボイラープレートなしの122)


class M{public static void main(String[]a){for(String i=a[0],o="";;System.out.println(i=o),o="")for(String p:i.split("(?<=(.)(?!\\1))"))o+=p.length()+""+p.charAt(0);}}

改行あり:

class M{
 public static void main(String[]a){
  for(String i=a[0],o="";;System.out.println(i=o),o="")
   for(String p:i.split("(?<=(.)(?!\\1))"))
    o+=p.length()+""+p.charAt(0);
 }
}
于 2010-10-13T00:04:41.917 に答える
2

ペソ: 111

初めてコードゴルフに挑戦しましたが、結果にはとても満足しています。

for($x=1;;){echo$y=$x,"\n";for($x="";$y;){for($c=0;$y[$c++]&&$y[$c]==$y[0];);$x.=$c.$y[0];$y=substr($y,$c--);}}

与えます:

> php htdocs/golf.php
1
11
21
... (endless loop)

追加クレジット付き PHP: 118

for($x=$argv[1];;){echo$y=$x,"\n";for($x="";$y;){for($c=0;$y[$c++]&&$y[$c]==$y[0];);$x.=$c.$y[0];$y=substr($y,$c--);}}

与えます:

> php htdocs/golf.php 4
4
14
1114
3114
... (to infinity and beyond)
于 2010-10-12T18:19:52.107 に答える
2

デルファイ

Delphi はひどいゴルフ言語ですが、それでも:

var i,n:Int32;s,t,k:string;u:char;label l;begin s:='1';l:writeln(s);t:='';u:=s[1
];n:=1;for i:=2to length(s)do if s[i]=u then inc(n)else begin str(n,k);t:=t+k+u;
u:=s[i];n:=1;end;str(n,k);t:=t+k+u;s:=t;goto l;end.

これは211 バイトです(そのままコンパイルされます)。

于 2010-10-12T01:06:30.873 に答える
2

コードゴルフ初挑戦なので、無理しないでくださいね!

PHP、128 122開始タグ付き 112 バイト

122 116開始タグと先頭の空白を除いた106 バイト。

<?php for($a="1";!$c="";print"$a\n",$a=$c)for($j=0,$x=1;$a[$j];++$j)$a[$j]==$a[$j+1]?$x++:($c.=$x.$a[$j])&&$x=1;

(ただし、文字列として初期化する必要があるのは非常に残念$aです.2バイト余分にかかります。そうしないと、インデックス表記を使用できません。)

出力

$ php morris.php
1
11
21
1211
111221
312211
...

PHP (追加クレジット)、133 127開始タグを含む 117 バイト

127 121開始<?phpタグと先頭の空白を除いた111 バイト。

<?php for($a=$argv[1];!$c="";print"$a\n",$a=$c)for($j=0,$x=1;$a[$j];++$j)$a[$j]==$a[$j+1]?$x++:($c.=$x.$a[$j])&&$x=1;

出力

$ php morris.php 3
3
13
1113
3113
132113
1113122113
...
^C
$ php morris.php 614
614
161114
11163114
3116132114
1321161113122114
1113122116311311222114
...

PHP (追加クレジット)、開始タグと終了タグでアンゴルフ

<?php

for ($a = $argv[1]; !$c = ""; print "$a\n", $a = $c)
{
    for ($j = 0, $x = 1; $a[$j]; ++$j)
    {
        // NB: this was golfed using ternary and logical AND operators:
        // $a[$j] == $a[$j + 1] ? $x++ : ($c .= $x . $a[$j]) && $x = 1;
        if ($a[$j] == $a[$j + 1])
        {
            $x++;
        }
        else
        {
            $c .= $x . $a[$j];
            $x = 1;
        }
    }
}

?>
于 2010-10-11T20:58:57.637 に答える
1

Python-117

私のpython-fuは強くないので、これのためにたくさんのグーグルをしました。:)

a='1'
while 1:
 print a
 a=''.join([`len(s)`+s[0]for s in''.join([x+' '*(x!=y)for x,y in zip(a,(2*a)[1:])]).split()])

アイデアは、zipを使用して(a [i]、a [i + 1])ペアのリストを生成し、内部理解を使用してa [i]!= a [i + 1]のときにスペースを挿入し、結果のリストを文字列に変換し、スペースで分割し、この分割リストで別の理解を使用して、各要素を要素のランレングスと最初の文字に置き換え、最後に結合して次の値を順番に取得します。

于 2010-10-11T22:01:26.037 に答える
1

PHP 72 バイト

<?for(;;)echo$a=preg_filter('#(.)\1*#e','strlen("$0"). $1',$a)?:5554,~õ;

このスクリプトはさらに最適化される可能性があります。しかし、PHPGolf ({http://www.phpgolf.org/?p=challenges&challenge_id=28}) でまったく同じシーケンスを取得したので、この方法を維持します。

于 2011-01-20T19:48:35.587 に答える
1

C#、204 バイト (追加クレジットを含めると 256 バイト)

コードゴルフ初挑戦

static void Main(){var v="1";for(;;){Console.Write(v + "\n");var r=v.Aggregate("", (x, y) => x.LastOrDefault()==y?x.Remove(0, x.Length-2)+(int.Parse(x[x.Length-2].ToString())+1).ToString()+y:x+="1"+y);v=r;}}

読みやすいバージョン、他との違いは、Linq の Aggregate 関数を使用することです

static void Main(){
    var value="1";
    for(;;)
    {
        Console.Write(value + "\n");
        var result = value.Aggregate("", (seed, character) => 
                        seed.LastOrDefault() == character ? 
                            seed.Remove(seed.Length-2) + (int.Parse(seed[seed.Length-2].ToString())+1).ToString() + character
                            : seed += "1" + character
                    );
        value = result;
    }
}
于 2010-10-12T22:33:03.737 に答える
1

C 追加クレジット付き、242 (または 184)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define s malloc(1<<20)
main(int z,char**v){char*j=s,*k=s;strcpy(k,*++v);for(;;){strcpy(j,k);z=1;*k=0;while(*j){if(*j-*++j)sprintf(k+strlen(k),"%d%c",z,*(j-1)),z=1;else++z;}puts(k);}}

インクルードを省略すると、さらに 60 文字を節約できます。gcc は引き続き警告を出してコンパイルします。

$ ./a.out 11111111 | head
81
1811
111821
31181211
132118111221
1113122118312211
31131122211813112221
132113213221181113213211
111312211312111322211831131211131221
3113112221131112311332211813211311123113112211
于 2010-10-11T19:50:40.923 に答える
1

C - 120 文字

129 追加クレジットあり

main(){char*p,*s,*r,x[99]="1",t[99];for(;r=t,puts(p=x);strcpy(x,t))
for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}

改行は読みやすさのためだけにあります。

これは、セグメンテーション違反が発生すると停止します (少なくとも 15 回の反復後)。C ライブラリがバッファリングされた I/O を使用している場合、segfault の前に出力が表示されないことがあります。その場合は、次のコードでテストします。

#include<stdio.h>
main(){char*p,*s,*r,x[99]="1",t[99];for(;r=t,puts(p=x),fflush(stdout),1;
strcpy(x,t))for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}

fflushこれにより、出力ごとにが追加されます。

Ungolfed では、次のようになります。

int main(){
    char *p, *start, *result, number[99] = "1", temp[99];

    while(1){ /* loop forever */
        puts(number);

        result = temp; /* we'll be incrementing this pointer as we write */
        p = number;    /* we'll be incrementing this pointer as we read */

        while(*p){ /* loop till end of string */
            start = p; /* keep track of where we started */

            while(*p == *start) /* find all occurrences of this character */
                p++;

            *result++ = '0' + p - start; /* write the count of characters, */
            *result++ = *start;          /* the character just counted, */
            *result   = 0;               /* and a terminating null */
        }

        strcpy(number, temp); /* copy the result back to our working buffer */
    }
}

ideoneで実際に動作しているのを見ることができます。

クレジットを追加すると、コードは次のようになります。

main(){char*p,*s,*r,x[99],t[99];for(scanf("%s",x);r=t,puts(p=x);strcpy(x,t))
for(;*p;*r++=p-s+48,*r++=*s,*r=0)for(s=p;*++p==*s;);}
于 2010-10-14T07:26:54.563 に答える
1

F# - 135

let rec m l=Seq.iter(printf "%i")l;printfn"";m(List.foldBack(fun x s->match s with|c::v::t when x=v->(c+1)::v::t|_->1::x::s)l [])
m[1]

フォーマットされたコード

let rec m l=
    Seq.iter(printf "%i")l;printfn"";
    m (List.foldBack(fun x s->
        match s with
        |c::v::t when x=v->(c+1)::v::t
        |_->1::x::s) l [])
m[1]

リストを印刷するか、代わりに string/bigint を使用するより良い方法を見つけることができることを願っています。

于 2010-10-23T02:44:36.650 に答える
1

Common Lisp - 124 122 115 文字

(do((l'(1)(do(a r)((not l)r)(setf a(1+(mismatch(cdr l)l))r(,@r,a,(car l))l(nthcdr a l)))))((format t"~{~s~}~%"l)))

フォーマットあり:

(do ((l '(1) (do (a r) ((not l) r) (setf a (1+ (mismatch (cdr l) l))
                                         r `(,@r ,a ,(car l)) l (nthcdr a l)))))
    ((format t "~{~s~}~%" l)))
于 2010-10-14T15:00:00.020 に答える
1

Python - 92 文字

98 追加クレジットあり

無限に出力します。出力をファイルにリダイレクトし、すばやくCtrl+を押すことをお勧めしますC

x=`1`;t=''
while 1:
 print x
 while x:c=x[0];n=len(x);x=x.lstrip(c);t+=`n-len(x)`+c
 x,t=t,x

エクストラ クレジット バージョンの場合は、

x=`1`

x=`input()`
于 2010-10-14T06:09:15.697 に答える
1

Python - 98 文字

from itertools import *
L='1'
while 1:print L;L=''.join('%s'%len(list(y))+x for x,y in groupby(L))

ボーナスは106文字

from itertools import *
L=raw_input()
while 1:print L;L=''.join('%s'%len(list(y))+x for x,y in groupby(L))
于 2010-10-12T19:50:09.090 に答える
1

C++、310 文字。

#include <iostream>
#include <list>
using namespace std;
int main(){list<int> l(1,1);cout<<1<<endl;while(1){list<int> t;for(list<int>::iterator i=l.begin();i!=l.end();){list<int>::iterator p=i;++i;while((i!=l.end())&&(*i==*p)){++i;}int c=distance(p,i);cout<<c<<*p;t.push_back(c);t.push_back(*p);}cout<<'\n';l=t;}}

正しくインデント:

#include <iostream>
#include <list>
using namespace std;

int main() {
    list <int> l(1,1);
    cout << 1 << endl;
    while(1) {
        list <int> t;
        for (list <int>::iterator i = l.begin(); i != l.end();) {
            const list <int>::iterator p = i;
            ++i;
            while ((i != l.end()) && (*i == *p)) {
                ++i;
            }
            int c = distance(p, i);
            cout << c << *p;
            t.push_back(c);
            t.push_back(*p);
        }
        cout << '\n';
        l = t;
    }
}
于 2010-10-11T19:04:45.623 に答える
0

C#、140の作業文字(ボイラープレート付きの177 171)

class C{static void Main(){var x="1\n";for(;;){System.Console.Write(x);var y="";for(int n,i=0;i<x.Length-1;y+=n+""+x[i],i+=n)n=x[i+1]!=x[i]?1:x[i+2]!=x[i]?2:3;x=y+"\n";}}}

このエクスプロイトのConwayの観察(IIRC)は、3を超える数はシーケンスに表示されないというものです。

        var x = "1\n";
        for (; ; )
        {
            Console.Write(x);
            var y = "";
            var i = 0;
            while (i < x.Length - 1)
            {
                var n = x[i + 1] != x[i] ? 1 : x[i + 2] != x[i] ? 2 : 3;
                y += n + "" + x[i];
                i += n;
            }
            x = y + "\n";
        }
于 2010-10-12T01:01:32.733 に答える
0

Javascript: 87

これは、BoltClockのコードと私自身の PHP の試みに触発されたものです。

for(a="1";!(c="");alert(a),a=c)for(j=0,x=1;a[j];j++)a[j]==a[j+1]?x++:(c+=x+a[j])&&(x=1)

余分な Javascript: 92

for(a=prompt();!(c="");alert(a),a=c)for(j=0,x=1;a[j];j++)a[j]==a[j+1]?x++:(c+=x+a[j])&&(x=1)

美化:

// Start with a=1, an set c to "" every start of the loop
// alert a and set a=c at the end of a loop
for (a = "1"; !(c = ""); alert(a), a = c)

  // Set iterator j to 0, set counter x to 1 at the initialisation
  // detect if a[j] exists at the start of the loop and incremement j at the end
  for (j = 0, x = 1; a[j]; j++)

    // check if the jth and (j+1)th characters are equal
    // if so, increment x,
    // if not, the end of a row is found, add it to c and set x to 1 again
    a[j] == a[j + 1] ? x++ : (c += x + a[j]) && (x = 1)
于 2010-10-12T22:02:16.347 に答える
0

Delphi、163 バイト (追加で 166 バイト)

Andreas Rejbrand バージョンを大幅に作り直しました。str() がパラメーターの型をチェックしないのは良いことです。そうしないと、integer(s)-integer(u) をキャストする必要があります。

var q,t,k:string;s,u:pchar;label l,z;begin t:='1';l:writeln(t);q:=t;s:=@q[1];
t:='';z:u:=s;while s^=u^do Inc(s);str(s-u,k);t:=t+k+u^;if s^=#0then goto l;
goto z;end.

さらに、t:='1'; を変更します。t:=readln; に

于 2010-10-12T11:55:42.860 に答える
0

C++、264

#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main(){string l="1\n";for(;;){ostringstream o;int e=1;char m;cout<<l;for(int i=1;i<l.size();i++){m=l[i-1];if(l[i]==m)e++;else if(e){if(m!='\n')o<<e<<m;e=1;}}l=o.str()+'\n';}return 0;}

適切なインデント付き:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string l="1\n";
    for(;;)
    {
        ostringstream o;
        int e=1;
        char m;
        cout<<l;
        for(int i=1; i<l.size(); i++)
        {
            m=l[i-1];
            if(l[i]==m)
                e++;
            else if(e)
            {
                if(m!='\n')
                    o<<e<<m;
                e=1;
            }
        }
        l=o.str()+'\n';
    }
    return 0;
}

出力例:

matteo@teoubuntu:~/cpp$ g++ morris.cpp -O3 -o morris.x && ./morris.x | head1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211

C++、276 (追加クレジットあり)

#include <iostream>
#include <sstream>
#include <string>
using namespace std;int main(){string l;getline(cin,l);for(;;){ostringstream o;int e=1;char m;l+='\n';cout<<l;for(int i=1;i<l.size();i++){m=l[i-1];if(l[i]==m)e++;else if(e){if(m!='\n')o<<e<<m;e=1;}}l=o.str();}return 0;}

適切なインデント付き:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string l;
    getline(cin,l);
    for(;;)
    {
        ostringstream o;
        int e=1;
        char m;
        l+='\n';
        cout<<l;
        for(int i=1; i<l.size(); i++)
        {
            m=l[i-1];
            if(l[i]==m)
                e++;
            else if(e)
            {
                if(m!='\n')
                    o<<e<<m;
                e=1;
            }
        }
        l=o.str();
    }
    return 0;
}

出力例:

matteo@teoubuntu:~/cpp$ g++ morris.cpp -O3 -o morris.x && ./morris.x | head
7754 <-- notice: this was inserted manually
7754
271514
121711151114
1112111731153114
31123117132115132114
13211213211711131221151113122114
11131221121113122117311311222115311311222114
3113112221123113112221171321132132211513211321322114
132113213221121321132132211711131221131211132221151113122113121113222114
111312211312111322211211131221131211132221173113112221131112311332211531131122211311123113322114
于 2010-10-11T20:47:37.463 に答える
0

Lua、114バイト(おまけ付き)

凝縮:

x=arg[1]while 1 do print(x)i=1 y=''while i<=#x do a=x:sub(i,i)s,e=x:find(a..'+',i)y=y..e+1-s..a;i=e+1 end x=y end

適切な形式:

x=arg[1]
for k=1,10 do
    print(x)
    i=1
    y=''
    while i <= #x do
        a=x:sub(i,i)
        s,e=x:find(a..'+',i)
        y=y..e+1-s ..a
        i=e+1
    end
    x=y
end
于 2010-11-25T11:20:52.210 に答える
0

Clojure 111文字

(loop[a"1"](pr a)(let[x(reduce(fn[a b](str a(count(first b))(nth b 1)))(str)(re-seq #"(.)\1*" a))](recur x)))

おまけ119文字

(loop[a(read-line)](pr a)(let[x(reduce(fn[a b](str a(count(first b))(nth b 1)))(str)(re-seq #"(.)\1*" a))](recur x)))
于 2010-10-13T11:18:34.383 に答える
0

スカラ - 97文字

@BalusC の印象的な回答に大いに触発されました。

def m(s:String){println(s);m((""/:(s split"(?<=(.)(?!\\1))")){(a,s)=>a+s.size+s(0)})};m(args(0))
于 2010-10-27T15:16:37.313 に答える
0

Groovy (86 文字) と追加のクレジット:

def f={m,n->n.times{println m;m=(m=~/(\d)\1*/).collect{it[0].size()+""+it[1]}.join()}}

で呼び出します:f(1,10)またはf(x,n)信用のために。

于 2014-05-22T08:39:40.587 に答える
0

c# 315 236228

よし、まずはコードゴルフに挑戦


static void Main(string[]args)
    {string o,s="1";int l=11;while(l-- >0)
    {Console.WriteLine(s);o="";while(s!=""){var c=s.Substring(0,1);int i=Regex.Match(s,"("+c+"*)").Length;o+=i.ToString()+c;s=s.Substring(i);}s=o;}}

ここに改行スペースがあるソースがあります >8.9999999999


static void main( string[] args )
    {
        string sp = "1";
        string ou = "";
        int It = 11;
        while ( It-- > 0 )
        {

            Console.WriteLine(sp);
            ou = "";
            while ( sp != "" )
            {
                var c = sp.Substring(0, 1);
                int i = Regex.Match(sp, "(" + c + "*)").Length;
                ou += i.ToString() + c;
                sp = sp.Substring(i);

            }
            sp = ou;
        }
    }

エクストラクレジット

static void Main(string[]a)
{string o,s=a[0];int l=11;while(l-- >0)
{Console.WriteLine(s);o="";while(s!=""){var c=s.Substring(0,1);int i=Regex.Match(s,"("+c+"*)").Length;o+=i.ToString()+c;s=s.Substring(i);}s=o;}}
于 2010-10-11T22:54:04.107 に答える
0

285 248 Chars は、C# で実行できる最高の文字数です (これも余分なものはありません!)

編集:これは私の最初のコードゴルフでもあります..それをするのはとても楽しかったです:D

static void Main(){string s="1",x=s;for(;;){char[]c=x.ToCharArray();char d=c[0];x="";int a=0;for(inti=0;i<=c.Length;i++){char q;if(i!=c.Length)q=c[i];else q='0';if (d != q){x+=a.ToString();x+=d.ToString();d=q;a=1;}else a++;}Console.WriteLine(x);}}

読み取り可能なコード:

using System;
class Program
{
    static void Main()
    {
        string startPoint = "1";
        string currentPoint = startPoint;
        while (true)
        {
            char[] currentPointAsCharArray = currentPoint.ToCharArray();
            char previousCharacter = currentPointAsCharArray[0];
            currentPoint = "";
            int countOfCharInGroup = 0;
            for(int i=0;i<=currentPointAsCharArray.Length;i++)
            {
                char c;
                if (i != currentPointAsCharArray.Length)
                    c = currentPointAsCharArray[i];
                else
                    c = '0';
                if (previousCharacter != c)
                {
                    currentPoint += countOfCharInGroup.ToString();
                    currentPoint += previousCharacter.ToString();
                    previousCharacter = c;
                    countOfCharInGroup = 1;
                }
                else
                    countOfCharInGroup++;
            }
            Console.Write(currentPoint + "\n");
        }
    }
}
于 2010-10-13T11:51:26.513 に答える
0

J、61文字

J: las=: ,@((# , {.);.1~ 1 , 2 ~:/\ ])&.(10x&#.inv)@]^:(1+i.@[)

例:

10 las 1
1 11 21 1211 111221 312211 13112221 1113213211 31131211131221 13211311123113112211 11131221133112132113212221

結果は実際の数値シーケンスであることに注意してください (他の言語で与えられたテキストによる解決法を参照)。

ソースはこちら: http://rosettacode.org/wiki/Look-and-say_sequence#J

于 2010-11-17T09:51:46.613 に答える