Tìm độ dài chuỗi tối đa


29

Giả sử chúng ta có một chuỗi và chúng ta muốn tìm chuỗi lặp lại tối đa của mỗi chữ cái.

Ví dụ, đưa ra đầu vào mẫu:

"acbaabbbaaaaacc"

Đầu ra cho đầu vào mẫu có thể là:

a=5
c=2
b=3

Quy tắc:

  • Mã của bạn có thể là chức năng hoặc một chương trình - để bạn chọn
  • Đầu vào có thể bằng thông số stdin, tập tin hoặc chức năng
  • Đầu ra chỉ chứa các ký tự xuất hiện trong đầu vào
  • Độ dài tối đa đầu vào là 1024
  • Thứ tự đầu ra không quan trọng, nhưng nó phải được in ở dạng [char] = [trình tự lặp lại tối đa] [dấu phân cách]
  • Chuỗi có thể chứa bất kỳ ký tự

Cuộc thi kết thúc vào thứ Năm lúc 23:59 UTC.


Có tối đa đến chiều dài của chuỗi đầu vào không?
sigma

2
Liệu đầu ra phải chính xác như được đưa ra? Chúng ta có thể nói 0 cho các chữ cái không xuất hiện không? Mỗi chữ cái lên đến chữ cái cao nhất sẽ xuất hiện ít nhất một lần?
xnor

1
Vui lòng làm rõ nếu đầu ra phải được định dạng chính xác như được minh họa trong câu hỏi của bạn. Ít nhất 10 trong số 16 câu trả lời hiện tại sử dụng một định dạng khác nhau, ba câu trả lời khác trình bày hai phiên bản khác nhau.
Dennis

