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$...)
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:
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.
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.
Publicar un comentario