ค้นหาความยาวของลำดับสูงสุด


29

สมมติว่าเรามีสตริงและเราต้องการหาลำดับซ้ำสูงสุดของจดหมายทุกฉบับ

ตัวอย่างเช่นกำหนดอินพุตตัวอย่าง:

"acbaabbbaaaaacc"

เอาต์พุตสำหรับอินพุตตัวอย่างสามารถเป็น:

a=5
c=2
b=3

กฎ:

  • รหัสของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรม - เพื่อให้คุณเลือก
  • อินพุตสามารถเป็นได้โดยพารามิเตอร์ stdin ไฟล์หรือฟังก์ชัน
  • เอาต์พุตควรมีเฉพาะอักขระที่ปรากฏในอินพุต
  • ความยาวสูงสุดของอินพุตคือ 1024
  • ลำดับเอาต์พุตไม่สำคัญ แต่ต้องพิมพ์ในรูปแบบ [char] = [ลำดับซ้ำสูงสุด] [ตัวคั่น]
  • สตริงสามารถมีอักขระใด ๆ

การแข่งขันจะสิ้นสุดในวันพฤหัสบดีที่ 3 เวลา 23:59 UTC


มีความยาวสูงสุดของสตริงอินพุตหรือไม่
— sigma

2
ผลลัพธ์จะต้องตรงตามที่กำหนดหรือไม่? เราสามารถพูด 0 สำหรับตัวอักษรที่ไม่ปรากฏขึ้นได้หรือไม่? ตัวอักษรทุกตัวจนถึงตัวอักษรสูงสุดจะปรากฏอย่างน้อยหนึ่งครั้งหรือไม่
— xnor

1
โปรดอธิบายว่าผลลัพธ์จะต้องอยู่ในรูปแบบที่ถูกต้องในคำถามของคุณ อย่างน้อย 10 ใน 16 คำตอบปัจจุบันใช้รูปแบบที่แตกต่างกันและอีกสามคำตอบนำเสนอรุ่นที่แตกต่างกันสองแบบ
— เดนนิส

1
@ โจอี้คุณน่าจะลงโทษกอล์ฟ โดยคุณแสดงความเสียใจฉันจะเห็นl:S_&{'=L{2$+_S\#)}g,(N}/ในระบบการผลิต! และฉันจะสาปแช่งชื่อของคุณ
— Cruncher

1
สิ่งนี้นับหรือไม่ :) wolframalpha.com/input/?i=char+%22acbaabbbaaaaacc%22+frequency
— dualed

คำตอบ:


22

รหัสเครื่อง 8086, 82 80

เนื้อหาของx.comไฟล์:

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

รองรับการทำซ้ำได้มากถึง 99 อักขระ

ซอร์สโค้ด (ทำหน้าที่เป็นอินพุตสำหรับแอสdebug.comเซมเบลอร์) พร้อมข้อคิดเห็น!

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

นี่เป็นเทคนิคการตีกอล์ฟที่ฉันคิดว่าสนุกดี:

  • ที่อยู่อาร์เรย์เป็น3d00ที่3dเป็น =ascii-สำหรับ วิธีนี้อยู่สำหรับรายการอาร์เรย์ของตัวละครเป็นx 3d78เมื่อตีความว่าเป็นสายอักขระ 2 ตัวก็จะx=ได้
  • บัฟเฟอร์ส่งออกที่อยู่104; มันเขียนทับรหัสการเริ่มต้นที่ไม่จำเป็นอีกต่อไป ลำดับจุดสิ้นสุดของบรรทัด0D 0A 24ถูกเรียกใช้งานเป็นรหัสที่ไม่เป็นอันตราย
  • aamการเรียนการสอนที่นี่ไม่ได้ให้การเล่นกอล์ฟใด ๆ แม้ว่ามันจะสามารถ ...
  • เขียนตัวเลขสองครั้งก่อนสมมติว่ามันมีค่ามากกว่า 10 แล้วแก้ไขถ้ามันเล็กกว่า
  • คำแนะนำในการออกจากที่อยู่ไม่ชัดเจน 11bซึ่งประกอบด้วยรหัสเครื่องที่จำเป็นC3โดยโชค

