💃

TypeScriptでドドスコ

2022/08/06に公開

https://twitter.com/Sheeeeepla/status/1554028833942441984?s=20&t=FX1g8oTxTNJ3FDREglglXQ

面白そうな題材を見つけたのでサクッと実装してみた。

Deno で動作確認してますが、環境さえ整えれば ts-node でも動くと思います。

Deno の環境があれば以下のようにGitHub のソースから直接実行できます。

deno run https://raw.githubusercontent.com/kagurazaka-0/deno-scripts/main/dodosuko/case1.ts
const DODOSUKO = ["ドド", "スコ"] as const

type Dodosuko = typeof DODOSUKO[number]

const DODOSUKO_CHAINS_ROOT: Array<Dodosuko> = ["ドド", "スコ", "スコ", "スコ"]
const DODOSUKO_CHAINS: Array<Dodosuko> = [...DODOSUKO_CHAINS_ROOT, ...DODOSUKO_CHAINS_ROOT, ...DODOSUKO_CHAINS_ROOT]

function createDodosukoChains(): Iterator<Dodosuko> {
  return DODOSUKO_CHAINS[Symbol.iterator]()
}

function getDodosuko() {
  return DODOSUKO[Math.floor(Math.random() * DODOSUKO.length)]
}

function main() {
  let iterator = createDodosukoChains()
  while (true) {
    const nextDodosuko = iterator.next()
    if (nextDodosuko.done) {
      break
    }
    const dodosuko = getDodosuko()
    console.log(dodosuko)
    if (dodosuko !== nextDodosuko.value) {
      // NOTE: 初めからやり直し
      iterator = createDodosukoChains()
    }
  }
  console.log("ラブ注入💕")
}

main()

出力の一例
(略)
ドド
スコ
ドド
ドド
ドド
スコ
ドド
スコ
スコ
スコ
ドド
スコ
スコ
スコ
ドド
スコ
スコ
スコ
ラブ注入💕

一致してますね

40 行弱でサクッと実装できました。

ポイントは js の Iterator を使用している点で、

  • ドド/スコが一致していれば next
  • iterator が最後までいっている時(nextDodosuko.done === trueの時)は while を抜けてラブ注入 💕する
  • 一致していなければ最初から
    • iterator = createDodosukoChains()で iterator を初期化

js の Iterator の解説は Masaki Hara 氏の ↓ の記事が大変わかりやすいです

https://zenn.dev/qnighy/articles/112af47edfda96

課題点としては、

  • 標準出力で改行を無くしたい
    • Java でいうところのSystem.out.println()ではなくSystem.out.print()を使用したう
    • Deno の標準出力を調べるのがダルかった
  • 手続き型ではなく、関数型を使用して見栄えを良くしたい
    • let や while などを使用せず、rxjs あたりを使用したい

でしょうか。

まあでも実装を 1 時間弱で終わらせられたのでまあまま満足

ちなみにマイペースにTwitterやってます。フォローしてください!

Special Thanks

https://zenn.dev/ikawaha/articles/20220806-55c9db03732a09

ドドスコのツイートを見つけるきっかけになった記事、感謝

Discussion