Maksimum dizi uzunluğunu bulun


29

Bir dizgemiz olduğunu varsayalım ve her harfin maksimum tekrarlanan dizisini bulmak istiyoruz.

Örneğin, örnek girdi verilen:

"acbaabbbaaaaacc"

Numune girişi için çıktı olabilir:

a=5
c=2
b=3

Kurallar:

  • Kodunuz bir işlev veya program olabilir - seçtiğiniz için
  • Giriş, stdin, dosya veya fonksiyon parametresi ile yapılabilir
  • Çıktı yalnızca girdide görünen karakterleri içermelidir
  • Giriş maksimum uzunluğu 1024
  • Çıkış sırası önemli değil, ancak [char] = [maksimum tekrarlanan sıra] [sınırlayıcı] şeklinde yazdırılması gerekiyor
  • Dize herhangi bir karakter içerebilir

Yarışma 3 perşembe günü saat 23: 59 UTC'de sona eriyor.


Giriş dizgisinin uzunluğu için maksimum var mı?
sigma

2
Çıktı tam olarak verildiği gibi mi olmalı? Görünmeyen harfler için 0 diyebilir miyiz? En yüksek harfe kadar her harf en az bir kere mi görünecek?
xnor

1
Lütfen çıktının sorunuzda tam olarak gösterildiği gibi biçimlendirilmesi gerekip gerekmediğini netleştirin. Mevcut 16 cevabın en az 10'u farklı bir format kullanıyor, üçü iki farklı versiyon sunuyor.
Dennis,

