Foro SofosAgora

Foro abierto a los intereses de sus usuarios. Debate, aprende y diviértete.
Fecha actual 16 Oct 2018, 01:28

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 27 mensajes ]  Ir a página Anterior  1, 2, 3
Autor Mensaje
NotaPublicado: 15 Abr 2018, 15:56 
Desconectado
Avatar de Usuario

Registrado: 10 Jun 2011, 21:52
Mensajes: 4490
He hecho esto para los dos para que veáis que los IDEs online son útiles:

https://ideone.com/QGahg8

No sé si tendrá fecha de caducidad, así que lo copio aquí:

Código:
resolve = lambda a, b: [(a[0], b[1])] if a[1] == b[0] else []
 
def isconsistent(inequations):
  pending = inequations[:]
  done = []
  hashes = set()
  while pending:
    c = pending.pop()
    if c[0] == c[1]:
      return False
    for i in done:
      n = resolve(c, i) + resolve(i, c)
      for e in n:
        h = "%s<%s"%e
        if h in hashes:
          continue
        hashes.add(h)
        pending.append(e)
    done.append(c)
  return True
 
print(isconsistent([("A", "B"), ("B", "C"), ("C", "D")]))
print(isconsistent([("A", "B"), ("B", "C"), ("C", "A")]))


En las tuplas que se pasan se entiende que está el símbolo '<'.

PD: https://ideone.com/Sv2IVz más breve:

Código:
res = lambda a, b: [(a[i], b[(i+1)%2]) for i in [0,1] if a[(i+1)%2] == b[i]]

def isconsistent(inequations):
  pending, done, hashes = [inequations[:], [], set()]
  while pending:
    p = pending.pop()
    if p[0] == p[1]:
      return False
    for n in (n for d in done for n in res(p, d) if "%s<%s"%n not in hashes):
      hashes.add("%s<%s"%n)
      pending.append(n)
    done.append(p)
  return True

print(isconsistent([("A", "B"), ("B", "C"), ("C", "D")]))
print(isconsistent([("A", "B"), ("B", "C"), ("C", "A")]))


