Odpověď na názor

Odpovídáte na názor k článku Kouzlo minimalismu potřetí: vývoj her a dem pro osmibitová Atari. Názory mohou přidávat pouze registrovaní uživatelé. Nově přidané názory se na webu objeví až po schválení redakcí.

  • 6. 3. 2026 22:50

    forth

    Existuje takova pekna uloha z rossetacode co zjistuje zda dany retezec je pangram a nebo neni. Tzn. zda obsahuje vsechny pismena abecedy.

    Je to jednoducha uloha, ale uz pocet osob se nevleze do jedineho auta.

    #include <stdio.h>
    
    int is_pangram(const char *s)
    {
        const char *alpha = ""
            "abcdefghjiklmnopqrstuvwxyz"
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
        char ch, wasused[26] = {0};
        int total = 0;
    
        while ((ch = *s++) != '\0') {
            const char *p;
            int idx;
    
            if ((p = strchr(alpha, ch)) == NULL)
                continue;
    
            idx = (p - alpha) % 26;
    
            total += !wasused[idx];
            wasused[idx] = 1;
            if (total == 26)
                return 1;
        }
        return 0;
    }
    
    int main(void)
    {
        int i;
        const char *tests[] = {
            "The quick brown fox jumps over the lazy dog.",
            "The qu1ck brown fox jumps over the lazy d0g."
        };
    
        for (i = 0; i < 2; i++)
            printf("\"%s\" is %sa pangram\n",
                tests[i], is_pangram(tests[i])?"":"not ");
        return 0;
    }

    ja to pojal jako benchmark tak ze udelam 32 bitove binarni pole

    #include <stdio.h>
    
    int pangram(const char * str)
    {
       str--;
       unsigned char c;
       unsigned long int alphabet = 0;
    
       while (c = *++str) {
          c |= 32; // uppercase
          c -= 'a';
          if ( c<26 ) alphabet |= (long unsigned int) 1 << c;
       }
    
       return alphabet==0x3FFFFFF;
    }
    
    int main()
    {
       char *str = "The five boxing wizards jump quickly.";
       unsigned int i;
       for (i = 10000; i > 0; i--)
          pangram(str);
    
       printf("%d\n", pangram(str));
       return 0;
    }

    podle vzoru

    : pangram? ( addr len -- ? )
      0 -rot bounds do
        i c@ 32 or [char] a -
        dup 0 26 within if
          1 swap lshift or
        else drop then
      loop
      1 26 lshift 1- = ;
    
    s" The five boxing wizards jump quickly." pangram? .   \ -1

    Tohle funguje jen pokud ma forth 32 bitove a vetsi slova.

    pseudo forth 16bit kod:

    : pangram ( addr -- ? )
      1-
      0.
      BEGIN
        ROT  1+ -ROT 2OVER NIP C@ 0 C<> WHILE 2OVER NIP C@
        32 OR [CHAR] a -
        DUP 26. WITHIN IF
          DBITSET ( d index -- d )
        ELSE DROP THEN
      REPEAT
      67108863. D= NIP ;

    A kdyz to zkompilujes z88dk nebo forthem, tak C je 6x pomalejsi.
    Docela by me zajimalo i jak si vede C prekladac pro 6502. Z80 to trvalo 2m 51.61s a ten jeho kod uplne zkolaboval a jak ten kod pro sebe rozkouskoval na male casti a ty prevadel do asm tak je to kolikrat ze neco spocita a uklada na "stack" a pak to hned zase vraci do stejnych registru a pouzije znova...