1
@Joey Golf oynamak için muhtemelen cezalandırmalısınız. Bunu kandırarak, l:S_&{'=L{2$+_S\#)}g,(N}/üretim sistemlerinde görmeyi bırakacağım ! Ve ismini lanetleyeceğim.
Cruncher

Yanıtlar:


22

8086 makina kodu, 82 80

x.comDosyanın içeriği :

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

Sadece 99 karaktere kadar tekrarları destekler.

Kaynak kodu ( debug.commontajcı için girdi olarak kullanılır ), yorumlarla!

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

İşte burada eğlenceli olduğunu düşündüğüm bazı golf teknikleri:

  • dizinin adresi, ascii kodunun 3d00nerede 3dolduğu =. Bu şekilde, karakter için dizinin giriş için adres xolduğunu 3d78. 2 karakterli bir dize olarak yorumlandığında, öyle x=.
  • Çıkış tamponu adresindedir 104; artık gerekmeyen başlatma kodunun üzerine yazar. Satır sonu dizisi 0D 0A 24zararsız kod olarak yürütülür.
  • Buradaki aamtalimat herhangi bir golf sağlamıyor, ama yine de ...
  • Sayıyı iki kez yazarak, ilk önce 10'dan büyük olduğunu varsayarak ve sonra küçükse düzeltin.
  • Çıkış talimatı, 11bgerekli makine kodunu C3şansla içeren gizli bir adrestedir .

İlginç yaklaşım Ancak, 99 tekrarlama sınırlamasıyla, 1024 aaaa'nın girişinin sağlandığı durumları ele almaz.
Homer6

14

CJam, 27 26 25 bayt

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

Çevrimiçi deneyin.

Örnek

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

Nasıl çalışır

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 bayt

Yine basit bir yaklaşım.

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

Açıklama:

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

Örnek:

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

Serbest biçimli çıktıya izin verilirse (diğer birçok cevapta olduğu gibi), ben de 45 baytlık bir sürümüm var . Bu kutular kutuların bir listesini gösterir (evet, SE'nin satır yüksekliği onları kırarsa da böyle yazdırılırlar).

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

Bu komut satırı argümanlarından girdi alır ve stdout'a çıkar.


charsbiraz daha kısa split("").
Ventero

@Ventero Bunu denedim, ancak charsbir dizi yerine bir numaralandırıcı veriyor. 1.9.3'tayım, 2.0 mı?
19

Evet, 2.0'da charsbir dizi döndürür.
Ventero

Kuralları biraz esnetiyor olabilir, ama belki de pyerine kullanabilirsin puts?
Shelvacu,

1
Anlıyorum. Her ne kadar bu daha az güzel olsa da, her şeyi mahvedeceğini göremiyorum.
daniero

7

GolfScript, 26 bayt

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

Çevrimiçi deneyin.

Açıklama:

  • :sGiriş dizesini sdaha sonra kullanmak üzere değişkene kaydeder .
  • .&Girdideki benzersiz karakterleri, { }%döngüdeki kodun geri kalanının tekrar ettiği yineleyen karakterleri ayıklar .
  • 61 çıkış sınırlayıcısı olarak çalışmak için, 61 numaralı sayıyı (eşittir işareti için ASCII kodu) yığındaki geçerli karakterin üzerine iter.
  • {2$=}s%dizeyi salır ve yinelenen geçerli karaktere eşitse karakterlerini 1 ile, yoksa karakterleri 0 ile değiştirir. (Aynı zamanda çıktı için yığındaki geçerli karakteri bırakır.)
  • 1,/ bu dizgileri ve sıfırları alır ve sıfırlara böler.
  • $sonuçta ortaya çıkan alt dizileri sıralar, -1=son alt dizgiyi çıkarır (çünkü hepsi aynı karakterdeki tekrarlardan oluşur, çünkü en uzun) ve ,bu alt dizginin uzunluğunu döndürür.
  • n+ uzunluğu sıralar ve buna yeni bir satır ekler.

Ps. Çıktıdaki eşittir işaretleri isteğe bağlıysa, toplam 24 baytlık uzunluk için 61atlanabilir (ve 2$değiştirilir 1$) :

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

1
Eğer itmek eğer takas kaydedebilirsiniz 61ilk: :s.&{61{2$=}s%1,/$-1=,n+}%.
Howard

@Howard: Teşekkürler!
Ilmari Karonen

6

CoffeeScript, 109 bayt

Regex'i severim.

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'

İşte tarayıcınızın konsolunda deneyebileceğiniz derlenmiş 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;
};

Sonra arayabilirsin

f("acbaabbbaaaaacc")

almak

c=2
a=5
b=3

Bu gibi giriş için yanlış sonuçlar üretiyor gibi görünüyor aaaabaa.
Ventero

@ Doğru haklısın, iki sorun var. bir tanesi kolayca düzeltildi, fakat diğerini düşünmem gerekiyor.
Martin Ender

@ Ventero düzeltildi.
Martin Ender

5

Pyth , 24 25 26 (veya 29)

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

Test burada yapılabilir: link

Biçiminde çıkışlar:

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

Açıklama:

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

Uygun (a = 5) çıkış için, şunları kullanın:

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

29 karakter


Görünüşe göre aynı fikirde de vardı. Bunun için + 1'leyin.
seequ

@The Nadir evet, bunu yapmak için çok iyi bir yol gibi görünüyor.
isaacg

Algoritmanızla ilgili değil, python çıktısı kafa karıştırıcı çünkü k=''başka yerde tanımlanmış.
gggg

Evet, bunun için üzgünüm. Geliştirmek için çalışacağım. Ben de düzenleyeceğim.
isaacg

5

C, 126 125 119 bayt

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

Koşu:

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

Sen yerini alabilecek getchar()>0tarafından ~getchar()olduğu gibi bu cevap
anatolyg

@anatolyg EOF'nin tam olarak -1 olması garanti ediliyor mu? Sadece <0 olarak tanımlandığını sanıyordum.
kabarık

Bence -1 yeterince yaygındır (örn. Windows ve linux), böylece Code Golf için kabul edersiniz. Üretim kodu less than zeroiçin tamamen uygun, ancak == EOFdaha açık.
anatolyg

@anatolyg Tabii ki, aslında sanırım EOF spesifikasyonuna göre görünüşte <0 olacağı bile garanti edilmiyor - örneğin 256 olabilir . :)
kabarık

2
EOFnegatif olduğu garanti edilir ve charimzalanmış olsa bile -1 kullanılır ; buraya
anatolyg

4

Mathematica , 74 72 69

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

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

Çok iyi değil ama dizeler Mathematica'nın en iyi alanı değil. Yine de iyileşmek. :-)


Bu oldukça etkileyici bir golf (kendim denedikten sonra bunu söylüyor ...)
Szabolcs

v10, tam bir çözüm değil: First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & En azından oldukça basit ve okunabilir.
Szabolcs

@Szabolcs Teşekkürler! Arasındaki fark nedir GroupByve GatherBy?
Sayın Sihirbaz

Asıl fark, bu bir GroupBydöner Association. Diğer farkları henüz ayrıntılı olarak incelemedim. reference.wolfram.com/language/ref/GroupBy.html Bulutta ücretsiz bir hesapla deneyebilirsiniz (bu şekilde oynuyorum).
Szabolcs

3

C # (LinQPad)

146

Bu tsavino'nun cevabı ama daha kısa. Burada Distinct()yerine kullandım GroupBy(c=>c). Ayrıca, küme parantezleri foreach-loopdışarıda bırakılır:

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 expressionNormal sorgu sözdizimi yerine kullanmayı denedim , ancak Cast<Match>ilk ihtiyacım olduğu için kod daha uzun 1 karakter oldu ... Her neyse, LinQPad'de çalıştırılabildiğinden, Dump()yerine kullanabilirsiniz 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();}

