creative, а вы можете привести пример рассуждений при решении какой-нибудь задачи, где вы видите, что решаете слишком долго? Может, станет понятно, что не так.
Решил я тоже написать интерпретатор brainfuck'a. Хронология:
* Час кодирования.
* В первой половине второго часа, проверка и отладка на простых случаях типа:
Код:
+++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++.+++++++++++++++++
++++++++++++.+++++++..+++.-------------------
---------------------------------------------
---------------.+++++++++++++++++++++++++++++
++++++++++++++++++++++++++.++++++++++++++++++
++++++.+++.------.--------.------------------
---------------------------------------------
----.-----------------------.
* Во второй половине второго часа простые случаи со скобками [] работали
* Прошло два часа, код заработал на примере:
Код:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.
* В течении третьего, четвёртого часов упорно пытался понять через отладчик, почему не работает следующий код:
Код:
>>>>>++++++++[<+++++++++>-]<+[>>[>]+[<]<-]>++++++++++[<+++++
+++++>-]<[>>[+>]<[<]<-]<++++++++[>++++++++[>>->->->>>>>>>>>>
>->>>->>>>>>->->->->>->>>->>>>->>>>>->->>>>>>->>>>->>>>>->->
>>>>->>>->>>>>>>->-[<]<-]>>++>++>->>+>++>++>+>>>>++>>->+>>->
>>>++>>+>+>+>--->>->+>+>->++>>>->++>>+>+>+>--->>-->>+>>->+>+
>>->>+>++>+>+>->+>>++>++>->>++>->>++>+>++>+>>+>---[<]<<-]>>>
++++>++++>+++>--->++>->->->>[-]>->-->[-]>+++>++>+>+++>--->>>
--->[-]>+>+>+>--->[-]>+++>++>+>+++>->+++>>+++>++>---->->->+>
--->[-]>->---->-->>+++>++>+>>+++>->++>++>+>->+++>+++>---->--
>-->+++>++++>->+++>---->--->++>>+>->->---[[<]<]+++++++++[<+<
+++++++++++>>-]<<[>>>>>[<]>[.>]>--[>.>]<[<<]>++>>>[.>]>[>]>[
.>]<[[<]<]>>[.>]>--[>.>]<[<<]>++>>>[.>]>[.>]>[>]>[.>]<[[<]<]
<<[<]>>>+<[>-]>[>]<[+++++++++[<+<->>>>>+<<<-]+<<[>>-]>>>[<]<
<<++++++++++>>[>>[-]+<<-]>>-<<]>>>-[>]>-<<[<]>[.>]>--[>.>]<[
<<]>++>>>[.>]>[>]>[.>]<.[[<]<]<<[<]>>-<-]
* в конце четвёртого часа окончательно понял, что написанный код слишком не надёжен и просто удалил его полностью
* с конца четвёртого часа и весь пятый час полностью писал и отлаживал следующий код, на этот раз ошибок почти не было, через несколько попыток код заработал корректно (серил с выводом готового интерпретатора)
Итого: четыре часа проб и ошибок над кривым кодом в отладчике и осознание того как правильней решать эту задачу и ещё час на получение правильного решения.
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 4096
unsigned char *mem;
int mpt;
void scope(unsigned char *tape)
{
int n, c;
int tpt = 0;
while (tape[tpt]) {
switch (tape[tpt]) {
case '<':
mpt--; //case '<'
tpt++;
break;
case '>':
mpt++; //case '>'
tpt++;
break;
case '+':
mem[mpt]++; //case '+'
tpt++;
break;
case '-':
mem[mpt]--; //case '-'
tpt++;
break;
case '.':
printf("%c", mem[mpt]); //case '.'
tpt++;
break;
case ',':
scanf("%c", &mem[mpt]); //case ','
tpt++;
break;
case '[':
c = 1; //case '['
n = ++tpt;
while (c) {
if (tape[n] == ']') c--;
if (tape[n] == '[') c++;
n++;
}
if (mem[mpt]) {
scope(&tape[tpt]);
}
tpt = n;
break;
case ']':
if (mem[mpt] == 0) return; //case ']'
tpt = 0;
break;
}
}
}
int main()
{
unsigned char *tape;
int tpt;
unsigned char ch;
int ret;
mem = calloc(MAX_SIZE, 1);
tape = calloc(MAX_SIZE, 1);
tpt = 0;
do {
ret = scanf("%c", &ch);
if (ch == '<' || ch == '>' || ch == '+' || ch == '-'
|| ch == '.' || ch == ',' || ch == '[' || ch == ']') {
tape[tpt++] = ch;
}
} while (ret > 0);
scope(tape);
//printf("\n");
return 0;
}
Вопрос: Нужно пытаться сразу написать правильный код? Если да, то обычно я так не могу, в голове всё расплывается. Если нет, то после долгих проб и ошибок над кривым кодом, я его удаляю и пишу работающий код, так как в процессе проб и ошибок я уже начинаю представлять как оно должно работать. Но если так, то это очень и очень долго. Каким образом Вам удаётся всё сразу удержать в голове и за 10-20 минут написать такой же рабочий код?
P.S. Кстати
классный пример на brainfuck, он у меня в интерпретаторе тоже заработал :)