ズンドコキヨシのNimバージョン
Nim版が無かったので書いてみました。
(EDIT: quit
を利用して一行短くしました。4/03, 2016)
元ネタ:https://twitter.com/kumiromilk/status/707437861881180160
# How to compile: nim c -r FILENAME.nim
import math
type ZunDoko = enum
doko, zun
iterator zundokoGenerator(): ZunDoko =
yield case math.random(2).ZunDoko:
of zun: echo "ズン"; zun
of doko: echo "ドコ"; doko
var song: seq[int] = @[]
while true:
for z_or_d in zundokoGenerator():
song.add(z_or_d.int)
if z_or_d == doko:
defer: song = @[]
if song.sum >= 4:
echo "キ ヨ シ!"
quit 0
出力
ズン
ドコ
ズン
ズン
ズン
ズン
ドコ
キ ヨ シ!
追記: threadsを利用した実装
# How to compile: nim c -r --threads:on FILENAME.nim
import math, threadpool
type ZunDoko = enum
doko, zun
iterator zundokoGenerator(id: int): ZunDoko =
yield case math.random(2).ZunDoko:
of zun: echo "ズン" & $id; zun
of doko: echo "ドコ" & $id; doko
var song {.threadvar.}: seq[int]
proc kiyoshi(id: int = 0) {.thread.} =
block done:
song = @[]
while true:
for z_or_d in zundokoGenerator(id):
song.add(z_or_d.int)
if z_or_d == doko:
defer: song = @[]
if song.sum >= 4:
echo "キ ヨ シ!" & $id
break done
when isMainModule:
let max_threads = 10
for i in 1..max_threads:
spawn kiyoshi(i)
sync()