Skip to content

Instantly share code, notes, and snippets.

@guilledk
Created November 9, 2018 06:01
Show Gist options
  • Select an option

  • Save guilledk/e5ff9fb6e05af065254c6ec5ce92973b to your computer and use it in GitHub Desktop.

Select an option

Save guilledk/e5ff9fb6e05af065254c6ec5ce92973b to your computer and use it in GitHub Desktop.
Tarea 2 - P1 2018 Code Golf
function PalabraEnPosicion (palabra : TPalabra; cuadro : TCuadro; posicion : TPosicion) : boolean;
var i : integer;
begin
i := 1;
while (i > 0) and (i <= palabra.largo) do
if ((posicion.columna + i - 1) > MaxColumna) or (cuadro[posicion.fila, posicion.columna + i - 1] <> palabra.letras[i]) then i := -1 else inc(i);
PalabraEnPosicion := true and (i > 0)
end;
procedure ResolverSopa (cuadro : TCuadro; palabras : ConjuntoPalabras; var resultado: OcurrenciasPalabras);
var aux, iter : ListaPosiciones;
i : integer;
posicionTemporal : TPosicion;
begin
for i := 1 to MaxConjuntoPalabras do resultado[i] := nil;
for i := 1 to MaxConjuntoPalabras do
for posicionTemporal.fila := 1 to MaxFila do
for posicionTemporal.columna := 1 to (MaxColumna - palabras[i].largo + 1) do
if PalabraEnPosicion(palabras[i], cuadro, posicionTemporal) then
begin
new(aux);
aux^.posicion := posicionTemporal;
aux^.siguiente := nil;
if resultado[i] = nil then resultado[i] := aux else
begin
iter := resultado[i];
while iter^.siguiente <> nil do iter := iter^.siguiente;
iter^.siguiente := aux;
end;
end;
end;
procedure ObtenerDatosSopa(cuadro : TCuadro; palabras : ConjuntoPalabras; var datos : DatosSopa);
var solve : OcurrenciasPalabras;
i, mas_veces_actual, t_lista: integer;
ultima_pos_actual : TPosicion;
iter : ListaPosiciones;
begin
ResolverSopa(cuadro, palabras, solve);
datos.comun := true;
for i := 1 to MaxConjuntoPalabras do
begin
t_lista := 0;
iter := solve[i];
while iter <> nil do
begin
inc(t_lista);
iter := iter^.siguiente;
end;
if t_lista > 0 then
begin
datos.HayPalabras := true;
if palabras[i].largo > datos.MasLarga.largo then
datos.MasLarga := palabras[i];
if mas_veces_actual < t_lista then
begin
mas_veces_actual := t_lista;
datos.MasVeces := palabras[i];
end;
iter := solve[i];
while iter <> nil do
begin
if (iter^.posicion.fila > ultima_pos_actual.fila) or ((iter^.posicion.fila = ultima_pos_actual.fila) and (iter^.posicion.columna > ultima_pos_actual.columna)) then
begin
ultima_pos_actual := iter^.posicion;
datos.Ultima := palabras[i];
end;
iter := iter^.siguiente;
end;
end;
datos.comun := datos.comun and (t_lista > 0) and (mas_veces_actual = 1);
end;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment