Lua, 8888 84 bytes
Improved version (-4 bytes thanks to QuertyKeyboard)
s=""g=s.gsub g(...,".",function(c)s=g(g(g(s,"\\"," "),"/?$",c)," /","/")print(s)end)
Original version (88 bytes)
Another attempt in Lua, this time with a completely different approach using string manipulation instead of a counter variable.
s=""for c in(...):gmatch"."do s=s:gsub("\\"," "):gsub("/?$",c):gsub(" /","/")print(s)end
Ungolfed:
s = ""
for c in string.gmatch((...), ".") do --for each character in the input
--s contains the output from the previous iteration
s = s:gsub("\\\\", " ") --Replace backslash with space -> indent by 1
s = s:gsub("/?$", c) --Remove any / at the end of the string and append c to the string
s = s:gsub(" /", "/") --Remove a single space in front of any / -> un-indent by 1
print(s)
end
There's one interesting thing in the code: (...):gmatch"."
This uses some quirks in the Lua parser. When Lua encounters a piece of code in the form func "string"
, it'll convert this to func("string")
. This is so that one can write print "string"
to print a constant string and it only works with a single string literal after the function. Anything else will give a syntax error. However, this syntactic sugar also works with function calls in the middle of an expression, and more surprising, it works just fine together with the :
method call syntactic sugar. So in the end, Lua will interpret the code like this:
(...):gmatch"."
-> (...):gmatch(".")
-> string.gmatch((...), ".")
If anyone can think of a way to remove one of the three gsub calls, please tell me.If anyone can think of a way to remove one of the three gsub calls, please tell me.