Talk:Minifuck-2D
I think there is a problem with the cat. The input and output are done with '..
', but since '.
' means "Move to next bit and invert it, output next 8 bits if at least one of them is non-zero, else input.", the second '.
' will not affect the same 8 bits. For instance if the first input is char '2' (00110010), then the output will be 'D' (01100100). --Koen (talk) 12:42, 18 September 2012 (UTC)
Possible Interpreter
I think there is still a problem. Now, because .
flips the bit, the second .
affects the number by printing it out. For example, if the first input is char '2' (00110010), the output will be '²' (10110010). However, it is possible that this is intentional behavior, and if so, I don't know what to make of it. Squidmanescape (talk) 06:59, 30 April 2023 (UTC)
I wrote a possible interpreter which follows my understanding of the rules laid down. I think this interpreter follows the rules detailed, though the effects of the rules mean the cat program doesn't actually work as written.
def run_minif_2D(code_string, file_name=False): # This is the code itself. code = [] # This is the memory memory = [0] * 8 # You can use text files. if file_name: for line in open(code_string, 'r'): code.append(line.rstrip('\n')) else: code = code_string.split('\n') # This makes sure you can still go down # when one line is shorter than all the rest max_line = max([len(line) for line in code]) # This indicates the next instruction in the code. pointer = (0, 0) # This indicates the current memory location. cell = 0 # The direction is equal to direction * 90 degrees counterclockwise from right. direction = 0 while -1 < pointer[0] < len(code) and -1 < pointer[1] < max_line: row = pointer[0] column = pointer[1] step_number = 1 if column < len(code[row]) and code[row][column] in '<.!@': instruction = code[row][column] if instruction == '<' and cell != 0: cell -= 1 elif instruction == '@': direction = (direction + 1) % 4 elif instruction in ('.', '!'): # makes sure there are always 8 zeroes to query if cell + 8 == len(memory): memory.append(0) cell += 1 memory[cell] ^= 1 if instruction == '.': # 8 cells are always available out = memory[cell:cell+8] out_num = sum(2 ** (7 - power) for power, digit in enumerate(out) if digit == 1) if out_num == 0: in_str = input("Input ASCII value between 0 and 255, inclusive:") if in_str == '': in_num = 0 else: in_num = ord(in_str[0]) while not 0 <= in_num <= 255: in_str = input("Input ASCII value between 0 and 255, inclusive:") if in_str == '': in_num = 0 else: in_num = ord(in_str[0]) for power in range(7, -1, -1): memory[cell+7-power] = in_num // 2 ** power in_num %= 2 ** power else: print(chr(out_num)) elif instruction == '!' and memory[cell] == 0: step_number = 2 for _ in range(step_number): if direction == 0: pointer = (row, column + 1) elif direction == 1: pointer = (row + 1, column) elif direction == 2: pointer = (row, column - 1) else: # direction == 3 pointer = (row - 1, column) row = pointer[0] column = pointer[1] return memory
One cat program that works is:
!<!@!<.<! <.! ! ! @ @ ! ! ! ! ! @