Advertisement
PifyZ

Befunge en Boomonkey (non finalisé)

Mar 27th, 2016
381
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.13 KB | None | 0 0
  1. import stdio as io
  2. import File
  3.  
  4. enum Direction { Right, Left, Up, Down }
  5.  
  6. class Befunge {
  7.     List<Int> values
  8.     Int x_cur
  9.     Int y_cur
  10.     Direction dir
  11.     String code
  12.     List<String> lines
  13.  
  14.     public new() {
  15.         dir = RIGHT
  16.  
  17.         values = new Array<Int>()
  18.         x_cur = 0
  19.         y_cur = 0
  20.  
  21.         args = io.args()
  22.  
  23.         if (args.length != 1)
  24.             io.exit(1)
  25.  
  26.         code = File.getContent(args[0])
  27.  
  28.         lines = ~/\r\n|\n|\r/g.split(code)
  29.  
  30.         for (i in 0 ... lines.length) {
  31.             for (j in lines[i].length ... 80)
  32.                 lines[i] += ' '
  33.         }
  34.  
  35.         while (true) {
  36.             match lines[y_cur].charAt(x_cur) {
  37.                 '+'  { add() }
  38.                 '-'  { sub() }
  39.                 '*'  { mul() }
  40.                 '/'  { div() }
  41.                 '%'  { mod() }
  42.                 '!'  { not() }
  43.                 '`'  { greater() }
  44.                 '>'  { move_right() }
  45.                 '<'  { move_left() }
  46.                 '^'  { move_up() }
  47.                 'v'  { move_down() }
  48.                 '?'  { move_random() }
  49.                 '_'  { pop_horizontal() }
  50.                 '|'  { pop_vertical() }
  51.                 '\"' { string() }
  52.                 ':'  { dup() }
  53.                 '\\' { swap() }
  54.                 '$'  { jmp() }
  55.                 '.'  { display_int() }
  56.                 ','  { display_char() }
  57.                 '#'  { trampoline() }
  58.                 'p'  { set_code() }
  59.                 'g'  { get_code() }
  60.                 '&'  { ask_int() }
  61.                 '~'  { ask_char() }
  62.                 '@'  { exit() }
  63.                 ' '  { null }
  64.  
  65.                 nb if (~/[0-9]/.match(nb)) {
  66.                     push_number((Int) nb)
  67.                 }
  68.  
  69.                 _ {
  70.                     io.println("Erreur : opcode invalide '${lines[y_cur].charAt(x_cur)}' a la ligne ${y_cur}, caractere ${x_cur}")
  71.                     io.exit(1)
  72.                 }
  73.             }
  74.  
  75.             move_pt()
  76.  
  77.             if ((x_cur + 1) * (y_cur + 1) > lines.length * 80)
  78.                 break
  79.         }
  80.  
  81.         io.println("\n")
  82.  
  83.         io.print("Pile finale : ")
  84.         io.println(values)
  85.  
  86.         io.print("Position du pointeur : ")
  87.         io.println("ligne ${y_cur}, caractere ${x_cur}")
  88.     }
  89.  
  90.     move_pt() {
  91.         match dir {
  92.             Direction.Right { x_cur++}
  93.             Direction.Left  { x_cur-- }
  94.             Direction.Up    { y_cur-- }
  95.             Direction.Down  { y_cur++ }
  96.         }
  97.  
  98.         if (x_cur < 0)
  99.             x_cur = 79
  100.  
  101.         if (y_cur < 0)
  102.             y_cur = 24
  103.  
  104.         if (x_cur >= 80)
  105.             x_cur = 0
  106.  
  107.         if (y_cur >= 25)
  108.             y_cur = 0
  109.     }
  110.  
  111.     Int pop() {
  112.         if (values.length == 0)
  113.             return 0
  114.  
  115.         return values.pop()
  116.     }
  117.  
  118.     push_number(Int nb) {
  119.         values.push(nb)
  120.     }
  121.  
  122.     # +
  123.     add() {
  124.         b = pop()
  125.         a = pop()
  126.         values.push(a + b)
  127.     }
  128.  
  129.     # -
  130.     sub() {
  131.         b = pop()
  132.         a = pop()
  133.         values.push(a - b)
  134.     }
  135.  
  136.     # *
  137.     mul() {
  138.         b = pop()
  139.         a = pop()
  140.         values.push(a * b)
  141.     }
  142.  
  143.     # /
  144.     div() {
  145.         b = pop()
  146.         a = pop()
  147.         values.push(Math.floor(a / b))
  148.     }
  149.  
  150.     # %
  151.     mod() {
  152.         b = pop()
  153.         a = pop()
  154.         values.push(a % b)
  155.     }
  156.  
  157.     # !
  158.     not() {
  159.         a = pop()
  160.         values.push(a == 0 ? 1 : 0)
  161.     }
  162.  
  163.     # `
  164.     greater() {
  165.         b = pop()
  166.         a = pop()
  167.         values.push(b > a ? 1 : 0)
  168.     }
  169.  
  170.     # >
  171.     move_right() {
  172.         dir = Direction.Right
  173.     }
  174.  
  175.     # <
  176.     move_left() {
  177.         dir = Direction.Left
  178.     }
  179.  
  180.     # ^
  181.     move_up() {
  182.         dir = Direction.Up
  183.     }
  184.  
  185.     # v
  186.     move_down() {
  187.         dir = Direction.Down
  188.     }
  189.  
  190.     # ?
  191.     move_random() {
  192.         dir = Direction.random()
  193.     }
  194.  
  195.     # _
  196.     pop_horizontal() {
  197.         a = pop()
  198.         dir = if a == 0 { Direction.Right } else { Direction.Left }
  199.     }
  200.  
  201.     # |
  202.     pop_vertical() {
  203.         a = pop()
  204.         dir = if a == 0 { Direction.Down } else { Direction.Up }
  205.     }
  206.  
  207.     # "..."
  208.     string() {
  209.         while (move_pt() && lines[y_cur].charAt(x_cur) != '\"')
  210.             values.push(lines[y_cur].charCodeAt(x_cur))
  211.     }
  212.  
  213.     # :
  214.     dup() {
  215.         a = pop()
  216.         values.push(a)
  217.         values.push(a)
  218.     }
  219.  
  220.     # \
  221.     swap() {
  222.         b = pop()
  223.         a = pop()
  224.         values.push(b)
  225.         values.push(a)
  226.     }
  227.  
  228.     # $
  229.     jmp() {
  230.         pop()
  231.     }
  232.  
  233.     # .
  234.     display_int() {
  235.         a = pop()
  236.         io.print(a)
  237.     }
  238.  
  239.     # ,
  240.     display_char() {
  241.         a = pop().toChar()
  242.         io.print(a)
  243.     }
  244.  
  245.     # #
  246.     trampoline() {
  247.         move_pt()
  248.     }
  249.  
  250.     # p
  251.     set_code() {
  252.         io.println(values)
  253.  
  254.         y = pop()
  255.         x = pop()
  256.         v = pop()
  257.  
  258.         before = lines[y_cur].substr(0, x_cur)
  259.         after  = lines[y_cur].substr(x_cur + 1)
  260.  
  261.         lines[y_cur] = before + lines[y].charAt(x) + after
  262.     }
  263.  
  264.     # g
  265.     get_code() {
  266.         y = pop()
  267.         x = pop()
  268.         values.push(lines[y].charCodeAt(x))
  269.     }
  270.  
  271.     # &
  272.     ask_int() {
  273.         io.println(values)
  274.  
  275.         a = (Int) io.stdin().readLine()
  276.  
  277.         values.push(a)
  278.     }
  279.  
  280.     # ~
  281.     ask_char() {
  282.         a = io.stdin().readByte()
  283.  
  284.         values.push(a)
  285.     }
  286.  
  287.     # @
  288.     exit() {
  289.         io.exit(0)
  290.     }
  291.  
  292.     public static main() {
  293.         new Befunge()
  294.     }
  295. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement