Juego: problemas de lógica/ingenio

Rayalz

#179 Esto queda paginas atras xD

#146 Despues de darle vueltas, mueren todos.

Todos tienen cancer
Todos saben quien tiene cancer (pero no saben si ellos mismos lo tienen)
"Al menos uno tiene cancer"
La gente sabe que de 99, los otros 98 tienen cancer. Ergo, al menos 1, se imaginara que es el mismo (pasa igual con todos) y todos se matan.

Eyvindur

Yo sigo sin entender una cosa en el de los pimientos xD.

Hacéis una lista tal que esta:

spoiler

En lugar de una tipo:

spoiler

Y descartando los resultados iguales. Esa serían las posibles opciones de edad del hijo.

Hasta donde me alcanza, salen más combinaciones que esas 7.

1 respuesta
Hipnos

#182 El interlocutor sólo puede tener duda en estos casos, ya que son en los que la información de valor distinto puede resultar útil:

1= 1x1
4= 2x2 1x4
9= 3x3
16= 4x4
25= 5x5
36= 6x6
49= 7x7

Del único que puede extraer información con la frase "Tienen distinto valor" es con el 1x4, que le permite diferenciar 2x2 y 1x4.

1 respuesta
Akiramaster

#180 acabo de llegar! :(.

Eyvindur

#183 Vale, necesariamente tiene que ser un cuadrado que se pueda formar con otro par, entiendo.

Akiramaster

#146
El primer día no muere nadie.
El segundo se suicidan todos.

Zerokkk

Os cito #180 #174 ya que me preguntásteis sobre el asunto:

He estado probando para varios casos el mismo algoritmo, y la conclusión que saco es que no es 100% válido, pero su eficacia aumenta exponencialmente según tantos abducidos haya. Aviso para navegantes: cada iteración es una simulación completa del ejercicio. Es decir, los abducidos han llegado a decir la frase.

Para 3 abducidos (1000 iteraciones/output):
ERROR: Hay 316/1000 intentos que han salido mal [68% éxito]
ERROR: Hay 302/1000 intentos que han salido mal [69% éxito]
ERROR: Hay 323/1000 intentos que han salido mal [67% éxito]
ERROR: Hay 301/1000 intentos que han salido mal [69% éxito]
ERROR: Hay 313/1000 intentos que han salido mal [68% éxito]

Para 10 abducidos (1000 iteraciones/output)
ERROR: Hay 10/1000 intentos que han salido mal [98% éxito]
ERROR: Hay 10/1000 intentos que han salido mal [98% éxito]
ERROR: Hay 6/1000 intentos que han salido mal [99% éxito]
ERROR: Hay 5/1000 intentos que han salido mal [99% éxito]
ERROR: Hay 11/1000 intentos que han salido mal [98% éxito]

Para 20 abducidos (1000 iteraciones/output):
Ningún intento de 1000 ha fallado. [100% éxito]
Ningún intento de 1000 ha fallado. [100% éxito]

Y la crema, 15000 simulaciones, que me ha llevado 14 minutos de procesamiento (estoy en un portátil y lo he programado en Java por comodidad, no es de extrañar):
Ningún intento de 15000 ha fallado. [100% éxito]

He hecho una de 1000 para 21 y 22 y lo mismo: ni un sólo error.

No sé si es que hay alguna equivalencia numérica que me estoy saltando, o qué, pero ya en clase hice 2 comprobaciones de 10.000 y como 5 de 1000 para 20 abducidos, y ninguna me dio mal. Pero supongo que será que por estadística, a más abducidos, más dificultad de encontrar un error.

2 respuestas
Hipnos

#187 Pero lo que queremos saber es cómo cuentas más de 4 con una cuenta cíclica, si yo no sé cuánta gente ha sido interrogada antes que yo, o desde mi anterior interrogatorio.

1 respuesta
Zerokkk

#188 Te pego el código, la parte que importa. Como verás me he rallado más de lo que parece, y es algo más complicado de lo que había explicado más atrás. Este es el código, ahora edito y te pongo el dump para 1 simulación para que veas como funciona:

Métodos de contador para la clase Persona:

  public boolean changeCount(){

        contador++;
        System.out.println("Persona "+id+" entrevistada, "+contador+" repeticiones.\n");
        if(checkContador()){
            System.out.println("Todos hemos sido entrevistados\n");
            return true;
        }
        return false;
    }

    public boolean checkContador(){
        boolean var = false;
        if(contador==NUMEROABDUCIDOS && onRepetition==true){
            contador--;
            var = false;
        } else if(contador==NUMEROABDUCIDOS && onRepetition==false){

            var = true;
        }
        return var;
    }