แนวทางที่น่าสนใจ อย่างไรก็ตามด้วยข้อ จำกัด ของการทำซ้ำ 99 ครั้งมันจะไม่จัดการกับกรณีที่มีการป้อนข้อมูลของ 1024 aaaa
— Homer6

14

CJam, 27 26 25 bytes

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

ลองออนไลน์

ตัวอย่าง

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

มันทำงานอย่างไร

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 ไบต์

เป็นวิธีที่ง่ายอีกครั้ง

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

คำอธิบาย:

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 + '='

ตัวอย่าง:

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

หากได้รับอนุญาตให้ส่งออกรูปแบบอิสระ (เช่นเดียวกับคำตอบอื่น ๆ อีกมากมาย) ฉันมีรุ่น45 ไบต์เช่นกัน กล่องเหล่านี้แสดงรายการของกล่อง (ใช่พวกมันจะถูกพิมพ์แบบนั้นแม้ว่าความสูงบรรทัดของ SE จะแตกออกมา)

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

8

ทับทิม, 72

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

สิ่งนี้ใช้อินพุตจากอาร์กิวเมนต์บรรทัดรับคำสั่งและเอาต์พุตไปยัง stdout


charsสั้นกว่าsplit("")เล็กน้อย
— Ventero

@Ventero ฉันลองมัน แต่charsให้ตัวแจงมากกว่าอาร์เรย์ ฉันอยู่ใน 1.9.3 ดังนั้นมันจึงเป็น 2.0
— ชัดเจน

ใช่ใน 2.0 charsคืนอาร์เรย์
— Ventero

อาจยืดกฎนิดหน่อย แต่อาจจะใช้pแทนputs?
— Shelvacu

1
ฉันเห็น. แม้ว่าจะทำให้สวยน้อยลง แต่ฉันไม่สามารถเห็นได้ว่ามันจะผิดกฎใด ๆ
— daniero

7

GolfScript ขนาด 26 ไบต์

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

ลองออนไลน์

คำอธิบาย:

  • :sบันทึกสตริงอินพุตในตัวแปรsเพื่อใช้ในภายหลัง
  • .&แยกอักขระที่ไม่ซ้ำกันในอินพุตซึ่งโค้ดที่เหลือใน{ }%ลูปจะวนซ้ำ
  • 61 ดันหมายเลข 61 (รหัส ASCII สำหรับเครื่องหมายเท่ากับ) ที่ด้านบนของอักขระปัจจุบันบนสแต็กเพื่อทำหน้าที่เป็นตัวคั่นเอาต์พุต
  • {2$=}s%รับค่าสตริงsและแทนที่อักขระด้วย 1 หากพวกเขาเท่ากับอักขระปัจจุบันที่มีการวนซ้ำหรือ 0 ถ้าไม่มี (นอกจากนี้ยังทำให้อักขระปัจจุบันอยู่บนสแต็กสำหรับเอาต์พุต)
  • 1,/ นำสตริงของคนและศูนย์นี้และแยกมันที่ศูนย์
  • $เรียงลำดับสตริงย่อยที่เป็นผลลัพธ์-1=แยกสตริงย่อยสุดท้าย (ซึ่งเนื่องจากทั้งหมดประกอบด้วยการซ้ำของอักขระเดียวกันมีความยาวที่สุด) และ,ส่งคืนความยาวของสตริงย่อยนี้
  • n+ stringifies ความยาวและผนวกบรรทัดใหม่ให้มัน

ps หากเครื่องหมายเท่ากับในเอาต์พุตเป็นทางเลือก61สามารถละเว้นได้ (และ2$แทนที่ด้วย1$) สำหรับความยาวทั้งหมด24 ไบต์ :

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

1
คุณสามารถบันทึก swap ได้ถ้าคุณกด61ครั้งแรก: :s.&{61{2$=}s%1,/$-1=,n+}%.
— Howard

@ วิธี: ขอบคุณ!
— Ilmari Karonen

6

CoffeeScript 109 ไบต์

