7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Haskellでもアローラロコンをアーロンにする

Posted at

元ネタ

さらにその元ネタ

最近少し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自体の勉強はすこし進んだところでまた混乱してきているので、引き続きゆっくり進められたらと思います。

それではありがとうございました。

7
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?