💃
TypeScriptでドドスコ
面白そうな題材を見つけたのでサクッと実装してみた。
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 氏の ↓ の記事が大変わかりやすいです
課題点としては、
- 標準出力で改行を無くしたい
- Java でいうところの
System.out.println()
ではなくSystem.out.print()
を使用したう Deno の標準出力を調べるのがダルかった
- Java でいうところの
- 手続き型ではなく、関数型を使用して見栄えを良くしたい
- let や while などを使用せず、rxjs あたりを使用したい
でしょうか。
まあでも実装を 1 時間弱で終わらせられたのでまあまま満足
ちなみにマイペースにTwitterやってます。フォローしてください!
Special Thanks
ドドスコのツイートを見つけるきっかけになった記事、感謝
Discussion