def test_sub_decimal_2(self): source = c.block_of(s.push_decimal(3.5), s.push_decimal(-4.25), s.sub_decimal()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), 7.75) self.assertEqual(sim.pointer, 4)
def test_add_decimal_6(self): source = c.block_of(s.push_decimal(-4.5), s.push_decimal(4.5), s.add_decimal()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), 0.0) # TODO -0.0 self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertEqual(sim.pointer, 4)
def test_top_minus_second_1(self): source = c.block_of(s.push_decimal(-0.5), s.push_decimal(2.25), s._top_minus_second()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), 1.75) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertEqual(sim.pointer, 8)
def test_if_top_decimal_is_nz_then_override_2(self): source = c.block_of(s.push_decimal(0.5), s.push_decimal(0.0), s._if_top_decimal_is_nz_then_override()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), 0.5) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertEqual(sim.pointer, 8)
def test_if_nz_int_swap_2(self): source = c.block_of(s.push_decimal(-0.5), s.push_decimal(2.25), s._if_nz_int_swap()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), -0.5) self.assertAlmostEqual(self.getFloat(sim, 4), 2.25) self.assertEqual(sim.pointer, 8)
def test_dec_both_abs_decimal_3(self): source = c.block_of(s.push_decimal(0.5), s.push_decimal(0.5), s._dec_both_abs_decimal()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), 0.0) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertEqual(sim.pointer, 8)
def test_multi_decimal_1(self): source = c.block_of(s.push_decimal(2.0), s.push_decimal(-4.25), s.multi_decimal()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), -8.5) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertAlmostEqual(self.getFloat(sim, 8), 0.0) self.assertEqual(sim.pointer, 4)
def test_xor_sign_4(self): source = c.block_of(s.push_decimal(2.0), s.push_decimal(4.25), s._xor_sign()) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertEqual(sim.memory[8 + s.IDX_DMY], 0) self.assertEqual(sim.memory[8 + s.IDX_INT], 0) self.assertEqual(sim.memory[8 + s.IDX_DEC], 0) self.assertEqual(sim.memory[8 + s.IDX_SGN], 0) self.assertEqual(sim.memory[12], 0) self.assertEqual(sim.pointer, 8)
def test_if_lt_decimal_4(self): source = c.block_of( s.push_decimal(2.0), s.push_decimal(-4.25), s.if_lt_decimal( then_statement=s.push_byte(ord('L')) + s.put_char(), else_statement=s.push_byte(ord('G')) + s.put_char())) out = io.StringIO() sim = BfSim(source, stdout=out) while not sim.is_stopped(): sim.run(10000) self.assertEqual(out.getvalue(), "G") self.assertAlmostEqual(self.getFloat(sim, 0), 0.0) self.assertAlmostEqual(self.getFloat(sim, 4), 0.0) self.assertAlmostEqual(self.getFloat(sim, 8), 0.0) self.assertEqual(sim.pointer, 0)
def test_push_decimal_2(self): source = s.push_decimal(-3.5) sim = BfSim(source) while not sim.is_stopped(): sim.run(10000) self.assertAlmostEqual(self.getFloat(sim, 0), -3.5) 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)))