ฉันชอบ 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'

นี่คือ JavaScript ที่รวบรวมซึ่งคุณสามารถทดลองใช้ในคอนโซลของเบราว์เซอร์ของคุณ

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

จากนั้นคุณสามารถโทร

f("acbaabbbaaaaacc")

เพื่อรับ

c=2
a=5
b=3

aaaabaaนี้ดูเหมือนว่าจะสร้างผลที่ไม่ถูกต้องสำหรับการป้อนข้อมูลเช่น
— Ventero

@Ventero คุณพูดถูกมีสองปัญหา อันหนึ่งได้รับการแก้ไขอย่างง่ายดาย แต่ฉันต้องคิดเรื่องอื่น
— Martin Ender

แก้ไข @Ventero แล้ว
— Martin Ender

5

Pyth , 24 25 26 (หรือ 29)

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

การทดสอบสามารถทำได้ที่นี่: ลิงค์

เอาต์พุตในรูปแบบ:

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

คำอธิบาย:

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

งูหลาม:

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

สำหรับเอาต์พุต (a = 5) ที่เหมาะสมให้ใช้:

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

29 ตัวอักษร


ดูเหมือนว่าคุณมีความคิดเดียวกันแน่นอน มี +1 สำหรับสิ่งนั้น
— seequ

@TheRare ใช่ดูเหมือนว่าเป็นวิธีที่ดีมากที่จะทำ
— isaacg

ไม่เกี่ยวข้องกับอัลกอริธึมของคุณ แต่เอาต์พุตของไพ ธ อนสับสนเนื่องจากk=''ถูกนิยามไว้ที่อื่น
— gggg

ใช่ขอโทษด้วย ฉันจะพยายามปรับปรุงมัน ฉันจะแก้ไขด้วย
— isaacg

5

C, 126 125 119 ไบต์

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

วิ่ง:

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

คุณสามารถแทนที่getchar()>0โดย~getchar()ชอบในคำตอบนี้
— anatolyg

@anatolyg EOF รับประกันว่าเป็น -1 หรือไม่ ฉันคิดว่ามันถูกนิยามโดยเฉพาะว่าเป็น <0 เท่านั้น
— ปุย

ฉันคิดว่า -1 เป็นเรื่องธรรมดามากพอ (เช่น Windows และ linux) ดังนั้นคุณสามารถสมมติมันสำหรับ Code Golf สำหรับรหัสการผลิตless than zeroก็โอเคอย่างสมบูรณ์ แต่== EOFชัดเจนยิ่งขึ้น
— anatolyg

@atatolg แน่นอนและที่จริงฉันเดาตามสเป็ค EOF เห็นได้ชัดว่าไม่ได้รับประกันว่าจะเป็น <0 - อาจเป็นเช่น 256 เช่นกันดังนั้นฉันจะบันทึกไบต์เดียว :)
— ปุย

2
EOFรับประกันว่าจะเป็นลบและ -1 จะถูกใช้แม้ว่าcharจะมีการเซ็นชื่อ ดูที่นี่
— Anatolyg

4

Mathematica , 74 72 69

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

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

ไม่ดีมาก แต่สายอักขระไม่ใช่พื้นที่ที่ดีที่สุดของMathematica เริ่มดีขึ้น :-)


นี่คือการเล่นกอล์ฟที่น่าประทับใจ (การพูดแบบนี้หลังจากลองด้วยตัวเอง ... )
— Szabolcs

v10 ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & อย่างน้อยมันก็ค่อนข้างตรงไปตรงมาและอ่านได้
— Szabolcs

@ Szabolcs ขอบคุณ! ความแตกต่างระหว่างGroupByและGatherByคืออะไร
— Mr.Wizard

ความแตกต่างที่สำคัญคือส่งกลับGroupBy Associationฉันยังไม่ได้ศึกษารายละเอียดที่แตกต่างอื่น ๆ reference.wolfram.com/language/ref/GroupBy.html คุณสามารถทดลองใช้งานในระบบคลาวด์ด้วยบัญชีฟรี (นั่นคือวิธีที่ฉันกำลังเล่นกับเกมนี้)
— Szabolcs

