Thử thách Rosetta Stone: Mã hóa chiều dài Run v2.0


8

Mục tiêu của Thử thách Rosetta Stone là viết các giải pháp bằng càng nhiều ngôn ngữ càng tốt. Thể hiện đa ngôn ngữ lập trình của bạn!

Các thách thức

Chúng tôi đã thực hiện mã hóa chạy dài được fore nhưng chỉ coi chạy của một nhân vật duy nhất. Tất nhiên, đôi khi chúng ta có thể tiết kiệm nhiều hơn nếu chúng ta xem xét việc chạy nhiều ký tự.

Lấy aaaxyzxyzxyzddddví dụ. Điều này có thể được nén để 3a3{xyz}4d. Nhiệm vụ của bạn là viết một chương trình hàm, với một chuỗi các chữ cái và dấu cách phân biệt chữ hoa chữ thường, nén nó một cách tối ưu bằng cách sử dụng mã hóa độ dài chạy cho các lần chạy nhiều ký tự.

Bạn có thể nhận đầu vào thông qua đối số chức năng, STDIN hoặc ARGV và trả lại kết quả hoặc in nó sang STDOUT.

Chạy không được lồng nhau, vì vậy aaabbbaaabbbphải 3a3b3a3b, không 2{3a3b} . Tức là chuỗi phải được mã hóa (hoặc giải mã) trong một lần chạy.

Hậu quả của nén tối ưu

Một số ví dụ trong đó ứng dụng ngây thơ của mã hóa độ dài chạy có thể dẫn đến kết quả tối ưu:

  • abab không được "nén" thành 2{ab}
  • aaaabcdeabcdekhông được nén 4abcdeabcde3a2{abcde}thay vào đó.

Nếu có hai phiên bản tối ưu (ví dụ aa2ahoặc abcabc2{abc}) thì kết quả vẫn ổn.

Ví dụ

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}

Chấm điểm

Mỗi ngôn ngữ là một cuộc thi riêng biệt để ai có thể viết bài dự thi ngắn nhất, nhưng người chiến thắng chung cuộc sẽ là người chiến thắng hầu hết các cuộc thi phụ này. Điều này có nghĩa là một người trả lời bằng nhiều ngôn ngữ không phổ biến có thể đạt được lợi thế. Code golf chủ yếu là một công cụ bẻ khóa khi có nhiều hơn một giải pháp trong một ngôn ngữ: người có chương trình ngắn nhất được tín dụng cho ngôn ngữ đó.

Nếu có hòa, người chiến thắng sẽ là người có nhiều bài dự thi thứ hai nhất (v.v.).

Quy tắc, hạn chế và ghi chú

Vui lòng giữ tất cả các bài nộp khác nhau của bạn trong một câu trả lời.

Ngoài ra, không có shenanigans nào có cùng câu trả lời trong các phương ngữ ngôn ngữ hơi khác nhau. Tôi sẽ là người đánh giá xem những bài nộp nào đủ khác nhau.

Bảng xếp hạng hiện tại

Phần này sẽ được cập nhật định kỳ để hiển thị số lượng ngôn ngữ và những người đang dẫn đầu trong mỗi ngôn ngữ.

  • C # (265) - edc65
  • JavaScript (206) - edc65
  • Con trăn (214) - Sẽ
  • VB.NET (346) - edc65

Xếp hạng người dùng hiện tại

  1. edc65 (3)
  2. Ý chí (1)

Câu trả lời:


1

JavaScript (E6) 206

Hầu như chắc chắn nó là tối ưu. Tôi bắt đầu cố gắng mã hóa chuỗi dài nhất với mức tăng tối đa và mã hóa đệ quy những gì còn lại ở bên trái và bên phải. Sau mỗi lần thử tôi giữ kết quả ngắn nhất.

Ghi chú golf (cụ thể là JS)

  • Đối số giả thay vì người địa phương (để đệ quy)
  • So sánh độ dài bằng cách sử dụng chỉ số giới hạn đưa ra 'không xác định'
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
}

Kiểm tra trong bảng điều khiển FireFox / FireBug

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

Đầu ra

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

Chính xác cùng một thuật toán

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

Kiểm tra trong LinqPad, chế độ 'chương trình C #', thêm chính sau chức năng 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");
}

Cùng một đầu ra

VB.Net (.NET 4) 346 (có thể)

Cùng một thuật toán và cùng một thư viện, nhưng ngôn ngữ đủ khác nhau

Tôi không thể chắc chắn về số byte, vì Visual Studio tiếp tục định dạng lại mã và thêm khoảng trắng.

Ghi chú golf: sử dụng tốt hơn những thứ khác

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

Bạn có thể hoàn tác việc thêm không gian. Nếu bạn nhập một ký tự làm cho nó định dạng lại, hãy nhấn ctrl-z để hoàn tác định dạng. Nó có nghĩa là hai ký tự thay vì một ký tự thường xuyên nhưng tốt hơn là loại bỏ tất cả các khoảng trắng và nguồn cấp dữ liệu sau đó.
Jerry Jeremiah

3

Con trăn 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

(thụt cấp thứ hai là tab)

Vì đây là , đây là cách tiếp cận đệ quy ngây thơ mà không cần thoát sớm, nên nó thực sự rất chậm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.