Hola a todos, Después de presentar ayer en las jornadas de usuarios de R de Madrid el problema de las ocho reinas y su solución con R, unas de las críticas que recibí es que el código de la solución no iba mucho con el estilo de R. En concreto, la función que recibe una lista con la posición de las reinas (ejemplo (1,5,2,3,4,6,8,7)) y calcula si se atacan (comparten la misma diagonal). El código es el siguiente: correcto <- function(p) { n <- length(p) for(i in 1:(n-1)) { for(j in (i+1):n) { if(abs(p[j] - p[i]) == abs(j – i)) return(FALSE) } } return(TRUE) } Si algún alma caritativa de la lista me ayudase a "erreficar" el código le quedaría muy agradecido. De hecho, en la reunión de usuarios se comentó que seguramente sea posible escribir esta función con una única línea de código R. Muchas gracias a todos Rafael García Twitter: @rgarcialeiva Blog: http://mundoalgoritmos.blogspot.com.es/ [[alternative HTML version deleted]]
Hola, ¿qué tal? No sé si responderá exactamente a tu pregunta, pero hace un tiempo escribí sobre el problema (de las ¡nueve! reinas) y planteé una versión alternativa a tu código: http://www.datanalytics.com/blog/2012/01/23/nueve-reinas-con-sas-y-r-tambien/ Un saludo, Carlos J. Gil Bellosta http://www.datanalytics.com El día 27 de septiembre de 2013 10:05, Rafael Garcia Leiva <rgarcialeiva en gmail.com> escribió:> Hola a todos, > > Después de presentar ayer en las jornadas de usuarios de R de Madrid el > problema de las ocho reinas y su solución con R, unas de las críticas que > recibí es que el código de la solución no iba mucho con el estilo de R. En > concreto, la función que recibe una lista con la posición de las reinas > (ejemplo (1,5,2,3,4,6,8,7)) y calcula si se atacan (comparten la misma > diagonal). > > El código es el siguiente: > > correcto <- function(p) { > n <- length(p) > for(i in 1:(n-1)) { > for(j in (i+1):n) { > if(abs(p[j] - p[i]) == abs(j ? i)) > return(FALSE) > } > } > return(TRUE) > } > > Si algún alma caritativa de la lista me ayudase a "erreficar" el código le > quedaría muy agradecido. De hecho, en la reunión de usuarios se comentó que > seguramente sea posible escribir esta función con una única línea de código > R. > > Muchas gracias a todos > > Rafael García > Twitter: @rgarcialeiva > Blog: http://mundoalgoritmos.blogspot.com.es/ > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >
A ver esto: p<- c(1,5,2,3,4,6,8,7) !any(match((2:length(p))-(1:(length(p)-1)), p[-length(p)]-p[-1])) Saludos, Marcelino El 27/09/2013 10:05, Rafael Garcia Leiva escribió:> Hola a todos, > > Después de presentar ayer en las jornadas de usuarios de R de Madrid el > problema de las ocho reinas y su solución con R, unas de las críticas que > recibí es que el código de la solución no iba mucho con el estilo de R. En > concreto, la función que recibe una lista con la posición de las reinas > (ejemplo (1,5,2,3,4,6,8,7)) y calcula si se atacan (comparten la misma > diagonal). > > El código es el siguiente: > > correcto <- function(p) { > n <- length(p) > for(i in 1:(n-1)) { > for(j in (i+1):n) { > if(abs(p[j] - p[i]) == abs(j ? i)) > return(FALSE) > } > } > return(TRUE) > } > > Si algún alma caritativa de la lista me ayudase a "erreficar" el código le > quedaría muy agradecido. De hecho, en la reunión de usuarios se comentó que > seguramente sea posible escribir esta función con una única línea de código > R. > > Muchas gracias a todos > > Rafael García > Twitter: @rgarcialeiva > Blog: http://mundoalgoritmos.blogspot.com.es/ > > [[alternative HTML version deleted]] > > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es >