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

2 Comentários on “teste de turing”

  1. fcasado disse:

    Fala grande mestre! Bem legal o teste de Turing… Coisa de Coperfield…rs Uma pergunta de iniciante: Pq é “feio/errado” usar o “goto”… rs
    Abraço

  2. alef disse:

    Opa, quanto tempo meu!

    Então, o lance de usar goto não é errado, mas pode complicar se você usar de maneira inadequada.

    Nos dois links abaixo há explicações sobre isso:
    http://jmmv.livejournal.com/39178.html
    http://kerneltrap.org/node/553

    (inglês, pra variar)


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s