jueves, 17 de abril de 2008

MT Divisores

Objetivo: Dado un número, hallar sus divisores
Entrada: ...$0000$...
Salida: ...$0000$00...

La idea básica es leer el número(empezando con el cabezal a la izquierda del todo, por tanto lo primero que encontrará será un $), encontrar la mitad (marcarla como blancos). Con esto conseguimos el máximo divisor, por tanto lo copiamos al principio de la cadena y vamos comparando si es o no divisor. En caso de serlo, copiamos el número(el de mas a la izquierda '00'$00BB$B...) a la derecha, y ponemos un 1 para separalo del siguiente divisor(..00$00BB$001...) y le borramos un 0 desde la izquierda al candidato (..0$00BB$001...). En caso de que no sea divisor borramos el cero de la más a la izquierda y empezamos de nuevo(
..0$00BB$...)



Este ejercicio lo hemos hecho a lo largo de la semana, quedando por las mañanas el viernes 11, y lunes,martes y miercoles de esta semana.
Problemas... un monton xDD, desde borrar todo y tener que empezar desde el principio... hasta si marcar o no un $, pero esto ya lo pondra david en una entrada lol.

2 comentarios:

MABD dijo...

No es por joder... pero haciendo la traza con la cadena de entrada que vosotros mismos habeis suministrado teneis un error en el que la MT no puede reconocer B en el estado q1. Revisarlo.

Es cuando marca todos los 0's de la mitad izquierda y con B's la mitad derecha. cuando todos los 0's estan marcados o son B no puede hacer nada en q1.

Lord Garfio dijo...

Después de echarle hartas horas a vuetra MT DIVISORES he localizado unos cuantos fallos que no permiten el funcionamiento de la máquina, aquí vamos...

Primero:

Con cadenas de entrada con números pares ocurre que No tenéis transición en el estado ( Q1,B ) justamente cuando habéis terminado de marcar el último 0 con B en el estado ( Q3,0 ).

Mi solución pasa por poner la siguiente transición: ( Q3, B, L ).

Segundo:

Con cadenas de entrada con números impares ocurre que No tenéis transición en los estados ( Q33,$ ) y ( Q34, $ ). Revisando y analizando he detectado que lo que pretendéis hacer en esos 2 estados es borrar las marcajes del 0.

Así que despues de echarle imaginación he parchado esto y mi solución es poner para el ( Q33,$ ) una transición de ( Q34, $, R ) y para el ( Q34, $ ) una transición de ( Q12, $, L ).

Con esta solución el estado Q35 queda absolutamente inutil, por lo que el estado FINAL debería ser Q35 y NO Q36 como tenéis puesto.

Tercero:

Tanto para números pares como para números impares en la cadena de entrada, nunca llegáis a escribir en la salida los divisores de tal valor de entrada.

Esto ocurre siempre porque en el estado ( Q17 ) borràis las marcas del bloque de divisores e inmediatamente pasáis a comprobar si es DIVISOR ó NO ( Q18 ), por lo que siempre encontràis al menos un 0 que os lleva decidir que no lo és.

Cuarto:

Tras unas últimas pruebas más en haciendo Descripciones Instantaneas de vuestra MT, he detectado que siempre comprobàis si el 1 es divisor del valor de la cadena de entrada y por lo mismo que os cuento en el apartado Tercero, no llegáis a nada.

Finalmente:

Qué significa los 2 asteriscos en el estado ( Q25 ) ?

Saludos.