How do DP and CC change in Piet?
Asked Answered
C

1

7

According to the specification,

Black colour blocks and the edges of the program restrict program flow. If the Piet interpreter attempts to move into a black block or off an edge, it is stopped and the CC is toggled. The interpreter then attempts to move from its current block again. If it fails a second time, the DP is moved clockwise one step. These attempts are repeated, with the CC and DP being changed between alternate attempts. If after eight attempts the interpreter cannot leave its current colour block, there is no way out and the program terminates.

Unless I'm reading it incorrectly, this is at odds with the behaviour of the Fibonacci sequence example here:

(from: http://www.dangermouse.net/esoteric/piet/samples.html)

Specifically, why does the DP turn left at (0,3) ((0,0) being (top, left)) when it hits the left edge? At this point, both DP and CC are LEFT, so, by my reading, the sequence should then be:

  1. Attempt (and fail) to leave the block by going off the edge at (0,4),
  2. Toggle CC to RIGHT,
  3. Attempt (and fail) to leave the block by going off the edge at (0,2).
  4. Rotate DP to UP,
  5. Attempt (and succeed) to leave the block at (1,2) by entering the white block at (1,1)

The behaviour indicated by the trace seems to be that DP gets rotated all the way, leaving CC at LEFT.

What have I misunderstood?

Calicle answered 29/4, 2010 at 10:5 Comment(0)
C
7

Your analysis seems correct; the sample is buggy. The white block at (1,1) should be black. You can verify this by grabbing the sample image and executing it.

Note that at least three of the interpreters linked from DMM's page are buggy - Marc Majcher's is marked as such, Sylvain Tintillier's traverses and outputs correctly but switches the meaning of in and inn from the spec (this is a bug-free version), and PietDev incorrectly traverses colour blocks.

EDIT: other white blocks probably also need to be black, e.g. the block at (6,3).

Commonage answered 29/4, 2010 at 16:19 Comment(1)
Thanks. I spent a good while wondering why my implementation went into an infinite loop at that point. White (6,3) is OK, as at that point, CC is LEFT, so the cursor exits light blue block (7,3) & (7,4) by entering (6,4) anyway.Calicle

© 2022 - 2024 — McMap. All rights reserved.