例のお題を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のパワフルさを垣間見た一日でした。