私の仕事では、RLE (ランレングス エンコーディング) パターンがよく出てくるようです。
その本質は、「ブレーク」が表示されるか、入力の最後に到達するたびに、最後の「ブレーク」以降に発生した要素の削減を出力していることです。
(実際の RLE では、「ブレーク」はこの文字が最後の文字と一致しないことですが、現実の世界では通常もう少し複雑ですが、それでも現在の要素と最後の要素の関数です。)
last_val != None: rle.append((last_val, count))
ループと終了の両方で発生する重複した条件とアクションを削除したい。
問題は次のとおりです。
- それらを関数呼び出しに置き換えると、コードが少なくなるのではなく、多くなります。
- 命令型のスタイルに保つ (たとえば、Haskell では、問題は蒸発するだけです)。
必須の Python コードは次のとおりです。
#!/usr/bin/env python
data = "abbbccac"
if __name__ == '__main__':
rle = []
last_val = None
count = 0;
for val in data:
if val != last_val and last_val != None:
rle.append((last_val, count))
count = 1
else:
count += 1
last_val = val
if last_val != None:
rle.append((last_val, count))
print rle
PS関数型言語で自明に解決可能:
#!/usr/bin/env runhaskell
import Data.List (group)
dat = "abbbccac"
rle :: Eq a => [a] -> [(a, Int)]
rle arr = map (\g -> (head g, length g)) $ group arr
main :: IO ()
main = print $ rle dat