3

C # (LinQPad)

146

นี่คือคำตอบของ tsavino แต่สั้นกว่า นี่ผมใช้แทนDistinct() GroupBy(c=>c)นอกจากนี้วงเล็บปีกกาจากforeach-loopยังเหลือ:

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

ฉันพยายามใช้lambda expressionแทนที่จะเป็นไวยากรณ์แบบสอบถามปกติ แต่เนื่องจากฉันต้องการCast<Match>รหัสแรกจึงกลายเป็นอักขระ 1 ตัวอีกต่อไป ... อย่างไรก็ตามเนื่องจากสามารถประมวลผลได้ใน LinQPad คุณสามารถใช้Dump()แทน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();}

Max()การศึกษาต่อของรหัสที่มีฉันคิดเกี่ยวกับ Funcฟังก์ชั่นนี้ยอมรับ วิธีนี้ฉันสามารถข้ามSelectส่วนเมื่อใช้ lambda epxression:

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

ดังนั้นผลสุดท้าย:

128

ปรับปรุง:

ขอบคุณคำแนะนำจาก Dan Puzey ฉันสามารถบันทึกตัวละครอีก 6 ตัวได้:

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

ความยาว:

122


ขอบคุณสำหรับการปรับปรุงของฉันฉันไม่รู้เกี่ยวกับกลอุบายกับ. ดัมพ์ () ใน LinqPad ตามจริงแล้วฉันพัฒนารหัสใน Visual Studio และคัดลอกไปยัง LinqPad เพื่อบันทึกอักขระบางตัวเนื่องจาก LinqPad ไม่ต้องการวิธีหลัก
— tsavinho

ขอบคุณ! ฉันเพิ่งจะได้รู้Dump()วิธีการเมื่อเร็ว ๆ นี้ช่วยให้คุณประหยัด 10+ ตัวอักษรทุกครั้ง :) การจัดฟันแบบโค้งนั้นง่ายและที่เหลือก็เป็นส่วนหนึ่งของการระดมสมอง: D
— Abbas

1
หากคุณมีความสุขที่จะใช้IEnumerableรูปแบบการแสดงผลของ LinqPad คุณสามารถบันทึกอีก 8 ตัวอักษรด้วยตัวคุณเอง:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
— Dan Puzey

3

Python 3 (70)

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

แม้แต่ Python golfed สามารถอ่านได้มาก ฉันคิดว่ารหัสนี้เป็นสำนวนเต็มยกเว้นตัวแปรตัวอักษรเดียวและหนึ่งบรรทัดในขณะที่วง

ตัวอย่างการทำงาน:

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

นี่เป็นวิธีแก้ปัญหาที่น่าสนใจ
— Cruncher

1
หากคุณเปลี่ยนชุดเป็นเพียงฉันคิดว่ามันยังคงเป็นไปตามข้อกำหนด ไม่ว่าที่ไหนถ่านแต่ละอันจะต้องพิมพ์เพียงครั้งเดียว
— Cruncher

@Cruncher ฉันเห็นด้วยกับ OP ไม่ได้ระบุตัวอักษรแต่ละตัวเพียงครั้งเดียว แต่คำตอบของ Python อื่น ๆ ดูเหมือนว่าจะถือว่ามัน แม้ว่ารูปแบบผลลัพธ์จะยังคงไม่สอดคล้องกัน ฉันหวังว่า OP ได้ตอบสนองต่อคำขอเพื่อชี้แจง
— xnor

2

ทับทิม, 58

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

รับอินพุตจาก STDIN ส่งเอาต์พุตไปยัง STDOUT ในรูปแบบ {"a"=>5, "c"=>2, "b"=>3}


2

C # ใน LINQPad - 159 ไบต์

อย่างน้อยฉันก็เอาชนะ T-SQL; P จะไม่ชนะใครอื่น แต่ฉันคิดว่าฉันจะแบ่งปันมันต่อไป

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

การใช้งาน:

v("acbaabbbaaaaacc");

ข้อเสนอแนะยินดีต้อนรับเสมอ!