Parte cíclica del programa (ya con la lista creada. Luego después de esto hay métodos de comprobación, pero nada que tenga que ver con el algoritmo en sí:

    while(salida==false){
        
int randnum = r.nextInt(NUMERO); // La constante "NUMERO" es el número de abducidos Persona p = listaPersonas.get(randnum); boolean verified = p.changeCount(); if(verified){ salida = true; } else { if(inter1==false && inter2==false){ if(!p.lastCheck.equals("0/0")){ inter2 = true; System.out.println("\n=> 0/1"); p.lastCheck = "0/1"; }else { if(p.onRepetition){ inter1=false; inter2=true; p.lastCheck = "0/1"; System.out.println("\n=> 0/1 [POR REPETICIÓN]"); p.onRepetition = false; p.contador = p.contador - 1; } else { p.contador = p.contador - 1; p.onRepetition = true; } } } else if (inter1==false && inter2==true) { if(!p.lastCheck.equals("1/1")){ inter1=true; inter2=true; System.out.println("\n=> 1/1"); p.lastCheck = "1/1"; }else { if(p.onRepetition){ inter1=true; inter2=false; p.lastCheck = "1/1"; System.out.println("\n=> 1/1 [POR REPETICIÓN]"); p.onRepetition = false; p.contador = p.contador - 1; } else { p.contador = p.contador - 1; p.onRepetition = true; } } } else if (inter1==true && inter2==true){ if(!p.lastCheck.equals("1/1")){ inter2=false; System.out.println("\n=> 1/0"); p.lastCheck = "1/0"; }else { if(p.onRepetition){ inter1=true; inter2=true; p.lastCheck = "1/0"; System.out.println("\n=> 1/0 [POR REPETICIÓN]"); p.onRepetition = false; p.contador = p.contador - 1; } else { p.contador = p.contador - 1; p.onRepetition = true; } } } else if (inter1==true && inter2==false){ if(!p.lastCheck.equals("1/0")){ inter1=false; inter2=false; System.out.println("\n=> 0/0"); p.lastCheck = "0/0"; }else { if(p.onRepetition){ inter1=false; inter2=false; p.lastCheck = "0/0"; System.out.println("\n=> 0/0 [POR REPETICIÓN]"); p.onRepetition = false; p.contador = p.contador - 1; } else { p.contador = p.contador - 1; p.onRepetition = true; } } } } }

Dump de una simulación normal y corriente:

spoiler
ciza

#187 en mi opinión el algoritmo en si te funciona por simple casualidad, te explico mi punto de vista:

Al final lo que estas haciendo es contar cuantas veces te entrevistan (tomando el camino de si te encuentras el mismo codigo, cuentas alguna mas).

Cuantas mas personas haya es más fácil que funcione ya que digamos que si sois 1000, al menos tienes que pasar 1000 veces por la entrevista. Y siendo totalmente aleatorio, digamos que de media va a haber un número grande de gente pasando por la entrevista entre vez y vez que tu pasas (supón que el proceso aleatorio tiene cierta regularidad y que son 1000 personas entre vez y vez que te entrevistan)

Es decir, estas probando que en 1.000.000 de entrevistas (1000 personas entre cada una de tus 1000 entrevistas) se ha cogido al menos una vez a cada uno. Es normal que con poca gente apenas te funcione, con el tema de la repetición lo único que haces es aumentar la gente que pasa por la entrevista.

A la espera de tu opinión, pero es muy poco riguroso el algoritmo

3 respuestas
forcem

tio si estas en un hospital donde sabes que las 98 personas tienen cancer, tu tienes cancer fijo.
todos muertos.

1
Hipnos

Yo te propongo que simules sin llamar a un individuo, como si los alienígenas estuvieran haciendo trampa y no llaman nunca al número 20.

Si te salen chorros de falsos positivos, ya sabes que tu algoritmo es incorrecto y funciona por pura probabilidad como dice #190

1 respuesta
Zerokkk

#190 #192 Es que afirmaría que es matemáticamente imposible definir un protocolo que tenga un porcentaje de éxito del 100% que cumpla estas características (y si no que venga Duronman y lo demuestre xD), en el cual no sea necesario poner a alguien como "líder" como en la solución principal.

He querido rizar el rizo y por tanto hacer que sí sea posible en una condición todavía peor, que es esa. Y desde luego no es perfecto, ya que hay casos para los que no funciona, pero ya ves que por simple estadística, es casi imposible que se dé otro caso. Quizá si cogemos y hacemos 1 millón de simulaciones encontremos un par de pares de erratas, pero creo que ya es un margen de error tan pequeño, que sigue siendo útil para su propósito.

Obviamente esto es para elecciones aleatorias.

2 respuestas
Hipnos

#193 Claro, pero asumes una distribución de llamada equiprobable para todos. Si los aliens son cabrones y llaman 1 vez al número 20 por cada 1000 a cada uno de los otros, estás jodido.

2 respuestas
ciza

#193 la cuestión es que la opción de lider se contempla. Sin lider el problema nunca es 100% resoluble, pero vamos que decir cuando pase 5*n veces por la prueba suelto la frase funcionaria igual (posiblemente mejor) que lo que describes.

#194 saca otro que aun me queda un rato en el trabajo :clint:

2 respuestas
Hipnos

#195 No lo veo explicado bonito ni con la respuesta final en ningún post. Pero me da que cualquiera que no sea dificultad 9 o 10 va a ser trivial para ti xD

1 respuesta
Zerokkk

#194 Desde luego, esa es una condición obligatoria para su cumplimiento. Pero es que ya lo dice el propio enunciado: Todos van a ser interrogados un número infinito de veces, de forma aleatoria y sin orden aparente. No me baso en aire para decir eso xD.

#195 Créeme que tiene bastante sentido, y de hecho funciona considerablemente mejor que 5*n siendo n el número de abducidos. Párate a echarle un ojo y verás el por qué, que vale que no es 100% riguroso, es una chorrada que he hecho en unos minutos, pero de ahí a decir que no es efectivo para las condiciones dadas, es mucho tirarse a la piscina.

Estadísticamente, si se te presentase este caso, tendrías varias veces más posibilidades de que te caigan dos rayos a lo largo de tu vida que de que saliese mal la jugada. Yo de hecho, sigo sin conseguir que me de una sola simulación mal para n=20, y mira que lo intento :(

2 respuestas
ciza

#197 funciona mejor porque te vas a encontrar el asunto como lo dejaste el 25% de las veces y vas a restar uno, lo cual suma otras tres entrevistas (no suma la repetida, y luego tienes que sumar dos veces) pero bueno al fin y al cabo si queda mejor pon n2. En definitiva, el proceso es por repetición aunque estoy de acuerdo contigo en que si no se puede designar un lider, solo queda esta manera.

#196 yo lo encuentro suficientemente explicado, sin una notación rigurosa pero al fin y al cabo se entiende.

#199 despues de 'n' días se suicidan los 'n' individuos es la solución

Akiramaster

La otra respuesta es que nadie se suicida ya que saben que entre los otros enfermos hay uno (98 más bien) con cáncer, como dice el doctor.

O no muere nadie al saber que otros tienen cancer y no la certeza de tenerlo ellos, o todos se suicidan el segundo día al creer que son ellos el enfermo.

1 respuesta
Nherzogs

#197 Yo se que la respuesta que puse es correcta aunque no la expliqué del todo. Como dije ese problema nos salió en un concurso de lógica y matemáticas de la semana cultural de mi centro, y lo tuve que resolver.
Una vez dados los ganadores, nos enviaron a los participantes las respuestas. Si quieres rebusco por el correo que seguro que aun la tengo por ahí xd

2 respuestas
NeB1

#146 Yo empiezo con la incongruencia de no saber si los pacientes hablan entre sí, y de lo contrario, en qué momento se enteran de que tienen cáncer habitualmente xD

Quitando eso, entiendo un poco lo mismo que #199. No se suicida nadie porque el doctor ha dicho que "almenos hay un enfermo con cancer". Desde el punto de vista de cualquier enfermo, como saben que el resto ya tienen cáncer, la afirmación del médico no tiene porqué afectarles a ellos mismos. Es decir, no se suicidaría en este caso a la mañana siguiente.

Sin embargo, a no ser que sean retrasados, a la mañana del tercer día al ver que nadie se ha suicidado deberían comprender que cada persona en la sala piensa que los demás tienen cancer, y que por tanto están todos enfermos (de lo contrario se hubiesen suicidado 98 personas) y se deberían suicidar todos.

1 respuesta
ciza

#200 se refiere a la del último problema

#201 leete las paginas anteriores. Al menos tomatelo como que solo hay uno o más, no significa nada más alla de eso. Y solo es cuando tienen certeza de tenerlo.

1 respuesta
Zerokkk

#200 Lo sé, lo sé; si lees mis posts verás que digo que fue solo un intento por recrear un protocolo funcional, que al menos fuese válido para el 99,99% de los casos (lo terminó siendo bastante más), para unas condiciones todavía peores: la incapacidad de designar un líder.

1 respuesta
Schindler

Null

Hipnos

Estoy intentando resolver uno de grado altillo para saber si tiene solución y proponéroslo xD

Programando sería más fácil, pero me da pereza ponerme :x

NeB1

#202 Por eso mismo ratificas lo que digo.

El primer día NADIE tiene la certeza de tener cancer. Pues la condición que ha puesto el médico es que

PacientesConCancer >= 1

Lo que sabe cada una de las 99 personas es que:

PacientesConCancer >= 98

Por lo pronto cada uno sabe que sus compañeros tiene cancer y no tiene la certeza de ellos mismos tenerlo. Si el Doctor hubiese dicho que habían 99 enfermos de cáncer, entonces sí que tendrían la certeza de que tienen cancer.

El día siguiente, rectificando lo que había dicho antes, volvería a pasar lo mismo. Cada persona pensaría que el resto no se ha suicidado, porque el resto ha visto que hay almenos una persona con cáncer...

1 1 respuesta
Akiramaster

La respuesta es Soylent Green.

1
autlos

#190 Exacto, su algoritmo juega con la estadística. Por muy aleatorio que sea el orden de elegir para el interrogatorio, el EV, o la media, es que todos sean interrogados el mismo número de veces. A corto plazo (cuando experimenta con pocos abducidos), hay mucha varianza y por eso tiene tanto error su algoritmo. A largo plazo, todo tiende al valor esperado.

#203 Deberías mejorar algunos hábitos a la hora de programar. Como no mezclar variables en castellano con variables en inglés. Usar nombres de variables más intuitivos (no es el caso de interN ni de p), y aunque sólo tengas un contador deberías aclarar qué cuenta (contador_interrogadas). Y quizá un breve comentario de lo que estás comprobando en cada condicional. Para ti ahora mismo es muy legible porque lo acabas de hacer, pero si lo miras dentro de 2 meses te va a aburrir. Estabas haciendo DAM o DAW, ¿no? Eres bueno con los algoritmos, pero también vas a encontrar cierto placer en hacer el código lo más legible posible, aunque tengas la certeza de que sólo lo vas a leer tú xD.

1 1 respuesta
Elektro

Yo estoy con #206 y con otros que piensan similar. No entiendo que cambia que el doctor diga 'Al menos uno tiene cáncer' cuando ellos ya saben que 98 tienen cáncer.

De verdad, no se si está mal detallado el problema o falta alguna premisa. Para más inri, me recuerda muchísimo (por no decir que viene a ser lo mismo) al problema de los monjes y la marca en la frente, solo que ese sí está bien detallado y tiene todo el sentido del mundo, al menos para mí.

Ojo, no digo que lleve razón. De hecho me gustaría que alguien me explicara porque el problema de #146 tiene sentido, porque no se lo veo.

3 1 respuesta
Zerokkk

#208 Tranquilo, sé de sobra cómo programar xD. Este programita tiene ejemplos de malas praxis y malos hábitos a patadas, no sólo los que dices, sino que está mal tabulado, hay cosas que se podrían optimizar bastante, hay como mínimo 5 funciones que se podrían encapsular en métodos, podría trabajar directamente sobre arrays en lugar de ArrayList ya que uso un tamaño de conjunto definido... si lo hice así es para hacerlo rápido y tener más tiempo en pensar el algoritmo, que en la arquitectura del programa en sí. Joder, si hasta los sout son una puta chafallada ilegible xDD.

Acabé DAM e hice prácticas (donde saqué conocimientos de Web), pero ahora estoy con la carrera. Programación siempre se me dio bien y paradójicamente suelo fijarme bastante en el "programar bien", pero cuando hago una chorradita para mí como ahora, lo hago tirando para adelante al tuntún y si necesito una variable verificadora de un paso le pongo "var" y me quedo tan ancho, aún sabiendo que eso es una patada a toda tarea de mantenimiento xDD.

Y sí, la algoritmia (al menos para mí) es lo más bonito de la programación, y pueden salir cosas muy guapas. Y no, esto no es un ejemplo de buen algoritmo, porque primeramente no tiene un análisis lógico detrás xD (de hecho se me ocurre así de primeras una mejora que aumentaría la eficacia aún más), pero como pequeño intento rápido creo que no está mal.