• Publicidad

Intérprete Brainfuck

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Intérprete Brainfuck

Notapor Aceitunas » 2014-11-28 14:55 @663

Para los que no conozcan este 'lenguaje':

http://es.wikipedia.org/wiki/Brainfuck

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. # Intérprete brainfuck v1.0
  4. # Aceitunas
  5.  
  6. use strict;
  7.  
  8. my $cadena = "++++++++++[>+++++++>++++++++++>+++++++++++>+++>+<<<<<-]>++.>>+.---.<---.>>++.<+.++++++++.-------.<+++.>+.>+.>.";
  9. # Cadena contiene la línea de código a ejecutar
  10.  
  11.  
  12. my @puntero;      # puntero a los datos almacenados
  13. my $pospun = 0;   # posición del puntero
  14.  
  15. my $posicion = 0; # posición en el array que contiene las instrucciones
  16.  
  17. my @datos = split // , $cadena; # datos contiene todas las instrucciones a ejecutar
  18.  
  19. while ($posicion <= $#datos)
  20. {
  21.     Interpretar($datos[$posicion]);  
  22.    
  23.     $posicion++;  
  24. }
  25.  
  26. exit;
  27.  
  28. sub Interpretar
  29. {
  30.  
  31.  
  32.     if ($_[0] eq '+')
  33.     {
  34.         $puntero[$pospun]++;
  35.     }
  36.     elsif ($_[0] eq '-')
  37.     {
  38.         $puntero[$pospun]--;
  39.     }
  40.     elsif ($_[0] eq '>')
  41.     {
  42.         $pospun++;
  43.     }
  44.     elsif ($_[0] eq '<')
  45.     {
  46.         $pospun--;
  47.     }
  48.     elsif ($_[0] eq '.')
  49.     {
  50.         print chr $puntero[$pospun];
  51.     }
  52.     elsif ($_[0] eq ',')
  53.     {
  54.         $puntero[$pospun] = ord <STDIN>;
  55.     }
  56.     elsif ($_[0] eq '[')
  57.     {  
  58.         my $SumPos; # Para calcular el espacio del bucle
  59.  
  60.         while ($puntero[$pospun] != 0)
  61.         {
  62.  
  63.             my $GuardarPos = $posicion; # Guardamos la posición donde comienza el bucle
  64.            
  65.             $SumPos = -1;
  66.  
  67.             while ($datos[$posicion] ne ']')
  68.             {
  69.                 $SumPos++;             
  70.                 $posicion++;
  71.                 Interpretar($datos[$posicion]);
  72.        
  73.             }
  74.  
  75.             $posicion = $GuardarPos; # recuperamos la posición donde comienza el bucle
  76.            
  77.         }
  78.         $posicion += $SumPos;
  79.     }
  80. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Salida del programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
red@red-MS-1034:~/Escritorio$ perl debug.pl
Hola mundo!
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Probado con el mismo ejemplo de la Wikipedia.
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.

Publicidad

Re: Intérprete Brainfuck

Notapor explorer » 2014-11-29 08:34 @398

Creo que se puede hacer de otra manera... ¿me permites?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Intérprete Brainfuck

Notapor Aceitunas » 2014-11-29 11:29 @520

¡Claro que sí! :D
Voy a llegar hasta el final, voy a subir la velocidad - Migue Benítez.
Aceitunas
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2013-11-07 15:25 @684
Ubicación: Ciudad Real, España.


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados