元ネタ
さらにその元ネタ
アローラロコンを1文字飛ばしで読むと…
— 清原弘貴@ShodoでAI校正 (@hirokiky) July 27, 2022
>>> "アローラロコン"[::2]
'アーロン'
最近少しHaskellの文法を勉強していて、練習にとてもよさそうなお題だったので乗っからせてもらいました。
実行
skipchar.hs
import Debug.Trace
main = do cs <- getContents
print $ map (\(n, c) -> c) $ filter (\(n, c) -> if (n `mod` 2) == 1 then True else False) $ zip [1..] $ cs
$ echo "アローラロコン" | stack runghc skipchar.hs
"アーロン"
詳細
冗長に書くと以下のようになります。
skipchar.hs
import Text.Show.Unicode
main = do cs <- getContents
uprint $ skipchar $ cs
skipchar :: [Char] -> [Char]
skipchar cs = removeIndexes $ filterOddIndexes $ addIndexes $ cs
addIndexes :: [Char] -> [(Int, Char)]
addIndexes cs = zip [1..] cs
removeIndexes :: [(Int, Char)] -> [Char]
removeIndexes cs = map removeIndex cs
removeIndex :: (Int, Char) -> Char
removeIndex (n, c) = c
filterOddIndexes :: [(Int, Char)] -> [(Int, Char)]
filterOddIndexes ts = filter isIndexOdd ts
isIndexOdd :: (Int, Char) -> Bool
isIndexOdd (n, c) = if (n `mod` 2) == 1 then True else False
Char型の配列になっている入力を、一度(Int, Char)型の配列に変換することでどの文字が偶数番目なのかを判断をさせています。
['ア', 'ロ', 'ー', 'ラ'., ...]
→ [(1, 'ア'), (2, 'ロ'), (3, 'ー'), (4, 'ラ'), ...]
直感的に思いついた方法がこれでしたが、番号の割り振り介さないもっとシンプルな書き方もありそうです。
ただHaskellっぽさのある操作であるところの無限リスト及び遅延評価が触れたので結果オーライかなと思ってます(?)
感想
処理そのものよりも、カタカナを出力する方に地味に時間がかかってしまいました。
(Unicodeを扱うライブラリを使うためStackというものをインストールしたかったのですが、WSLで上手く動作せずMacに移動しました)
Haskell自体の勉強はすこし進んだところでまた混乱してきているので、引き続きゆっくり進められたらと思います。
それではありがとうございました。