Foros del Web » Programación para mayores de 30 ;) » Programación General »

Reto/favor: Plantead problemas sencillos que no pueda resolver.

Estas en el tema de Reto/favor: Plantead problemas sencillos que no pueda resolver. en el foro de Programación General en Foros del Web. Los intentaría resolver con un programa. Con sencillos me refiero a: - Que las variables sean todas tipo número o todas tipo texto, y que ...
  #1 (permalink)  
Antiguo 05/10/2015, 20:51
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Reto/favor: Plantead problemas sencillos que no pueda resolver.

Los intentaría resolver con un programa.

Con sencillos me refiero a:
- Que las variables sean todas tipo número o todas tipo texto, y que no se requiera cambiar ese tipo.
- Las condiciones a cumplir deben ser V1>5 o cosas por el estilo, no pueden ser por ejemplo "que V1 sea lo máximo posible" (que sería: "hallar el conjunto de acciones con el cual V1 alcance más valor").
- No puede haber azar.
- Si hay un rival, debe estar especificado cómo actuará en cada caso.
- Las acciones posibles no pueden ser intercambiar valores de variables, ni crear variables ni quitarlas.
Nota:
- Si son números decimales y hay potencias o radicales con ellos, no aseguro que haya precisión.

Doy un ejemplo de un problema que cumple los requisitos, excepto que este sí lo puedo resolver:
Nota: Esto tiene líneas de código pero también otras que son más bien de pseudocódigo.
Código a:
Ver original
  1. // 2 variables tipo número:
  2. V1 = 0;
  3. V2 = 5;
  4. // Variables relacionadas con las posibles acciones:
  5. M.Actini = 1;
  6. Act = ActIni;
  7. // Modo en que se aplican las acciones:
  8. V1 = V1+Act;
  9. // ...es decir al valor de V1 se le suma el valor de Act.
  10. // Condición en que se soluciona el problema:
  11. V1 == V2
  12. // Relacionado con el límite del valor de la acción:
  13. Si M.Act<5
  14.     // Modo en que varía la acción:
  15.     M.Act = M.Act+1;
  16. fin del si
La solución ahí sería usar la acción nro 5.

Si intento avanzar en algún aspecto y me parece que lo logré entonces quitaré el límite correspondiente. Por ejemplo si hago los ajustes para que funcione con ambos tipos a la vez, de variables, entonces avisaré que se pueden usar variables de ambos tipos.

Quiero ver si dentro de los límites que dije hay cosas que no esté teniendo en cuenta. Por ejemplo si yo no decía "Las acciones posibles no pueden ser intercambiar valores de variables" uds me podrían haber pedido que reordene cierta cantidad de variables (es decir que intercambie sus valores) y yo eso prácticamente nunca lo he hecho.

So, gracias.
__________________
"No se puede borrar hasta", PHPeros.

Última edición por Tachikomaia; 05/10/2015 a las 22:14
  #2 (permalink)  
Antiguo 05/10/2015, 23:16
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.328
Antigüedad: 11 años, 7 meses
Puntos: 606
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Hace menos de 5 meses ya abriste un hilo similar en el que varias personas te propusieron ejercicios. Yo de hecho al final de este post te puse ejercicios básicos que se hacen en casi todos los cursos de iniciación a la programación.

Te dejo dos consejos:
- Usa ya de una vez variables claras, que las letras son gratis y ayudan a entender el código. Deja de usar ya "cosas" como "V1", "V2",...
- De vez en cuando tendrías que dar un vistazo a todos los hilos que has abierto y releerte lo que pusiste. Siempre se te han dado consejos para mejorar pero como no es tu estilo o no has querido cambiar como programas sigues igual después de años y así es imposible...
__________________
Aviso: No se resuelven dudas por MP!
  #3 (permalink)  
Antiguo 06/10/2015, 11:50
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Cometí un error en el casi código que puse:
Act = ActIni;
es
Act = M.ActIni;

En mi programa está bien, lo que pasa que eso se hace más adelante y acá lo escribí apurado intentando que no haya quejas de que usé Act sin haberlo definido.

Otra cosa que quizá ya he aclarado pero no recuerdo, por las dudas: Los problemas que planteen deben tener alguna solución. Sino evidentemente no podría resolverlos, no pido problemas de esos.

--------------------------------------------------------------------------------------------------------

Malenko, tu post para mí es problema que no sé resolver (cómo responderlo bien), pero no está dentro de los límites que dije xD

El hilo al que te refieres era para aprender a programar mejor o adecuarme a lo que uds decían que es mejor, y entender qué era. Ya no recuerdo bien los motivos pero era sobre aprender a resolver problemas yo, programando sí pero no una "pseudoIA" ni con ayuda de una.

Este otro hilo también es para aprender a programar, sí, pero muy relacionado con una "pseudoIA" y los problemas hemos de resolverlos ella y yo, no sólo yo. También este tema es para ver sus límites y cosas que necesita.

Hice los ejercicios que me dijiste, o más o menos, y como no se comentó más al respecto lo dejé. Igual ahora estoy con las cuestiones de este tema.

No es imposible, yo sé lo que hago, tú sígueme la corriente, si pido cómo hacer un "A"+1 ("A1") en python me dices, si pido un problema dentro de ciertos límites, y que no pueda resolver con mi pseudoIA, me dices un problema así si se te ocurre, sino ten paciencia porque iré quitando los límites.

Cita:
- Usa ya de una vez variables claras, que las letras son gratis y ayudan a entender el código. Deja de usar ya "cosas" como "V1", "V2",...
¿Lo dices por el casi código que puse? Tienes razón, lo que pasa que pienso "muy en general", creo, entonces planteo los problemas como si fuesen un tipo de problema y no un ejemplo particular, me confundo. Va una corrección:
Código a:
Ver original
  1. // 2 variables tipo número:
  2. numDeManzanasEnMiCanasto = 0;
  3. numDeManzanasQueQuieroTenerEnMiCanasto = 5;
  4. // Variables relacionadas con las posibles acciones:
  5. M.actoInicial = 1;
  6. // (*)
  7. Acto = M.actotInicial;
  8. // Modo en que se aplican las acciones:
  9. numDeManzanasEnMiCanasto = numDeManzanasEnMiCanasto+Acto;
  10. // ...es decir al valor de numDeManzanasEnMiCanasto se le suma el valor del Acto.
  11. // Condición en que se soluciona el problema:
  12. numDeManzanasEnMiCanasto == numDeManzanasQueQuieroTenerEnMiCanasto
  13. // Relacionado con el límite del valor de la acción:
  14. Si M.Acto<5
  15.     // Modo en que varía la acción:
  16.     M.Acto = M.Acto+1;
  17. fin del si
