ズンドコキヨシ with Nim

  • 2
    Like
  • 2
    Comment
More than 1 year has passed since last update.

ズンドコキヨシの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()