Nano Hash - криптовалюты, майнинг, программирование

Проблема с петлей интерпретатора Brainfuck

Я сейчас трахаюсь с мозгами и столкнулся с проблемой с петлями.

Я последовал совету из этого, но мне кажется, чтобы заставить его работать.

Вот мой код:

<html>
<body>
<font face="consolas">
<script>
var brPos = 0;
var k = 0;
var loop = [];
var printtape = "";
var out = "";
var i = 0;
var pointer = 0;
var tape = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var source = prompt("Code").split("");
while (i<source.length+1){
    if (source[i] == "<"){
        pointer--;
    } else if (source[i] == ">"){
        pointer++;
    } else if (source[i] == "+"){
        tape[pointer]++;
    } else if (source[i] == "-"){
        tape[pointer]--;
    } else if (source[i] == ","){
        tape[pointer] = prompt("Input").charCodeAt(0);
    } else if (source[i] == "."){
        out += String.fromCharCode(tape[pointer]);
    } else if (source[i] == "["){
        loop.push(pointer);
        if (tape[pointer] == 0){
            brPos = i;
            while (k >= 0) {
                if (source[brPos] == "[") {
                    k++;
                } else if (source[brPos] == "]") {
                    k--;
                }
            }
            i = brPos;
            brPos = 0;
            loop.pop();
        }
    } else if (source[i] == "]"){
        i=loop[loop.length-1];
    }
    i++;
    for (j=0;j<tape.length;j++) {
        if (tape[j] > 255) {
            tape[j] = 0;
        } else if (tape[j] < 0) {
            tape[j] = 255;
        }
    }
    console.log(tape);
    console.log(loop);
}
printtape = "";
printtape += "|";
for (i=0;i<tape.length;i++) {
    if (tape[i]<10) {
        printtape += "00"+tape[i]+"|";
    }
    if (tape[i]>=10&&tape[i]<100) {
        printtape += "0"+tape[i]+"|";
    }
    if (tape[i]>=100) {
        printtape += tape[i]+"|";
    }
}
printtape += "<br>";
printtape += "  ";
for (i=0;i<pointer;i++) {
    printtape += "    ";
}
printtape += "^";
document.write(printtape);
alert(out);
</script>
</font>
</body>
</html>

Это оскорбительный код (я думаю):

} else if (source[i] == "["){
    loop.push(pointer);
    if (tape[pointer] == 0){
        brPos = i;
        while (k >= 0) {
            if (source[brPos] == "[") {
                k++;
            } else if (source[brPos] == "]") {
                k--;
            }
        }
        i = brPos;
        brPos = 0;
        loop.pop();
    }
} else if (source[i] == "]"){
    i=loop[loop.length-1];
}

Когда я запускаю код (в IE) с циклом brainf * ck, он не завершает цикл while и в конечном итоге дает сбой, и я не знаю почему.

P.S. Я знаю, что кто-то в комментариях скажет, что тег <font> является недопустимым HTML, и я должен использовать CSS, но он работает, он быстрее, чем CSS, и мне все равно.


  • В чем проблема (к тому же не работает)? 06.12.2016
  • Он работает вечно и, похоже, не завершает цикл while. 06.12.2016

Ответы:


1

Я ничего не знаю о синтаксическом анализе Brainfuck, но логика кода не работает, и вы получаете бесконечный цикл, потому что brPos является константой внутри цикла. Вы делаете одно и то же сравнение и снова и снова возвращаетесь к строке k++. brPos нужно изменить, если ты когда-нибудь захочешь уйти оттуда.

06.12.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..