(*): M es un objeto, como una carpeta, donde pongo variables que no quiero que se guarden en archivos. Porque cuando uso el comando para guardar variables en archivos, se guardan todas las que estén en la zona raíz, así que a las que no quiero guardar las meto en un objeto. "M" es un abreviador de memoria, pero es un nombre que le puse hace años y su función no es precisamente memorizar. Lo más "lógico" supongo que sería llamarle "ObjetoParaEvitarQueCiertasVariablesSeGuarden" pero es muy largo, quedaría así:
Código a:
Ver original
  1. // 2 variables tipo número:
  2. numDeManzanasEnMiCanasto = 0;
  3. numDeManzanasQueQuieroTenerEnMiCanasto = 5;
  4. // Variables relacionadas con las posibles acciones:
  5. ObjetoParaEvitarQueCiertasVariablesSeGuarden.actoInicial = 1;
  6. Acto = ObjetoParaEvitarQueCiertasVariablesSeGuarden.actotInicial;
  7. // Modo en que se aplican las acciones:
  8. numDeManzanasEnMiCanasto = numDeManzanasEnMiCanasto+Acto;
  9. // ...es decir al valor de numDeManzanasEnMiCanasto se le suma el valor del Acto.
  10. // Condición en que se soluciona el problema:
  11. numDeManzanasEnMiCanasto == numDeManzanasQueQuieroTenerEnMiCanasto
  12. // Relacionado con el límite del valor de la acción:
  13. Si ObjetoParaEvitarQueCiertasVariablesSeGuarden.Acto<5
  14.     // Modo en que varía la acción:
  15.     ObjetoParaEvitarQueCiertasVariablesSeGuarden.Acto = ObjetoParaEvitarQueCiertasVariablesSeGuarden.Acto+1;
  16. fin del si
Comprendo perfectamente si te parece una trolleada pero no sé qué quieres exactamente en el sentido de qué nombre ponerle a las variables. Y si así como está no te parece una trolleada, o sea si así te parece bien, me alegro porque no es mi intención trollear, pero en general no voy a nombrar así las variables.
Te recomiendo este video:
https://www.youtube.com/watch?v=JoQhKR9Q0Jg
desde 0:30

Y te diré otros motivos de por qué uso V1, V2, etc, para todos estos problemas (aunque me los pueden plantear con los nombres que uds quieran).

1: Debo crear archivos cuyos nombres contengan las variables. Así lo hago:
Código a:
Ver original
  1. M.A = 1;
  2. M.SaveID = V1;
  3. do {
  4.     M.A = M.A+1;
  5.     M.SaveID = M.SaveID+"_"+eval("V"+M.A);
  6. } while (M.A<M.SitElms);
  7. // Save it
  8. M.SaveID = M.SaveID+".txt";
  9. fscommand ("save", M.SaveID);
Puede haber cosas ahí que no entiendas, pero el punto es que si les cambio los nombres a las variables al principio, tengo que cambiarlas luego en este fragmento también. Además, si no tienen una "forma" similar (por ejemplo texto+número: V1) no puedo usar un "loop" como este para crear el nombre del archivo.

Si son pocas variables no hay problema, pero si son muchas sí!

Hay una posible solución: Crear variables con nombres reales y otras variables como las que hago, que tengan los valores de las variables reales:
numDeManzanasEnMiCanasto = 0;
V1 = 0;
numDeManzanasQueQuieroTenerEnMiCanasto = 5;
V2 = 5;
o al revés:
V1 = 0;
numDeManzanasEnMiCanasto = V1;
V2 = 5;
numDeManzanasQueQuieroTenerEnMiCanasto = V2;
pero en definitiva es el doble de trabajo! ¿y lo entiendo más así? No!

Quizá pienses "pero por qué precisas crear archivos" o "por qué el nombre debe tener las variables", lo cual me parece bien pensado, pero eso no lo voy a responder, lo siento.

Ese código se repite en varios frames, encima eso, sé que convendría convertirlo en función pero de momento estoy preocupado por otros asuntos.

2: Debo ver que los archivos se guardaron o cargaron bien. Para números debo usar esto:
Código a:
Ver original
  1. function FuncMVImp () {
  2.         Cargas = 0;
  3.         A = 0;
  4.         do {
  5.             A = A+1;
  6.             set ("V"+A, CompNum2);
  7.         } while (A<SitElms);
  8.         Act = CompNum2;
  9.     }
y además esto:
Código a:
Ver original
  1. function FuncMVComp () {
  2.         Comp = Comp+1;
  3.         Verif = 1;
  4.         A = 0;
  5.         do {
  6.             A = A+1;
  7.             VA = Number(eval("V"+A));
  8.             set ("V"+A, VA);
  9.             if (CompNum>VA) {
  10.                 Verif = 0;
  11.                 A = SitElms;
  12.             }
  13.         } while (A<SitElms);
  14.         Act = Number(Act);
  15.         if (CompNum>Act) {
  16.             Verif = 0;
  17.         }
  18.     }
Son funciones dentro de M, que se usan fuera. Están en M porque si las defino fuera se graban cosas extra en los archivos, además la mayoría de las variables que usan están en M. Más allá de eso, son más o menos lo mismo que lo anterior: Un loop con contador, que en este caso define (la 1era) o compara (la 2nda) V1, luego V2, etc. Si les pusiera nombres "libremente" estos métodos no funcionarían y tendría que cambiar nombres. Además funciones como esta hay otras, por ejemplo:
Código a:
Ver original
  1. function FuncNVImp () {
  2.         Cargas = 0;
  3.         A = 0;
  4.         do {
  5.             A = A+1;
  6.             set ("_root.N.V"+A, CompNum2);
  7.         } while (A<SitElms);
  8.         _root.N.Act = CompNum2;
  9.     }
Código a:
Ver original
  1. function FuncNVComp () {
  2.         Comp = Comp+1;
  3.         Verif = 1;
  4.         A = 0;
  5.         do {
  6.             A = A+1;
  7.             VA = Number(eval("_root.N.V"+A));
  8.             set ("_root.N.V"+A, VA);
  9.             if (CompNum>VA) {
  10.                 Verif = 0;
  11.                 A = SitElms;
  12.             }
  13.         } while (A<SitElms);
  14.         _root.N.Act = Number(_root.N.Act);
  15.         if (CompNum>_root.N.Act) {
  16.             Verif = 0;
  17.         }
  18.     }
Como ves la diferencia es mínima, tan poca que podrían convertirse en 2 funciones (te mostré 2 de cada tipo, pero son como 4 de una y 3 de otra) si se hacen los ajustes necesarios, pero de momento estoy concentrado en otros temas. La diferencia entre estas funciones con respecto a las anteriores es que esta trabaja con "Vs" definidas en N en vez de M; es otro objeto que tiene un uso diferente que no voy a explicar.

Si en base a eso tienes una solución mejor, te la agradezco.

------------------------------------------------------------------------------------------

Por cierto es muy poco importante esto pero por si alguno se enoja porque no está definido M.Act y se usa, se debe a que hace tiempo tenía pensado que fuese posible que la siguiente acción a realizar fuese modificada por la acción actual, entonces precisaba una variable que indicara la acción que se hizo (Act) y la que se va a realizar (M.Act). Puede que no sea eso, pero es más o menos lo que recuerdo. Actualmente quizá se pueda simplificar.
__________________
"No se puede borrar hasta", PHPeros.

Última edición por Tachikomaia; 06/10/2015 a las 11:57
  #4 (permalink)  
Antiguo 06/10/2015, 12:21
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

1. - Averiguar si algún número de la serie de Fibonacci es un número primo.
2. - De los números primos del 1 al 100, averiguar para cada uno de ellos cual el número que ocupa esa misma posición en la misma lista de números primos.

Ejemplo, dada la serie de números primos:
2, 3, 5, 7, 11, 13, 17, 19, 23...

el 2 es el 1º número primo de esta lista pero el 2º número primo es 3. Así pues, el 2 apunta al 3
El 3 es siguiente número primo de esta lista pero el 3º número primo de ella es el 5, así pues el 3 apunta al 5.
El 5 es el siguiente número primo de esta lista, pero el 5º número primo de la misma lista es el 11.
El 7 es el siguiente número primo de esta lista, pero el 7º número primo de la misma lista es el 17.
Así pues, lo que quiero es la siguiente lista:

2->3
3->5
5->11
7->17
11->el que sea
etc
hasta el inmediatamente anterior a 100-> el que corresponda.

3.- Cada mañana encuentro en mi terraza unas bragas. Y cada tarde de lunes a viernes una de mis 5 vecinas viene a preguntar que si me he encontrado unas bragas en mi terraza. Así pues... yo le doy las bragas que he encontrado. Ahora llego a la conclusión de que siempre me equivoco. Porque mientras que la misma braga sigue cayendo el mismo día de la semana (todos los lunes es la misma, la de los lunes... todos los martes es la misma, la de los martes...) mis vecinas no siempre vienen en el mismo día de la semana. Pero tampoco vienen al azar. La vecina que una semana viene el lunes, a la semana siguiente viene el martes, y a la siguiente semana viene el miércoles...

Se de sobra que si terminan el ciclo, la que empieza viniendo el lunes como muy tarde le entregaré sus bragas 5 semanas más tarde, cuando haya recogido las del lunes, el martes, el miércoles, el jueves y el viernes. Pero 5 semanas son mucho tiempo.

Resulta que todo este lio de las bragas, ya acabé con él por fín, tras varias semanas. Y todas mis vecinas por fín tienen ya sus bragas bien asignadas. ¿Y como lo se? Fácil. La semana pasada no vino ninguna vecina a casa (qué descanso). Pero hoy es lunes y me he encontrado unas bragas que nunca antes me había encontrado. Y me temo que todo el proceso está comenzando de nuevo. Así pues...

¿Como puedo averiguar qué bragas son de qué vecina, sin preguntárselo a ellas y como puedo disminuir el tiempo máximo en asignar a cada vecina sus bragas correctamente?

4.- En España, la quiniela tiene 3 posibles resultados, el 1, la X o el 2 según si gana el equipo de casa, empatan o gana el de fuera. Y en la quiniela cada apuesta se hace con 15 partidos distintos.

¿Cuantas quinielas he de jugar en 1 semana para asegurarme acertar los 15 partidos en 1 de ellas? Si cada combinación de 15 resultados (cada apuesta) cuesta 1€ y se recogen 3 millones de €uros de premio a los 15 aciertos, 400.000€ a los 14 aciertos, 50000€ a los 13, 1000€ a los 12 y 3€ a los 11... ¿cuanto habré ganado con todas mis apuestas?

Última edición por Kritik; 07/10/2015 a las 13:57
  #5 (permalink)  
Antiguo 07/10/2015, 14:33
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

1.- La fuerza de la gravedad en la superficie de la luna es de 1,622 m/s², mientras que la fuerza de la gravedad en la superficie de la tierra es de 9.8 m/s².

En el año 2012 Jan Zelezny tenía el record de lanzamiento de jabalina en 98m 48 cm. Si lo hubiese lanzado en la luna con la misma fuerza... qué distancia habría conseguido?

2.- Un niño aprende 10 palabras nuevas del idioma inglés cada día, pero a partir de la semana de haber empezado cada 3 días empieza a olvidar 1 palabra de la semana anterior, 2 palabras de las que aprendió 2 semanas atrás y 3 palabras de cada semana anterior a la segunda.

Si para hablar bien un idioma se necesitan 1000 palabras... ¿llegará el niño a aprenderlas? ¿En cuantos días las aprenderá en el caso de llegar?
  #6 (permalink)  
Antiguo 07/10/2015, 20:40
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

En este diagrama que hice días atrás olvidé mencionar la precisión de los decimales.

Ya está un poco "obsoleto" ese diagrama pero Kritik me ayudó a concientizar otro aspecto en el que avanzar: El autocompletado. Es decir, me planteas un problema en castellano y con cosas que además no sé bien qué son, como los números primos. Olvidé mencionarlo pero mi programa requiere que las variables determinantes estén definidas, no puede averiguar cuales son, a menos que el problema se plantee en dos partes: 1- averiguarlas, 2-resolver el problema en sí. Pero tampoco puede averiguarlas sin alguna "pista".
Nota: Llamo "variables determinantes" a las que determinan cual será la solución. Por ejemplo dónde está el personaje parado o cómo es el laberinto.
Sobre el diagrama hay más info aquí:
http://sofosagora.net/filosofia-gene...nes-t5773.html
...no es el tema pero si creen que hay "otras flechas" (mejoras) agradezco que me las digan.

En fin ¿cual es el problema con tu planteamiento? Que debo convertirlo en código, y que sería más fácil si lo el problema estuviese planteado un poco más de esa forma. No lo exijo, pero recuerda que es para ver la capacidad de mi programa, no para ver mi capacidad de traducir.

-----------------------------------------------------------------------------------------------------------------------

Problema 1:
1. - Averiguar si algún número de la serie de Fibonacci es un número primo.

https://es.wikipedia.org/wiki/Sucesi...n_de_Fibonacci
Creo que lo entendí.

https://es.wikipedia.org/wiki/N%C3%BAmero_primo
Eso no ¿son los números enteros > 1 que al ser divididos por números enteros > 1 distintos de si mismos dan un resto > 0?
Confirmame eso. Parece ser el caso, el 4 no estaría porque es divisible entre 2 que sí está, el 6 por el 2 y 3, el 8 por el 4... Voy a suponer que es eso, sino me avisas.

Si considero esto como casilleros, en primer lugar debo caer en un casillero que esté dentro de la serie, y en segundo, que sea primo.

Es un problema que
- puede resolverse en 1 acción (básicamente porque la acción es sustituyente (leer sobre el diagrama), es decir se puede pasar de un valor a cualquier otro, no hay un rango máximo de movimiento)
- no requiere resetear la situación (esto no lo había pensado, debería hacer una versión en que no se reseteé, sino la búsqueda será peor).
...me gustaría definir el problema como suelo definirlo:
Cita:
// SitElms:
V1 = 1;
M.SitElms = 1;
// Otros elementos:
M.Actini = 2;
M.CompNum = -10;
M.CompNum2 = M.CompNum*10;
// Mod Sit (Act con M.Act) ?
V1 = Act;
// Sols check
if (V1 == 5) {

// Actmod pos?
// ActMod.
M.Act = M.Act+1;
Pero es complicado...

En primer lugar no hay límite en el valor de la acción o de las variables. Si viste mi respuesta a Malenko quizá entiendas cual es el problema con eso, sino intentaré explicarlo...
Para verificar que las variables se cargaron bien (aunque en este caso no es necesario cargarlas! wow, tampoco lo había pensado, más motivos para hacer otra versión), M.CompNum debe ser menor y más largo (si fuese cadena) que los valores a cargar. Como los valores en este caso, en teoría -ya que no hay límite- pueden ser infinitos, M.CompNum debe ser variable pero no sé exactamente cómo variarlo. Tengo una idea, la más obvia: Cuando una variable cambia, chequear si M.CompNum es menor y más largo, sino asignarle el valor de la variable *10. M.CompNum2 también participa en el proceso y debe ajustarse, pero ese es simplemente M.CompNum*10. Pero en fin, debo probar que eso funcione. Además me hiciste darme cuenta que el tema de "ser más largo" es un sin sentido -quizá- porque según he visto las cadenas al compararlas como x < y se fija cual está primero en "el abecedario", no cual es más larga. So, tendría que repensar en ese tema.

2ndo problema: Definir las condiciones de solución.
Esto es lo que te decía al principio, lo de "traducir". O, en este caso, ver si es necesario definir variables internas o no, o si conviene. O sea: ¿Cómo el programa puede chequear si un número está en la serie de Fibonacci?
Normalmente uno haría algo como:
Código a:
Ver original
  1. N = 1
  2. Num1 = 1
  3. Num2 = 1
  4. Si N == 1
  5.     Num1 = Num1+Num2
  6.     N=2
  7. sino
  8.     Num2 = Num1+Num2
  9.     N=1
  10. fin del si

Es decir:
Código a:
Ver original
  1. // Frame 1:
  2. N = 1;
  3. Num1 = 1;
  4. Num2 = 1;
  5. // Frame 2:
  6. if (N == 1) {
  7.     Num1 = Num1+Num2;
  8.     trace(Num1);
  9.     N = 2;
  10. } else {
  11.     Num2 = Num1+Num2;
  12.     trace(Num2);
  13.     N = 1;
  14. }
  15. // Frame 3:
  16. gotoAndPlay (2);

y entonces...
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
...y entonces no hay que analizar si un número está en la serie o no, o al menos puede asumirse que está...

Pero en mi método para hacer eso tendría que variar el Act de forma que haga eso, pero mira cómo lo varío:
// ActMod.
M.Act = M.Act+1;

Por supuesto podría crear variables internas como decía, como hice más arriba, pero siento que no tiene sentido ¿son necesarias para resolver un problema? Algunas sí, pero estas...

¿Podría variar el Act "inteligentemente" (al menos mejor que "+1") sin tener que crear otras variables?

Incluso si intento dejar eso de lado, es decir que se sume +1 -lo cual hará la búsqueda más larga, lo sé-, sigue sin solucionarse el problema: ¿Cómo el programa puede saber que un número pertenece a la serie?

Debo hallar una ecuación o algo...

1, 1, 2, 3, 5...

N pertenece a la serie si... (teoría) 40% de N es entero y 60% de N es entero. Esto sería desde el 5. Veamos el siguiente caso... 3, 5, 8. No, la fruta que tiré no cayó en la verdad xD y no volveré a tirar en esto. Aquí dice algo:
https://espanol.answers.yahoo.com/qu...6164509AAwjnDF
pero no entiendo si con perfecto se refiere a entero.

Otro día sigo. No sé qué esperabas encontrar, pero posiblemente resultó distinto, espero que me hayas entendido un poco más y puedas aconsejarme acordemente (y lo mismo otros, aunque dudo que alguien lea todo esto xP ). Básicamente es que tengo una estructura con la que pienso que se puede definir cualquier problema, lo cual quizá sea un error, pero debe haber una estructura que permita eso, simplemente requiere más flexibilidad ¿cómo sería?

Por mi parte me he dado cuenta de varias cosas gracias a tu 1er problema, por lo que te daría un +10.

PD: Suerte que planteaste el problema en ese orden:
Serie, primo.
Sino hubiese analizado cual de los primos pertenecen a la serie xD
__________________
"No se puede borrar hasta", PHPeros.

Última edición por Tachikomaia; 08/10/2015 a las 07:58
  #7 (permalink)  
Antiguo 08/10/2015, 12:08
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Tachikomaia no entiendo nada ni de tu gráfico, ni de tu código ni de nada de lo que has escrito que explique como funciona tu código. Sin embargo si he entendido las cosas que no tienen que ver con tu programa, y paso a contestar las que he entendido:

Nº Primo: Aquel que única y exclusivamente es divisible por sí mismo y por la unidad para dar un resto de 0.

Ejemplo: El 11.

11:1=11 y resto 0; <<==Resto 0
11:2=5 y resto 1;
11:3=3 y resto 2;
11:4=2 y resto 3;
11:5=2 y resto 1;
11:6=1 y resto 5;
11:7=1 y resto 4;
11:8=1 y resto 3;
11:9=1 y resto 2;
11:10=1 y resto 1;
11:11=1 y resto 0; <<==Resto 0

El 11 es un número primo, porque única y exclusivamente es divisible entre sí mismo y la unidad para dar resto 0.

Ejemplo: El 15.
15:1=15 y el resto es 0; <<==Resto 0
15:2=7 y el resto es 1;
15:3=5 y el resto es 0; <<==Resto 0

El 15 no es un número primo, porque a parte de por sí mismo y de la unidad, también es divisible por el 3 y si siguieses... también por el 5.

Creo que es lo mismo que has escrito tú pero con otras palabras. Pero no estoy del todo seguro. Espero que aunque tú lo expliques de otra manera, te hayas enterado de esta explicación.

Para resolver si un número pertenece o no a la serie de Fibonacci (habría que ponerle un limite porque la serie es infinita) tendrías que saber 1º construir la serie. Efectivamente, la sabes construir de forma manual... pues sería lo mismo pero con código. Y una vez que la tienes... coger el 1º número de la serie y comparar, y luego el 2º, 3º, hasta el límite que le pongas. (ya que la serie de los números primos también es infinita)

Me alegra haberte ayudado con tu programa. A ver si tu programa me resuelve el problema que tengo con mis vecinas y sus bragas... qué calvario!!Jaja

Última edición por Kritik; 08/10/2015 a las 12:15
  #8 (permalink)  
Antiguo 10/10/2015, 22:02
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

¿Qué tipos de problema hay?
Quiero hacer hacer un diagrama de flujo o algoritmo para mí, para definir qué tipo de programa usar según el caso.

Por ejemplo:
Código a:
Ver original
  1. Si requiere más de una acción para solucionarse
  2.     Si se puede describir sin listas ni variables externas al problema
  3.         // Si se requiere una ecuación puede que sea un subproblema
  4.         Si usa números
  5.             Si usa números decimales
  6.                 Si usa texto
  7.                     // Usar versión Long Dec y Tx.
  8.                 Sino
  9.                     // Versión Long Dec.
  10.             Sino si usa texto
  11.                 // Long Num y Tx.
  12.             Sino
  13.                 // Long Num.
  14.         Sino
  15.             // Long Tx.
  16.     Sino si se puede describir con variables externas al problema
  17.         Si usa números
  18.             Si usa números decimales
  19.                 Si usa texto
  20.                     // Ext Long Dec y Tx.
  21.                 Sino
  22.                     // Ext Long Dec.
  23.             Sino si usa texto
  24.                 // Ext Long Num y Tx.
  25.             Sino
  26.                 // Ext Long Num.
  27.         Sino
  28.             // Ext Long Tx.
  29.     Sino si se puede describir con una lista
  30.         Si usa números
  31.             Si usa números decimales
  32.                 Si usa texto
  33.                     // List Long Dec y Tx.
  34.                 Sino
  35.                     // List Long Dec.
  36.             Sino si usa texto
  37.                 // List Long Num y Tx.
  38.             Sino
  39.                 // List Long Num.
  40.         Sino
  41.             // List Long Tx.
  42. Sino si se puede describir sin acción o sin variables de situación
  43.     Si se puede describir sin listas ni variables externas al problema
  44.         // Si se requiere una ecuación puede que sea un subproblema
  45.         // Simplest
  46.     Sino si se puede describir con variables externas al problema
  47.         // Ext Simplest
  48.     Sino si se puede describir con una lista
  49.         // List Simplest
  50. Sino si se puede describir sin listas ni variables externas al problema
  51.     // Si se requiere una ecuación puede que sea un subproblema
  52.     // One
  53. Sino si se puede describir con variables externas al problema
  54.     // Ext One
  55. Sino si se puede describir con una lista
  56.     // List One
Sin duda puede y debe perfeccionarse, pero bueno, escrito es lo mejor que tengo por ahora (en mi mente no diría que está escrito, pero si lo está, lo que hay aún no lo pude leer xP ).

Lo de los decimales lo debo quitar, porque en realidad la diferencia es que requiere una variable extra (Precisión) y lo demás debe ajustarse manualmente, así que en principio no hay mucha diferencia que sea útil tener preestablecida. Más que versiones, para algunos casos necesito estrategias o subalgoritmos.

Como se ve, el que haya números o textos sólo importa si el problema requiere más de una acción para resolverse. ¿Qué significa eso?
Ejemplo de problema solucionable en 1 acción:
Tu rival tiene 500 HP, debes reducirlos a 0 o menos y dispones de 3 ataques:
1- Magia de fuego, que le quita 250
2- Magia de rayo, que le quita 125
3- Magia de hielo, que le quita 500
Podría agregar posibles ataques pero está claro que el problema puede solucionarse en 1 acción, 1 ataque.
Para estos problemas hice este diagrama:

...pero fue antes de haber hecho el "algoritmo" de arriba, es decir, este tipo de problemas se dividen en 2 y quizá otros (debo ver el algoritmo, no lo sé de memoria): Los que requieren definir situación y acciones y los que sólo una de ellas.

Para los problemas que requieren más de una acción no tengo un diagrama en pc, pero sí lo tengo, e igual que no lo postee es otro tema. Aclaro por las dudas.

Si lo que dije les resultó basura quizá esto les guste más (no es mío):
http://www.eumed.net/libros-gratis/2007a/257/3.3.htm
http://www.tiposde.org/escolares/512...-de-problemas/
...pero a mí no me sirvió de mucho, creo.

En cuanto al problema planteado, he estado ajustando mi cabeza, o esperando que se ajuste, a este tema de la necesidad de usar variables externas (*) o una lista. Por cierto olvidé explicar eso, pero más o menos se entiende. En este caso me pidieron analizar una lista (o dos, debo pensar en eso) que más o menos puede describirse a partir de poco, de 3 variables y un algoritmo ¿no? Pero ¿qué pasa si me piden que analice una lista de nombres que no tiene sentido o lógica aparente? Es más complicado. Bueno, anduve pensando un poco en estas cosas.

(*): En posts anteriores las llamé internas, ahora externas. Al decir internas me refería a que son parte del programa pero no del problema, es decir, son externas al problema. Actualmente me decidí por llamarle externas, creo que queda más claro.

Saludos.
__________________
"No se puede borrar hasta", PHPeros.
  #9 (permalink)  
Antiguo 10/10/2015, 23:45
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

No entiendo la lógica de tu pseudocódigo ni las explicaciones que das sobre él. Pero mientras lo hagas funcionar no importa que el resto no sepamos como funciona. Yo no se de coser ni tejer y aún así uso ropa.
  #10 (permalink)  
Antiguo 11/10/2015, 21:14
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Nota: No había entendido el problema. Te averigué si un número de la 1er serie era divisible por algún número primo, pero vos me pediste averiguar si algún número de la 1era lista está en la 2nda.
"1. - Averiguar si algún número de la serie de Fibonacci es un número primo."
Más adelante me corrijo.

Listo, a medias.
Código Frame 1:
Ver original
  1. // SitElms:
  2. // Otros elementos:
  3. E1 = 0;
  4. Act = 1;
  5. Tx = "";
Código Frame 2:
Ver original
  1. // Mod Sit.
  2. E2 = Act+E1;
  3. E1 = Act;
  4. Act = E2;
Código Frame 3:
Ver original
  1. // Sols check
  2. if (Act/2 == Math.floor(Act/2)) {
  3.     // Good Val.
  4.     Tx = Tx + Act +" cumple los requisitos.\n";
  5.     stop ();
  6. } else {
  7.     // Not good Val.
  8.     Tx = Tx + Act +" no cumple los requisitos.\n";
  9.     gotoAndPlay (2);
  10. }
¿Por qué "a medias"?
Porque sólo chequea si es divisible entre 2. Para que chequee más casos tendría que poner más ifs o un loop con variación de los chequeos (eso recién se me ocurrió, antes simplemente pensaba que si entraba a poner ifs yo no iba a terminar, y el programa tampoco). Luego te doy una solución más completa. Pero realmente más allá de esta solución me parece un problema muy interesante, porque es como que no hay una forma ideal de buscar la solución. O sea, puedo elegir un número de la 1er lista y compararlo con cada uno de la 2nda (los primos), cosa que podría nunca acabar salvo que le ponga un límite, pero si le pongo un límite podría no hallar una solución que estuviera más allá de ese límite. Y sino, puedo hacer lo que hice, variar el número de la 1er lista y mantener el de la 2nda, es decir probar siempre si el 1ero (variable) es divisible entre el 2ndo (contante). Me agrada la idea de pensar una forma en que pudiera variar ambos números...
Si tuviese definidas las cosas más claro, como hacen uds, así:
Lista1 = 1, 2, 3, 5, 8, 13...
Lista2 = 2, 3, 5, 7, 11, 13...
...podría ver el asunto más claramente. De hecho se me ocurre una forma:
Tomar un número de una lista2, ver si está en la otra, y sino tomar otro, PERO, eso sería una "solución" rápida, que podría no resultar. Porque la lista 1... espera ¿he entendido mal el problema? Sí, vaya ^^u
Yo te averigué si un número de la 1er serie era divisible por algún número primo, pero vos me pediste averiguar si algún número de la 1era lista está en la 2nda.

1. - Averiguar si algún número de la serie de Fibonacci es un número primo.

Bueno, te cambio la parte del código que hace falta:
Código Frame 3:
Ver original
  1. // Sols check
  2. if (Act == 2) {
  3.     // Good Val.
  4.     Tx = Tx + Act +" cumple los requisitos.\n";
  5.     stop ();
  6. } else {
  7.     // Not good Val.
  8.     Tx = Tx + Act +" no cumple los requisitos.\n";
  9.     gotoAndPlay (2);
  10. }

Qué tonto, sí o sí iba a haber algún número divisible entre un primo XD

En fin. Entonces serviría esa solución que estaba diciendo, y le agrego algunas cosas:
Tomar el nro1 de la lista 1.
Tomar el nro2 de la lista 2.
Si son iguales mostrarlo en pantalla y fin.
Sino ver qué número es menor, y en la lista donde esté tomar el siguiente.
Volver al paso "Si".

Ahora bien, yo quiero solucionarlo usando un método que sirva "siempre", por eso usé el mío. Sería necesario ajustar algunas cosas, tendré que pensar -encima había entendido mal el problema xP -

Sobre mi código:
El problema que planteas no tiene situación, o serían esas listas que, en un caso deduzco mediante variables y en otro caso no he puesto. Aún no soluciono problemas con listas "indeductibles", lo explicaré más adelante.
El punto es que dice SitElms (elementos de la situación) pero luego no hay código; acabo de decir el motivo.
E1 es una variable externa al problema, la nro1.
Act es la acción, en este caso el número que se va a chequear.
Tx es un texto que se muestra en pantalla indicando cómo va la búsqueda.
Frame 2:
Se varía el número a chequear y se conserva el número anterior, para poder hacer la variación que requiere la 1er lista.
Frame 3:
Se chequea que el número analizado cumpla las condiciones establecidas, en este caso ser 2. Como dije, debería chequear más cosas, pero tendré que pensarlo.

---------------------------------------------------
En cuanto a mi método, he reducido a 8 las versiones, aunque creo que irán aumentando según qué tipo de cosas tengan las listas. También terminé la versión que puede manejar números y textos, aunque no la probé.

Lista de versiones:
One:
Para problemas que pueden solucionarse mediante 1 acción y no requieran listas. Puede manejar números y textos, y me atrevo a decir que también permite que las variables cambien su tipo y crear variables.

One List:
No realizada, permitiría trabajar con listas indeductibles o difíciles de deducir.

Long Nums:
Si el problema requiere más de una acción para solucionarse y usa números pero no listas.

Long Txs:
Si el problema requiere más de una acción para solucionarse y usa textos pero no listas.

Long Nums y Txs:
No probada. Si el problema requiere más de una acción para solucionarse y usa números y textos pero no listas.

Long List Nums:
No realizada. Si el problema requiere más de una acción para solucionarse y usa números y listas.

Long List Txs:
No realizada. ...más de una acción para solucionarse... textos y listas.

Long List Nums y Txs:
No realizada. ...más de una acción para solucionarse... números y textos y listas.

El problema que me planteaste sería de tipo One List:, por lo que tardaré en resolverlo.
__________________
"No se puede borrar hasta", PHPeros.
  #11 (permalink)  
Antiguo 12/10/2015, 00:55
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Pues te voy plantear otra versión de ese problema, ya que no me había puesto a pensar en la solución. No me había puesto a pensar en ambas listas y en sus coincidencias. Ahora que los he visto en las listas de tu respuesta veo que la solución "2" o "3" o con números bajitos me parece supersencillo. ¿Y quién va a querer que un programa haga algo que cuesta tan poco como para hacerlo uno mismo? La informática ha de ayudar a hacer cosas que a las personas nos cueste. Yo no querría que me enchufaran un respirador artificial sin necesitarlo. Y por ello esta nueva versión.

Realmente el ejercicio anterior se detiene en la primera coincidencia.

"1. - Averiguar si algún número de la serie de Fibonacci es un número primo."

Así pues... en cuanto el programa diese con el 1º resultado... lo daría y 1 resultado es "algún" resultado.

Y por eso, la nueva versión es:

1.- Averiguar todos los números comprendidos entre el 1 y el 100 de la serie de Fibonacci que son números primos.

Última edición por Kritik; 12/10/2015 a las 01:02
  #12 (permalink)  
Antiguo 12/10/2015, 01:54
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Ok, pero aún no lo solucioné realmente, me tomará tiempo.

He estado pensando en en el tema de las listas, cómo implementarlo. En principio mi idea era crear archivos L1P1.txt, L1P2.txt, etc (L=Lista, P=Parte) cada uno conteniendo el elemento correspondiente de la lista, marcado en el nombre del archivo (de modo que si requiero la variable L1P1 cargo el archivo L1P1.txt). La ventaja de usar archivos en vez de variables es que ocupan menos ram, creo. Luego cambié de idea, porque quise usar cierto método de revisión que idee, y pensé que no se podía o no convenía usarlo con archivos pero ahora lo dudo. En fin, como dije en el post anterior, desde mi punto de vista cuando hacía chequos de las listas sólo podía "variar" elementos de una u otra, entonces tenía chequeos de este orden:
Lista1:___Lista2:
Comparo L1P1 con L2P1
L1P1 con L1P2
L1P1 con L1P3
lo primero no variaba hasta que llegase el límite de lo 2ndo. O al revés, no podía variar amas cosas al mismo tiempo.
Bien, pero idee un método para variar ambas. Sí, probablemente ya existe, pero ese no es el tema.
L1P1 con L2P1
L1P1 con L2P2
L1P2 con L2P1
L1P1 con L2P3
L1P2 con L2P2
L1P3 con L2P1
etc.

Tengo códigos desparramados en una cuadernola y sin mucho sentido porque como dije dependen de si la lista se hace antes de las comparaciones, o durante, y si se generan archivos o no. Me tomará tiempo analizar más o menos cada posibilidad y decidirme por una.
En fin, el código puede que esté mal pero por lo que pensé sería:
Código a:
Ver original
  1. Generar L1P1
  2. Generar L2P1
  3. X=1
  4. MaxX=1
  5. Y=1
  6. Comparar L1PX con L1PY
  7. X--
  8. Si X == 0
  9.    MaxX++
  10.    X=MaxX
  11.    Generar L1PX
  12.    Generar L2PX
  13.    Y=1
  14. sino
  15.    Y--

Por otro lado ¿cómo generar una lista de número primos? Investigué un poco sobre eso. Y ya lo logré o estoy cerca:
Código Frame 1:
Ver original
  1. // Elementos de la lista.
  2. E1 = 2;
  3. // Otros elementos:
  4. M.Es = 1;
  5. // Candidato.
  6. E2 = 2;
  7. M.NextENom = "E"+(M.Es+1);
  8. M.NextE = eval(M.NextENom);
  9. M.Tx = E1+"\n";

Código Frame 2:
Ver original
  1. M.A = 0;
  2. // Siguiente candidato.
  3. M.NextE = M.NextE+1;

Código F3:
Ver original
  1. M.A = M.A+1;
  2. M.B = M.NextE/eval("E"+M.A);
  3. if (M.B == Math.floor(M.B)) {
  4.     // El condicado no sirve, Siguiente.
  5.     gotoAndPlay (2);
  6. }

Código F4:
Ver original
  1. if (M.A < M.Es) {
  2.     // Probar con otro num al candidato.
  3.     gotoAndPlay (3);
  4. }

Código F5:
Ver original
  1. // El candidato se agrega a la lista.
  2. M.Tx = M.Tx + M.NextE + "\n";
  3. set (M.NextENom, M.NextE);
  4. M.Es = M.Es+1;
  5. M.NextENom = "E"+(M.Es+1);
  6. if (M.Es < 10) {
  7.     gotoAndPlay (2);
  8. } else {
  9.     stop ();
  10. }

Pero no tiene mucho sentido, es decir, inicialmente lo pensé como para que fuese el programa o la parte del programa que hiciera las listas, pero como se me complicó empecé a poner comentarios relacionados con el caso específico en vez de algo general. Y los conceptos que usé ahí quizá se contradicen con los que usé en otro sitio, lo siento, es que estoy pensando, no tengo las cosas tan claras. En fin, seguiré y más adelante les paso archivos swf.

Ah, también usé Eureqa para ver cual era la ecuación/función para los primos, pero resultó muy complicada. Me refiero a y en función de x:
x___y
1___2
2___3
3___5
4___7
5___11
__________________
"No se puede borrar hasta", PHPeros.

Última edición por Tachikomaia; 12/10/2015 a las 02:14
  #13 (permalink)  
Antiguo 12/10/2015, 21:16
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 7 años, 3 meses
Puntos: 319
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Cita:
Como se ve, el que haya números o textos sólo importa si el problema requiere más de una acción para resolverse. ¿Qué significa eso?
Ejemplo de problema solucionable en 1 acción:
Tu rival tiene 500 HP, debes reducirlos a 0 o menos y dispones de 3 ataques:
1- Magia de fuego, que le quita 250
2- Magia de rayo, que le quita 125
3- Magia de hielo, que le quita 500
Podría agregar posibles ataques pero está claro que el problema puede solucionarse en 1 acción, 1 ataque.
Para estos problemas hice este diagrama:

...pero fue antes de haber hecho el "algoritmo" de arriba, es decir, este tipo de problemas se dividen en 2 y quizá otros (debo ver el algoritmo, no lo sé de memoria): Los que requieren definir situación y acciones y los que sólo una de ellas.
En estos casos, en vez de romperse la cabeza pensando algoritmos complicados, es mejor cambiar de enfoque y dividir al problema en dos partes: "QUE tiene que resolver" y "COMO tiene que resolverlo", en el paradigma funcional y lógico, el "COMO" lo resuelve la herramienta, mientras que tu solo tienes que definirle "QUE" es lo que hay que hacer.

Ej:
Código Prolog:
Ver original
  1. % Tipos de (magia, daño) en el orden de preferencia.
  2. magic(hielo, 500).
  3. magic(fuego, 250).
  4. magic(rayo,  125).
  5.  
  6. % Realizar ataques.
  7. destroy(HP, Previous, Attacks) :- HP > 0,  % Mientras este vivo.
  8.                                   magic(Type, Damage),  % Seleccionar una magia para usar.
  9.                                   NewHP is HP - Damage,  % Computar daño.
  10.                                   destroy(NewHP, [Type|Previous], Attacks).  % Seguir peleando.
  11.                                  
  12. % Hasta derrotar al objetivo.
  13. destroy(HP, Previous, Previous) :- 0 >= HP.
  14.  
  15. % Sugar.
  16. destroy(HP, Attacks) :- destroy(HP, [], Attacks).

Eso genera todas y cada una de las soluciones posibles al problema:
Cita:
?- destroy(500, Attacks).
Attacks = [hielo] ;
Attacks = [hielo, fuego] ;
Attacks = [fuego, fuego] ;
Attacks = [hielo, rayo, fuego] ;
Attacks = [fuego, rayo, fuego] ;
Attacks = [rayo, rayo, fuego] ;
Attacks = [hielo, rayo] ;
Attacks = [hielo, fuego, rayo] ;
Attacks = [fuego, fuego, rayo] ;
Attacks = [rayo, fuego, rayo] ;
Attacks = [hielo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo] ;
Attacks = [hielo, rayo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo, rayo] ;
Attacks = [rayo, rayo, rayo, rayo] ;
Definir que solo quieres las soluciones que derroten con exactitud a tu adversario (que dejen sus HP en 0 pero no en negativo) es tan simple como:
Código Prolog:
Ver original
  1. % Cambiar esto:
  2. % destroy(HP, Previous, Previous) :- 0 >= HP.
  3. % Por esto:
  4. destroy(0, Previous, Previous).
  5. % Que es lo mismo que esto:
  6. % destroy(HP, Previous, Previous) :- 0 = HP.
En ese caso las soluciones cambian:
Cita:
?- destroy(500, Attacks).
Attacks = [hielo] ;
Attacks = [fuego, fuego] ;
Attacks = [rayo, rayo, fuego] ;
Attacks = [rayo, fuego, rayo] ;
Attacks = [fuego, rayo, rayo] ;
Attacks = [rayo, rayo, rayo, rayo] ;
Si la consiga es destruirlo en hasta N ataques, donde N > 0, entonces podemos definir la logica de esta forma:
Código Prolog:
Ver original
  1. % Tipos de (magia, daño) en el orden de preferencia.
  2. magic(hielo, 500).
  3. magic(fuego, 250).
  4. magic(rayo,  125).
  5.  
  6. % Realizar ataques.
  7. destroy(HP, Number, Previous, Attacks) :- HP > 0,                           % Mientras este vivo.
  8.                                   length(Previous, Length),                 % Contar ataques realizados.
  9.                                   Length < Number,                          % Hay ataques disponibles.
  10.                                   magic(Type, Damage),                      % Seleccionar una magia para usar.
  11.                                   NewHP is HP - Damage,                     % Computar daño.
  12.                                   destroy(NewHP, Number, [Type|Previous], Attacks). % Seguir peleando.
  13.                                  
  14. % Hasta derrotar al objetivo.
  15. destroy(HP, Number, Previous, Previous) :- 0 >= HP.
  16.  
  17. % Sugar.
  18. destroy(HP, Number, Attacks) :- destroy(HP, Number, [], Attacks).

Podemos ver que:
Cita:
?- destroy(500, 1, Attacks).
Attacks = [hielo] ;

?- destroy(500, 2, Attacks).
Attacks = [hielo] ;
Attacks = [hielo, fuego] ;
Attacks = [fuego, fuego] ;
Attacks = [hielo, rayo] ;

?- destroy(500, 3, Attacks).
Attacks = [hielo] ;
Attacks = [hielo, fuego] ;
Attacks = [fuego, fuego] ;
Attacks = [hielo, rayo, fuego] ;
Attacks = [fuego, rayo, fuego] ;
Attacks = [rayo, rayo, fuego] ;
Attacks = [hielo, rayo] ;
Attacks = [hielo, fuego, rayo] ;
Attacks = [fuego, fuego, rayo] ;
Attacks = [rayo, fuego, rayo] ;
Attacks = [hielo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo] ;

?- destroy(500, 4, Attacks).
Attacks = [hielo] ;
Attacks = [hielo, fuego] ;
Attacks = [fuego, fuego] ;
Attacks = [hielo, rayo, fuego] ;
Attacks = [fuego, rayo, fuego] ;
Attacks = [rayo, rayo, fuego] ;
Attacks = [hielo, rayo] ;
Attacks = [hielo, fuego, rayo] ;
Attacks = [fuego, fuego, rayo] ;
Attacks = [rayo, fuego, rayo] ;
Attacks = [hielo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo] ;
Attacks = [hielo, rayo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo, rayo] ;
Attacks = [rayo, rayo, rayo, rayo] ;
Si lo que queremos es derrotarlo exactamente en N ataques, con N > 0, entonces lo que debemos modificar es:
Código Prolog:
Ver original
  1. % Cambiar esto:
  2. % destroy(HP, Number, Previous, Previous) :- 0 >= HP.
  3. % Por esto:
  4. destroy(HP, Number, Previous, Previous) :- 0 >= HP, length(Previous, Length), Length = Number.
Obteniendo así:
Cita:
?- destroy(500, 1, Attacks).
Attacks = [hielo] ;

?- destroy(500, 2, Attacks).
Attacks = [hielo, fuego] ;
Attacks = [fuego, fuego] ;
Attacks = [hielo, rayo] ;

?- destroy(500, 3, Attacks).
Attacks = [hielo, rayo, fuego] ;
Attacks = [fuego, rayo, fuego] ;
Attacks = [rayo, rayo, fuego] ;
Attacks = [hielo, fuego, rayo] ;
Attacks = [fuego, fuego, rayo] ;
Attacks = [rayo, fuego, rayo] ;
Attacks = [hielo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo] ;

?- destroy(500, 4, Attacks).
Attacks = [hielo, rayo, rayo, rayo] ;
Attacks = [fuego, rayo, rayo, rayo] ;
Attacks = [rayo, rayo, rayo, rayo] ;

?- destroy(500, 5, Attacks).
false.
Como veras, viendo el mismo problema desde diferentes ángulos hay diferentes soluciones.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #14 (permalink)  
Antiguo 16/10/2015, 12:00
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Cita:
Iniciado por NSD Ver Mensaje
En estos casos, en vez de romperse la cabeza pensando algoritmos complicados, es mejor cambiar de enfoque y dividir al problema en dos partes: "QUE tiene que resolver" y "COMO tiene que resolverlo", en el paradigma funcional y lógico, el "COMO" lo resuelve la herramienta, mientras que tu solo tienes que definirle "QUE" es lo que hay que hacer.
Eso es lo que hago pero en el tipo de lenguaje que entiendo, en el que dices parece que se escribiera mucho menos sí (aunque para mí es más complicado). Yo describo la situación inicial, el objetivo y las acciones posibles, y pues "pido" que me diga con qué acción logro el objetivo, cómo logro el objetivo.

PD: Usar hielo simplemente debería solucionar el problema, alguna falla hay por ahí porque en la lista que pusiste dice también hielo y fuego, cuando habiendo usando hielo ya debería haberse solucionado.

--------------------------------------------------------------------------------

Bien, yo no hice los ejercicios aún, el tiempo que dediqué a esto (que por ahora no podrá ser mucho) fue sobre analizar qué tipos de problema hay. No creo que el ejercicio que debo sea tan complicado, pero es bastante diferente de lo que hacía y me ha costado entender en qué.

Aproximación de lo que serían "las variables de un problema":
- Qué elementos se analizan: Los de una función o lista, o más de una.
- Qué expresan los elementos: Acciones (entonces implica situación inicial) o respuestas o "nada".
- Complejidad de las condiciones.
- Hasta cuando se analiza.
- Qué respuestas se dan y en qué condiciones.


En los ejercicios que yo hacía:
Ejemplo: Tienes 1 litro debes tener 10, acciones disponibles: 1) Agregar 1 litro, 2) Agregar 2 litros.
- Los elementos que se analizan están en una función (sencilla, algo como Act+1 partiendo de Act=1).
- Expresan acciones (de aplicación sencilla como modificar una variable; la situación inicial también sencilla, bien definida).
- Las condiciones son simples (por ejemplo Litros=>10, nada de "hallar el mayor resultado posible", ni "que haya X elementos en la lista que cumplan la condición").
- Se analiza hasta encontrar alguna solución.
- Se da una respuesta, cuando se cumple el objetivo que se pide. Si se requiere más de una acción se dicen todas las requeridas, pero en definitiva es una respuesta, en un caso.

En el ejercicio de aquí:
Averiguar todos los números comprendidos entre el 1 y el 100 de la serie de Fibonacci que son números primos.
- Los elementos que se analizan están en una función (no muy complicada, pero para que sea sencilla, por lo que sé, requiere crear una variable que no es parte del problema).
- Expresan nada.
- Las condiciones son complejas (para averiguar si un número es primo, que yo sepa, no existe una única condición con la cual pueda expresarse, más bien hay que hacer divisiones y en lo posible sólo usando ciertos números, que conforman una lista que no se puede hacer a modo de función)
- Se analiza cada elemento de la lista.
- La cuestión de la respuesta es similar, pero hay que crear una lista de un modo que yo no hacía.

De hecho, como en las condiciones es como si se creara una lista, que será usada en muchos casos, entonces es como si el problema exigiera analizar una lista no simplemente una función (ver "-" 1ero).

Ambos problemas pueden expresarse con la idea de que se quiere pasar de una situación a otra y hay acciones posibles. En el 2ndo caso la situación sería "no tengo la lista de...", habría que pasar a tenerla, y las acciones posibles podrían ser, listas, o números que han de agregarse, pero más que problema para mí parece una duda que requiere una respuesta, lo de acciones parece marear la perdiz ¿no creen? Bueno pero yo intentaba ver al asunto como algo de acciones.

