Vlákno názorů k článku Co je to nenaprogramovatelné? od xbrut - tak sem se pokusil ten program pro TS...

  • Článek je starý, nové názory již nelze přidávat.
  • 26. 11. 2003 15:45

    xbrut (neregistrovaný)

    tak sem se pokusil ten program pro TS simulovat. tady je zdroj:



    #include <stdio.h>


    const int max_cycles = 65536 * 32767;
    const int dotafter = max_cycles / 256;

    const int tape_min = -32768 * 16;
    const int tape_max = +32767 * 16;

    int tape[-tape_min + tape_max + 1];
    int pos = 0;
    int state = 1;
    int minpos = 0;
    int maxpos = 0;

    int getval() {
    return tape[pos - tape_min];
    }

    void setval(int val) {
    tape[pos - tape_min] = val;
    }

    bool terminate = false;

    void goleft() {
    if(pos>tape_min) {
    pos--;
    if(pos<minpos) minpos = pos;
    } else {
    printf("left -> out of range!\n");
    terminate = true;
    }
    }

    void goright() {
    if(pos<tape_max) {
    pos++;
    if(pos>maxpos) maxpos = pos;
    } else {
    printf("goright() -> out of range!\n");
    terminate = true;
    }
    }

    int main(void) {
    printf("br0\n");
    for(int i = tape_min; i <= tape_max; i++) {
    tape[i - tape_min] = 0;
    }
    bool terminate = false;
    printf("br1\n");
    int c = max_cycles;
    printf("br2\n");
    do {
    switch(getval()) {
    case 0:
    switch(state) {
    case 1:
    state = 2;
    setval(1);
    goright();
    break;
    case 2:
    state = 3;
    setval(0);
    goright();
    break;
    case 3:
    state = 4;
    setval(1);
    goleft();
    break;
    case 4:
    state = 5;
    setval(0);
    goleft();
    break;
    case 5:
    state = 1;
    setval(0);
    goright();
    break;
    case 6:
    state = 1;
    setval(1);
    goleft();
    break;
    default:
    printf("0, 7 \n");
    terminate = true;
    }
    break;
    case 1:
    switch(state) {
    case 1:
    state = 6;
    setval(0);
    goleft();
    break;
    case 2:
    state = 4;
    setval(0);
    goright();
    break;
    case 3:
    state = 5;
    setval(1);
    goright();
    break;
    case 4:
    state = 4;
    setval(0);
    goleft();
    break;
    case 5:
    state = 3;
    setval(1);
    goright();
    break;
    case 6:
    state = 7;
    setval(1);
    goright();
    break;
    default:
    printf("1, 7 \n");
    terminate = true;
    }
    break;
    default:
    terminate = true;
    }
    c--;
    if(c % dotafter == 0) {
    printf(".");
    }
    terminate = terminate or (c <= 0 );
    } while(not terminate);
    printf(">>>>>>> %i\n", c);
    printf("minpos = %i, maxpos = %i\n\n", minpos, maxpos);
    }

    ale nedospel sem k zadnemu reseni. po ukonceni (po vynulovani pocitadla - provedlo se 65536*32767=2 147 418 112 kroku) to skoncilo ve stavu:
    minpos=-69975, maxpos=38, jelikoz testy s mensim poctem kroku skoncily min 'nalevo', predpokladam, ze jde o nekonecny cyklus...

  • 26. 11. 2003 15:52

    Ondrej Holecek (neregistrovaný)

    zase vedle, tohle neodsimulujete, na tohle vam pomuze bud velmi chytra hlave, a nebo google ;-)