Skip to content

Instantly share code, notes, and snippets.

@Yardanico
Last active January 25, 2020 11:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Yardanico/c6495e6b8d0776ff07b6feabab0b1d17 to your computer and use it in GitHub Desktop.
Save Yardanico/c6495e6b8d0776ff07b6feabab0b1d17 to your computer and use it in GitHub Desktop.
FizzBuzz in v's and fizzbuzz
import macros, strutils, sequtils, sugar
var bytes {.compileTime.}: seq[int]
const chars = ["fizz", "buzz", "fizzbuzz"]
proc translate(): string =
for i in 0..<(bytes.len div 7):
result.add(
chr(
100*bytes[7*i] +
70*bytes[7*i+1] +
25*bytes[7*i+2] +
10*bytes[7*i+3] +
5*bytes[7*i+4] +
2*bytes[7*i+5] +
bytes[7*i+6])
)
proc action(n: int, code: NimNode): NimNode =
bytes.add n
echo bytes, "as"
proc f(n: NimNode) =
if n.kind == nnkIdent:
# XXX do NOT add mod here! This version (miraculously) works with utf8
bytes.add(chars.find(n.strVal))
for c in n.children:
f(c)
f(code)
if bytes.len mod 7 == 0 and bytes.len >= 7:
let str = translate()
if {'\n'} == { str[str.len-1], str[str.len-2] }:
bytes.setLen(0)
return parseStmt(str)
newStmtList()
proc vify*(strCode: string): string =
var str = strCode
var bytes: seq[int]
doAssert str.find("\n\n") < 0, "No two consecutive new line characters"
if str[str.len-1] == '\n':
str &= "\n"
else:
str &= "\n\n"
for c in str:
var n = ord(c)
bytes.add n div 100
n = n mod 100
bytes.add n div 70
n = n mod 70
bytes.add n div 25
n = n mod 25
bytes.add n div 10
n = n mod 10
bytes.add n div 5
n = n mod 5
bytes.add n div 2
n = n mod 2
bytes.add n
var lineLen = 0
let idents = bytes.map(n => chars[n])
for i in 0..<idents.len:
let s = idents[i]
if i+1 == idents.len and result[result.len-1] == '\n':
result.delete(result.len-1, result.len)
result &= s & " "
lineLen += s.len + 1
if lineLen >= 60:
lineLen = 0
result &= "\n"
macro generateDefinitions =
result = newStmtList()
for i in 0..2:
let
number = newIntLitNode(i)
name = newIdentNode(chars[i])
echo i
result.add quote do:
macro `name`*(code: untyped):untyped = action(`number`, code)
generateDefinitions
import v
vvvv vvvvv vvvv vvvvv v vvv vvvvv vv v vvvvv v vvvvv vvvvv vv
vvv vvvvv vv vvvvv vv v v vvvvv v vvv vvvv vvvv v vvvv vvvv
vvv vvvvv vv vvv vvvvv v vvvvv vvvvv vv vvvv v v vvvv vvvvv
vvv vv vvvv vvvv v vvvvv vv vvv vv v v vvvv vvvv vv vvvvv vvv
vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv vv v v vvvvv
vvvv vv vv vvv vvvvv vvvv vvvv vvv vvvvv v vvvvv vvvvv v vvv
vvvvv vv v vvvv vvvvv vvvv vvvvv v vv vvvv vvvv vvvvv vvvv v
vvv vvvv vvvvv vvvv vvvvv v vvv vvvv vvvv vvvvv vv vvv vvvvv
vvvvv vvvv vvvv vvv v vv vv v v vvvvv vv vvvv vvvv vvvv vvvvv
vvvvv vv vv vvvv vv vvvvv vvvv vvvvv vvvv vvvvv v vvvv vvvvv
vv vvvvv vvvv vvv vv v v vvvv vvvv vvvv vvv vvvvv v vvvvv vvvvv
v vvvv vvvvv vv vvvv vvvvv vv vvvvv vv v v vvvv vvvv vvv vvvv
vvvvv vvv vvvv vvvv v vvvvv vv vvv vvvvv vv vvvv vv v v vvv
v vvvvv vv v v vvvv vv vvvvv vv v vvv vvvv vvvvv v vvvv vvvvv
vvvv vvvvv vvvv v vvvvv vvvv v vv v vvv vv vvv vvv vv v v vv
v vvv vvvv vvvv vv vvvvv vvv v vvvvv vvvv v vvvvv vvvv v vv
v vvv vv vvv vvv vv v v vv v vvv vvvv vvvvv v vvvv vvvvv vvvv
vvvvv vvvv v vvvvv vvvv v vvvv vvvv vv vvvvv vvv v vvvvv vvvv
v vvvvv vvvv v vv v vvv vvvv vvv vv v v vvvv vvvvv vv v vvvvv
vv vvv vvvvv v vvvvv vvvv vvvv vvv vv v v vvvvv vv vvvvv vvvvv
vv vvv vvvv vvvv v vvvvv v vvvv vvvvv vv vvvv vvvvv v vv vvvv
vvvv v vvvvv vv vvvvv vvvv vvvv vvvvv vv vv vvvv vv vv vvvvv
vvv v vv vv v v vvvvv vv vvvv vvvvv vv vvvvv vvvvv vv vvv vvvv
vvvvv vvvv vvvvv v vvvv vvvv vvvvv vv vv v v vvv v vvvvv v v
vvvv vv v v vvvv vvvvv v vvvvv v vvvvv vvvvv vv vvv vv v v vvvv
vvvvv vvvv vv v v vvvv vvvvv vvvv vvvvv v vvvv vv v v vv vvvv
vv vv vvv vvvvv vv vvv vvvvv vvv v vvvv vv vv vvvv vvvv vvvv
vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv
vv vvv vvvvv vvvvv v vv vvvv vvvv vvvvv vvvvv v vvvv vv v v
vvvv vvvv vvvv vvvv vvvvv vvvv vvvvv vvv vv vv v v vv vvvvv
vvvv vv vv vvvvv vvv v vv vvvvv vv vvv vvvv vvvv vvvvv vvvvv
vv vvvv vvvvv vvv v vvvvv v vv vvvvv vv vvvvv vv vvv vvvvv vvvv
vvvv v vvvv vvvv vvvv vvvv vvvv vvvv vv vv vvvv vvvv vvvv vvv
vvvv vvvvv vvv vvvvv vv vvv vv vv vvvv vv vvvv vvv vv vvvv vv
vv vvvv vv vv vvv v vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv
vvvv vvvv vvvvv vvvvv vv vvvv vvvv vv vvvvv vv vvvvv vvvv vv
vvv v vvvv vvvvv vvvv vvvv vvv vv vv vvv vv vv vvvvv vvvv vv
vvvv vv vv vvv v vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv
vvvv vvvv vvvvv vvvvv vv vvvv vvvv vv vvvvv vv vvvvv vvvv vv
vvv v vvvv vvvvv vvvv vv vvv vv vv vvvv vvv vvvv vvv vv vv vvv
vv vv vvvv vvvv vv vvvvv vv vv vvv v vvvv vvvv vv vvvvv vvv
vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv vvvv vv vvvvv
vv vvvvv vvvv vv vvv v vvvv vvvvv vvvv vv vvv vv vv vvvv vvvv
vvvv vvv vv vv vvv vv vv vvvv vvv vv vvvv vv vv vvv v vvvv vvvv
vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv
vvvv vv vvvvv vv vvvvv vvvv vv vvv v vvvv vvvvv vvvv vv vvv
vv vv vvvv vvvvv vvvv vvv vv vv vvv vv vv vvvvv vv vv vvv v
vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv
vvvvv vv vvvv vvvv vv vvvvv vv vvvvv vvvv vv vvv v vvvv vvvvv
vvvv vv vvv vv vv vvvvv v vvvv vvv vv vv vvv vv vv vvvv vvvv
vv vvv v vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv
vvvvv vvvvv vv vvvv vvvv vv vvvvv vv vvvvv vvvv vv vvv v vvvv
vvvvv vvvv vv vvv vv vv vvvvv vv vvvv vvv vv vv vvv vv vvvv
vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv
vv vvvv vvvv vv vvvvv vv vvvvv vvvv vv vvv v vvvv vvvvv vvvv
vv vvv vv vv vvvvv vvv vvvv vvv vv vv vv vvvvv vv vv vvvvv v
v vvvv vvvvv vv v vvvvv vv vvv vvvvv v vvvvv vvvv vvvv vvv vv
v v vvvv vvvv v vvvv vvvv vvv vvvvv vv vvvvv vvvv vvvvv vvvv
vvvvv v vvvvv vvvvv v vvvv vv vv vvvv vvvvv v vvvv vvv v vv
vv v v vvvv vvvvv vvvv vvvvv v vvvv vvvvv vv vvvvv vv vvv vvv
vv v v vvvv vvvv vvv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv
vvvvv vvv v vv vv v v vvv vvvvv vv vvvv vvvvv vvvv vvvvv v vvv
vvv vvvvv vv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vv
vv vvvvv vvv v vv vv v v vvv vvvvv vv vvvv vvvvv vvvv vvvvv
v vvv vvv vvvvv vv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv
vv v v vvv v vvvvv v v vvvv vv v v vv v v vvvv vvvv vv vvvvv
vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv vv vvv
vvvvv vvvv vvvv v vvvv vvvv vvvv vvvv vvvv vvvv vv v v vvvvv
v vvvv v v vvvv vv v v vv v v vvvvv vv v vvvvv vv vvv vvvvv
v vvvvv vvvv vvvv vvv vv v v vvvv vvvvv v vv vv vvvv vvvvv v
vvvv vvv v vv vv v v vvv vvvvv vv vvvv vvvvv vvvv vvvvv v vvv
vvv vvvvv vv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vv
vv vvvvv vv v v vvv v vvvvv v v vvvv vv v v vv v v vv v v vvvv
vvvvv vvvv vvvv vvvvv v vv v v vvvvv v vvvv vv vvv vvvvv vvvvv
v v vvvv vvvvv vvvv vvvvv v vvvv vvvv vvvv vvvv vv v v vvv v
vvvvv vvv v vvvvv vv v v vvvvv v vvvv vvvvv v vvvv vvvvv v v
vvv vvvv vv vvvv vvvv vvvv vvvv vvvv vvvvv vvvvv v vvvv vvvvv
vv vvvvv vvv v vv vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv
vvvv vvvv vvvvv vvvvv vv vvvv vv vvv vvvvv vvvv vvvv v vvvv
vvvv vvvv vvvv vvvv vvvv vv vv vvvv vvvv vvvv vvv vvvv vvvvv
vvv vvvv vvvv v vvvvv vv vvv vvvvv vv vvvv vv vvv vvvvv vvvv
vvvvv v vvvv vvvvv vvvv vvvvv v vvvv vvvv vvvv vvvv vv vv vvvv
vvvvv v vvvv vv vvv vvvvv vvvvv vv vvvv vvvvv vv vvvvv vvvvv
vv vvv vvvv v vvvvv vvvv vvvv v vvvvv v vv vv vv vvvvv vv vv
vvvvv v v vvvv vv v v vv v v vv v v vvvv vvvvv v vvvvv v vvvvv
vvvvv vv vvv vv v v vvvv vvvv vvv vv v v vvvv vvvvv vvvv vvvvv
v vvvv vv v v vvvvv v vvvv vv vvv vvvvv vvvv vvvv vvv vvvv vvvvv
vvv vvvv vvvvv vvvv vvvvv v vv vvvv vvvv vvvv vvvvv vv vvv vvvv
vvvv vvvvv vvvvv v vvvv vvv v vv vvvv vvvvv v vv vv vvvv vvvv
vvvv vvv vv vv vvvvv v v vvvv vv v v vv v v vvvv vvvvv v vv
vv vvvv vvvv vvvv vvv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv
vvvvv vv vv vvvvv v v vvvv vv v v vv v v vvvv vvvvv vvvv vvvv
vvvvv v vv v v vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv
vvvv vvvvv vvvvv vv vvvv vv vvv vvvvv vvvvv v vv vvvv vvvv vvvvv
vvvvv v vvvv vv v v vvvvv v vvv vvvvv v vvvvv vvvv vvvv vvvv
vv v v vv vvvvv vvvv vvv v vvvvv vvv v vvvvv vv vvvv vv vv v
v vvvv vvvv v vvvvv v vvvv vvvv vvvv vvvv vv v v vvvv vvvv vv
vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv vvvvv vv vvvv
vv vvv vvvvv vvvvv v vv vvvv vvvv vvvvv vvvvv v vvvv vvv vv
v vvv v vvvvv vv vvvvv vvvv vvv v vv v v vvvv vv v v vv v v
vv v v vvvvv v vv vvvv vvvv vvvvv vvvvv vv vvvvv vv v v vvvvv
vv vvvv vvvvv vv vvvvv vvvvv vv vvv vv v v vvv v vvvvv vv v
v vvvvv vv vvvvv vvvvv vv vvv vvvv vvvv v vvvvv v vvvv vvvvv
vv vvvv vvvvv v vv vvvv vvvv v vvvvv vv vvvvv vvvv vvvv vvvvv
vv vv vvvv vv vv vvvvv v v vvvv vv v v vv v v vv v v vvvv vvvvv
vvvv vvvv vvvvv v vv v v vvvvv vvvv vv vv vv vvv vvvv vvv v
vvvvv v vvvv vv vv vvv vvvvv vvvv vvvv vv v v vvv v vvvvv vvv
v vvvvv vv v v vvvvv vvvv vv vvvvv vv vvvv vvvvv vv vvvvv vvvvv
vv vvv vvvv vv vvvvv vvvvv vv vvvv vvvvv vv vvvvv vvvvv vv vvv
vv vvv vvvvv vvvvv v vv vvvv vvvv vvvvv vvvvv v vvvv vv vvv
vvvv vv vvvv vvv vvvv vvv vv vv vvv vvv vvvvv vv vvvv vvvvv
vv vvvvv vvvvv vv vvv vvvv vv vvvvv vvvvv vv vvvv vvvvv vv vvvvv
vvvvv vv vvv vv vvv vvvvv vvvvv v vv vvvv vvvv vvvvv vvvvv v
vvvv vv vvv vvvv vv vvvv vvvv vvvv vvv vv vvvvv vvvv vvvv vvv
v vv vvvv vvvv vv vvvvv vvv vvvvv vvvvv vv vvvvv vvvv vvvv vvvvv
vvvvv vv vvvv vv vvv vvvvv vvvvv vv vvvv vvvv vvvv vvvvv vvvvv
vv vvvvv vvv vvvv vvvvv vvvv vvvv vvvvv vvvvv v vvvv vv vv vvvv
vv vvvv vv vv vv vvvvv vvv v vvv vvvvv vv vvv vvvv vvvv vvvvv
vvvvv vv vvvvv vvvvv vvv v vvvvv vv vvv vvvvv v vvvv vv v v
vvvvv vv v vvvv vvvv v vvvvv vv vvv vvvvv vv vvvv vvvv vvvv
vvvvv vvvv v vv vvvvv vv vvvvv vvvvv v vvv vvvvv vv vvvvv vv
vv vvvv vvvvv vv vvvv vvvvv vv vvvvv vvvvv vv vvv vv vv vvvvv
v v vvvv vv v v vv v v vvvvv v vvvv vvvv vvvv vvvvv vvvvv vvv
vvv vvvv v vv vvvvv vv vvvvv vvvvv v vvv vvvvv vv vvvvv vvv
vvvv vvvvv vvvv vvvvv vvvv vvvvv vv vvvv vvvvv vv vvvvv vv vv
vvvv vv vv vvvvv v v vvvv vvvvv v vvv vvvv vvvv v vvvv vvvv
vvv vvvvv vv vvv vvvvv v vvvvv vv v v vvvv vvvvv v vvvv vvvvv
vvvv vvvvv vvvv v vvvvv vvvv v vv vv vvvv vvvv vvvv vvv vvvvv
v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vvv v vv vvvvv vvv v
vvvvv v vvvv vvvvv vv vvvvv vvvvv vvv vvvvv vvvvv vv v vvvv
vvvv vvvvv vvvv vvvv vvvv vv vv vvvvv vvv v vvvvv vvvv vvvv
v vvvv vvvv vvv vvvvv vv vvvvv vvvv vvvvv vvvv vvvvv v vvvvv
vvvvv v vvvv vv vv vvvv vv vvvv vv vv vvv vvv vv v v vvvv vvvv
vvv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vv vv vvvvv
v v vvvv vvvvv v vvv vvvv vvvv v vvvv vvvv vvv vvvvv vv vvv
vvvvv v vvvvv vv v v vvvv vvvv vv vvvvv vvv v vvvvv vvvv v vvvvv
vvvv v vv vv vvvv vvvv vvvv vvv vvvvv v vvvvv vvvv vvvv vvvv
vvvv vvvv vvvvv vvv v vv vvvvv vvv v vvvvv v vvvv vvvvv vv vvvvv
vvvvv vvv vvvvv vvvvv vv v vvvv vvvv vvvvv vvvv vvvv vvvv vv
vv vvvvv vvv v vvvvv vvvv vvvv v vvvv vvvv vvv vvvvv vv vvvvv
vvvv vvvvv vvvv vvvvv v vvvvv vvvvv v vvvv vv vv vvvv vv vvvv
vvv vv vvv vvv vv v v vvvv vvvv vvv vvvvv v vvvvv vvvv vvvv
vvvv vvvv vvvv vvvvv vv vv vvvvv v v vvvv vvvvv v vvv vvvv vvvv
v vvvv vvvv vvv vvvvv vv vvv vvvvv v vvvvv vv v v vvvv vvvvv
v vvvv vvvvv vvvv vvvvv vvvv v vvvvv vvvv v vvvv vvvv vv vvvvv
vvv v vvvvv vvvv v vvvvv vvvv v vv vv vvvv vvvv vvvv vvv vvvvv
v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vvv v vv vvvvv vvv v
vvvvv v vvvv vvvvv vv vvvvv vvvvv vvv vvvvv vvvvv vv v vvvv
vvvv vvvvv vvvv vvvv vvvv vv vv vvvvv vvv v vvvvv vvvv vvvv
v vvvv vvvv vvv vvvvv vv vvvvv vvvv vvvvv vvvv vvvvv v vvvvv
vvvvv v vvvv vv vv vvvv vv vvvv vvvv vv vvv vvv vv v v vvvv
vvvv vvv vvvvv v vvvvv vvvv vvvv vvvv vvvv vvvv vvvvv vv vv
vvvvv v v vvvv v v vvvv
buzz fizz fizz fizz fizz buzz fizz buzz fizz fizz buzz fizz
fizz buzz buzz fizz fizz buzz fizz fizzbuzz fizz fizz fizz buzz
fizz buzz buzz fizz buzz fizz fizz buzz fizz fizz fizz fizz
fizz buzz fizz buzz buzz fizz buzz fizz fizz fizz buzz fizz
fizz buzz fizz fizz buzz fizz fizz fizz fizz fizz buzz fizz
buzz buzz fizz fizz fizz buzz fizzbuzz fizz fizzbuzz fizz fizz
fizz buzz fizzbuzz fizz fizz buzz fizz fizz buzz fizzbuzz fizz
fizz buzz fizz fizz buzz fizzbuzz fizz fizzbuzz fizz fizz fizz
buzz fizzbuzz fizz buzz buzz fizz fizz buzz fizzbuzz fizz buzz
buzz fizz fizz fizzbuzz fizz buzz buzz buzz buzz fizz fizz fizz
fizz fizz buzz fizz buzz buzz fizz fizz fizzbuzz fizz buzz fizz
fizz fizz fizz fizzbuzz fizz buzz fizz fizz buzz fizz fizz buzz
fizz fizz buzz fizz buzz buzz fizz fizz buzz fizz fizzbuzz fizz
fizz buzz fizz fizz buzz buzz fizz fizz buzz buzz fizz fizz
buzz fizz fizz fizz fizz fizz buzz buzz buzz fizzbuzz fizz fizz
fizz buzz fizz buzz fizzbuzz fizz fizz buzz fizz fizz fizz fizz
fizz buzz fizz fizz fizz buzz fizz fizz buzz fizz fizz fizzbuzz
fizz buzz fizz buzz fizz fizz fizzbuzz fizz buzz fizz fizz fizz
buzz fizz buzz fizzbuzz fizz fizz fizz buzz buzz buzz fizzbuzz
fizz fizz fizz buzz fizz buzz fizzbuzz fizz fizz fizz fizzbuzz
buzz buzz fizz buzz buzz fizz fizz buzz buzz buzz fizz buzz
fizz fizz fizzbuzz fizz buzz fizz buzz fizz fizz fizzbuzz fizz
buzz fizz fizz fizz buzz fizz buzz fizzbuzz fizz fizz fizz buzz
buzz buzz fizzbuzz fizz fizz fizz buzz fizz buzz fizzbuzz fizz
fizz buzz fizz fizz fizz fizz fizz buzz fizz fizz fizz buzz
fizz fizz buzz fizz fizz fizzbuzz fizz buzz fizz buzz fizz fizz
fizzbuzz fizz buzz fizz fizz fizz fizzbuzz buzz buzz fizz buzz
buzz fizz fizz buzz buzz buzz fizz buzz fizz fizz fizzbuzz fizz
buzz fizz buzz fizz fizz fizzbuzz fizz buzz fizz fizz fizz buzz
fizz buzz fizzbuzz fizz fizz buzz fizz fizzbuzz fizz buzz buzz
fizz buzz fizz fizzbuzz fizz fizz buzz buzz fizz fizz fizz buzz
fizz fizz buzz fizz fizz buzz fizz fizz fizz buzz fizz fizz
buzz buzz fizz buzz fizz fizz buzz buzz buzz fizz fizz buzz
fizz fizz buzz fizz fizz fizz fizz fizz buzz buzz fizz buzz
fizz fizz fizz buzz buzz fizz buzz fizz fizz fizz fizzbuzz fizz
fizz fizz buzz fizz fizz fizzbuzz buzz fizz fizz fizz fizz fizz
buzz fizzbuzz fizz fizzbuzz fizz fizz fizz buzz buzz buzz fizz
buzz fizz fizz buzz buzz buzz buzz buzz fizz fizz fizzbuzz fizz
fizz fizz fizz fizz fizz buzz buzz buzz buzz fizz buzz fizz
fizz fizz buzz fizz fizz buzz fizz fizz buzz fizz fizz fizz
buzz fizz fizz buzz buzz fizz buzz fizz fizz buzz buzz buzz
fizz fizz buzz fizz fizz buzz fizz fizz fizz fizz fizz buzz
buzz fizz buzz fizz fizz fizz buzz buzz fizz buzz fizz fizz
fizz fizzbuzz fizz fizz buzz buzz fizz fizz fizzbuzz buzz fizz
fizz fizz fizz fizz buzz fizzbuzz fizz fizzbuzz fizz fizz fizz
buzz buzz buzz fizz buzz fizz buzz fizz fizzbuzz fizz buzz buzz
fizz fizz fizz buzz fizz fizz fizz fizz fizz fizz buzz fizz
fizz fizz
import macros
var bytes {.compileTime.}: seq[int]
const chars = ["fizz", "buzz", "fizzbuzz"]
proc translate(): string =
for i in 0..<(bytes.len div 7):result.add(chr(100*bytes[7*i]+70*bytes[7*i+1]+25*bytes[7*i+2]+10*bytes[7*i+3]+5*bytes[7*i+4]+2*bytes[7*i+5]+bytes[7*i+6]))
proc action(n: int, code: NimNode): NimNode =
bytes.add n
proc f(n: NimNode) =
if n.kind == nnkIdent:bytes.add(chars.find(n.strVal))
for c in n.children:f(c)
f(code)
if bytes.len mod 7==0 and bytes.len>=7:
let str = translate()
if {'\n'} == {str[str.len-1],str[str.len-2]}:bytes.setLen(0);return parseStmt(str)
newStmtList()
macro fizz(code:untyped)=action(0, code)
macro buzz(code:untyped)=action(1, code)
macro fizzbuzz(code:untyped)=action(2, code)
for n in 1..100:echo [$n,"Fizz","Buzz","FizzBuzz"][int(n%%3<1)+2*int(n%%5<1)]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment