def test_sub_byte_1(self): source = c.block_of(s.push_byte(3), s.push_byte(2), s.sub_byte()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getByte(sim, 0), 1) self.assertEqual(sim.pointer, 4)
def test_if_nz_decimal_3(self): source = c.block_of( s.push_decimal(0.0), s.if_nz_decimal( then_statement=s.push_byte(ord('N')) + s.put_char(), else_statement=s.push_byte(ord('Z')) + s.put_char())) out = io.StringIO() sim = BfSim(source, stdout=out) while not sim.is_stopped(): sim.run(10000) self.assertEqual(out.getvalue(), "Z") self.assertAlmostEqual(self.getFloat(sim, 0), 0.0) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertEqual(sim.pointer, 0)
def test_push_byte_1(self): source = s.push_byte(3) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertEqual(self.getByte(sim, 0), 3) self.assertEqual(sim.pointer, 4)
def mandelbrot(columns: int, rows: int) -> str: # X軸の加算値 x_step = (X_END - X_BEGIN) / (columns - 1) # Y軸の加算値 y_step = (Y_END - Y_BEGIN) / (rows - 1) return c.program_of( # #0: y0 = y_begin s.push_decimal(Y_BEGIN), # #1: y = rows s.push_byte(rows), s.loop_of( # for(y) # #2: x0 = x_begin s.push_decimal(X_BEGIN), # #3: x = columns s.push_byte(columns), s.loop_of( # for(x) s.dup(1), # #4: cx = x0 s.dup(4), # #5: cy = y0 s.push_decimal(0), # #6: zx = 0 s.push_decimal(0), # #7: zy = 0 s.push_byte(ord(" ")), # #8: ch = ' ' s.push_byte(ord("A") - 1), # #9: count = 'A'-1 s.push_byte(C_MAX), # #10: c = 26 s.loop_of( # for(c) # #11: zx2 = zx * zx s.dup(4), s.dup(0), s.multi_decimal(), # #12: zy2 = zy * zy s.dup(4), s.dup(0), s.multi_decimal(), # #13: size2 = zx2 + zy2 s.dup(1), s.dup(1), s.add_decimal(), # #14: THRESHOLD2 s.push_decimal(THRESHOLD2), # if size2 > 4.0 s.if_gt_decimal( then_statement=c.block_of( # 発散 # ch = count s.dup(5), # #15 s.override(7), # for_c break s.loop_last(4)), else_statement=c.block_of( # #15: zx_next = zx2 - zy2 + cx s.dup(3), s.dup(3), s.sub_decimal(), s.dup(11), s.add_decimal(), # #16: zy_next = zx * zy * 2 + cy s.dup(9), s.dup(9), s.multi_decimal(), s.dup(0), s.add_decimal(), s.dup(11), s.add_decimal(), # #17: if zx_next == zx && zy_next == zy s.dup(1), # zx_next s.dup(11), # zx s.sub_decimal(), # #17: 0(zx_next == zx) or 1(zx_next != zx) s.if_nz_decimal( s.push_byte(1) + s.swap(1), s.push_byte(0) + s.swap(1)), s.dup(1), # zy_next s.dup(11), # zy s.sub_decimal(), # #18: 0(zx_next == zx) or 1(zx_next != zx) s.if_nz_decimal( s.push_byte(1) + s.swap(1), s.push_byte(0) + s.swap(1)), # #17: 0(zx_next == zx && zy_next == zy) or other s.add_byte(), s.if_z( then_statement=c.block_of( # 収束 s.swap(1), s.drop(), # drop zy_next s.swap(1), s.drop(), # drop zx_next s.loop_last(5) # last c ), else_statement=c.block_of( # zx = zx_next s.swap(1), s.override(10), # zy = zy_next s.swap(1), s.override(10), # count += 1 s.dup(6), s.push_byte(1), s.add_byte(), s.override(7))))), s.drop() * 2 # drop zy2, zx2 ), s.drop(), # drop count # 色対応 s.dup(0), s.if_eq(ord('A'), s.put_str("\x1b[31m")), s.dup(0), s.if_eq(ord('B'), s.put_str("\x1b[32m")), s.dup(0), s.if_eq(ord('C'), s.put_str("\x1b[33m")), s.dup(0), s.if_eq(ord('D'), s.put_str("\x1b[34m")), s.dup(0), s.if_eq(ord('E'), s.put_str("\x1b[35m")), s.dup(0), s.if_eq(ord('F'), s.put_str("\x1b[36m")), # 色の対応ここまで s.put_char(), # putchar(ch) # 色をリセット s.put_str("\x1b[0m"), s.drop() * 4, # drop zy, zx, cy, cx # #4: x0 += x_step s.dup(1), s.push_decimal(x_step), s.add_decimal(), s.override(2)), # drop x0 s.drop(), # #2: putchar("\n") s.push_byte(ord("\n")), s.put_char(), # #2: y0 += y_step s.dup(1), s.push_decimal(y_step), s.add_decimal(), s.override(2)))
def julia(columns: int, rows: int) -> str: # X軸の加算値 x_step = (X_END - X_BEGIN) / (columns - 1) # Y軸の加算値 y_step = (Y_END - Y_BEGIN) / (rows - 1) return c.program_of( # #0: y0 = y_begin s.push_decimal(Y_BEGIN), # #1: y = rows s.push_byte(rows), s.loop_of( # for(y) # #2: x0 = x_begin s.push_decimal(X_BEGIN), # #3: x = columns s.push_byte(columns), s.loop_of( # for(x) s.dup(1), # #4: zx = x0 s.dup(4), # #5: zy = y0 s.push_byte(ord(" ")), # #6: ch = ' ' s.push_byte(ord("A") - 1), # #7: count = 'A'-1 s.push_byte(C_MAX), # #8: c = 26 s.loop_of( # for(c) # #9: zx2 = zx * zx s.dup(4), s.dup(0), s.multi_decimal(), # #10: zy2 = zy * zy s.dup(4), s.dup(0), s.multi_decimal(), # #11: size2 = zx2 + zy2 s.dup(1), s.dup(1), s.add_decimal(), # #12: THRESHOLD2 s.push_decimal(THRESHOLD2), # if size2 > 4.0 s.if_gt_decimal( then_statement=c.block_of( # 発散 # ch = count s.dup(5), # #13 s.override(7), # for_c break s.loop_last(4)), else_statement=c.block_of( # #13: zx_next = zx2 - zy2 + cx s.dup(3), s.dup(3), s.sub_decimal(), s.push_decimal(C_X), s.add_decimal(), # #14: zy_next = zx * zy * 2 + cy s.dup(9), s.dup(9), s.multi_decimal(), s.dup(0), s.add_decimal(), s.push_decimal(C_Y), s.add_decimal(), # #15: if zx_next == zx && zy_next == zy s.dup(1), # zx_next s.dup(11), # zx s.sub_decimal(), # #15: 0(zx_next == zx) or 1(zx_next != zx) s.if_nz_decimal( s.push_byte(1) + s.swap(1), s.push_byte(0) + s.swap(1)), s.dup(1), # zy_next s.dup(11), # zy s.sub_decimal(), # #16: 0(zx_next == zx) or 1(zx_next != zx) s.if_nz_decimal( s.push_byte(1) + s.swap(1), s.push_byte(0) + s.swap(1)), # #15: 0(zx_next == zx && zy_next == zy) or other s.add_byte(), s.if_z( then_statement=c.block_of( # 収束 s.swap(1), s.drop(), # drop zy_next s.swap(1), s.drop(), # drop zx_next s.loop_last(5) # last c ), else_statement=c.block_of( # zx = zx_next s.swap(1), s.override(10), # zy = zy_next s.swap(1), s.override(10), # count += 1 s.dup(6), s.push_byte(1), s.add_byte(), s.override(7))))), s.drop() * 2 # drop zy2, zx2 ), s.drop(), # drop count s.put_char(), # putchar(ch) s.drop() * 2, # drop zy, zx # #4: x0 += x_step s.dup(1), s.push_decimal(x_step), s.add_decimal(), s.override(2)), # drop x0 s.drop(), # #2: putchar("\n") s.push_byte(ord("\n")), s.put_char(), # #2: y0 += y_step s.dup(1), s.push_decimal(y_step), s.add_decimal(), s.override(2)))