例のお題をPerl6で解いてみる

Link> お題:文字列を先頭から見て同じところまで除去 - No Programming, No Life


という企画に実解析さんが参加しておられたので、私もPerl6で書いてみようかなと。


Link> お題:文字列を先頭から見て同じところまで除去 - はっ!透ける!―黙々とHaskellをやるダイアリー


一晩悩んで書いた結果、こんな感じ。

sub func (*@_) {
    return @_>>.substr(([>>eq>>] @_.map({[.comb]})).map({.Int or last 0}).reduce(&infix:<+>));
}

実行してみましょう。

say func("aaabca", "aaefga", "aaxyza").perl;
say func("1aa", "2aa", "3aa").perl;
say func("aaa", "aaa", "aaa").perl;
("abca", "efga", "xyza")
("1aa", "2aa", "3aa")
("", "", "")

ちゃんと動いてるようですね。
実はこの関数、空文字列を渡すとreduce周りで死んじゃったりするので、要求定義を全て満たしているかは微妙です…

    • -

実は、最初にこのお題を見た時「これはHyperoperator使うと短く書けるなー」という天啓を受けたので挑戦してみたんですが、予想以上にスマートに書けたので驚いています。HyperopratorとReduce Metaoperatorのパワフルさを垣間見た一日でした。