Y con esto se terminó el fin de semana :(

_________________
Spoiler: show
Imagen


Arriba
 Perfil  
Responder citando  
NotaPublicado: 20 Abr 2018, 11:51 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 8464
No hice mucho, pero acabo de terminar el generador de condiciones al azar. No es la solución del tema, sólo algo relacionado que me aburría terminar.
Spoiler: show
Código:
Lets = "CVF";
Cs = 0;
Vs = 0;
Fs = 0;
Conds = 0;
function CondXValYPart () {
   LetCant_Refonly = Let+"s";
   LetCant = eval(LetCant_Refonly);
   LetCantplus1 = LetCant+1;
   LetNum = random(LetCantplus1)+1;
}
function LetIncr () {
   if (LetCant<=LetNum) {
      set (LetCant_Refonly, LetCantplus1);
   }
}
do {
   Conds = Conds+1;
   // Val1
   Let = Lets.charAt(random(3));
   CondXValYPart();
   CondXVal1 = Let+LetNum;
   set ("Cond"+Conds+"Val1", CondXVal1);
   LetIncr();
   // Val2
   do {
      if (Let != "F") {
         Let = Lets.charAt(random(3));
      } else {
         Let = Lets.charAt(random(2));
      }
      CondXValYPart();
      CondXVal2 = Let+LetNum;
      set ("Cond"+Conds+"Val2", CondXVal2);
   } while (CondXVal1 == CondXVal2);
   LetIncr();
   trace (CondXVal1+" < "+CondXVal2);
} while (Conds < 5);
stop ();
Pensé que podría tardarse mucho en terminar el do while si cambio el 5 por 1000 por ejemplo, pero no, funciona rápido.

Creo que algunas relaciones pueden repetirse de forma inversa, por ejemplo C1<C2 y C2<C1. Veré qué hago... pero no aún (4).
1- Desarrollar la solución que tengo en mente para este tema.
2- Desarrollar la solución que me dijo martesk.
3- Continuar leyendo sus respuestas e intentar aplicar vuestras soluciones.

See ya.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 03 May 2018, 19:47 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 8464
Creo que mi método no sirve.

Spoiler: show
Lo codifiqué. Creo que bien, por eso digo que es el método en sí el que no sirve, no la forma conque lo codifiqué.
Código:
Lets = "CVF";
Cs = 0;
Vs = 0;
Fs = 0;
Vars = 0;
Conds = 0;
do {
   Conds = Conds+1;
   do {
      NewVars = 0;
      LastNewVar = 0;
      // Var 1.
      Let1 = Lets.charAt(random(3));
      Let1s = eval(Let1+"s");
      Num1 = random(Let1s+1)+1;
      Val1 = Let1+Num1;
      if (Let1s<Num1) {
         Let1s = Let1s+1;
         NewVars = NewVars+1;
         LastNewVar = 1;
         EvaledVal1 = Vars+NewVars;
      } else {
         EvaledVal1 = eval(Val1);
      }
      // Val 2.
      if (Let1 != "F") {
         Let2 = Lets.charAt(random(3));
      } else {
         Let2 = Lets.charAt(random(2));
      }
      Let2s = eval(Let2+"s");
      Num2 = random(Let2s+1)+1;
      Val2 = Let2+Num2;
      if (Let2s<Num2) {
         Let2s = Let2s+1;
         NewVars = NewVars+1;
         LastNewVar = 2;
         EvaledVal2 = Vars+NewVars;
      } else {
         EvaledVal2 = eval(Val2);
      }
   } while (Val1 == Val2);
   // Crear las conds.
   set ("Cond"+Conds+"Val1", Val1);
   set ("Cond"+Conds+"Val2", Val2);
   trace (Val1+" < "+Val2);
   // Actualizar ss, valores y posiciones.
   if (NewVars == 2) {
      Vars = Vars+1;
      set (Let1+"s", Let1s);
      set (Val1, Vars);
      set ("P"+Vars, Val1);
      Vars = Vars+1;
      set (Let2+"s", Let2s);
      set (Val2, Vars);
      set ("P"+Vars, Val2);
   } else if (NewVars == 1) {
      if (LastNewVar == 2) {
         Vars = Vars+1;
         set (Let2+"s", Let2s);
         set (Val2, Vars);
         set ("P"+Vars, Val2);
      } else {
         Vars = Vars+1;
         set (Let1+"s", Let1s);
         set (Val1, Vars);
         set ("P"+Vars, Val1);
      }
   }
   if (EvaledVal2<EvaledVal1) {
      while (EvaledVal2<EvaledVal1) {
         // Ajustar valores y posiciones.
         set ("P"+EvaledVal1, eval("P"+(EvaledVal1-1)));
         set (eval("P"+EvaledVal1), EvaledVal1);
         EvaledVal1 = EvaledVal1-1;
      }
      set ("P"+EvaledVal1, Val1);
      set (Val1, EvaledVal1);
   }
} while (Conds<5);
N = 0;
do {
   N = N+1;
   if ( eval(eval("Cond"+N+"Val2")) <= eval(eval("Cond"+N+"Val1")) ) {
      trace ("Contradicción en "+ eval("Cond"+N+"Val1") + " y " + eval("Cond"+N+"Val2"));
   }
} while (N<Conds);
stop ();


Especificamente lo que no sirve es esto:
Código:
   if (EvaledVal2<EvaledVal1) {
      while (EvaledVal2<EvaledVal1) {
         // Ajustar valores y posiciones.
         set ("P"+EvaledVal1, eval("P"+(EvaledVal1-1)));
         set (eval("P"+EvaledVal1), EvaledVal1);
         EvaledVal1 = EvaledVal1-1;
      }
      set ("P"+EvaledVal1, Val1);
      set (Val1, EvaledVal1);
   }

Cuando se crea una variable, se le asigna un valor y una posición en una lista donde estarían ordenadas de menor a mayor. Digo estarían porque en el momento en que son creadas, las nuevas están en último lugar. Ahora es cuando se aplica el fragmento del código.

Supongamos que tenemos.

// Condiciones.
F1 < V1
V2 < F2
C1 < F2
// Valores.
F1 = 1
V1 = 2
V2 = 3
F2 = 4
C1 = 5
// Posiciones:
P1 = "F1"
P2 = "V1"
P3 = "V2"
P4 = "F2"
P5 = "C1"

Cuando se crea una condición con una variable que no es nueva (F2 en este caso), puede suceder que la variable de la derecha sea menor o igual que la de la izquierda, cosa que sería una contradicción.
¿C1 < F2?
No, 5 no < 4.
A partir de ahora, mientras exista ese error, las variables que estén antes de la que necesita ser reducida, serán aumentadas, así como sus posiciones.
Queda así:
// Valores.
F1 = 1
V1 = 2
V2 = 3
C1 = 4
F2 = 5
// Posiciones:
P1 = "F1"
P2 = "V1"
P3 = "V2"
P4 = "C1"
P5 = "F2"

Agregamos otra condición:
V2 < C2
En este caso no hay problema, simplemente ponemos C2 al final:
C2 = 6
P6 = "C2"

Última condición:
C2 < V1
Según mi método habría que mover C2 hasta que quede menor que V1. Así:
// Valores.
F1 = 1
C2 = 2
V1 = 3
V2 = 4
C1 = 5
F2 = 6
// Posiciones:
P1 = "F1"
P2 = "C2"
P3 = "V1"
P4 = "V2"
P5 = "C1"
P6 = "F2"

Luego se aplicaría esto:
N = 0;
do {
N = N+1;
if ( eval(eval("Cond"+N+"Val2")) <= eval(eval("Cond"+N+"Val1")) ) {
trace ("Contradicción en "+ eval("Cond"+N+"Val1") + " y " + eval("Cond"+N+"Val2"));
}
} while (N<Conds);

Revisa que las condiciones se cumplan y avisa en caso de que no.
F1 < V1: 1 < 3
V2 < F2: 4 < 6
C1 < F2: 2 < 6
V2 < C2: 4 no < 2

O sea, detecta una contradicción, pero según he visto en realidad podría no haberla si los valores hubieran sido asignados mejor. Ejemplo:
F1 = 0
V2 = 0
C1 = 0
F2 = 1
C2 = 1
V1 = 2

F1 < V1: 0 < 2
V2 < F2: 0 < 1
C1 < F2: 0 < 1
V2 < C2: 0 < 1
C2 < V1: 1 < 2

Los valores que puse iguales en realidad no importa si lo son o no. Podría ser por ejemplo:
F1 = 1
V2 = 2
C1 = 3
F2 = 4
C2 = 5
V1 = 6

El valor podría ser calculado en base a quienes tiene delante. Por ejemplo V1 nunca fue > qiue otro, o sea que 0 estaría bien.

Pero bueno,
es tiempo de intentar usar vuestros métodos.

El de martesk lo voy a dejar para más adelante ya que no tiene código, de momento no me parece fácil de aplicar.

Por ahora sólo diré que no entiendo vuestros códigos, pero más adelante diré especificamente qué cosas y las googlearé a ver si así lo averiguo.

Saludos.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 04 May 2018, 03:58 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 8464
Mustafá Mond escribió:
Tachikomaia escribió:
Acá es donde está el error que no vimos, creo.

¿Qué pasaría si los 2 1eros resultados fuesen A<B y B<C?
Que C<A daría una contradicción, pero tu método, que yo sepa, no lo vería.



Tienes razón. Muy bien visto.

Necesitas cambiar el algoritmo para que cada vez que actualices la tabla de la verdad no solo modifique la fila y columna actuales, sino que la recorra recursivamente.

Pero eso no es eficiente.
A estas alturas me importa poco la eficiencia ^^u

Pero no entiendo a qué te refieres.

Sale A<B
Lo pongo en la tabla.
Sale B<C
Lo pongo. No sé cómo sería modificar todas las "celdas" necesarias ¿cómo se haría eso? ¿cuando sí y cuando no?

Citar:
¿Y si lo planteamos al revés?:
Primero generamos todas las variables implicadas en orden aleatorio,
y posteriormente generamos algunas sentencias correspondientes a ese orden.
¿Te refieres a 1ero darles valores y luego en base a ellos ver cuales son las relaciones? Buena idea
Imagen

Pensar que había leído esto y no lo había entendido. De hecho no estoy seguro de entenderlo, pero si es lo que interpreté, me gustó.

El código no lo entiendo ni a palos. Yo sé lo básico, digamos QBASIC, más especificamente action script 1.0 (o una versión más vieja, la que está en Macromedia (no Adobe) Flash 5), pero es casi lo mismo:
- Definir variables
- ifs, else if, else
- do while, while
- eval

No mucho más allá de acciones especificas de AS que no vienen al caso. Funciones y poco y nada de arrays y for.

Código:
        static void Main(string[] args)
        {
Estas cosas no sé si puedo obviarlas o no. Nunca usé este tipo de cosas.

Código:
            // buffer resultado.
            StringBuilder sb = new StringBuilder();
Acá estás creando una variable relacionada con strings pero no sé si es un string normal o qué.

Si te fijas en mis códigos yo nunca las creo sin valor, en el lenguaje que uso no es necesario, se les pone el valor directamente (de hecho en QBASIC las de texto se creaban con LET$ creo y los números con LET, pero en AS se crean siempre igual :mrgreen: salvo que quieras que el nombre sea variable, caso en que se usa set, puedes ver ejemplos en mi código).

Código:
            // colección de las n variables implicadas.
            List<char> entities = "ABCDEFGHIJKLMNOPQRST".ToCharArray().ToList();
Entiendo que estás diciendo cuales son los posibles nombres, tal vez, pero no entiendo esas palabras varias que pones. List, <char>, entities...

En fin. ¿Puede ser un pseudocódigo?

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 04 May 2018, 08:52 
Desconectado
Avatar de Usuario

Registrado: 03 Ene 2018, 17:00
Mensajes: 302
Hola Tachikomaia,

Programar es programar. El lenguaje es lo de menos.
Elegí ejemplificar el algoritmo en C# porque es un lenguaje fácil con el que mucha gente está familiarizado.

1) Genero una secuencia aleatoriamente desordenada de nombres de variables M, A, F, C, B, D, T, etc.
Nota 1: no creo las variables en sí, sino solo su nombre.
Mételas en algún tipo de colección (List, Array, lo que sea: DIM entities(20) as STRING).
Nota 2: no les doy un valor (claro, no he creado las variables), pero establezco que cuanto más bajo es su índice en el array, más bajo es su valor.
De forma que M < A < F < C < B < D < T, etc.

2) Después genero dos índices al azar (ej: 5 y 3), cojo sus variables (D y C), y como 5 > 3 entonces D > C (solo tengo que aplicar a las variables la misma desiguadad que cumplen los índices generados al azar).
Y así generamos tantas condiciones verdaderas como queramos.