Tened un poco de más paciencia, lo siento.
__________________
"No se puede borrar hasta", PHPeros.
  #15 (permalink)  
Antiguo 16/10/2015, 12:31
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.328
Antigüedad: 11 años, 7 meses
Puntos: 606
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Creo que antes tendrías que conocer los principios básicos de la programación y la algoritmia antes te plantearte problemas que no sabes ni como expresar (entonces como quieres abstraerte para plantear una solución "programable"?).
__________________
Aviso: No se resuelven dudas por MP!
  #16 (permalink)  
Antiguo 16/10/2015, 20:07
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

He googleado y leí hasta donde vi que decían tipos de variable. Lo único que me pareció útil para mí en este momento fue lo de "una instrucción de alto nivel implicará un programa de bajo nivel"
http://magmax.org/blog/principios-ba...-programacion/
así que, mejor dime cual/es crees que me sería/n útil/es. Gracias.
__________________
"No se puede borrar hasta", PHPeros.
  #17 (permalink)  
Antiguo 17/10/2015, 02:11
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.328
Antigüedad: 11 años, 7 meses
Puntos: 606
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

En coursera, edx y similares tienes cursos de iniciación a la programación (creo que uno de ellos incluso era en python, que era el lenguaje que ultimamente estabas usando). Dales un vistazo.

Y cuando digo "aprender a programar", no se trata de saber que es un bucle for o while y sus sintaxis, sino saber lo mínimo de algoritmia para empezar a resolver los problemas básicos.
__________________
Aviso: No se resuelven dudas por MP!
  #18 (permalink)  
Antiguo 17/10/2015, 09:15
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Programación desde cero, Lenguajes y tipos.
  #19 (permalink)  
Antiguo 17/10/2015, 12:58
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.328
Antigüedad: 11 años, 7 meses
Puntos: 606
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Yo me refería a cursos serios.
__________________
Aviso: No se resuelven dudas por MP!
  #20 (permalink)  
Antiguo 17/10/2015, 20:40
Avatar de Tachikomaia  
Fecha de Ingreso: agosto-2011
Mensajes: 403
Antigüedad: 8 años
Puntos: 5
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Esto parece de pago:
https://es.coursera.org/specializations/python
Repito, por favor define con más claridad a qué te refieres.
__________________
"No se puede borrar hasta", PHPeros.
  #21 (permalink)  
Antiguo 18/10/2015, 04:00
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Los cursos avanzados son más "serios" que los cursos de principiantes. Sin embargo esos cursos "serios" no son más que unos garabatos ilegibles para un principiante.

Hay gente que pretendiendo tener una actitud instructiva de alta calidad pierde la capacidad de comunicación con el mundo. Y solo le queda la capacidad de comunicación con una muy pequeña franja de este mundo, que casualmente sabe tanto que no necesita ser instruida.

El curso que yo he indicado puede "no ser serio". Pero si es entendible para todo el mundo. Y quizá a los que saben mucho no ayude. Pero eso no significa que no vaya a ayudar a nadie.
  #22 (permalink)  
Antiguo 18/10/2015, 04:08
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 7 años, 4 meses
Puntos: 31
Respuesta: Reto/favor: Plantead problemas sencillos que no pueda resolver.

Cita:
Iniciado por Malenko Ver Mensaje
Yo me refería a cursos serios.
Eso es una opinión muy respetable.

Etiquetas: programa, sencillos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:04.