implementation

私 perl 36byte

#!perl -pl
$_=s/O*I//*(2*s/OI//g+1)
$_=<>;print s/O*I//*(2*s/OI//g+1),$/

O*Iで先頭を削って、削れたならばさらにO+I+の数を数える。 これはmatchの順序の関係でOIとしてよい。

hanada3355さん bash 33byte

tr O \ |awk '$0=(NF?NF:.5)*2-1""'

O空白で置換することでIの繰り返しからなる単語の列となる。 単語数NFを使って計算している。NFが$0$の時は$1$にする。

tr O \ |awk '$0=(NF?NF*2-1:0)""'

とすると1B縮む。

climpetさん perl 30byte

@a=<>=~/I+/g;print@a*2-!!@a,$/

方針は同じで、I+にmatchする部分を全て取り出し、その数を使って計算している。

@a = (<> =~ /I+/g);
print(@a*2 - !!@a, $/);