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


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.