คำตอบที่ดี! ฉันมีข้อเสนอแนะบางอย่าง แต่นั่นยาวเกินไปสำหรับความคิดเห็นดังนั้นคลิกที่นี่เพื่อรับคำตอบ :)
— Abbas

2

PowerShell 80 77 72

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

คุณต้องเรียกใช้บนคอนโซล ...


1
$xฟุ่มเฟือย คุณสั้นกว่าสามไบต์ไม่ได้ใช้งาน ยังsort -uพอเพียง ไม่จำเป็นต้องสะกดชื่อพารามิเตอร์ทั้งหมด อย่างไรก็ตามสิ่งนี้จะล้มเหลวสำหรับอักขระบางตัวเนื่องจากการใช้งานที่ไม่ใช้ค่า Escape ใน regex ขึ้นอยู่กับวิธีที่»สตริงสามารถมีอักขระใด ๆ «ที่จะต้องทำความเข้าใจซึ่งอาจเป็นปัญหาได้
— Joey

ขอบคุณ @Joey สำหรับเคล็ดลับในการจัดเรียง -u อย่างไรเกี่ยวกับการที่ $ x ฉันไม่สามารถได้รับมันในการทำงานเช่น[char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}นี้ดูเหมือนว่าที่สอง $ args มาว่างเปล่า ... - darkajax 17 นาทีที่แล้ว
— DarkAjax

อ๋อใช่ ขอโทษ นั่นเป็นเพราะมันอยู่ในบล็อกสคริปต์ซึ่งมีอาร์กิวเมนต์ของตัวเอง ( $argsไม่มีอีกต่อไปของสคริปต์)
— Joey

2

Perl - 65 71 76ตัวอักษร

รหัสกอล์ฟครั้งแรกของฉัน!

สำหรับแต่ละคำตอบให้คัดลอกไปที่ golf.pl และเรียกใช้เป็น:

echo acbaabbbaaaaacc | perl golf.pl

วิธีแก้ปัญหาที่สั้นที่สุดของฉันพิมพ์ตัวละครแต่ละตัวหลาย ๆ ครั้งตามที่ปรากฏเนื่องจากกฎดังกล่าวไม่ได้รับอนุญาต

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

โซลูชันที่สั้นที่สุดถัดไปของฉัน (85 90ตัวอักษร) พิมพ์แต่ละอักขระเพียงครั้งเดียว:

<>=~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

ใน FSI การโทร

f "acbaabbbaaaaacc"

จะช่วยให้

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

อย่างไรก็ตามหากต้องการพิมพ์โดยไม่มีข้อมูลเพิ่มเติมให้โทรหาเช่นนี้:

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

ซึ่งจะช่วยให้

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

1

Javascript, 116 ไบต์

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

ตัวอย่างผลลัพธ์:

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

แก้ไข: ลบแล้ว ORDER BYเนื่องจากกฎอนุญาตการสั่งซื้อเอาต์พุตใด ๆ

รับอินพุตจากตัวแปร CHAR @aและใช้CTE แบบเรียกซ้ำเพื่อสร้างแถวสำหรับอักขระแต่ละตัวในสตริงและคำนวณหาลำดับเหตุการณ์ที่เกิดขึ้น

หลังจากนั้นก็ง่ายSELECTและGROUP BYคำนึงถึงลำดับของเอาต์พุต

ลองใช้กับซอ 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

การกำหนดตัวแปร:

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

ตัวอย่างผลลัพธ์:

a=5
c=2
b=3

ฉันไม่คิดว่าฉันเคยเห็นโซลูชัน SQL มาก่อน น่าสนใจ
— Seiyria

พิจารณาฟังก์ชันแทนstr ltrimคุณสามารถตั้งชื่อตัวแปรของคุณ@เพื่อบันทึกตัวอักษร สิ่งนี้ช่วยให้คุณสูญเสียiตัวแปรใน rcte ฉันคิดว่าคุณสามารถโกนหนวดได้ไม่กี่ตัวอักษร คุณอาจสามารถเขียนแบบสอบถามด้วยการใช้ฟังก์ชั่นหน้าต่างเช่นผลรวมมากกว่าแถวก่อนหน้าหรือล่าช้า ฉันยังไม่ก่อตัวขึ้น แต่ใจคุณ
— Michael B

