2023/8/15 Acronym
https://gyazo.com/08e498904d800e9ab7a7bbbaa2f65554
https://exercism.org/tracks/haskell/exercises/acronym
「Portable Network Graphics」のことを「PNG」と呼んだりするやつをThree-letter acronymと言う
acronymは「頭字語」
ハイフンとスペースの次の文字をつなぎ合わせる感じか
table:_
Input Output
As Soon As Possible ASAP
Liquid-crystal display LCD
Thank George It's Friday! TGIF
大文字を取り出す
HyperText Markup Language → HTML
"GNU Image Manipulation Program" → GIMP
先頭
ハイフンの次
スペースの次
小文字の次の大文字
スペース、ハイフンで区切って、
最初に来るアルファベットを取り出す
なければ無視
HTMLの例だけ特殊に見えるmrsekut.icon
code:hs
-- Although this case was removed in specification 1.1.0,
-- the Haskell track has chosen to keep it,
-- since it makes the problem more interesting.
, Case { description = "camelcase"
, input = "HyperText Markup Language"
, expected = "HTML"
}
なんかコメント付いてるし
何か良い抽象化で統一的に扱えるということなのだろうか
kebabみたいな関数でいったん変換してからやれば行けそうな気はするが
https://hackage.haskell.org/package/casing-0.1.4.1/docs/Text-Casing.html#v:kebab
GNUみたいな文字列を渡した時に「G-N-U」にならないようになってないといけない
安直すぎるがmrsekut.icon
kebabを実装するのが一筋縄じゃいかない
元のフォーとマットが確定してないので
HTMLのせいで難易度めっちゃ上がってない?
それ以外のケースは簡単にかけた
抽象的に言えば
単語ごとにsplit
一文字目(alphabet)をupperしてくっつける
だけか
GNUとHyperTextをどうやって統一的に扱うのか
逐次的にやればできたが、あまり美しくない
以前のやつにならって最初からText使おう
先に全部くっつけちゃってあとからfilterするとか
一応できた
splitRのような標準にない関数を作った時点で何かしら抽象化がミスってることを感じていたmrsekut.icon
間違っていることは分かるが、どうしたら良いかわからない状態になってた
他の人の回答
https://exercism.org/tracks/haskell/exercises/acronym/solutions/jdehaan
"aA"みたいに、小文字→大文字と連続してるのを取得する
loop時に前後の値を参照する
最初に思いついた流れはこれだったのだけど、実装の仕方が分からなかったmrsekut.icon
めちゃくちゃ単純な実装で解決してる
次回はいけそう
https://exercism.org/tracks/haskell/exercises/acronym/solutions/dalepsmith
x1:x2:xsで再帰する
loop時に前後の値を参照する
https://exercism.org/tracks/haskell/exercises/acronym/solutions/Myna65
意味的にはこれが一番正しそう
以下のような関数
code:Hs
acronym :: String -> String
acronym xs
| all isUpper xs = head xs -- "GNU"なら"G"
| all isLower xs = toUpper $ head xs -- "text"なら"T"
| otherwise = filter isUpper xs -- "HyperText"なら"HT"
#ExercismをHaskellで解く
#Exercism_再度やりたい