Problema que no sé comor resolver

EnZo

Buenas, estoy haciendo un test para presentarme como candidato a una empresa pero hay un ejercicio que llevo un buen rato intentando resolver y no lo soluciono:

El siguiente trozo de codigo está inflado y tiene logica con callejones sin salida. Usa tu habilidad de programador para corregirlo, reducir el codigo y hacerlo mas legible.
Todas las variables son de tipo booleano.

if (x != y) {
    if (y == x) {
        console.log("violet");
    } else {
        if (x != w && w != z && w != y) {
            console.log("lily");
        } else {
            console.log("snowdrop");
        }
    }
} else {
    if (x == y || x == z) {
        if (x == y && y == z) {
            console.log("rose");
        } else {
            if (y == z) {
                console.log("poppy");
            } else {
                console.log("daffodil");
            }
        }
    } else {
        console.log("bluebell");
    }
}

Lo que llevo hasta ahora (sigue sin ser una solucion y es una mierda, que no os sirva de ejemplo). Sigo intentandolo:

spoiler
B

Solo tienes que ir eliminando condiciones que nunca se cumplen:
Ejemplo:

if (x != y) {
    if (y == x) {
        console.log("violet");
    }

 

El segundo if nunca se cumplirá. El problema es lo suficientemente simple para que no te postee el código completo refactorizado.

1 respuesta
EnZo

#2 Sí, de esa condicion me he dado cuenta al principio, pero si profundizas mas verás que no es tan facil, o almenos para mí. Porque tienes que tener en cuenta que no sabes el valor de las variables que ellos van a probar.

#5 Las apariencias engañan?

2 respuestas
glolg

#3 pero si son de tipo booleano solo pueden ser 0 o 1 por lo tanto con darle un valor a x, por ejemplo x=0, ya resuelves el problema . La incoherencia la podrás ver partiendo de un valor.

B

#3 Todas las variables son de tipo booleano.

Crear una funcion para que te calcule todas las combinaciones lo hace en 2 minutos y puedes comparar respuestas con el original.

#3 son 4 variables w,x,y,z.

Me acuerdo de la pedazo web 3d con javascript que hiciste, me sorprente que tengas problemas con este ejercicio.

1 respuesta
EnZo

Habeis pensado que ellos van a tener una configuracion del tipo:
w=false
x=true
y=false
z=true
-----------> Devuelve violet (xejemplo)
w=true
x=true
y=true
z=false
-----------> Devuelve rose

Y si no lo devuelve bien no vale, no es solo organizar y quitar las comparaciones que no se cumplen. Se vé que soy muy tonto, pero no lo veo tan facil...

B

El 90% de la resoculción del problema es quitar condiciones redundantes. Divide el problema en boques pequeños, empieza por:

if (x != y) {
    if (y == x) {
        console.log("violet");
    } else {
        if (x != w && w != z && w != y) {
            console.log("lily");
        } else {
            console.log("snowdrop");
        }
    }
}

Y luego el else.

Ellos comprobarán todas las combinaciones, supongo que tendrán un script para comparar resultados.

Cuando tienes que presentar el test?, si vas mal de tiempo puedo postear mi solución pero no te va ayudar en nada.

1 respuesta
elkaoD

Si lo he traducido bien a CoffeeScript, para [x, y, z, w] :

[true, true, true, true] = rose
[true, true, true, false] = rose
[true, true, false, true] = daffodil
[true, true, false, false] = daffodil
[true, false, true, true] = snowdrop
[true, false, true, false] = snowdrop
[true, false, false, true] = snowdrop
[true, false, false, false] = snowdrop
[false, true, true, true] = snowdrop
[false, true, true, false] = snowdrop
[false, true, false, true] = snowdrop
[false, true, false, false] = snowdrop
[false, false, true, true] = daffodil
[false, false, true, false] = daffodil
[false, false, false, true] = rose
[false, false, false, false] = rose

2 respuestas
EnZo

#7 Ellos no tienen porque comprobar los 24 posibilidades, tienen sus 7 combinaciones y tienen que darle los resultados correctos en funcion de su combinacion.

No gracias, ese no lo voy a presentar era por curiosidad de si alguien sabe hacerlo. Mañana si quieres das la solucion. Porque lo tengo que enviar esta noche.

LOc0

http://es.wikipedia.org/wiki/Mapa_de_Karnaugh

Una tabla de verdad de 4 variables para cada salida. Las salidas que no se den nunca pues son imposibles (oh). Para el resto con karnaugh te sacas las funciones lógicas "mínimas" que serán tipo:

if( x || !y || (z && w) )
console.log("lo que sea" )
else if()
console.log("lo que sea" )
else
console.log("lo que sea" )

Es decir, 3 ifs y sin operador == ni !=

Son con else-if porque ninguna combinación de variables produce dos salidas distintas como puede verse en #8

Salu2 ;)

