Human Resource Code
Human Resource Code is an esolang based off a game called Human Resource Machine. The only commands used are those from the game as well as some extra exclusive commands. Human Resource Code is also meant to somewhat look like the code seen when attempting to paste Human Resource Machine code into notepad. This esolang was created by User:EthanPixelate.
Introduction
Like Human Resource Machine, Human Resource Code has 5 main parts to it:
- Code (Obviously)
- The "Worker"
- The "Inbox"
- The "Outbox"
- The "Carpet"
The code instructs the worker on how to take boxes from the inbox, alter them with assistance of the carpet, and outputs the result into the outbox. boxes taken from the inbox can be an integer within the range (-999,999), or a single ASCII character. To do any useful computations with these inputs, you are going to need somewhere to store the data for modification, thats where the carpet comes into play. The carpet has 128 cells all containing boxes with 0 in them, normally in Human Resource Machine all levels would have a small select number of cells with nothing in them, but to make things easier, all 128 cells in this language contain 0.
Commands
Basic IO
Human Resource Code has 4 simple input/output related commands
ASK
The "ASK" command asks the user for the input of a single integer and pushes it onto the farther side of the inbox conveyor.
ASKSTRING
The "ASKSTRING" command asks the user for their input like the above command, this time however they can input some text. For every character in the imputed string, the corresponding ASCII number is pushed onto the far side of the inbox conveyor, ending with a 0 to mark the end of the input.
INBOX
The "INBOX" command removes the box on the closer end of the inbox conveyor and gives it to the worker.
OUTBOX
The "OUTBOX" command removes the box from the worker's hands and pushes it onto the closer end of the outbox conveyor. If the box being sent to the outbox is a number, it will be followed by a space " ".
Carpet Manipulation
COPYTO <Cell>
The "COPYTO" command copies the box in the worker's hands and places the cloned box into the described position on the carpet.
Example: INBOX COPYTO 4
COPYFROM <Cell>
Likewise, the "COPYFROM" command copies a box from the described position on the carpet and gives it to the worker, causing the worker to discard any previously held box.
ADD <Cell>
Assuming that the currently held box is A and that a copy of the box on the described carped position is B, the worker discards the held box and replaces it with A+B, does not work with letter boxes.
SUB <Cell>
The "SUB" command is identical to the "ADD" command. However, instead of doing A+B, it does A-B. Note: Neither the ADD or SUB command will work on character boxes unlike Human Resource Machine
BUMPUP <Cell>
The "BUMPUP" command increments the described box on the carpet by 1.
BUMPDN <Cell>
The "BUMPDN" command decrements the described box on the carpet by 1.
Note: In Human Resource Machine, the BUMPUP and BUMPDN copies the incremented/decremented to your hands, Human Resource Code does not.
Math Example: BUMPUP 0 BUMPUP 0 BUMBUP 1 COPYFROM 0 ADD 1 OUTBOX Output: 3
Misc.
STOP
The "STOP" command simply halts execution of the program, immediately outputting the outboxed result.
TOCHAR
The "TOCHAR" command converts whatever number is in the worker's hand and converts it into an ASCII character with the number being the id of the character.
TONUM
The "TONUM" command takes the character in the worker's hands and converts it into a number, with the value being the ASCII code of the previously held character.
COMMENT or ;
This is not really a command, rather it is a comment, and will do nothing
Jumping and Controlled Flow
Jumps are a special type of command, because you first require creating some points for the jumps to go to first. To create a jump-point for your code, you simply suffix a line with a ":":
A: BLAHBLAHBLAH B: YADDAYADDAYADDA HelloThere: HELLOFRIENDS IfCellIsSomething: DOTHIS DOTHAT
Note: There must not be any white space characters in the name of the jump-point to work.
JUMP <Jump Point Name>
The "JUMP" command is a simple command that causes code execution to jump to the specified jump-point.
JUMPZ <Jump Point Name>
The "JUMPZ" command is identical to the "JUMP" command. However, the jump only occurs if the worker is holding the number 0 in their hands.
JUMPN <Jump Point Name>
The "JUMPN" command is identical to the "JUMP" command. However, the jump only occurs if the worker is holding any negative number in their hands.
JUMPC <Jump Point Name>
The "JUMPC" command is identical to the "JUMP" command. However, the jump only occurs if the worker is holding a character in their hands.
Jumping Example, this example takes the first item the inbox (assuming it is a number) and decrements it until it is 0 and outboxes it: INBOX COPYTO 0 Loop: BUMPDN 0 COPYFROM 0 JUMPZ IsZero JUMP LOOP IsZero: OUTBOX
Trying HRC
Example Programs
Truth Machine
ASK INBOX JUMPZ IsZero JUMP IsNotZero IsZero: COPYFROM 1 OUTBOX STOP IsNotZero: BUMPUP 1 Loop: COPYFROM 1 OUTBOX BUMPUP 2 JUMP Loop
Cat Program:
ASKSTRING Main: INBOX JUMPZ IfEndOfStr TOCHAR OUTBOX JUMP Main IfEndOfStr: STOP
Hello World
COPYFROM ASCII_UPPER_A COPYTO 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM ASCII_LOWER_A COPYTO 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM 0 TOCHAR OUTBOX BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM ASCII_SPACE TOCHAR OUTBOX COPYFROM ASCII_UPPER_A COPYTO 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM ASCII_LOWER_A COPYTO 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX BUMPDN 0 BUMPDN 0 BUMPDN 0 BUMPDN 0 BUMPDN 0 BUMPDN 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM ASCII_LOWER_A COPYTO 0 BUMPUP 0 BUMPUP 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX COPYFROM ASCII_SPACE COPYTO 0 BUMPUP 0 COPYFROM 0 TOCHAR OUTBOX
Interpereters
Obviously, if you want to actually use Human Resource Code, you need an interpereter. This section of the wiki lists some interpreters to be used for executing HRC Code.
Lua
HRC Interpereter written in Lua:
-- basic HRC interpereter created by Ethan Pixelate
-- when "require"ing the module, set "m.InputCallback" to a function that determines what happens when the users input is required, the first parameter is the message asking for the input, the returned result should be the users input (duh)
local m = {}
function m.InputCallback(Msg)end
local function StringToLines(s)
local t = {}
for chunk in string.gmatch(s.." ", "[^\n]+") do
local Thing = string.sub(chunk,1)
if string.sub(Thing,-1) == "\n" then
Thing = string.sub(Thing,1,-2)
end
t[#t+1] = Thing --must string.sub it so that he \n isn't included
end
return t
end
function ParseLines(Lines)
local Final = {}
Final.JumpPoints = {}
local Item = {}
for k,v in pairs(Lines) do
for Param in v:gmatch("%S+") do
if tonumber(Param) then
table.insert(Item,tonumber(Param))
else
table.insert(Item,Param)
end
end
if string.sub(v,-1) == ":" then
Final.JumpPoints[string.sub(v,1,-2)] = k
end
table.insert(Final,Item)
Item = {}
end
return Final
end
function m.Run(c)
if c == "" then
error("Did you forget to write code?")
end
local Lines = StringToLines(c)
local Code = ParseLines(Lines)
local Line = 1
local Final = ""
local Carpet = {}
Carpet.ASCII_ZERO = 48
Carpet.ASCII_UPPER_A = 65
Carpet.ASCII_LOWER_A = 97
Carpet.ASCII_SPACE = 32
local Inbox = {}
local Holding
for i=0,127,1 do
Carpet[i] = 0
end
local function HRCError(Msg)
print("Output Before Failure: "..Final)
error(Msg)
end
local function HoldingCheck()
if Holding == nil then
HRCError("Cannot operate because there are nothing in your hands.")
end
end
local function CarpetLimit(CellNum)
if type(CellNum) == "number" then
if CellNum < 0 then
HRCError("There is no cell with id "..tostring(CellNum)..", keep it at 0 or above.")
end
if CellNum > 127 then
HRCError("There is no cell with id "..tostring(CellNum)..", keep it at 127 or bellow.")
end
if Carpet[CellNum] < -999 then
HRCError("A box cannot have a value lower than -999, the limit is -999 to 999.")
end
if Carpet[CellNum] > 999 then
HRCError("A box cannot have a value higher than 999, the limit is -999 to 999.")
end
end
end
local function JumpCheck(JumpName)
if not Code.JumpPoints[JumpName] then
HRCError("No such jump \""..JumpName.."\" exists.")
end
end
while true do
local Param = Code[Line][2] -- shorthand used in carpet related operations
if Code[Line][1] == "STOP" then
break
elseif Code[Line][1] == "JUMP" then
JumpCheck(Param)
Line = Code.JumpPoints[Param]
elseif Code[Line][1] == "JUMPZ" then
JumpCheck(Param)
if Holding == 0 then
Line = Code.JumpPoints[Param]
end
elseif Code[Line][1] == "JUMPN" then
JumpCheck(Param)
if math.abs(Holding) ~= Holding then
Line = Code.JumpPoints[Param]
end
elseif Code[Line][1] == "JUMPC" then
if type(Holding) == "string" then
Line = Code.JumpPoints[Param]
end
elseif Code[Line][1] == "COPYFROM" then
CarpetLimit(Param)
Holding = Carpet[Param]
elseif Code[Line][1] == "COPYTO" then
CarpetLimit(Param)
HoldingCheck()
Carpet[Param] = Holding
elseif Code[Line][1] == "ADD" then
HoldingCheck()
CarpetLimit(Param)
Holding = Holding + Carpet[Param]
elseif Code[Line][1] == "SUB" then
HoldingCheck()
CarpetLimit(Param)
Holding = Holding - Carpet[Param]
elseif Code[Line][1] == "BUMPUP" then
CarpetLimit(Param)
Carpet[Param] = Carpet[Param] + 1
elseif Code[Line][1] == "BUMPDN" then
CarpetLimit(Param)
Carpet[Param] = Carpet[Param] - 1
elseif Code[Line][1] == "TONUM" then
HoldingCheck()
Holding = string.byte(Holding)
elseif Code[Line][1] == "TOCHAR" then
HoldingCheck()
Holding = string.char(Holding)
elseif Code[Line][1] == "OUTBOX" then
HoldingCheck()
if type(Holding) == "number" then
Final = Final .. tostring(Holding) .. " "
else
Final = Final .. Holding
end
Holding = nil
elseif Code[Line][1] == "INBOX" then
if #Inbox < 1 then
HRCError("Cannot take from inbox if inbox stack is empty.")
end
local Item = Inbox[1]
table.remove(Inbox,1)
Holding = Item
elseif Code[Line][1] == "ASKSTRING" then
local Receive = m.InputCallback("Input something")
for i=1,#Receive,1 do
table.insert(Inbox,string.byte(string.sub(Receive,i,i)))
end
table.insert(Inbox,0)
elseif Code[Line][1] == "ASK" then
local Receive
while not tonumber(Receive) do
Receive = m.InputCallback("Input a number")
if not tonumber(Receive) then
print("You must input a number")
end
end
table.insert(Inbox,tonumber(Receive))
else
if not Code[Line][1] == "COMMENT" or Code[Line][1] == ";" then
HRCError("Unknown Command: "..Code[Line][1])
end
end
Line = Line + 1
if Line > #Code then
break
end
end
print("Output: "..Final)
end
return m