--- id: 5a23c84252665b21eecc8038 title: Subleq challengeType: 5 forumTopicId: 302328 dashedName: subleq --- # --description-- [Subleq](https://rosettacode.org/wiki/eso:Subleq) — приклад a [One-Instruction Set Computer (OISC) (Комп'ютер із набором однієї інструкції)](https://en.wikipedia.org/wiki/One_instruction_set_computer). Назва пішла від перших літер інструкції: **SU**btract і **B**ranch if **L**ess than or **EQ**ual to zero (відняти й перейти, якщо результат менший або рівний нулю). Ваше завдання — створити дешифрувальник, який змоделює принцип дії такої машини. Пам'ять машини складається з масиву цілих чисел зі знаком. Підійде будь-який допустимий розмір слова, але пам'ять повинна підтримувати від'ємні та додатні числа. Виконання починається з лічильника команд, спрямованого на перше слово, яке є адресою 0. Це відбувається наступним чином:
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Що відповідає чомусь схожому на це у гіпотетичній мові асемблера:
start: zero, message, -1 message, -1, -1 neg1, start+1, -1 neg1, start+3, -1 zero, zero, start zero: 0 neg1: -1 message: "Hello, world!\n\0"# --instructions-- Напишіть функцію, що використовує набір цілих чисел як параметр. Це відображає елементи пам'яті. Функція повинна інтерпретувати послідовність та виводити вихідний рядок. Для цього завдання припустимо, що стандартного вводу немає. # --hints-- `Subleq` має бути функцією. ```js assert(typeof Subleq == 'function'); ``` `Subleq([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, 0])` має виводити рядок. ```js assert( typeof Subleq([ 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, 0 ]) == 'string' ); ``` `Subleq([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, 0])` має відображати `"Hello, world!"`. ```js assert.equal( Subleq([ 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, 0 ]), 'Hello, world!' ); ``` # --seed-- ## --seed-contents-- ```js function Subleq(mem) { } ``` # --solutions-- ```js function Subleq(mem) { var out = ''; var instructionPointer = 0; do { var a = mem[instructionPointer]; var b = mem[instructionPointer + 1]; if (a === -1) { } else if (b === -1) { out += String.fromCharCode(mem[a]); } else { mem[b] -= mem[a]; if (mem[b] < 1) { instructionPointer = mem[instructionPointer + 2]; continue; } } instructionPointer += 3; } while (instructionPointer >= 0); return out; } ```