整数リストの変形

整列済みの number のリストがある。

'(1 3 4 5 6 12 13 15)

このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。

最初の例のリストであれば以下のようになる。

'(1 (3 . 6) (12 . 13) 15)

このようなリストの変換をするコードを書きたい。

reiroさんのコードとnobsunさんのコードは短くて興味深いなあ。それにしても同じ単純そうなお題でこれだけバラエティに富んだコードができるSchemeって一体…。どの文法がそうさせているのか?パターンマッチは相当パワフルっぽいなあ。やはりHaskell極めたくなってきた。


anarchy golfでも似た問題ありそうなので探したのだけど問題数が多すぎて見つからなかったorz


あと、連続している部分は、ステップ間隔が1だけど、'(1 3 5 7)を'(1 7 2)のように間隔2ずつとか間隔をn個にもできるように問題を拡張した方が一般的だと思うが、どこでの使用を想定しているのだろう?例えば以下のように変形する。

'(1 4 6 8 9 10 11 12 15) ⇒ '(1 '(4 8 2) (9 . 12) 15)

すると恐らく、2個の場合は、'(13 14)を(13 . 14)のようにすると、以下のケースで紛らわしいので、3個以上の連続の場合パックするという規則も必要になると思われる。

'(13 14 16)    '((13 . 14) 16)
もしくは
'(13 14 16)   '(13 '(14 16 2))