👊

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