LoginSignup
4
5

More than 5 years have passed since last update.

Emacs Lispでズンドコキヨシ

Posted at

ズンドコキヨシ with Emacs Lispに続くEmacs Lispバージョン第2弾。遅れをとった…

(defun zundoko-list ()
  (let ((zun-or-doko '("ズン" "ドコ"))
        (zzzzd '("ズン" "ズン" "ズン" "ズン" "ドコ"))
        (kiyoshi "キ・ヨ・シ!")
        zundoko len-zzzzd len-zundoko kiyoship)
    (setq len-zzzzd (length zzzzd))
    (while (not kiyoship)
      (setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))
      (when (<= len-zzzzd (setq len-zundoko (length zundoko)))
        (when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
          (setq zundoko (append zundoko (list kiyoshi)))
          (setq kiyoship t))))
    zundoko))

(defun zundoko-insert ()
  (interactive)
  (let (zd)
    (setq zd (zundoko-list))
    (while zd
      (insert (car zd))
      (when (setq zd (cdr zd))
        (insert " ")))
    (insert "\n")))

*scratch*バッファで実行

(zundoko-insert)
ズン ズン ズン ズン ズン ズン ズン ズン ドコ キ・ヨ・シ!
nil

解説というか感想

ズンドコのリストを作るのがLispっつぽい処理かなと。

「ズン ズン ズン ズン ドコ」を判定するために、nthcdr関数で取得したzundokoリストの末尾部分をzzzzdリストを比較しています。リストの先頭部分だけを取り出すことも考えたのですが、方法が分かりませんでした(リストをreverse関数で逆にしてからnthcdrで取り出すことはできますが)。

(when (equal (nthcdr (- len-zundoko len-zzzzd) zundoko) zzzzd)
  (setq zundoko (append zundoko (list kiyoshi)))
  (setq kiyoship t))))

リストの末尾を取り出す必要があるため、zundokoリストの先頭ではなく末尾に新しい「ズン」または「ドコ」を追加しています。appendはリストの結合なので、追加する要素もリストにする必要があります。

(setq zundoko (append zundoko (list (nth (random 2) zun-or-doko))))

zundoko-insertは、zundoko-listの内容をそのまま挿入する関数。リストをそのままスペース区切りで出力する関数を見つけられなかったので作りました。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5