Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Serpiente Sumica
- %Lista de digitos
- digito([1,2,3,4,5,6,7,8,9]).
- functor(j,4).
- %serpiente recibe 4 listas
- serpiente(j(L1,L2,L3,L4)):-digito(L), retornarLista1(L,L1,Ls1), retornarLista(Ls1,L2,Ls2), retornarLista(Ls2,L3,Ls3),retornarLista(Ls3,L4,_).
- %Retorna una lista de 3 elementos que su sumatoria es 13 y los retorna en una lista
- retornarLista1(Aux,[A,B,C],[C|L3]):- member(A,Aux), delete(Aux,A,L1),member(B,L1), delete(L1,B,L2),member(C,L2), delete(L2,C,L3), 13 =:= A + B + C.
- %Retorna una lista de 3 elementos conserbando el 1er elemento de la lista dada y la sumatoria de sus elementos es 13 y retorna la lista dada sin los elementos de las segunda
- retornarLista(Aux,[A,B,C],[C|L3]):- delete(Aux,A,L1),member(B,L1), delete(L1,B,L2),member(C,L2), delete(L2,C,L3), 13 =:= A + B + C.
- % Ocho Numeros en Linea
- % la lista devuelve los numeros del 1 al 8
- lista([1,2,3,4,5,6,7,8]).
- % devuelve una lista con digitos del 1 al 8 de forma que la diferencia, en un orden o en otro, entre dos números vecinos, no sea nunca menor que 4
- ochoEnLineaA(V):-lista(L),quitarElem(L,E,Ls), ochoAuxA([E|Ls],[E|S]), retornarLista([E|S], V).
- % se encarga de generar y verificar las condiciones de las listas
- ochoAuxA([X],[X]):-!.
- ochoAuxA([EL1|L1],[EL1|Resto]):- quitarElem([EL1|L1],EL1,Ls), quitarElem(Ls,EL2,Ls1), abs(EL1-EL2) >=4, ochoAuxA([EL2|Ls1],Resto).
- % quita el elemento E de la lista L
- quitarElem(L,E,Ls):- member(E,L), delete(L,E,Ls).
- % devuelve la lista pasada
- retornarLista([E|S],[E|S]).
- % Rueda Numerica
- % devuleve listas con digitos del 1 al 9, de manera que todas las líneas de tres dígitos sumen el 15
- ruedaNumerica(L1, L2, L3, L4):- digitos(L), quitarElem(L, E, Ls), obtenerRueda(E, Ls, L1, L2, L3, L4).
- % obtiene una rueda con el elemento E como centro
- obtenerRueda(E, L, L1, L2, L3, L4):- parteDeRueda(E, L, L1, Ls), parteDeRueda(E, Ls, L2, Ls1),
- parteDeRueda(E, Ls1, L3, Ls2), parteDeRueda(E, Ls2, L4, _).
- % devuelve la lista que cumple la condición de que sume 15
- parteDeRueda(E, L, [El,E,Er], Resto):- quitarElem(L, El, Ls), quitarElem(Ls, Er, Resto), 15 is E + Er + El.
- % Producto con Nueve Numeros
- % devuelve listas con digitos del 1 al 9, de manera que el producto resultante sea correcto
- productoNueveNumeros(Multiplicando, E, Result):- digitos(L), obtenerMultiplicando(L, Multiplicando, Ls),
- quitarElem(Ls, E, Resto), obtenerResult(Resto, Result),
- Result is Multiplicando * E.
- % devuelve el multiplicando
- obtenerMultiplicando(L, Multiplicando, Resto):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
- quitarElem(Ls2, E2, Ls3), quitarElem(Ls3, E3, Resto),
- Multiplicando is E*1000 + E1*100 + E2*10 + E3.
- % devuelve el resultado de la multiplicacion
- obtenerResult(L, Numero):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
- quitarElem(Ls2, E2, Ls3), quitarElem(Ls3, E3, _),
- Numero is E*1000 + E1*100 + E2*10 + E3.
- % Pares e Impares en una Suma
- % devuelve listas de digitos del 1 al 9, colocando los números pares en los cuadrados y los impares en los círculos del grafico del ejercicio
- sumaNueveNumeros(Result):- digitos(L), obtenerOperandoUno(L, Oper1,Ls),obtenerOperandoDos(Ls, Oper2,Ls2),
- cuentaSuma(Ls2,Oper1, Oper2, Result),
- write(Oper1 '+' Oper2 '=' Result).
- % obtiene el primer operando
- obtenerOperandoUno(L,[E,E1,E2],Ls3):- quitarElem(L, E, Ls1),E mod 2 =\= 0,quitarElem(Ls1, E1, Ls2),E1 mod 2 =:= 0,
- quitarElem(Ls2, E2, Ls3),E2 mod 2 =:= 0.
- % obtiene el segundo operando
- obtenerOperandoDos(L,[E,E1,E2],Ls):- quitarElem(L, E, Ls1),E mod 2 =\= 0,quitarElem(Ls1, E1, Ls2),E1 mod 2 =\= 0,
- quitarElem(Ls2, E2, Ls),E2 mod 2 =:= 0.
- % realiza la suma
- cuentaSuma(Ls2,Oper1, Oper2, [R1,R2,R3]):- obtenerResultSum(Oper1,Num1),obtenerResultSum(Oper2,Num2),Result is Num1 + Num2,
- R1 is Result // 100 ,quitarElem(Ls2,R1,V), R1 mod 2 =\= 0, Raux is (Result - R1*100),
- R2 is Raux // 10,quitarElem(V,R2,V2), R2 mod 2 =\= 0,
- R3 is (Result - (R1*100 + R2*10)),
- quitarElem(V2,R3,_),R3 mod 2 =:= 0.
- % obtiene el resultado de la suma
- obtenerResultSum(L, Numero):- quitarElem(L, E, Ls1), quitarElem(Ls1, E1, Ls2),
- quitarElem(Ls2, E2, _),
- Numero is E*100 + E1*10 + E2,!.
Advertisement
Add Comment
Please, Sign In to add comment