👊
Hello World あたたたた F#編 その2
この記事は Hello World あたたたた Advent Calendar 2025 シーズン3の14日目兼、F# Advent Calendar 2025 の14日目の記事です。
Hello World あたたたた の F#編はすでにあるので二番煎じになりますが、面白そうだったので参加してみました。
open System
let helloWorldAtatatata (finisher: string) =
let usedChars = finisher.ToCharArray() |> Array.distinct
("", Seq.initInfinite (fun _ -> Array.randomChoice usedChars))
||> Seq.scan (fun acc newChar -> acc + (string newChar))
|> Seq.find (fun x -> x.EndsWith(finisher))
|> printfn "%s\nお前はもう死んでいる"
helloWorldAtatatata "あたたたた"
// あたたああたあたあああたあたあたあたあたたああたあたたたた
// お前はもう死んでいる
レギュレーションから外れてしまいましたが、「た」の数を増やしたり、別の文字を入れたりして遊べるようになっています。
helloWorldAtatatata "あたたたたたっ"
// たたあっったたあたっっあたたたたたっ
// お前はもう死んでいる
※2026/01/07 コードをさらに簡潔にしました。
元のコード
open System
let helloWorldAtatatata (finisher: string) =
let usedChars = finisher.ToCharArray() |> Array.distinct
""
|> Array.unfold (fun state ->
if state.EndsWith(finisher) then
None
else
let nextChar = Array.randomChoice usedChars
let newState = state + string nextChar
Some(nextChar, newState))
|> String
|> printfn "%s\nお前はもう死んでいる"
※2026/01/08 レギュレーション(処理フロー)対応版を追加↓
open System
("", true)
|> Seq.unfold (fun (hako, running) ->
match hako, running with
| _, false -> None
| x, _ when x.EndsWith("あたたたた") ->
Some(printf "\nお前はもう死んでいる", (hako, false))
| _, _ ->
let char = "あた"[Random().Next(2)]
Some(printf "%c" char, (hako + (string char), true)))
|> Seq.iter id
Discussion