PD 1) No estoy familiarizado con la sintaxis de algo tan de los 70's como el QBASIC. Pero la idea es la misma.

PD 2) StringBuilder es un buffer de string. Sirve para ir anexando pedazos de texto a una cadena. Casi todos los lenguajes implementan un buffer parecido.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 04 May 2018, 16:28 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 8464
Mustafá Mond escribió:
Hola Tachikomaia,

Programar es programar. El lenguaje es lo de menos.
Pienso más o menos lo mismo, pero el lenguaje importa a la hora de que yo entienda lo que leo.

Bueno te entendí bastante bien entonces. La solución que diste es fácilmente extendible a otro tipo de relaciones (<=, etc). Genial.

Citar:
PD 1) No estoy familiarizado con la sintaxis de algo tan de los 70's como el QBASIC. Pero la idea es la misma.
Ni yo... pero según recuerdo, es más simple que C#.

Citar:
PD 2) StringBuilder es un buffer de string. Sirve para ir anexando pedazos de texto a una cadena. Casi todos los lenguajes implementan un buffer parecido.
No sé dónde he visto la palabra buffer, pero no estoy familiarizado con ella. Según esto
https://es.wikipedia.org/wiki/B%C3%BAfer_de_datos
Se trataría de la clásica variable. Pero parece que soy el único que ha hecho la pregunta...
https://www.google.com.uy/search?newwindow=1&rlz=1C1_____esUY472UY472&ei=XmvsWsqEJcKOwgTm0q7gCA&q=difference+between+buffer+and+variable&oq=difference+between+buffer+and+var&gs_l=psy-ab.3.0.33i160k1l4.193161.213760.0.215537.29.23.3.3.3.0.243.3520.1j16j4.21.0....0...1c.1.64.psy-ab..2.27.3591...0j35i39k1j0i131k1j0i67k1j0i20i263k1j0i10k1j0i10i203k1j0i203k1j0i22i10i30k1j0i22i30k1.0.z9eYSHHJzdw

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 06 May 2018, 08:50 
Desconectado
Avatar de Usuario

