🦕
ズンドコキヨシ with deno
もはや太古のネタですが、denoでやっている人がいなかったのでやりました。後悔はしていません。
GitHubで公開しているので、下のコマンドで簡単に動かせます。
deno run https://github.com/4513ECHO/deno-zundoko/raw/main/zundoko.ts
解説
import {
distinct,
sample,
} from "https://deno.land/std@0.123.0/collections/mod.ts";
import { equal } from "https://deno.land/std@0.123.0/testing/asserts.ts";
function general_kiyoshi(phrases: string[], last_phrase: string): void {
const stack: string[] = [];
while (true) {
const picked = sample(distinct(phrases));
if (picked) {
console.log(picked);
stack.push(picked);
}
if (equal(stack.slice(-phrases.length), phrases)) {
console.log(last_phrase);
break;
}
}
}
if (equal(Deno.args, [])) {
const zundoko = ["ズン", "ズン", "ズン", "ズン", "ドコ"];
const kiyoshi = "キ・ヨ・シ!";
general_kiyoshi(zundoko, kiyoshi);
} else {
general_kiyoshi(Deno.args.slice(0, -1), Deno.args.slice(-1)[0]);
}
せっかくdenoを使っているので、std縛りで書きます。
標準で豊富な資産があるのはdenoのよいところですよね。
今回はcollections
モジュールとasserts
モジュールを使いました。
general_kiyoshi
関数はphrases
に単語のリスト、last_phrase
に最終的な単語を取ります。
スタックに出力した文字を入れていって、末尾の要素を毎回比較するような単純なしくみです。
const picked = sample(distinct(phrases));
ここでphrases
の中から要素を1つ選んでいます。Pythonでいえばrandom.choice()
です。
if (equal(stack.slice(-phrases.length), phrases)) {
JavaScriptは[] === []
がfalse
になるクソ仕様を持っています。
しかし、equal
関数を使えば正しく判定できます。
Discussion