@MichaelB ขอบคุณสำหรับคำแนะนำ ปัญหาที่ฉันมีกับ str () ก็คือมันจะให้พื้นที่เพิ่มเติมเป็นจำนวนมาก แน่นอนฉันจะเริ่มใช้ @ เป็นตัวแปร!
— comfortablydrei

เป็นความจริงที่strส่งออก 10 อักขระเสมอ แต่นี่คือการเล่นกอล์ฟ: P
— Michael B

1

Haskell - 113 120 ไบต์

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

ทดสอบกับ

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

คุณสามารถใช้.ฟังก์ชั่น (เขียนข้อความ) เพื่อหลีกเลี่ยงการสร้างแลมบ์ดาซึ่งพารามิเตอร์จะปรากฏเฉพาะหลังจากสิ้นสุด$ฟังก์ชั่นเชื่อมต่อ การทำเช่นนี้เพียงแค่เปลี่ยนทั้งหมด$เพื่อ.s (ตัวอย่าง: (\i->reverse$sort$group i)กลายเป็นreverse.sort.group.
— YawarRaza7349

1

JavaScript [83 ไบต์]

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

เรียกใช้รหัสนี้ในคอนโซลเบราว์เซอร์

สำหรับอินพุต " acbaabbbaaaaacc" คอนโซลควรเอาต์พุต " 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)

แก้ไข:ทางออกแรกของฉันเป็นไปตามกฎ แต่มันพิมพ์เหตุการณ์ถ่านหลายครั้งเช่นabab=> a=1,b=1,a=1,b=1ดังนั้นฉันจึงออกมาพร้อมกับเรื่องนี้ ( 101ตัวอักษร) สำหรับผู้ที่ไม่พอใจกับครั้งแรกของฉัน:

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

0

จูเลียอายุ 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 ไบต์

รหัสปฏิบัติการที่จะอ่าน 1 บรรทัด (ใช้ตัวอักษรพิมพ์เล็ก 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]

แก้ไข: ไม่รวมเอาต์พุตที่ไม่จำเป็นตามคำขอจาก @Therare

ผลลัพธ์ดูดี

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

You really should exclude the unnecessary output. (I think)
— seequ

"fixed" the output
— Dog eat cat world

You can remove spaces between braces, numbers and keywords, such as for or if.
— seequ

3
I think you've misread the questions. l=2 and o=1 for "helloworld"
— gnibbler

4
You're counting total appearances instead of maximum consecutive appearances.
— xnor

0

JavaScript - 141 137 125

I don't like 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}

Run

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

outputs

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

0

Javascript, 109 104 100 98 bytes

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}

Example usage:

console.log(c("aaaaaddfffabbbbdb"))

outputs:

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

usage

_('asdaaaadddscc');

printed

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

Does import java.util.*; work in Java?
— seequ

yes and i paste old code
— user902383

The OP said it could just be a function/method so you can shorten this to simply the method.
— Rudi Kershaw

This outputs all occurrences of the character in the String, not the longest substrings consisting of the character. For example, acbaabbbaaaaacc outputs a=8; b=4; c=3 instead of a=5; b=3; c=2.
— Kevin Cruijssen

0

C 169

Iterates each printable character in ASCII table and counts max from input string.

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

Have you tested this? It doesn't look like it produces correct output on a lot of strings , and also doesn't meet the spec which says that input can be up to 1024 long... plus, there's a lot of easy golfing techniques that you've missed. :)
— fluffy


0

Groovy - 80 chars

Based on this clever answer by xnor :

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

Output:

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

Ungolfed:

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

Does that actually count the maximum sequence length? I don't see how that would work correctly for a string like "aabbbbaaaabbbbbba" although I don't know Groovy either.
— fluffy

It works for your example. I've updated the ungolfed version. Note that "a" * 4 == "aaaa" .
— Michael Easter

Ah, I see how it works now. Clever.
— fluffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.