Rosetta Stoneチャレンジ:Run-Length Encoding v2.0


8

ロゼッタストーンチャレンジの目標は、できるだけ多くの言語でソリューションを作成することです。あなたのプログラミング多言語主義を自慢して見せてください!

チャレンジ

ランレングスエンコーディング最初に実行しましたが、単一文字のランのみを考慮しました。もちろん、複数の文字の実行を考慮すると、さらに節約できる場合があります。

例を挙げましょうaaaxyzxyzxyzdddd。これはに圧縮できます3a3{xyz}4d。あなたの仕事は、大文字と小文字を区別する文字とスペースの文字列を与えられ、複数文字の実行に対してランレングスエンコーディングを使用して最適に圧縮する関数のプログラムを書くことです。

関数の引数STDINまたはARGVを介して入力を受け取り、結果を返すか、STDOUTに出力できます。

実行は入れ子にしてaaabbbaaabbbはいけませ。したがって3a3b3a3b、ではなく 、でなければなりません2{3a3b}。つまり、文字列は1回のパスでエンコード(またはデコード)する必要があります。

最適な圧縮の結果

ランレングスエンコーディングの素朴なアプリケーションが次善の結果をもたらす可能性があるいくつかの例:

  • abab 「圧縮」してはならない 2{ab}
  • aaaabcdeabcde圧縮されてはならない4abcdeabcdeが、3a2{abcde}その代わり。

2つの最適なバージョン(例:aaand 2aまたはabcabcandおよび2{abc})がある場合、どちらの結果でも問題ありません。

Input              Output

aa                 aa -or- 2a
aaaaaAAAAA         5a5A
ababa              ababa
abababa            a3{ba} -or- 3{ab}a
foo foo bar        2{foo }bar
aaaabcdeabcde      3a2{abcde}
xYzxYz             xYzxYz -or- 2{xYz}
abcabcdefcdef      abcab2{cdef}
pppqqqpppqqq       3p3q3p3q
pppqqqpppqqqpppqqq 3{pppqqq}

得点

各言語は、最短のエントリーを書ける人に関して個別のコンテストですが、全体的な勝者は、これらのサブコンペティションのほとんどを勝つ人です。これは、多くの珍しい言語で答える人が有利になることを意味します。コードゴルフは、言語に複数の解決策がある場合のタイブレーカーです。プログラムが最も短い人がその言語の功績を認められます。

同点の場合、勝者は2番目に多く送信された人(以下同様)になります。

ルール、制限、注意事項

異なる提出物はすべて1つの回答に収めてください。

また、わずかに異なる言語の方言で基本的に同じ答えをするshenanigansはありません。私はどのような提出物が十分に異なっているかについての裁判官になります。

現在のリーダーボード

このセクションは定期的に更新され、言語の数とそれぞれの言語の主導者が表示されます。

  • C#(265)— edc65
  • JavaScript(206)— edc65
  • Python(214)—意志
  • VB.NET(346)— edc65

現在のユーザーランキング

  1. edc65(3)
  2. 意志(1)

回答:


1

JavaScript(E6)206

ほぼ間違いなく最適です。最長の文字列を最大ゲインでエンコードし、左右に残っているものを再帰的にエンコードしようと試みます。各試行の後、私は最短の結果を保持します。

ゴルフメモ(JS固有)

  • ローカルではなく疑似引数(再帰用)
  • 「未定義」を与える範囲外インデックスを使用して長さを比較します
R=(s,n=s,d=s.length>>1,w,i,j,c)=>{
  for(;d;--d){
    for(i=-1;s[d+d+i++];){
      w=s.slice(i,j=i+d);
      for(r=1;w==s.substr(j,d);j+=d)++r;
      c=d>1?r+'{'+w+'}':r+w,
      // c[d*r-1]|| /* uncomment this line (+10 bytes) to have faster response
      n[(c=R(s.slice(0,i))+c+R(s.slice(j))).length]&&(n=c)
    }
  }
  return n
}

FireFox / FireBugコンソールでテストする

;['aa','aaaaaAAAAA','ababa','abababa','foo foo bar', 'aaaabcdeabcde',
  'xYzxYz', 'abcabcdefcdef', 'pppqqqpppqqq','pppqqqpppqqqpppqqq']
.forEach(x=>console.log(x+' -> '+R(x)))

出力

aa -> aa
aaaaaAAAAA -> 5a5A
ababa -> ababa
abababa -> 3{ab}a
foo foo bar -> 2{foo }bar
aaaabcdeabcde -> 3a2{abcde}
xYzxYz -> xYzxYz
abcabcdefcdef -> abcab2{cdef}
pppqqqpppqqq -> 3p3q3p3q
pppqqqpppqqqpppqqq -> 3{pppqqq}

C#(。NET 4.0)265

まったく同じアルゴリズム

string R(string s)
{
  string n=s,c,w;
  int l=s.Length,d=l/2,i,j,r;
  for(;d>0;--d)
  {
    for(i=0;d+d+i<=l;i++)
    {
      w=s.Substring(i,d);
      for(j=i+d,r=1;j+d<=l&&w==s.Substring(j,d);j+=d)++r;
      c=d>1?r+"{"+w+"}":r+w;
      // if(c.Length<d*r){ // uncomment this line for faster execution
        c=R(s.Substring(0,i))+c+R(s.Substring(j));
        n=c.Length<n.Length?c:n;
      //} // and this one of course
    }
  }
  return n;
}

LinqPadでテスト、モード「C#プログラム」、R関数の後にメインを追加

void Main()
{
  string[] test = {"aa","aaaaaAAAAA","ababa","abababa","foo foo bar","aaaabcdeabcde",
  "xYzxYz","abcabcdefcdef","pppqqqpppqqq","pppqqqpppqqqpppqqq"};
  test.Select(x => new { x, r=R(x) }).Dump("Result");
}

同じ出力

VB.Net(.NET 4)346(おそらく)

同じアルゴリズムと同じライブラリーですが、言語は十分に異なります

Visual Studioはコードの再フォーマットとスペースの追加を繰り返しているため、バイト数については確信が持てません。

ゴルフノート:何か他のものを使うほうがいい

function R(s as string)

  dim n=s,c,w
  dim l=s.Length,i,j,d
  for d=l\2 to 1 step-1
    for i=0 to l-d-d
      w=s.Substring(i,d)
      j=i+d
      r=1
      do while (j+d<=l andalso w=s.Substring(j,d))
        r=r+1
        j=j+d
      loop
      c=if(d>1,r & "{" & w & "}",r & w)
      if(c.Length<d*r) then
        c=R(s.Substring(0,i))+c+R(s.Substring(j))
        if c.Length<n.Length then n=c
      end if
    next
  next
  return n

end function

スペースの追加を元に戻すことができます。再フォーマットする文字を入力する場合は、ctrl-zを押して、フォーマットを元に戻します。これは、頻繁に1文字ではなく2文字を意味しますが、すべてのスペースと改行を後で削除するよりも優れています。
ジェリージェレミア

3

Python 214

def t(s):
 b=s;l=len;r=range(1,l(s))
 for i in r:
  p=s[:i];b=min(b,p+t(s[i:]),key=l);x=1
  for j in r:k=i*j+i;x*=p==s[i*j:k];b=min(b,(b,''.join((`j+1`,"{"[i<2:],p,"}"[i<2:],t(s[k:]))))[x],key=l)           
 return b

(第2レベルのインデントはタブです)

これはなので、これは早期終了のない素朴な再帰的アプローチであるため、本当に遅いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.