最大シーケンス長を見つける


29

文字列があり、すべての文字の最大繰り返しシーケンスを検索するとします。

たとえば、サンプル入力が与えられた場合:

"acbaabbbaaaaacc"

サンプル入力の出力は次のとおりです。

a=5
c=2
b=3

ルール:

  • あなたのコードは関数でもプログラムでも構いません-あなたが選択するために
  • 入力は、stdin、file、またはfunctionパラメーターによることができます
  • 出力には、入力に現れる文字のみを含める必要があります
  • 入力の最大長は1024です
  • 出力順序は重要ではありませんが、[char] = [maximum repeat sequence] [delimiter]の形式で出力する必要があります
  • 文字列には任意の文字を含めることができます

コンテストは、3日木曜日23:59 UTCに終了します。


入力文字列の長さに上限はありますか?
シグマ14年

2
出力は指定どおりでなければなりませんか?表示されない文字に対して0と言えますか?最高文字までのすべての文字が少なくとも1回表示されますか?
xnor

1
出力を質問で例示されているとおりにフォーマットする必要があるかどうかを明確にしてください。現在の16の回答のうち少なくとも10は異なる形式を使用し、他の3つは2つの異なるバージョンを使用しています。
デニス

1
@ジョイあなたはおそらくゴルフのために罰する必要があります。あなたがそれを容認することによって、私はl:S_&{'=L{2$+_S\#)}g,(N}/本番システムで見ることになります!そして、私はあなたの名前を呪います。
たけた

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コードです=。この方法では、文字の配列のエントリのアドレスx3d78です。2文字の文字列として解釈される場合、それはx=です。
  • 出力バッファはアドレスにあります104; 不要になった初期化コードを上書きします。行末シーケンス0D 0A 24は無害なコードとして実行されます。
  • aam説明ではゴルフはできませんが、...
  • 数値を2回書き込みます。最初に10より大きいと仮定し、次に小さい場合は修正します。
  • 終了命令は、あいまいなアドレス11bにあります。これには、必要なマシンコードが含まれていますC3

興味深いアプローチ。ただし、99回の繰り返しという制限があるため、1024 aaaaの入力が提供される場合は処理されません。
ホーマー

14

CJam、27 26 25バイト

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

これは、コマンドライン引数から入力を受け取り、標準出力に出力します。


charsは、より少し短いですsplit("")
ヴェンテロ14年

@Ventero私はそれを試しましたがchars、配列ではなく列挙子を提供します。私は1.9.3にいるので、2.0のものですか?
激しい14年

はい、2.0ではchars配列を返します。
-Ventero

これは、ルールを少し伸ばし、おそらく使用することができるpの代わりにputs
Shelvacu 14年

1
そうですか。それによって見栄えは悪くなりますが、規則が破られることはわかりません。
daniero 14年

7

GolfScript、26バイト

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

オンラインでお試しください。

説明:

  • :s入力文字列sを後で使用するために変数に保存します。
  • .&入力内の一意の文字を抽出し、{ }%ループ内の残りのコードが繰り返し処理します。
  • 61 スタック上の現在の文字の上に数値61(等号のASCIIコード)をプッシュして、出力区切り文字として機能させます。
  • {2$=}s%文字列sを取得し、反復される現在の文字と等しい場合は文字を1に置き換え、そうでない場合は0に置き換えます。(また、現在の文字を出力用にスタックに残します。)
  • 1,/ この1と0の文字列を取り、0で分割します。
  • $結果のサブストリングをソートし-1=、最後のサブストリングを抽出し(これらはすべて同じ文字の繰り返しで構成されているため、最も長い)、,このサブストリングの長さを返します。
  • n+ 長さを文字列化し、それに改行を追加します。

追伸 出力の等号がオプションである場合、24バイトの合計の長さのために、61省略できます(およびに2$置き換えられます)1$

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

1
61最初のものをプッシュすると、スワップを保存できます:s.&{61{2$=}s%1,/$-1=,n+}%
ハワード14年

@ハワード:ありがとう!
イルマリカロネン14年

6

CoffeeScript、109バイト

正規表現が好きです。

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あなたは正しい、2つの問題があります。一方は簡単に修正できますが、もう一方について考える必要があります。
マーティンエンダー14年

@Venteroが修正されました。
マーティンエンダー14年

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)

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

適切な(a = 5)出力を得るには、次を使用します。

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

29文字


まったく同じ考えを持っていたようです。そのために+1を持っています。
seequ 14年

@TheRareええ、それはそれを行う非常に良い方法のようです。
isaacg 14年

実際にはアルゴリズムとは関係ありませんが、k=''他の場所で定義されているため、Python出力は混乱を招きます。
gggg 14年

ええ、それについてすみません。改善に取り組みます。私も編集します。
isaacg 14年

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であると明確に定義されているだけだと思いました。
ふわふわ14年

-1は十分に一般的である(つまり、WindowsとLinux)ので、Code Golfの場合はそれを想定できると思います。実動コードの場合、less than zero完全に問題ありません== EOFが、より明確です。
アナトリグ14年

@anatolyg確かに、そして実際に私は明らかにしても<0であることが保証されていないスペックEOFあたりの推測-それは可能性もあること、例えば、256 Iは1つだけのバイト節約できますので。:)
ふわふわ14年

2
EOF負であることが保証され、char署名されていても-1が使用されます。ここを
アナトリグ14年

4

Mathematica74 72 69

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

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

あまり良くありませんが、文字列はMathematicaの最良の領域ではありません。しかし、良くなっています。:-)


これはかなり印象的なゴルフです(自分で試してみてからこう言っています)
Szabolcs 14年

完全なソリューションではないv10:First@*MaximalBy[Length] /@ GroupBy[First]@Split@Characters[#] & 少なくとも非常に簡単で読みやすい。
ザボルクス14年

@Szabolcsありがとう!違いは何だGroupByとはGatherBy
ミスターウィザード14年

主な違いは、をGroupBy返すことAssociationです。他の違いについてはまだ詳しく調べていません。 reference.wolfram.com/language/ref/GroupBy.html クラウドで無料のアカウントを使用 して試してみることができます(これらの方法で遊んでいます)。
ザボルクス14年

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、ラムダ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の.Dump()のトリックについて知りませんでした。正直なところ、LinqPadはメインメソッドを必要としないため、Visual Studioでコードを開発し、LinqPadにコピーして一部の文字を保存しました。
tsavinho 14年

ありがとう!私もDump()最近この方法を知ったばかりで、毎回10文字以上節約できます:)中括弧は簡単で、残りは少し頭がおかしかったです:D
アッバス14年

1
あなたはLinqPadの使用に満足している場合IEnumerable:あなたはあなたの体とこれと、別の8つの文字を保存することができます表示スタイルをi.Distinct().Select(c=>c+"="+Regex.Matches(i,"["+c+"]+").Cast<Match>().Max(m=>m.Value.Length)).Dump();
ダン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でさえも非常に読みやすくなります。このコードは、1文字の変数と1行のwhileループを除き、完全に慣用的だと思います。

実行例:

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

これは興味深い解決策です
ランチャー

1
セットをsに変更すると、まだ要件を満たしていると思います。各文字を1回だけ印刷する必要があるとは言いません。
ランチャー

@Cruncher OPは各文字を1回指定しないことに同意しますが、他のPythonの答えはそれを想定しているようです。ただし、出力形式には一貫性がありません。OPが明確化の要求に応答したことを望みます。
xnor 14年

2

ルビー、58

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

STDINから入力を受け取り、次の形式でSTDOUTに出力します {"a"=>5, "c"=>2, "b"=>3}


2

LINQPadのC#-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");

提案はいつでも大歓迎です!


素晴らしい答えです!いくつかの提案がありますが、コメントするには長すぎますので、ここをクリックして回答をご覧ください。:)
アッバス14年

2

Powershell 80 77 72

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

コンソールで実行する必要があります...


1
$x不必要です。使用しない場合は3バイト短くなります。また、sort -u十分です。完全なパラメーター名を綴る必要はめったにありません。ただし、これは正規表現でエスケープされていないため、特定の文字では失敗します。「文字列に任意の文字を含めることができる方法」の理解方法によっては、これが問題になる可能性があります。
ジョーイ14年

しかし、$に関するソート-uの先端のための@Joeyおかげで、のように、私は仕事にそれを得ることができませんでしxは[char[]]"$args"|sort -u|%{"$_="+($args-split"[^$_]"|sort)[-1].length}17分前darkajax -それは...空来る2番目の$ argsは思わ、
DarkAjax

ええ、はい。ごめんなさい。これは、独自の引数を持つスクリプトブロック内にあるためです(スクリプト$argsにはもう存在しません)。
ジョーイ14年

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文字)は、各文字を1回だけ印刷します。

<>=~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出力の順番を考慮して。

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

変数の割り当て:

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

サンプル出力:

a=5
c=2
b=3

ここでSQLソリューションを見たことはないと思います。面白い。
セイリア

str代わりに、関数を検討してくださいltrim。変数@に名前を付けてcharを保存することもできます。これによりi、rcte の変数を失うことができます。そのようにしてかなりの数の毛を剃ることができると思います。また、前の行の合計や遅延などのウィンドウ関数を使用して、クエリを書き換えることもできます。私はまだあなたを気にかけているのかはまだはっきりしていません。
マイケルB 14年

@MichaelBアドバイスをありがとう。str()の問題は、余分なスペースが大量に出力されることです。私は間違いなく@を変数として使い始めます!
comfortablydrei 14

それは事実だstr常に10個の文字を出力しますが、これはゴルフです:P
マイケル・B

1

ハスケル-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)]

.(compose)関数を使用すると、$接続された関数のチェーンの終わりの後にのみパラメーターが表示されるラムダの作成を回避できます。これを行うには、単にすべてを変更します$には、Sを.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ような単一の文字の出現を数回出力するので、最初の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- 111126115 114 111バイト

1行を読み取る実行可能コード(小文字のa〜zのみを使用)

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

本当に不要な出力を除外する必要があります。(私が思うに)
seequ

出力を「修正」
犬が猫の世界を食べる14

forまたはなど、中括弧、数字、キーワードの間のスペースを削除できますif
seequ 14年

3
質問を誤解したと思います。l=2そしてo=1「HelloWorldの」のための
gnibbler

4
最大連続表示の代わりに合計表示をカウントしています。
XNOR

0

JavaScriptを- 141 137 125

私は正規表現が好きではありません:)

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}

走る

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

出力

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

0

ジャバスクリプト、109の 104 100 98バイト

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}

使用例:

console.log(c("aaaaaddfffabbbbdb"))

出力:

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

使用法

_('asdaaaadddscc');

印刷された

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で動作しますか?
seequ 14年

はい、私は古いコードを貼り付け
user902383

OPは、単に関数/メソッドである可能性があるため、これを単純にメソッドに短縮できると述べました。
ルディカーショー14年

これは、文字で構成される最も長い部分文字列ではなく、文字列内の文字のすべての出現を出力します。たとえば、の代わりにacbaabbbaaaaacc出力します。a=8; b=4; c=3a=5; b=3; c=2
ケビンクルーッセン

0

C 169

ASCIIテーブルの各印刷可能文字を繰り返し、入力文字列から最大値をカウントします。

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

これをテストしましたか?多くの文字列で正しい出力を生成するようには見えませんし、入力は最大1024の長さになる可能性があるという仕様を満たしていません...さらに、多くの簡単なゴルフテクニックがあります逃した。:)
ふわふわ14年

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文字

基づいて、この巧妙な答えXNOR

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

出力:

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

ゴルフをしていない:

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

それは実際に最大シーケンス長をカウントしますか?Groovyについても知りませんが、「aabbbbaaaabbbbbba」のような文字列に対してどのように正しく機能するかわかりません。
ふわふわ14年

あなたの例で動作します。ungolfedバージョンを更新しました。"a" * 4 == "aaaa"であることに注意してください。
マイケルイースター14年

ああ、私はそれが今どのように機能するかを見る。賢い。
ふわふわ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.