[ Foro de Pascal ]

Problema sobre lectura y presentación de dos palabras.

30-Mar-2012 21:58
Luis Torres (+18)
3 Respuestas

Muchos saludos a todos. Tengo una duda sobre cómo resolver el siguiente problema:
a) realice un programa que reciba como entrada dos palabras con almenos una letra en comun y las muestre en pantalla de forma cruzada. El cruce de las palabras debe ser lo mas cercano posible al centro de cada una de las palabras:

ejemplo

                                               a
                                               l
                                               u
                                   i n t e r c c e s i o n
                                               i
                                               n
                                               a
                                               r
   

Espero que me ayuden con la respuesta.                                          


31-Mar-2012 08:46
Nacho Cabanes (+83)

Interesante problema.

Yo creo que una forma "razonablemente ordenada" de resolverlo (aunque también se me ocurre alguna más rápida pero más anárquica) sería:

- Buscar las letras comunes (recorrer la palabra más corta, mirando cuales de sus letras están también en la otra).

- Para cada letra encontrada, anotar: letra, posición en cadena 1, distancia del centro en cadena 1, posición en cadena 2, distancia del centro en cadena 2 (si una letra aparece repetida en una cadena o en la otra, habrá que anotar varios pares distintos).

- Recorrer esa serie y tomar el valor que tenga la menor distancia al centro de ambas palabras (la suma de la distancia al centro en cambas cadenas; si hay varios que coincidan, tomar el primero o el último encontrado, de forma arbitraria, según la implementación que se decida).


01-Apr-2012 23:04
Sam Garcia

Hola a todos.
Aparte de la solución que dio el profe Nacho trate de idear un algoritmo que busque las letras que coinciden de la mitad hacia los lados. Como resultado tengo este código en el cual se utilizan 1 función y un procedimiento, espero pueda servirte en algo :-)  :

uses crt;
var
p1,p2,caux:string;
m1,xx,yy,posactual,lado:integer;
noescribir:boolean;

function posMedia(cadena:string;caracter:char):byte;
var
m,x,y,contador,temp:byte;
nocoincide:boolean;
begin
nocoincide:=true;
contador:=0;
m:=(length(cadena)+1) div 2;
y:=0;
x:=0;
temp:=m;
while ((m-x)>0) and ((m+y)<=length(cadena)) and nocoincide do
begin
if cadena[temp]=caracter then
nocoincide:=false
else
begin
contador:=contador+1;
if (contador mod 2)=0 then
begin
x:=x+1;
if (m-x)>0 then
temp:=m-x;
end
else
begin
y:=y+1;
if (m+y)<=length(cadena) then
temp:=m+y;
end;
end;
end;
posMedia:=temp;
if nocoincide then
posMedia:=0;
end;

procedure vertical(cadena:string;columna,fila:byte);
var
x:byte;
begin
for x:=0 to (length(cadena)-1) do
begin
gotoxy(columna,fila+x);write(cadena[x+1]);
end;
end;

begin
clrscr;
gotoxy(2,2);write('Primer palabra : ');
readln(p1);
gotoxy(2,3);write('Segunda palabra : ');
readln(p2);
if length(p1)<length(p2) then
begin
caux:=p1;
p1:=p2;
p2:=caux;
end;
m1:=(length(p2)+1) div 2;
xx:=0;
yy:=0;
posactual:=m1;
noescribir:=true;
lado:=0;
while ((m1-xx)>0) and ((m1+yy)<=length(p2)) and noescribir do
begin
if posMedia(p1,p2[posactual])<>0 then
begin
noescribir:=false;
clrscr;
gotoxy(1,posactual);write(p1);
vertical(p2,posMedia(p1,p2[posactual]),1);
end
else
begin
lado:=lado+1;
if (lado mod 2)=0 then
begin
xx:=xx+1;
if (m1-xx)>0 then
posactual:=m1-xx;
end
else
begin
yy:=yy+1;
if (m1+yy)<=length(p2) then
posactual:=m1+yy;
end;
end;
end;
if noescribir then
write('No coincide ninguna letra.');
end.


Eso es todo, chau.


02-Apr-2012 01:31
Luis Torres (+18)

Muchas gracias por tu pronta respuesta, Sam. Ya lo corrí y aparentemente funciona, pero me gustaría hacerle más pruebas. Estoy muy agradecido por tu idea.
Saludos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)