Registrado: 03 Ene 2018, 17:00
Mensajes: 302
Tachikomaia escribió:
Se trataría de la clásica variable. Pero parece que soy el único que ha hecho la pregunta...


Hola Tachikomaia,

Buffer es sinónimo de almacenamiento intermedio.

Hablando coloquialmente,
si tú defines una variable que nunca cambia (var PI = 3.14) la estás usando como constante,
si la defines para recoger un dato (var keypressed = <user input>) la estás usando como variable de datos,
y si la defines para ir sumando cachitos de datos que te llegan, la estás usando como buffer:


Código:
var buffer = ""

for ...
var keypressed = <user input>
buffer = buffer + keypressed
endfor

var message = buffer


Son ejemplos de buffer la memoria donde una calculadora almacena las cifras que vas pulsando hasta que completas el número que querías introducir, la memoria donde tu smartTV almacena los diez segundo siguientes de película (si te la mostrase tal como sale del stream de internet se cortaría constantemente), o en nuestro caso la variable donde vamos concatenando las inecuaciones que vamos generando.

Los lenguajes introducen algún tipo de StringBuffer porque el objeto string suele ser inmutable en memoria.
En realidad para el programador no tiene relevancia. Es tarea del compilador interpretar esto.

PD: anímate con otros lenguajes que son muy sencillos, como el c#, java, etc. Se aprenden muy rápido y tienen gran salida laboral.


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 27 mensajes ]  Ir a página Anterior  1, 2, 3

Todos los horarios son UTC + 1 hora [ DST ]


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
POWERED_BY
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO