teste de turing

Com certeza você já ouviu falar na tal Máquina de Turing. Depois de umas aulas lá no Prandiano, vários anos atrás, escrevi um programa que faz aquela brincadeira de criança: pense em um número de 0 a 10 – e aí consigo advinhar o número.

Respostas de SIM e NÃO determinam o resultado. Tudo que você precisa é ser capaz de responder de maneira adequada.

Veja aí, pensei no número 13:

$ ./turingame
pense em um número de 1 a 31 e pressione enter...

01 03 05 07 09 11 13 15 17 19 21 23 25 27 29 31
esta número está aqui? [s/n]: s

02 03 06 07 10 11 14 15 18 19 22 23 26 27 30 31
esta número está aqui? [s/n]: n

04 05 06 07 12 13 14 15 20 21 22 23 28 29 30 31
esta número está aqui? [s/n]: s

08 09 10 11 12 13 14 15 24 25 26 27 28 29 30 31
esta número está aqui? [s/n]: s

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
esta número está aqui? [s/n]: n

o número é 13!

Legal, né. Talvez o código não seja tão legal, nem tão intuitivo. Sabe como é… mas, pra mais informações, você pode ver os detalhes da Máquina de Turing e Teste de Turing (inglês) no wikipédia, nos links abaixo:

Máquina de Turing
Turing Test

Na sequência, o código do programa. É de 2004, tem até goto. Nem adianta torcer o nariz, porque duvido que um programador nunca tenha usado coisas como goto, system() e popen() – este último usa /bin/sh -c pra executar, exatamente como o você-sabe-quem.

/*
 * para compilar:
 * cc -Wall turingame.c -o turingame -lm
 *
 * turingame.c 20040726 AF
 */

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int getlist(int i, int max_num)
{
   int j, n = pow(2, i);

   for(j = 1; j < max_num/n; j+=2) {
      int r = j * n;

      for(i = 0; i < n; i++, r++)
        fprintf(stdout, "%02d ", r);
   }

   fprintf(stdout, "\n");
   return n;
}

int main(int argc, char **argv)
{
   int i, r = 0, max_pow = 5, max_num = 0;

   if(argc > 1) {
      if(*argv[1] == '-' && argv[1][1] != 'h') {
         char s[2] = { argv[1][1], 0 };
         max_pow = atoi(s);
         if(!max_pow) goto help;
      } else {
help:
         fprintf(stderr, "uso: %s [-h|-potência(padrao=%d)\n", *argv, max_pow);
         return 0;
      }

   }

   max_num = pow(2, max_pow);
   fprintf(stdout, "pense em um número de 1 a %d e pressione enter...\n",
         max_num-1); fflush(stdout);
   getchar();

   for(i = 0; i < max_pow; i++) {
      int n;
      char c;
      n = getlist(i, max_num);
      fprintf(stdout, "esta número está aqui? [s/n]: "); fflush(stdout);
      c = getc(stdin); getc(stdin);
      if(c == 's') r+=n;
      fprintf(stdout, "\n");
   }

   fprintf(stdout, "o número é %d!\n", r);

   return 0;
}
Anúncios