5.3 KiB
id, title, challengeType, forumTopicId, dashedName
| id | title | challengeType | forumTopicId | dashedName |
|---|---|---|---|---|
| 59e0a8df964e4540d5abe599 | Brain**** ausführen | 1 | 302261 | execute-brain |
--description--
Write a function to implement a Brain**** interpreter. The function will take a string as a parameter and should return a string as the output. More details are given below:
RCBF ist eine Menge von Brainf*** Übersetzer und Interpeter, die für Rosetta Code in einer Vielzahl von Sprachen geschrieben wurde.
Unten findst du Links zu jeden Versionen von RCBF.
Eine Implementierung muss lediglich die folgenden Anweisungen ordnungsgemäß implementieren:
| Command | Beschreibung |
|---|---|
> |
Move the pointer to the right |
< |
Bewege den Zeiger nach links |
+ |
Erhöhe die Speicherzelle des Zeigers |
- |
Verringere die Speicherzelle des Zeigers |
. |
Gebe das der Zelle zugehörige Zeichen am Zeiger aus |
, |
Übergebe und speichere ein Zeichen in der Zelle des Zeigers |
[ |
Überspringe das jeweilige ], wenn Zelle des Zeigers 0 ist |
] |
Springe zum jeweiligen [ zurück, wenn Zelle des Zeigers ein nonzero ist |
Jede Zellgröße ist erlaubt, EOF-Unterstützung (End-O**File – Ende der Datei) ist optional, je nachdem, ob es eine Speicherbegrenzung gibt.
--hints--
brain(bye) sollte einen String zurückgeben
assert(typeof brain(bye) === 'string');
brain("++++++[>++++++++++<-]>+++++.") should return "A"
assert.equal(brain('++++++[>++++++++++<-]>+++++.'), 'A');
brain(bye) sollte Goodbye, World!\r\n zurückgeben
assert.equal(brain(bye), 'Goodbye, World!\r\n');
brain(hello) sollte Hello World!\n zurückgeben
assert.equal(brain(hello), 'Hello World!\n');
brain(fib) sollte 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 zurückgeben
assert.equal(brain(fib), '1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89');
--seed--
--before-user-code--
let fib=`+
++
+++
++++
+>+>>
>>++++
+++++++
++++++++
+++++++++
++++++++++
++++++>++++
++++++++++++
+++++++++++++
+++<<<<<<[>[>>
>>>>+>+<<<<<<<-
]>>>>>>>[<<<<<<<
+>>>>>>>-]<[>++++
++++++[-<-[>>+>+<<
<-]>>>[<<<+>>>-]+<[
>[-]<[-]]>[<<[>>>+<<
<-]>>[-]]<<]>>>[>>+>+
<<<-]>>>[<<<+>>>-]+<[>
[-]<[-]]>[<<+>>[-]]<<<<
<<<]>>>>>[++++++++++++++
+++++++++++++++++++++++++
+++++++++.[-]]++++++++++<[
->-<]>+++++++++++++++++++++
+++++++++++++++++++++++++++.
[-]<<<<<<<<<<<<[>>>+>+<<<<-]>
>>>[<<<<+>>>>-]<-[>>.>.<<<[-]]
<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+
>-]>[<+>-]<<<-]`;
let hello='++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.'
let bye='++++++++++[>+>+++>++++>+++++++>++++++++>+++++++++>++++++++++>+++++++++++>++++++++++++<<<<<<<<<-]>>>>+.>>>>+..<.<++++++++.>>>+.<<+.<<<<++++.<++.>>>+++++++.>>>.+++.<+++++++.--------.<<<<<+.<+++.---.';
--seed-contents--
function brain(prog) {
}
--solutions--
function brain(prog){
var output="";
var code; // formatted code
var ip = 0; // current instruction within code
var nest = 0; // current bracket nesting (for Out button)
var ahead = []; // locations of matching brackets
var data = [0]; // data array (mod by +, -)
var dp = 0; // index into data (mod by <, >)
var inp = 0; // current input character (fetch with ,)
var quit = 0;
var commands = {
'>':function() { if (++dp >= data.length) data[dp]=0 },
'<':function() { if (--dp < 0) quit++ },
'+':function() { ++data[dp] },
'-':function() { --data[dp] },
'[':function() { if (!data[dp]) ip = ahead[ip]; else ++nest },
']':function() { if ( data[dp]) ip = ahead[ip]; else --nest },
',':function() {
var c = document.getElementById("input").value.charCodeAt(inp++);
data[dp] = isNaN(c) ? 0 : c; // EOF: other options are -1 or no change
},
'.':function() {
output+=String.fromCharCode(data[dp]);
/*var s = document.getElementById("output").innerHTML)
+ String.fromCharCode(data[dp]);
s = s.replace(/\n/g,"<br>").replace(/ /g,"&nbsp;");
document.getElementById("output").innerHTML = s;*/
},
};
let ar=prog.split('');
var st = [], back, error = -1;
for (ip=0; ip<ar.length; ip++) {
switch(ar[ip]) {
case '[':
st.push(ip);
break;
case ']':
if (st.length == 0) error = ip;
back = st.pop();
ahead[ip] = back;
ahead[back] = ip;
break;
}
}
for(ip=0;ip<ar.length;ip++){
if(commands.hasOwnProperty(ar[ip]))
commands[ar[ip]]();
}
return output;
}