How to resolve the algorithm Subleq step by step in the Julia programming language
How to resolve the algorithm Subleq step by step in the Julia programming language
Table of Contents
Problem Statement
Subleq is an example of a One-Instruction Set Computer (OISC).
It is named after its only instruction, which is SUbtract and Branch if Less than or EQual to zero.
Your task is to create an interpreter which emulates a SUBLEQ machine.
The machine's memory consists of an array of signed integers. These integers may be interpreted in three ways:
Any reasonable word size that accommodates all three of the above uses is fine.
The program should load the initial contents of the emulated machine's memory, set the instruction pointer to the first address (which is defined to be address 0), and begin emulating the machine, which works as follows:
Your solution may initialize the emulated machine's memory in any convenient manner, but if you accept it as input, it should be a separate input stream from the one fed to the emulated machine once it is running. And if fed as text input, it should be in the form of raw subleq "machine code" - whitespace-separated decimal numbers, with no symbolic names or other assembly-level extensions, to be loaded into memory starting at address 0 (zero).
For purposes of this task, show the output of your solution when fed the below "Hello, world!" program.
As written, this example assumes ASCII or a superset of it, such as any of the Latin-N character sets or Unicode; you may translate the numbers representing characters (starting with 72=ASCII 'H') into another character set if your implementation runs in a non-ASCII-compatible environment. If 0 is not an appropriate terminator in your character set, the program logic will need some adjustment as well.
The above "machine code" corresponds to something like this in a hypothetical assembler language for a signed 8-bit version of the machine:
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Subleq step by step in the Julia programming language
The provided code implements a program that interprets a series of integers as a series of instructions for interacting with a user. The instructions are as follows:
- Negative numbers indicate that the program should read a character from the user.
- Non-negative numbers less than 15 indicate that the program should print a character to the screen.
- Non-negative numbers greater than or equal to 15 indicate that the program should subtract the value at the next instruction from the value at the current instruction, and if the result is less than or equal to 0, jump to the instruction at the address specified by the following instruction.
The program reads a string of integers from the user, which represents the instructions, and then interprets the instructions sequentially.
Here is a detailed breakdown of the code:
-
The
Subleq
module is defined. -
The
OffsetArrays
module is used to create an offset array from the input vector of integers. This allows the program to access the elements of the vector using negative indices, which is necessary for implementing the jump instructions. -
The
interpret
function is defined. This function takes an input vector of integers as its argument and interprets the instructions sequentially. -
The
ip
variable is used to keep track of the current instruction being interpreted. -
The
while true
loop is used to interpret the instructions sequentially. -
The
a
,b
, andc
variables are used to store the values of the current instruction and the next two instructions. -
The
if a < 0
statement checks if the current instruction is a negative number, indicating that the program should read a character from the user. -
The
print("Enter a character: ")
statement prompts the user to enter a character. -
The
words[b] = parse(Int, readline(stdin))
statement reads a character from the user and stores it in the vector at the address specified by the second instruction. -
The
elseif b < 0
statement checks if the current instruction is a non-negative number less than 15, indicating that the program should print a character to the screen. -
The
print(buf, Char(words[a]))
statement prints the character stored at the address specified by the first instruction to the screen. -
The
else
statement checks if the current instruction is a non-negative number greater than or equal to 15, indicating that the program should jump to the instruction at the address specified by the following instruction. -
The
words[b] -= words[a]
statement subtracts the value at the next instruction from the value at the current instruction. -
The
if words[b] ≤ 0
statement checks if the result of the subtraction is less than or equal to 0. -
If the result is less than or equal to 0, the
ip = c
statement sets theip
variable to the address specified by the following instruction. -
The
ip < 0
statement checks if theip
variable is less than 0. If theip
variable is less than 0, the program has reached the end of the instructions and thewhile true
loop terminates. -
The
return String(take!(buf))
statement returns the string that has been printed to the screen. -
The
interpret(src::AbstractString)
function is defined. This function takes a string as its argument and interprets the string as a series of integers. The function then calls theinterpret
function with the resulting vector of integers. -
The
using .Subleq
statement imports theSubleq
module into the current namespace. -
The
print(Subleq.interpret("15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1 72 101 108 108 111 44 32 119 111 114 108 100 33 10 0"))
statement interprets the given string of integers and prints the resulting string to the screen.
Source code in the julia programming language
module Subleq
using OffsetArrays
function interpret(allwords::AbstractVector{Int})
words = OffsetArray(allwords, -1)
buf = IOBuffer()
ip = 0
while true
a, b, c = words[ip:ip+2]
ip += 3
if a < 0
print("Enter a character: ")
words[b] = parse(Int, readline(stdin))
elseif b < 0
print(buf, Char(words[a]))
else
words[b] -= words[a]
if words[b] ≤ 0
ip = c
end
ip < 0 && break
end
end
return String(take!(buf))
end
interpret(src::AbstractString) = interpret(parse.(Int, split(src)))
end # module Subleq
using .Subleq
print(Subleq.interpret("15 17 -1 17 -1 -1 16 1 -1 16 3 -1 15 15 0 0 -1 72 101
108 108 111 44 32 119 111 114 108 100 33 10 0"))
You may also check:How to resolve the algorithm General FizzBuzz step by step in the J programming language
You may also check:How to resolve the algorithm Monte Carlo methods step by step in the Tcl programming language
You may also check:How to resolve the algorithm Shell one-liner step by step in the ooRexx programming language
You may also check:How to resolve the algorithm Program termination step by step in the D programming language
You may also check:How to resolve the algorithm Empty string step by step in the TorqueScript programming language