Kodun daha ileri çalışılması beni düşündürdü Max(). Bu fonksiyon ayrıca bir kabul eder Func. Bu şekilde Selectlambda epxression kullanılırken kısmı atlayabilirdim :

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

Böylece, nihai sonuç:

128

Güncelleştirme:

Dan Puzey'den gelen ipucu sayesinde 6 karakter daha saklayabildim:

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

Uzunluk:

122


Gelişmeleriniz için teşekkür ederim, LinqPad'deki .Dump () oyununu bilmiyordum. Dürüst olmak gerekirse, kodu Visual Studio'da geliştirdim ve bazı karakterleri kaydetmek için LinqPad'e kopyaladım, çünkü LinqPad ana bir yönteme ihtiyaç duymuyor.
tsavinho

Teşekkürler! Dump()Son zamanlarda metodu daha yeni tanıdım , her seferinde 10'dan fazla karakter kazandırdı :) Kıvrımlı parantezler kolaydı ve geri kalanı biraz zor oldu: D
Abbas

1
LinqPad'in IEnumerableekran stilini kullanmaktan memnunsanız , vücudunuzla birlikte 8 karakter daha kaydedebilirsiniz:i.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
Dan Puzey

3

Piton 3 (70)

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

Golf bile olsa Python çok okunabilir. Bu kodun tek harfli değişkenler ve bir satırlık döngü dışında tamamen aptalca olduğunu düşünüyorum.

Örnek çalışır:

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

Bu ilginç bir çözüm
Cruncher

1
Kümeleri sadece s olarak değiştirirseniz, hala gereksinimleri karşıladığını düşünüyorum. Hiçbir yerde, her karakterin yalnızca bir kez basılması gerektiği söylenemez.
Cruncher

@Cruncher OP'nin her bir harfi bir defa belirtmediğini kabul ediyorum, ancak diğer Python cevapları bunu varsayıyor gibi görünüyor, bu yüzden karşılaştırılabilir olması için buna bağlı kalacağım. Yine de çıktı biçimleri hala tutarsız. OP'nin açıklama taleplerine cevap vermesini diliyorum.
xnor

2

Ruby, 58

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

STDIN'den girdi alır, formda STDOUT'a verir {"a"=>5, "c"=>2, "b"=>3}


2

LINQPad'deki C # - 159 Bayt

En azından T-SQL'i yendim; P başkasını dövmez, ama yine de paylaşacağımı düşündüm.

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

Kullanımı:

v("acbaabbbaaaaacc");

Öneriler her zaman beklerim!


Mükemmel cevap! Bazı önerilerim var ancak bu yorum için çok uzun sürdü bu yüzden cevabım için buraya tıklayın . :)
Abbas,

2

Powershell 80 77 72

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

Konsolda çalıştırman gerek ...


1
$xgereksizdir. Kullanmadan üç byte kısalmışsınız. Ayrıca sort -uyeterli. Tüm parametre adlarını hecelemek çok nadiren mümkündür. Bununla birlikte, bu, regex'in çıkmamış kullanımından dolayı bazı karakterler için başarısız olacaktır. »Dize herhangi bir karakteri nasıl içerebileceğine bağlı olarak« anlaşılmalıdır, bu bir sorun olabilir.
Joey

@Joey sort -u hakkındaki ipucu için teşekkür eder, ancak $ x ile ilgili olarak çalışamadım [char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}, ikinci $ args boş görünüyor ... - darkajax 17 dakika önce
DarkAjax

EEP, evet. Üzgünüm. Bunun nedeni, kendi argümanlarına sahip bir komut dosyası bloğunda olmasıdır ( $argsartık komut dosyasından biri yoktur).
Joey

2

Perl - 65 71 76 karakter

İlk golf kodum!

Her cevap için golf.pl dosyasına kopyalayın ve aşağıdaki gibi çalıştırın:

echo acbaabbbaaaaacc | perl golf.pl

En kısa çözümüm, her karakteri göründüğü kadar çok basar çünkü bu kurallar tarafından yasaklanmamıştır.

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

Bir sonraki en kısa çözümüm (85 90 karakter) her karakteri yalnızca bir kez yazdırır:

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

f "acbaabbbaaaaacc"

verir

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

Ancak, fazladan bilgi olmadan yazdırmak için, şu şekilde arayın:

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

hangi verir

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

1

Javascript, 116 bayt

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

Örnek çıktı:

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

Düzenleme: kaldırıldı ORDER BYçünkü kurallar herhangi bir çıktı sırasına izin veriyor.

Bir CHAR değişkeninden girdi alır ve dizgideki her karakter için bir satır oluşturmak için özyinelemeli bir CTE@a kullanır ve sıralı oluşumları bulur.

