Raku: 解 PWC 081 兩題

作者:   發佈於:   #raku

Perl Weekly Challenge 081 的兩題目分別是 1: Common Base String, 2: Frequency Sort.

Common Base String 之解法正好能將不久前提到的集合算符拿來用:

sub common-base-string (Str $A, Str $B) {
    return ( base-string($A) ∩ base-string($B) ).keys;
}

其中 這個符號是數學領域中表示「取左右兩集合之交集」之交集算符。用於 Raku 程式中時,左右兩側算子之型可為陣列、Set 等等各種 Setty 型別之衍生型別。其運算結果之型別為 Set。

此符號之 Unicode 字符名稱為 INTERSECTION 。要在 Emacs 中輸入此符號,可使 insert-char 函式:

M-x insert-char <RET> intersection <RET>

或其組合鍵:

C-x 8 <RET> intersection <RET>

第二題 Frequency sort 的解法前半部大致上就是讀檔、切出字、再將不符規則的字給過濾掉。也就是一般常見的 NLP 前置作業。查了一下文件後發現有兩個不錯的方法可以拿來切出字:

$o.words
$o.split(/<?wb>/)

這兩方法之對象 $o 物件之型別可為 StrIO。可省去 readline 之類的步驟、能少寫一層迴圈,頂方便的。

<?wb> 為 Raku 正規表示式中代表單字邊界 (word boundary) 之字符類別。

words 看來簡潔,但只是依空白拆開,以本題來說,對於後續處理有些不方便。最後是用了 split(/<?wb>/)