1
@Joey Có lẽ bạn nên trừng phạt vì chơi golf. Bằng cách bạn từ bỏ nó, cuối cùng tôi sẽ thấy l:S_&{'=L{2$+_S\#)}g,(N}/trong các hệ thống sản xuất! Và tôi sẽ nguyền rủa tên của bạn.
Cruncher

Câu trả lời:


22

Mã máy 8086, 82 80

Nội dung của x.comtập tin:

B7 3D 89 DF B1 80 F3 AA 0D 0A 24 B4 01 CD 21 42
38 D8 74 F7 38 17 77 02 88 17 88 C3 31 D2 3C 0D
75 E9 BF 21 3D B1 5E 31 C0 F3 AE E3 EE 4F BB 04
01 8A 05 D4 0A 86 E0 0D 30 30 89 47 02 3C 30 77
04 88 67 03 43 89 3F 89 DA B4 09 CD 21 47 EB D7

Nó chỉ hỗ trợ lặp lại tối đa 99 ký tự.

Mã nguồn (được dùng làm đầu vào cho trình biên dịch debug.com), với các bình luận!

a
    mov bh, 3d         ; storage of 128 bytes at address 3d00
    mov di, bx
    mov cl, 80
    rep stosb          ; zero the array
    db 0d 0a 24
; 10b
    mov ah, 1
    int 21             ; input a char
    inc dx             ; calculate the run length
    cmp al, bl         ; is it a repeated character?
    je  10b
    cmp [bx], dl       ; is the new run length greater than previous?
    ja  11a
    mov [bx], dl       ; store the new run length
; 11a
    mov bl, al         ; remember current repeating character
    xor dx, dx         ; initialize run length to 0
    cmp al, d          ; end of input?
    jne 10b            ; no - repeat
    mov di, 3d21       ; start printing run lengths with char 21
    mov cl, 5e         ; num of iterations = num of printable characters
; 127
    xor ax, ax
    repe scasb         ; look for a nonzero run length
    jcxz 11b           ; no nonzero length - exit
    dec di
    mov bx, 104        ; address of output string
    mov al, [di]       ; read the run length
    aam                ; convert to decimal
    xchg al, ah
    or  ax, 3030
    mov [bx+2], ax
    cmp al, 30         ; was it less than 10?
    ja  145
    mov [bx+3], ah     ; output only one digit
    inc bx             ; adjust for shorter string
; 145
    mov [bx], di       ; store "x=" into output string
    mov dx, bx         ; print it
    mov ah, 9
    int 21
    inc di
    jmp 127            ; repeat
; 150

rcx 50
n my.com
w
q

Dưới đây là một số kỹ thuật chơi gôn được sử dụng ở đây mà tôi nghĩ là thú vị:

  • địa chỉ của mảng là 3d00, 3dmã ascii dành cho =. Bằng cách này, địa chỉ cho mục nhập của mảng cho ký tự x3d78. Khi được hiểu là một chuỗi 2 ký tự, nó là x=.
  • Bộ đệm đầu ra là tại địa chỉ 104; nó ghi đè mã khởi tạo không còn cần thiết. Chuỗi cuối dòng 0D 0A 24được thực thi dưới dạng mã vô hại.
  • Các aamhướng dẫn ở đây không cung cấp bất kỳ chơi golf, mặc dù nó có thể ...
  • Viết số hai lần, đầu tiên giả sử nó lớn hơn 10, và sau đó sửa nếu nó nhỏ hơn.
  • Hướng dẫn thoát là ở một địa chỉ tối nghĩa 11b, chứa mã máy cần thiết C3do may mắn.

Cách tiếp cận thú vị. Tuy nhiên, với giới hạn 99 lần lặp lại, nó sẽ không xử lý các trường hợp cung cấp đầu vào của 1024 aaaa.
Homer6

14

CJam, 27 26 25 byte

l:S_&{'=L{2$+_S\#)}g,(N}/

Hãy thử trực tuyến.

Thí dụ

$ cjam maxseq.cjam <<< "acbaabbbaaaaacc"
a=5
c=2
b=3

Làm thế nào nó hoạt động

l:S       " Read one line from STDIN and store the result in “S”.                   ";
_&        " Intersect the string with itself to remove duplicate characters.        ";
{         " For each unique character “C” in “S”:                                   ";
  '=L     " Push '=' and ''.                                                        ";
  {       "                                                                         ";
    2$+_  " Append “C” and duplicate.                                               ";
    S\#)  " Get the index of the modified string in “S” and increment it.           ";
  }g      " If the result is positive, there is a match; repeat the loop.           ";
  ,       " Retrieve the length of the string.                                      ";
  (       " Decrement to obtain the highest value that did result in a match.       ";
  N       " Push a linefeed.                                                        ";
}/        "                                                                         ";

9

J - 52 byte

Vâng, một cách tiếp cận đơn giản một lần nữa.

f=:([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.

Giải trình:

f=:([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.
                                                 ~~. Create a set of the input and apply it as the left argument to the following.
   ([,'=',m=:":@<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1    The function that does the work
                                             "0 1    Apply every element from the left argument (letters) with the whole right argument (text).
                                  @.(+./@E.)         Check if the left string is in right string.
                       (]m~[,{.@[)                   If yes, add one letter to the left string and recurse.
             ":@<:@#@[                               If not, return (length of the left string - 1), stringified.
    [,'=',                                           Append it to the letter + '='

Thí dụ:

   f 'acbaabbbaaaaacc'
a=5
c=2
b=3
   f 'aaaabaa'
a=4
b=1

Nếu đầu ra dạng tự do được cho phép (như trong nhiều câu trả lời khác), tôi cũng có phiên bản 45 byte . Các hộp này đại diện cho một danh sách các hộp (vâng, chúng được in như thế, mặc dù chiều cao của SE phá vỡ chúng).

   f=:([;m=:<:@#@[`(]m~[,{.@[)@.(+./@E.))"0 1~~.
   f 'acbaabbbaaaaacc'
┌─┬─┐
│a│5│
├─┼─┤
│c│2│
├─┼─┤
│b│3│
└─┴─┘
   f 'aaaabaabba'
┌─┬─┐
│a│4│
├─┼─┤
│b│2│
└─┴─┘

8

Ruby, 72

(a=$*[0]).chars.uniq.map{|b|puts [b,a.scan(/#{b}+/).map(&:size).max]*?=}

Điều này nhận đầu vào từ các đối số dòng lệnh và đầu ra cho thiết bị xuất chuẩn.


charsngắn hơn một chút split("").
Ventero

@Ventero Tôi đã thử điều đó, nhưng charsđưa ra một điều tra viên chứ không phải là một mảng. Tôi đang ở 1.9.3, vậy nó có phải là thứ 2.0 không?
xa

Vâng, trong 2.0 charstrả về một mảng.
Ventero

Nó có thể được kéo dài các quy tắc một chút, nhưng có lẽ sử dụng pthay vì puts?
Shelvacu

1
Tôi hiểu rồi. Mặc dù điều đó làm cho nó bớt đẹp hơn, tôi không thể thấy rằng nó sẽ phá vỡ bất kỳ quy tắc nào.
daniero

7

GolfScript, 26 byte

:s.&{61{2$=}s%1,/$-1=,n+}%

Hãy thử trực tuyến.

Giải trình:

  • :slưu chuỗi đầu vào trong biến sđể sử dụng sau.
  • .&trích xuất các ký tự duy nhất trong đầu vào, phần còn lại của mã trong { }%vòng lặp sau đó lặp lại.
  • 61 đẩy số 61 (mã ASCII cho dấu bằng) trên đầu ký tự hiện tại trên ngăn xếp, để hoạt động như một dấu phân cách đầu ra.
  • {2$=}s%lấy chuỗi svà thay thế các ký tự của nó bằng 1 nếu chúng bằng với ký tự hiện tại được lặp lại hoặc 0 nếu chúng không. (Nó cũng để ký tự hiện tại trên ngăn xếp cho đầu ra.)
  • 1,/ lấy chuỗi số này và số không, và chia nó thành số không.
  • $sắp xếp các chuỗi con kết quả, -1=trích xuất chuỗi con cuối cùng (mà tất cả chúng bao gồm các lần lặp lại của cùng một ký tự, là dài nhất) và ,trả về độ dài của chuỗi con này.
  • n+ xâu chuỗi chiều dài và nối thêm một dòng mới vào nó.

Thi thiên Nếu các dấu bằng trong đầu ra là tùy chọn, 61có thể bỏ qua (và được 2$thay thế bởi 1$), với tổng chiều dài 24 byte :

:s.&{{1$=}s%1,/$-1=,n+}%

1
Bạn có thể lưu trao đổi nếu bạn đẩy 61đầu tiên : :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard

@Howard: Cảm ơn!
Ilmari Karonen

6

CoffeeScript, 109 byte

Tôi thích regex.

f=(s)->a={};a[t[0]]=t.length for t in s.match(/((.)\2*)(?!.*\1)/g).reverse();(k+'='+v for k,v of a).join '\n'

Đây là JavaScript được biên dịch mà bạn có thể thử trong bảng điều khiển của trình duyệt

f = function(s) {
  var a, t, _i, _len, _ref;
  a = {};
  _ref = s.match(/((.)\2*)(?!.*\1)/g).reverse();
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    t = _ref[_i];
    a[t[0]] = t.length;
  }
  return a;
};

Sau đó bạn có thể gọi

f("acbaabbbaaaaacc")

để có được

c=2
a=5
b=3

Điều này dường như tạo ra kết quả không chính xác cho đầu vào như thế nào aaaabaa.
Ventero

@Ventero bạn nói đúng, có hai vấn đề. cái này dễ sửa, nhưng tôi cần nghĩ về cái kia
Martin Ender

@Ventero đã sửa.
Martin Ender

5

Pyth , 24 25 26 (hoặc 29)

=ZwFY{Z=bkW'bZ~bY)p(Yltb

Kiểm tra có thể được thực hiện ở đây: liên kết

Đầu ra ở định dạng:

('a', 5)
('c', 2)
('b', 3)

Giải trình:

=Zw              Store one line of stdin in Z
FY{Z             For Y in set(Z):
=bk              b=''
W'bZ             while b in Z:
~bY              b+=Y
)                end while
p(Yltb           print (Y, len(b)-1)

Con trăn

k=""
Z=copy(input())
for Y in set(Z):
 b=copy(k)
 while (b in Z):
  b+=Y
 print(_tuple(Y,len(tail(b))))

Để có đầu ra (a = 5) thích hợp, hãy sử dụng:

=ZwFY{Z=bkW'bZ~bY)p++Y"="`ltb

29 ký tự


Có vẻ như bạn đã có cùng một ý tưởng. Có +1 cho điều đó.
xem

@TheRare yeah, có vẻ như là một cách rất tốt để làm điều đó.
isaacg

Không thực sự liên quan đến thuật toán của bạn, nhưng đầu ra python khó hiểu, bởi vì k=''được định nghĩa ở nơi khác.
gggg

Vâng, xin lỗi về điều đó. Tôi sẽ làm việc để cải thiện nó. Tôi cũng sẽ chỉnh sửa nó.
isaacg

5

C, 126 125 119 byte

l,n,c[256];main(p){while(~(p=getchar()))n*=p==l,c[l=p]=c[p]>++n?c[p]:n;for(l=256;--l;)c[l]&&printf("%c=%d\n",l,c[l]);}

Đang chạy:

$ gcc seq.c 2>& /dev/null
$ echo -n 'acbaabbbaaaaacc' | ./a.out
c=2
b=3
a=5

Bạn có thể thay thế getchar()>0bằng ~getchar()như trong câu trả lời này
anatolyg

@anatolyg EOF có được đảm bảo chính xác -1 không? Tôi nghĩ rằng nó chỉ được xác định cụ thể là <0.
fluffy

Tôi nghĩ -1 là đủ phổ biến (tức là Windows và linux) để bạn có thể giả sử nó cho Code Golf. Đối với mã sản xuất, less than zerolà hoàn toàn OK, nhưng == EOFrõ ràng hơn.
anatolyg

@anatolyg Chắc chắn, và thực sự tôi đoán theo thông số EOF rõ ràng thậm chí không được đảm bảo là <0 - ví dụ, nó cũng có thể là 256. Vì vậy, tôi sẽ chỉ lưu một byte. :)
fluffy

2
EOFđược đảm bảo là âm và -1 được sử dụng ngay cả khi charđược ký; xem tại đây
anatolyg

4

Toán học , 74 72 69

Print[#[[1,1]],"=",Max[Tr/@(#^0)]]&/@Split@Characters@#~GatherBy~Max&

% @ "acbaabbbaaaaacc"
a=5
c=2
b=3

Không phải là rất tốt, nhưng chuỗi không Mathematica khu vực tốt nhất 's. Mặc dù tốt hơn :-)


Đây là môn đánh gôn khá ấn tượng (nói điều này sau khi tự mình thử nó ...)
Szabolcs

v10, không phải là một giải pháp đầy đủ: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & Ít nhất là nó khá đơn giản và dễ đọc.
Szabolcs

@Szabolcs Cảm ơn! Sự khác biệt giữa GroupByvà là GatherBygì?
Mr.Wizard

Sự khác biệt chính là GroupBytrả về một Association. Tôi chưa nghiên cứu về sự khác biệt chi tiết nào. Reference.wolfram.com/lingu/ref/groupBy.html Bạn có thể dùng thử trên đám mây với một tài khoản miễn phí (đó là cách tôi đang chơi với những thứ này).
Szabolcs

3

C # (LinQPad)

146

Đây là câu trả lời của tsavino nhưng ngắn hơn. Ở đây, tôi đã sử dụng Distinct()thay vì GroupBy(c=>c). Ngoài ra, các dấu ngoặc nhọn từ foreach-loopbên trái được bỏ ra:

void v(string i){foreach(var c in i.Distinct())Console.WriteLine(c+"="+(from Match m in Regex.Matches(i,"["+c+"]+")select m.Value.Length).Max());}

136

Tôi đã thử sử dụng lambda expressionthay vì cú pháp truy vấn thông thường nhưng vì tôi cần một Cast<Match>mã đầu tiên, mã dài hơn 1 ký tự ... Dù sao đi nữa, vì nó có thể được thực thi trong LinQPad, bạn có thể sử dụng Dump()thay vì Console.WriteLine():

void v(string i){foreach(var c in i.Distinct())(c+"="+(from Match m in Regex.Matches(i,"["+c+"]+")select m.Value.Length).Max()).Dump();}

Nghiên cứu sâu hơn về mã đã khiến tôi suy nghĩ về Max(). Hàm này cũng chấp nhận a Func. Bằng cách này, tôi có thể bỏ qua Selectphần khi sử dụng epxression lambda:

void v(string i){foreach(var c in i.Distinct())(c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();}

Do đó, kết quả cuối cùng:

128

Cập nhật:

Nhờ mẹo từ Dan Puzey, tôi đã có thể lưu thêm 6 nhân vật:

void v(string i){i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m‌​.Value.Length)).Dump();}

Chiều dài:

122


Cảm ơn bạn đã cải thiện, tôi không biết về thủ thuật với .Dump () trong LinqPad. Thành thật mà nói, tôi đã phát triển mã trong Visual Studio và sao chép nó vào LinqPad để lưu một số ký tự vì LinqPad không cần một phương thức chính.
tsavinho

Cảm ơn! Dump()Gần đây tôi cũng mới biết phương pháp này, giúp bạn tiết kiệm hơn 10 ký tự :) Việc niềng răng xoăn rất dễ dàng và phần còn lại là một chút bím tóc: D
Abbas

1
Nếu bạn hài lòng khi sử dụng IEnumerablekiểu hiển thị của LinqPad, bạn có thể lưu 8 ký tự khác, với cơ thể này là: Cơ thể của bạn:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey

3

Con trăn 3 (70)

s=input()
for c in set(s):
 i=1
 while c*i in s:i+=1
 print(c,'=',i-1)

Ngay cả Python chơi golf cũng có thể rất dễ đọc. Tôi nghĩ rằng mã này là hoàn toàn thành ngữ ngoại trừ các biến một chữ cái và một vòng lặp trong khi một dòng.

Ví dụ chạy:

>>> helloworld
e = 1
d = 1
h = 1
l = 2
o = 1
r = 1
w = 1
>>> acbaabbbaaaaacc
a = 5
c = 2
b = 3

Đây là một giải pháp thú vị
Cruncher

1
nếu bạn thay đổi (các) bộ thành chỉ tôi nghĩ rằng nó vẫn đáp ứng các yêu cầu. Không nơi nào nói mỗi char chỉ được in một lần.
Cruncher

@Cruncher Tôi đồng ý OP không chỉ định từng chữ cái một lần, nhưng các câu trả lời khác của Python dường như giả định nó, vì vậy tôi sẽ gắn bó với nó để có thể so sánh được. Mặc dù các định dạng đầu ra vẫn không nhất quán. Tôi muốn OP đã trả lời các yêu cầu để làm rõ.
xnor

2

Ruby, 58

h={}
gets.scan(/(.)\1*/){h[$1]=[h[$1]||0,$&.size].max}
p h

Lấy đầu vào từ STDIN, xuất nó thành STDOUT trong biểu mẫu {"a"=>5, "c"=>2, "b"=>3}


2

C # trong LINQPad - 159 byte

Chà, ít nhất là tôi đã đánh bại T-SQL; P Sẽ không đánh bại ai khác, nhưng tôi nghĩ dù sao tôi cũng sẽ chia sẻ nó.

void v(string i){foreach(var c in i.GroupBy(c=>c)){Console.WriteLine(c.Key+"="+(from Match m in Regex.Matches(i,"["+c.Key+"]+")select m.Value.Length).Max());}}

Sử dụng:

v("acbaabbbaaaaacc");

Gợi ý luôn được chào đón!


Câu trả lời chính xác! Tôi đã có một số đề xuất nhưng quá dài cho một nhận xét vì vậy hãy nhấp vào đây để trả lời. :)
Abbas

2

Quyền hạn 80 77 72

$x=$args;[char[]]"$x"|sort -u|%{"$_="+($x-split"[^$_]"|sort)[-1].length}

Bạn cần chạy nó trên bảng điều khiển ...


1
$xlà thừa. Bạn ngắn hơn ba byte không sử dụng nó. Cũng sort -uđủ. Ít khi có nhu cầu đánh vần tên tham số đầy đủ. Tuy nhiên, điều này sẽ thất bại đối với một số ký tự nhất định do việc sử dụng không được giải quyết trong regex. Tùy thuộc vào cách »Chuỗi có thể chứa bất kỳ ký tự nào« được hiểu, đây có thể là một vấn đề.
Joey

@Joey cảm ơn vì tiền boa -u, tuy nhiên về $ x tôi không thể làm cho nó hoạt động được [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, có vẻ như $ args thứ hai trống rỗng ... - darkajax 17 phút trước
DarkAjax

Eep, vâng. Lấy làm tiếc. Đó là bởi vì nó nằm trong một khối tập lệnh, có các đối số riêng ( $argskhông còn là một trong các tập lệnh).
Joey

2

Perl - 65 71 76 ký tự

Golf mã đầu tiên của tôi!

Đối với mỗi câu trả lời, sao chép vào golf.pl và chạy như sau:

echo acbaabbbaaaaacc | perl golf.pl

Giải pháp ngắn nhất của tôi in mỗi ký tự nhiều lần như nó xuất hiện, vì điều đó không bị cấm bởi các quy tắc.

$_=$i=<>;for(/./g){$l=length((sort$i=~/$_*/g)[-1]);print"$_=$l
"}

Giải pháp ngắn nhất tiếp theo của tôi (85 90 ký tự) chỉ in mỗi ký tự một lần:

<>=~s/((.)\2*)(?{$l=length$1;$h{$2}=$l if$l>$h{$2}})//rg;print"$_=$h{$_}
"for keys %h

1

F # - 106

let f s=
 let m=ref(Map.ofList[for c in 'a'..'z'->c,0])
 String.iter(fun c->m:=(!m).Add(c,(!m).[c]+1))s;m

Trong FSI, gọi

f "acbaabbbaaaaacc"

cho

val it : Map<char,int> ref =
  {contents =
    map
      [('a', 8); ('b', 4); ('c', 3); ('d', 0); ('e', 0); ('f', 0); ('g', 0);
       ('h', 0); ('i', 0); ...];}

Tuy nhiên, để in mà không có thêm thông tin, hãy gọi nó như thế này:

f "acbaabbbaaaaacc" |> (!) |> Map.filter (fun _ n -> n > 0)

cái nào cho

val it : Map<char,int> = map [('a', 8); ('b', 4); ('c', 3)]

1

Javascript, 116 byte

y=x=prompt();while(y)r=RegExp(y[0]+'+','g'),alert(y[0]+'='+x.match(r).sort().reverse()[0].length),y=y.replace(r,'')

Đầu ra mẫu:

lollolllollollllollolllooollo
l=4
o=3

acbaabbbaaaaacc
a=5
c=2
b=3

helloworld
h=1
e=1
l=2
o=1
w=1
r=1
d=1 

1

T-SQL (2012) 189 171

Chỉnh sửa: loại bỏ ORDER BYvì quy tắc cho phép bất kỳ thứ tự đầu ra.

Lấy đầu vào từ một biến CHAR @avà sử dụng một CTE đệ quy để tạo một hàng cho mỗi ký tự trong chuỗi và tìm ra các lần xuất hiện liên tiếp.

Sau đó, nó đơn giản SELECTGROUP BY cân nhắc cho thứ tự đầu ra.

Hãy dùng thử trên SQL Fiddle.

WITH x AS(
    SELECT @a i,''c,''d,0r,1n
    UNION ALL 
    SELECT i,SUBSTRING(i,n,1),c,IIF(d=c,r+1,1),n+1
    FROM x
    WHERE n<LEN(i)+2
)
SELECT d+'='+LTRIM(MAX(r))
FROM x
WHERE n>2
GROUP BY d

Gán biến:

DECLARE @a CHAR(99) = 'acbaabbbaaaaacc';

Đầu ra mẫu:

a=5
c=2
b=3

Tôi không nghĩ rằng tôi đã thấy một giải pháp SQL ở đây trước đây. Hấp dẫn.
Seiyria

xem xét str, chức năng thay vì ltrim. Bạn cũng có thể đặt tên cho biến của mình @để lưu char. Điều này cho phép bạn mất ibiến trong RCte. Tôi nghĩ rằng bạn có thể cạo khá nhiều ký tự theo cách đó. Bạn cũng có thể viết lại truy vấn bằng cách sử dụng hàm windowing như sum trên các hàng trước hoặc lag. Tôi chưa hình thành như thế nào mà vẫn nhớ bạn.
Michael B

@MichaelB cảm ơn vì lời khuyên. Vấn đề tôi gặp phải với str () là nó tạo ra một loạt các khoảng trắng thừa. Tôi chắc chắn sẽ bắt đầu sử dụng @ như một biến!
thoải

Đúng là strluôn xuất ra 10 ký tự, nhưng đây là môn đánh gôn: P
Michael B

1

Haskell - 113 120 byte

import Data.List
main=interact$show.map(\s@(c:_)->(c,length s)).sort.nubBy(\(a:_)(b:_)->a==b).reverse.sort.group

Đã thử nghiệm với

$ printf "acbaabbbaaaaacc" | ./sl
[('a',5),('b',3),('c',2)]

Bạn có thể sử dụng hàm .(soạn) để tránh tạo lambda trong đó tham số chỉ xuất hiện sau khi kết thúc chuỗi $chức năng được kết nối. Để làm điều này, chỉ cần thay đổi tất cả $s thành .s (ví dụ: (\i->reverse$sort$group i)biến thành reverse.sort.group.
YawarRaza7349

1

JavaScript [83 byte]

prompt().match(/(.)\1*/g).sort().reduce(function(a,b){return a[b[0]]=b.length,a},{})

Chạy mã này trong bảng điều khiển trình duyệt.

Đối với đầu vào " acbaabbbaaaaacc" bàn điều khiển nên xuất " Object {a: 5, b: 3, c: 2}".


1

JavaScript - 91

for(i=0,s=(t=prompt()).match(/(.)\1*/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)

EDIT: Giải pháp đầu tiên của tôi tuân thủ các quy tắc, nhưng nó in nhiều lần các lần xuất hiện char như abab=> a=1,b=1,a=1,b=1vì vậy tôi đã đưa ra điều này ( 101 ký tự), cho những người không hài lòng với lần đầu tiên của tôi:

for(i=0,s=(t=prompt()).match(/((.)\2*)(?!.*\1)/g);c=s[i++];)t.match(c+c[0])||alert(c[0]+'='+c.length)

0

Julia, 85

f(s)=(l=0;n=1;a=Dict();[c==l?n+=1:(n>get(a,l,1)&&(a[l]=n);n=1;l=c) for c in s*" "];a)
julia> f("acbaabbbaaaaacc")
{'a'=>5,'c'=>2,'b'=>3}

0

Python3 - 111, 126, 115 114 111 byte

Mã thực thi sẽ đọc 1 dòng (chỉ sử dụng chữ thường chữ az)

d={}.fromkeys(map(chr,range(97,123)),0)
for c in input():d[c]+=1
[print("%s=%d"%(p,d[p]))for p in d if d[p]>0]

Chỉnh sửa: Không bao gồm đầu ra không cần thiết theo yêu cầu từ @Therare

Đầu ra trông đẹp

~/codegolf $ python3 maxseq.py 
helloworld
l=3
o=2
h=1
e=1
d=1
w=1
r=1

Bạn thực sự nên loại trừ đầu ra không cần thiết. (Tôi nghĩ vậy)
seequ

"cố định" đầu ra
Thế giới chó ăn thịt chó

Bạn có thể xóa khoảng trắng giữa dấu ngoặc, số và từ khóa, chẳng hạn như forhoặc if.
xem

3
Tôi nghĩ rằng bạn đã đọc sai các câu hỏi. l=2o=1cho "
hellowworld

4
Bạn đang đếm tổng số lần xuất hiện thay vì xuất hiện liên tiếp tối đa.
xnor

0

JavaScript - 141 137 125

Tôi không thích regex :)

function g(a){i=o=[],a=a.split('');for(s=1;i<a.length;){l=a[i++];if(b=l==a[i])s++;if(!b|!i){o[l]=o[l]>s?o[l]:s;s=1}}return o}

Chạy

console.log(g("acbaabbbaaaaacc"));

đầu ra

[ c: 2, a: 5, b: 3 ]

0

Javascript, 109 104 100 98 byte

function c(s){q=l={};s.split('').map(function(k){q[k]=Math.max(n=k==l?n+1:1,q[l=k]|0)});return q}

Ví dụ sử dụng:

console.log(c("aaaaaddfffabbbbdb"))

đầu ra:

{ a: 5, d: 2, f: 3, b: 4 }

0

PHP, 104 102 96

<?php function _($s){while($n=$s[$i++]){$a[$n]=max($a[$n],$n!=$s[$i-2]?$v=1:++$v);}print_r($a);}

sử dụng

_('asdaaaadddscc');

in

Array ( [a] => 4 [s] => 1 [d] => 3 [c] => 2 )

0

Java 247

import java.util.*;public class a{public static void main(String[]a){Map<Character, Integer> m = new HashMap<>();for(char c:a[0].toCharArray()){Integer v=m.get(c);m.put(c,v==null?1:v+1);}for(char c:m.keySet())System.out.println(c+"="+m.get(c));}}

import java.util.*;hoạt động trong Java không?
xem

có và tôi dán mã cũ
user902383

OP cho biết đây có thể chỉ là một chức năng / phương thức để bạn có thể rút ngắn điều này thành phương thức đơn giản.
Rudi Kershaw

Điều này xuất ra tất cả các lần xuất hiện của ký tự trong Chuỗi, không phải là chuỗi con dài nhất bao gồm ký tự. Ví dụ, acbaabbbaaaaaccđầu ra a=8; b=4; c=3thay vì a=5; b=3; c=2.
Kevin Cruijssen

0

C 169

Lặp lại từng ký tự có thể in trong bảng ASCII và đếm tối đa từ chuỗi đầu vào.

#define N 128
int c,i,n;
char Y[N],*p;
int main(){gets(Y);
for(c=33;c<127;c++){p=Y;n=0,i=0;while(*p){if(*p==c){i++;}else{n=(i>n)?i:n;i=0;}p++;}
if(n>0) printf("%c=%d\n",c,n);}
}

Bạn đã thử nghiệm điều này? Có vẻ như nó không tạo ra đầu ra chính xác trên nhiều chuỗi và cũng không đáp ứng được thông số kỹ thuật nói rằng đầu vào có thể dài tới 1024 ... cộng với, có rất nhiều kỹ thuật chơi gôn dễ dàng mà bạn đã bỏ lỡ :)
fluffy

0

JavaScript 116

prompt(x={}).replace(/(.)\1*/g,function(m,l){n=m.length
if(!x[l]||x[l]<n)x[l]=n})
for(k in x)console.log(k+'='+x[k])

0

Groovy - 80 ký tự

Dựa trên câu trả lời thông minh này của xnor :

t=args[0];t.toSet().each{i=0;
while(t.contains(it*++i));
println "${it}=${i-1}"}

Đầu ra:

$ groovy Golf.groovy abbcccdddd
d=4
b=2
c=3
a=1

Ung dung:

t=args[0]

t.toSet().each { c ->
    i=0
    s=c

    // repeat the char c with length i
    // e.g. "b", "bb", "bbb", etc
    // stop when we find a length that is not in t:
    // this is the max + 1
    while (t.contains(s)) {
        i++
        s=c*i
    }
    println "${c}=${i-1}"
}

Điều đó thực sự tính chiều dài chuỗi tối đa? Tôi không thấy cách nó hoạt động chính xác cho một chuỗi như "aabbbbaaaabbbbbba" mặc dù tôi cũng không biết Groovy.
lông mịn

Nó hoạt động cho ví dụ của bạn. Tôi đã cập nhật phiên bản chưa được chỉnh sửa. Lưu ý rằng "a" * 4 == "aaaa".
Michael Easter

Ah, tôi thấy nó hoạt động như thế nào bây giờ. Tài giỏi.
fluffy
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.