Bundan sonra , çıktının sırası için basit SELECTve GROUP BYdüşünülmüş.

SQL Fiddle'da deneyin .

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

Değişken atama:

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

Örnek çıktı:

a=5
c=2
b=3

Daha önce burada bir SQL çözümü gördüğümü sanmıyorum. İlginç.
Seiyria

stryerine işlevini düşünün ltrim. @Bir karakter kaydetmek için değişkeninizi de adlandırabilirsiniz . Bu i, rcte'deki değişkeni kaybetmenize izin verir . Bence bu şekilde birkaç tane tıraş edersin. Ayrıca, önceki veya gecikme satırları üzerindeki toplam gibi bir pencere işlevi kullanarak sorguyu yeniden yazabilirsiniz. Ne kadar akıl aldığınla ilgili pek bir şey yapmadım.
Michael B

@MichaelB tavsiye için teşekkürler. Str () ile karşılaştığım sorun, bir sürü fazladan boşluk çıkarmasıdır. @ Değişkenini kesinlikle kullanmaya başlayacağım!
comfortablydrei

Her strzaman 10 karakter çıktığı doğru , ama bu golf oyunu: P
Michael B

1

Haskell - 113 120 bayt

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

İle test edildi

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

.(Oluştur) işlevini, parametrenin yalnızca $bağlı işlevler zincirinin bitiminden sonra göründüğü bir lambda oluşturmaktan kaçınmak için kullanabilirsiniz . Bunu yapmak için, tüm $s .(\i->reverse$sort$group i)reverse.sort.group
öğelerini

1

JavaScript [83 bayt]

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

Bu kodu tarayıcı konsolunda çalıştırın.

" acbaabbbaaaaacc" Girişi konsol " " çıkmalı 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: İlk çözümüm kurallara uyuyor, ancak birkaç kez abab=> gibi tek karakter oluşumları basıyor a=1,b=1,a=1,b=1, bu yüzden ilkinden memnun olmayanlar için bununla çıktım ( 101 karakter):

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 bayt

1 satır okuyacak çalıştırılabilir kod (yalnızca küçük harf kullanın 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]

Düzenleme: @Therare'den istek üzerine gereksiz çıktılar hariç tutuldu

Çıktı güzel görünüyor

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

Gereksiz çıktıları gerçekten dışlamalısınız. (Sanırım)
seequ

çıkış "sabit"
Köpek kedi dünyasını yiyin

Sen ayraçları, sayı ve tür anahtar kelimelerle, arasında boşluk kaldırabilir forveya if.
seequ

3
Bence soruları yanlış okudun. l=2ve o=1"helloworld" için
gnibbler

4
Ardışık maksimum görünüm yerine toplam görünüm sayılır.
xnor

0

JavaScript - 141 137 125

Regex'i sevmiyorum :)

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}

Koşmak

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

çıktılar

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

0

Javascript, 109 104 100 98 bayt

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}

Örnek kullanım:

console.log(c("aaaaaddfffabbbbdb"))

çıktılar:

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

kullanım

_('asdaaaadddscc');

basılı

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.*;Java işi?
seequ

Evet ve eski kodu yapıştırıyorum
user902383

OP bunun sadece bir fonksiyon / yöntem olabileceğini söyledi, böylece bunu basitçe metodla kısaltabilirsiniz.
Rudi Kershaw

Bu, karakterden oluşan en uzun alt dizeleri değil, Dize'deki karakterin tüm oluşumlarını çıkarır. Örneğin, bunun yerine acbaabbbaaaaaccçıktılar . a=8; b=4; c=3a=5; b=3; c=2
Kevin Cruijssen

0

C 169

Yazdırılabilir her karakteri ASCII tablosunda yineler ve giriş dizgisinden maks.

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

Bunu test ettin mi? Bir çok dizgede doğru çıktı üretiyor gibi görünmüyor ve aynı zamanda girişin 1024 uzunluğa kadar çıkabileceğini söyleyen özelliklere uymuyor ... artı, çok sayıda kolay golf teknikleri var. cevapsız. :)
kabarık

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

Dayanarak bu akıllı cevap tarafından XNOR :

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

Çıktı:

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

Bu aslında maksimum dizi uzunluğunu sayıyor mu? Groovy'yi de bilmesem de, bunun "aabbbbaaaabbbbbba" gibi bir dize için doğru çalışacağını bilmiyorum.
kabarık

Örnek için çalışıyor. Ungolfed versiyonunu güncelledim. "A" * 4 == "aaaa" olduğuna dikkat edin.
Michael Easter,

Ah, şimdi nasıl çalıştığını gördüm. Zeki.
kabarık
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.