1 1 respuesta
EnZo

#8 Exacto. Eso da el codigo original.

Original
[0,0,0,0] rose
[0,0,0,1] daffodil
[0,0,1,0] snowdrop
[0,0,1,1] snowdrop
[0,1,0,0] snowdrop
[0,1,0,1] snowdrop
[0,1,1,0] daffodil
[0,1,1,1] rose
[1,0,0,0] rose
[1,0,0,1] daffodil
[1,0,1,0] snowdrop
[1,0,1,1] snowdrop
[1,1,0,0] snowdrop
[1,1,0,1] snowdrop
[1,1,1,0] daffodil
[1,1,1,1] rose

Mi nó solucion:
[0,0,0,0] snowdrop
[0,0,0,1] violet
[0,0,1,0] daffodil
[0,0,1,1] poppy
[0,1,0,0] poppy
[0,1,0,1] daffodil
[0,1,1,0] violet
[0,1,1,1] lily
[1,0,0,0] lily
[1,0,0,1] violet
[1,0,1,0] daffodil
[1,0,1,1] poppy
[1,1,0,0] poppy
[1,1,0,1] daffodil
[1,1,1,0] violet
[1,1,1,1] snowdrop

Es curioso que sea capicúa.

EnZo

#10 Y luego como encajas cada flor en su sitio?

#13 Una vez realizadas las funciones logicas minimas donde colocas el tipo de flor? La rosa donde iria, y la violeta? etc... Son 7

1 respuesta
LOc0

#12 ¿Encajar?

#12 Sólo pueden "salir" tres flores, las otras bye bye xD

Salu2 ;)

2 respuestas
EnZo

#13 Y no lo consideras incompleto? Como sé yo que no esperan que de una posibilidad para cada flor? No tiene mucho sentido entonces que pongan 7 flores si solo se van a mostrar 3 no? En eso consiste el ejercicio, las 3 flores ya se que se muestran xD

1 respuesta
elkaoD

#14 el código simplifica a:

if (x != y) {
    console.log("snowdrop");
} else if (y == z) {
    console.log("rose");
} else {
    console.log("daffodil");
}

Y no se pueden mostrar las 7 flores porque como el propio enunciado del problema dice, hay condiciones redundantes.

2 respuestas
B

#15 eso no le ayuda en nada, ya que lo has puesto explica:

Primer bloque:

if (x != y) {
 console.log("snowdrop");        
}

Lógica:

Si x != y el otro comparador x == y sobre por lo que violet fuera
if (x != w && w != z && w != y) , si x!=y entonces no se cumple la condición (x!=w && x!=y) por lo que "lily" fuera.

El segundo bloque te dejo que saques la lógica #1

2 respuestas
EnZo

#15 Enconces no he entendido el enunciado, GJ! xD
Iba a seguir discutiendo pero si los dois estais deacuerdo gana la mayoria.

#16 Me encanta que vayas de teacher <3

#18 No tranquila, no me molestó. Es que me hace gracia, además una vez dada la solucion por elkaod ya no tiene gracia. Mi problema ha sido que he malinterpretado el enunciado. Por pardillo lo dejo sin entregar. Menos mal que los otros me han salio bien ^^

2 respuestas
B

#17 Perdona si te molestó, pero yo veo mejor dar pistas y que saques la solución a que te den la solución directamente.

1 respuesta
Meleagant

Hace muchos años que no lo utilizo, pero diría que con un mapa de Karnaugh puedes sacar la solución óptima en un plis plas.

1 respuesta
B

#19 Como dice L0co si, me acuerdo de usarlo para circuitos lógicos pero creo que la idea del ejercicio es ver si el participante puede reducir problemas por el mismo sin recurrir a fórmulas.

B

#17 puedes postear los enunciados de los otros problemas para matar el tiempo?.

1 1 respuesta
Lecherito

#21 xD yo me aburría y me he puesto con el mapa de karnaugh D:

TicTaK
if (x != y) {
        if (x != w && w != z && w != y) {
            console.log("lily");
        } else {
            console.log("snowdrop");
        }
    }
} else {
        if (x == z) {
            console.log("rose");
        } else {                      
console.log("daffodil"); }
}

si tienes curiosidad te lo explico paso a paso

pd: no he usado mucho tiempo, seguro que se puede simplificar mas

pd2: lo mas practico es sacar la funcion logica minima mediante la simplificacion de la tabla de la verdad por karnaugh mismamente

LOc0

Y simplificando a elkaod :P:

console.log(x^y?"snowdrop":(y==z?"rose":"daffodil"));

A dormir...

Salu2 ;)

1 respuesta
Wasd

#24 Umbranoide es la milf de las programmers.

elkaoD

#16 me pareció una forma más visual de que viera por qué no se imprimen las 7 flores: porque al simplificar desaparecen.

Usuarios habituales