Temukan panjang urutan maks


29

Asumsikan kita memiliki string, dan kami ingin menemukan urutan maksimum setiap huruf yang diulang.

Misalnya, diberikan input sampel:

"acbaabbbaaaaacc"

Output untuk input sampel dapat:

a=5
c=2
b=3

Aturan:

  • Kode Anda dapat berupa fungsi atau program - untuk Anda pilih
  • Input dapat dengan parameter stdin, file atau fungsi
  • Keluaran harus hanya berisi karakter yang muncul dalam input
  • Input panjang maks adalah 1024
  • Urutan output tidak masalah, tetapi harus dicetak dalam bentuk [char] = [urutan berulang maksimum] [pembatas]
  • String dapat berisi karakter apa saja

Kompetisi berakhir pada Kamis 3 jam 23:59 UTC.


Apakah ada panjang maksimum string input?
sigma

2
Apakah hasilnya harus persis seperti yang diberikan? Bisakah kita mengatakan 0 untuk huruf yang tidak muncul? Apakah setiap huruf hingga huruf tertinggi akan muncul setidaknya satu kali?
xnor

1
Harap klarifikasi jika output harus diformat persis seperti yang dicontohkan dalam pertanyaan Anda. Setidaknya 10 dari 16 jawaban saat ini menggunakan format yang berbeda, tiga lainnya menyajikan dua versi yang berbeda.
Dennis

1
@ Joey Anda mungkin harus menghukum karena bermain golf. Dengan Anda memaafkannya, saya akhirnya akan melihat l:S_&{'=L{2$+_S\#)}g,(N}/dalam sistem produksi! Dan aku akan mengutuk namamu.
Cruncher

Jawaban:


22

8086 kode mesin, 82 80

Isi x.comfile:

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

Ini hanya mendukung pengulangan hingga 99 karakter.

Kode sumber (berfungsi sebagai input untuk debug.comassembler), dengan komentar!

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

Berikut ini beberapa teknik bermain golf yang menurut saya menyenangkan:

  • alamat array adalah 3d00, di mana 3dascii-code untuk =. Dengan cara ini, alamat untuk entri array untuk karakter xadalah 3d78. Ketika ditafsirkan sebagai string 2 karakter, itu x=.
  • Buffer output ada di alamat 104; itu menimpa kode inisialisasi yang tidak lagi diperlukan. Urutan akhir baris 0D 0A 24dijalankan sebagai kode tidak berbahaya.
  • The aaminstruksi sini tidak menyediakan golf apapun, meskipun itu bisa ...
  • Tulis nomornya dua kali, pertama dengan asumsi lebih besar dari 10, dan kemudian koreksi jika lebih kecil.
  • Instruksi keluar ada di alamat yang tidak jelas 11b, yang berisi kode mesin yang dibutuhkan C3karena keberuntungan.

Pendekatan yang menarik. Namun, dengan batasan 99 pengulangan, itu tidak akan menangani kasus di mana input 1024 aaaa disediakan.
Homer6

14

CJam, 27 26 25 byte

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

Cobalah online.

Contoh

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

Bagaimana itu bekerja

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

Ya, pendekatan sederhana lagi.

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

Penjelasan:

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

Contoh:

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

Jika output bentuk bebas diizinkan (seperti pada banyak jawaban lain), saya juga memiliki versi 45 byte . Kotak-kotak ini mewakili daftar kotak (ya, mereka dicetak seperti itu, meskipun tinggi garis SE merusaknya).

   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]*?=}

Ini mengambil input dari argumen baris perintah dan output ke stdout.


charssedikit lebih pendek dari split("").
Ventero

@Ventero Saya mencobanya, tetapi charsmemberikan enumerator daripada array. Saya di 1.9.3, jadi apakah ini 2.0?
Berlangsung

Ya, dalam 2.0 charsmengembalikan array.
Ventero

Mungkin sedikit meregangkan aturan, tapi mungkin menggunakan pbukan puts?
Shelvacu

1
Saya melihat. Meskipun itu membuatnya kurang cantik, saya tidak bisa melihat bahwa itu akan melanggar aturan apa pun.
daniero

7

GolfScript, 26 byte

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

Cobalah online.

Penjelasan:

  • :smenyimpan string input dalam variabel suntuk digunakan nanti.
  • .&mengekstrak karakter unik dalam input, yang selanjutnya dimasukkan ke dalam { }%loop berulang.
  • 61 mendorong angka 61 (kode ASCII untuk tanda sama dengan) di atas karakter saat ini di tumpukan, untuk bertindak sebagai pembatas output.
  • {2$=}s%mengambil string sdan mengganti karakternya dengan 1 jika mereka sama dengan karakter saat ini yang diiterasi, atau 0 jika tidak. (Ini juga meninggalkan karakter saat ini pada tumpukan untuk keluaran.)
  • 1,/ mengambil string satu dan nol ini, dan membaginya menjadi nol.
  • $macam substring yang dihasilkan, -1=ekstrak substring terakhir (yang, karena semuanya terdiri dari pengulangan dari karakter yang sama, adalah yang terpanjang), dan ,mengembalikan panjang substring ini.
  • n+ merangkai panjang dan menambahkan baris baru untuk itu.

Ps. Jika tanda sama dengan output adalah opsional, 61dapat dihilangkan (dan 2$diganti dengan 1$), untuk panjang total 24 byte :

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

1
Anda dapat menyimpan swap jika Anda mendorong 61pertama: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard

@ Howard: Terima kasih!
Ilmari Karonen

6

CoffeeScript, 109 byte

Saya suka 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'

Berikut ini adalah kompilasi JavaScript yang dapat Anda coba di konsol browser Anda

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

Maka Anda bisa menelepon

f("acbaabbbaaaaacc")

mendapatkan

c=2
a=5
b=3

Ini sepertinya menghasilkan hasil yang salah untuk input seperti aaaabaa.
Ventero

@Ventero Anda benar, ada dua masalah. satu mudah diperbaiki, tetapi saya perlu memikirkan yang lain.
Martin Ender

@Ventero diperbaiki.
Martin Ender

5

Pyth , 24 25 26 (atau 29)

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

Tes dapat dilakukan di sini: tautan

Output dalam format:

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

Penjelasan:

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

Python:

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

Untuk output yang tepat (a = 5), gunakan:

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

29 karakter


Sepertinya Anda memiliki ide yang sama persis. Punya +1 untuk itu.
seequ

@ TheRare ya, sepertinya cara yang sangat baik untuk melakukannya.
isaacg

Tidak benar-benar terkait dengan algoritma Anda, tetapi output python membingungkan, karena k=''ditentukan di tempat lain.
gggg

Ya, maaf soal itu. Saya akan berusaha memperbaikinya. Saya akan mengeditnya juga.
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]);}

Berlari:

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

Anda dapat menggantinya getchar()>0dengan ~getchar()seperti pada jawaban ini
anatolyg

@anatolyg Apakah EOF dijamin tepat -1? Saya pikir itu hanya secara spesifik didefinisikan sebagai <0.
lembut

Saya pikir -1 cukup umum (yaitu Windows dan linux) sehingga Anda dapat menganggapnya untuk Code Golf. Untuk kode produksi, less than zerotidak apa-apa, tetapi == EOFlebih jelas.
anatolyg

@ anatolyg Tentu, dan sebenarnya saya kira per spec EOF ternyata bahkan tidak dijamin <0 - bisa juga, misalnya, 256. Jadi saya hanya akan menyimpan satu byte. :)
fluffy

2
EOFdijamin negatif, dan -1 digunakan meskipun charditandatangani; lihat di sini
anatolyg

4

Mathematica , 74 72 69 69

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

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

Tidak terlalu bagus tetapi string tidak wilayah terbaik Mathematica . Menjadi lebih baik. :-)


Ini golf yang sangat mengesankan (mengatakan ini setelah mencobanya sendiri ...)
Szabolcs

v10, bukan solusi lengkap: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & Setidaknya cukup mudah dan mudah dibaca.
Szabolcs

@ Alkabolcs Terima kasih! Apa perbedaan antara GroupBydan GatherBy?
Tuan Penyihir

Perbedaan utama adalah bahwa GroupBymengembalikan sebuah Association. Saya belum mempelajari perbedaan lain secara detail. reference.wolfram.com/language/ref/GroupBy.html Anda dapat mencobanya di cloud dengan akun gratis (begitulah cara saya memainkan ini).
Szabolcs

3

C # (LinQPad)

146

Ini adalah jawaban tsavino tetapi lebih pendek. Di sini, saya menggunakan Distinct()bukan GroupBy(c=>c). Juga kurung kurawal dari foreach-loopditinggalkan:

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

Saya mencoba menggunakan lambda expressionalih - alih sintaks kueri normal, tetapi karena saya memerlukan sintaks Cast<Match>pertama, kodenya menjadi 1 karakter lebih panjang ... Bagaimanapun, karena dapat dijalankan di LinQPad, Anda dapat menggunakan Dump()alih-alih 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();}

Studi lebih lanjut tentang kode membuat saya berpikir tentang Max(). Fungsi ini juga menerima a Func. Dengan cara ini saya bisa melewatkan Selectbagian ketika menggunakan epxresi lambda:

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

Jadi, hasil akhir:

128

Memperbarui:

Berkat tip dari Dan Puzey, saya dapat menyimpan 6 karakter lainnya:

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

Panjangnya:

122


Terima kasih atas peningkatan Anda, saya tidak tahu tentang trik dengan .Dump () di LinqPad. Sejujurnya, saya mengembangkan kode dalam Visual Studio dan menyalinnya ke LinqPad untuk menyimpan beberapa karakter karena LinqPad tidak memerlukan metode utama.
tsavinho

Terima kasih! Saya juga baru tahu Dump()metodenya baru-baru ini, menghemat 10+ karakter setiap kali :) Kurung kurawal mudah dan sisanya sedikit braincracking: D
Abbas

1
Jika Anda senang menggunakan IEnumerablegaya tampilan LinqPad, Anda dapat menyimpan 8 karakter lagi, dengan ini sebagai tubuh Anda: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)

Bahkan Python golf bisa sangat mudah dibaca. Saya pikir kode ini sepenuhnya idiomatis kecuali untuk variabel huruf tunggal dan satu baris sementara loop.

Contoh berjalan:

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

Ini adalah solusi yang menarik
Cruncher

1
jika Anda mengubah set ke s, saya pikir itu masih memenuhi persyaratan. Tidak ada yang mengatakan setiap karakter harus dicetak hanya sekali.
Cruncher

@Cruncher Saya setuju OP tidak menentukan setiap huruf sekali, tetapi jawaban Python lain sepertinya menganggapnya, jadi saya akan tetap dengan itu agar sebanding. Padahal format output masih tidak konsisten. Saya berharap OP telah menanggapi permintaan untuk mengklarifikasi.
xnor

2

Ruby, 58

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

Mengambil input dari STDIN, mengeluarkannya ke STDOUT dalam formulir {"a"=>5, "c"=>2, "b"=>3}


2

C # dalam LINQPad - 159 Bytes

Yah, setidaknya saya mengalahkan T-SQL; P Tidak akan mengalahkan orang lain, tapi saya pikir saya akan tetap membagikannya.

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

Pemakaian:

v("acbaabbbaaaaacc");

Saran selalu diterima!


Jawaban bagus! Saya punya beberapa saran tapi itu terlalu panjang untuk dikomentari jadi klik di sini untuk jawaban saya. :)
Abbas

2

Powershell 80 77 72

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

Anda harus menjalankannya di konsol ...


1
$xberlebihan. Anda tiga byte lebih pendek tidak menggunakannya. Juga sort -ucukup. Jarang perlu mengeja nama parameter lengkap. Namun, ini akan gagal untuk karakter tertentu karena penggunaan yang tidak terhapus di regex. Bergantung pada bagaimana »String dapat berisi karakter apa saja yang harus dipahami, ini bisa menjadi masalah.
Joey

@ Joey, terima kasih atas tipnya pada sort -u, namun mengenai $ x saya tidak bisa membuatnya berfungsi [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, sepertinya $ args kedua kosong ... - darkajax 17 mnt lalu
DarkAjax

Eep, ya. Maaf. Itu karena ada di blok skrip, yang memiliki argumen sendiri ( $argstidak ada lagi skrip).
Joey

2

Perl - 65 71 76 karakter

Golf kode pertama saya!

Untuk setiap jawaban, salin ke golf.pl dan jalankan sebagai:

echo acbaabbbaaaaacc | perl golf.pl

Solusi terpendek saya mencetak setiap karakter sebanyak yang muncul, karena itu tidak dilarang oleh aturan.

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

Solusi terpendek saya berikutnya (85 90 karakter) hanya mencetak setiap karakter sekali:

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

Di FSI, menelepon

f "acbaabbbaaaaacc"

memberi

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

Namun, untuk mencetaknya tanpa informasi tambahan, sebut seperti ini:

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

pemberian yang mana

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,'')

Output sampel:

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

Sunting: dihapus ORDER BYkarena aturan mengizinkan urutan keluaran apa pun.

Mengambil input dari variabel CHAR @a,, dan menggunakan a CTE rekursif untuk membuat baris untuk setiap karakter dalam string dan mencari tahu kejadian berurutan.

Setelah itu, itu sederhana SELECTdanGROUP BY dengan pertimbangan untuk urutan output.

Cobalah di 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

Menetapkan variabel:

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

Output sampel:

a=5
c=2
b=3

Saya tidak berpikir saya telah melihat solusi SQL di sini sebelumnya. Menarik.
Seiyria

pertimbangkan strfungsi, alih-alih ltrim. Anda juga dapat memberi nama variabel Anda @untuk menyimpan char. Ini memungkinkan Anda kehilangan ivariabel di rcte. Saya pikir Anda dapat mencukur beberapa karakter dengan cara itu. Anda mungkin juga dapat menulis ulang kueri dengan menggunakan fungsi windowing seperti jumlah lebih dari baris sebelumnya atau lag. Saya belum terbentuk bagaimana pikiran Anda.
Michael B

@MichaelB terima kasih atas sarannya. Masalah yang saya miliki dengan str () adalah bahwa ia menghasilkan banyak ruang ekstra. Saya pasti akan mulai menggunakan @ sebagai variabel!
comfortablydrei

Memang benar bahwa strselalu menghasilkan 10 karakter, tetapi ini golf: 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

Diuji dengan

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

Anda dapat menggunakan fungsi .(compose) untuk menghindari pembuatan lambda di mana parameter hanya muncul setelah akhir rangkaian $fungsi yang terhubung. Untuk melakukan ini, cukup ubah semua $s menjadi .(contoh: (\i->reverse$sort$group i)berubah menjadi reverse.sort.group.
YawarRaza7349

1

JavaScript [83 byte]

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

Jalankan kode ini di konsol browser.

Untuk input " acbaabbbaaaaacc" konsol harus menampilkan " 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: Solusi pertama saya mematuhi aturan, tetapi mencetak beberapa kali kejadian char tunggal seperti abab=> a=1,b=1,a=1,b=1jadi saya keluar dengan ini ( 101 karakter), bagi mereka yang tidak puas dengan yang pertama:

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

Kode yang dapat dieksekusi yang akan membaca 1 baris (hanya menggunakan huruf kecil 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]

Sunting: Keluaran yang tidak perlu dikecualikan berdasarkan permintaan dari @Therare

Outputnya terlihat bagus

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

Anda benar-benar harus mengecualikan output yang tidak perlu. (Saya pikir)
seequ

"memperbaiki" hasilnya
Dog eat cat world

Anda dapat menghapus spasi antara kurung kurawal, angka dan kata kunci, seperti foratau if.
seequ

3
Saya pikir Anda salah membaca pertanyaan. l=2dan o=1untuk "helloworld"
gnibbler

4
Anda menghitung total penampilan alih-alih penampilan maksimum berturut-turut.
xnor

0

JavaScript - 141 137 125

Saya tidak suka 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}

Menjalankan

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

output

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

Contoh penggunaan:

console.log(c("aaaaaddfffabbbbdb"))

output:

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

pemakaian

_('asdaaaadddscc');

dicetak

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

0

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

Apakah import java.util.*;berfungsi di Jawa?
seequ

ya dan saya tempel kode lama
user902383

OP mengatakan itu hanya bisa menjadi fungsi / metode sehingga Anda dapat mempersingkat ini menjadi sekadar metode.
Rudi Kershaw

Ini menampilkan semua kemunculan karakter dalam String, bukan substring terpanjang yang terdiri dari karakter. Misalnya, acbaabbbaaaaaccoutput a=8; b=4; c=3bukan a=5; b=3; c=2.
Kevin Cruijssen

0

C 169

Iterasi setiap karakter yang dapat dicetak dalam tabel ASCII dan hitung maks dari string input.

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

Sudahkah Anda menguji ini? Ini tidak terlihat seperti menghasilkan output yang benar pada banyak string, dan juga tidak memenuhi spesifikasi yang mengatakan bahwa input bisa mencapai 1024 panjang ... ditambah, ada banyak teknik golf mudah yang telah Anda miliki terjawab. :)
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 karakter

Berdasarkan jawaban cerdas ini oleh xnor :

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

Keluaran:

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

Tidak Terkumpul:

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

Apakah itu benar-benar menghitung panjang urutan maksimum? Saya tidak melihat bagaimana itu akan bekerja dengan benar untuk string seperti "aabbbbaaaabbbbbba" meskipun saya tidak tahu Groovy juga.
lembut

Ini berfungsi untuk contoh Anda. Saya telah memperbarui versi yang ungolfed. Perhatikan bahwa "a" * 4 == "aaaa".
Michael Easter

Ah, saya mengerti cara kerjanya sekarang. Pintar.
lembut
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.