2015-05-01

Project Euler - Problema 4 en R

Title Continuamos con los problemas planteados en Project Euler.

Problema - Largest palindrome product

A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.

Find the largest palindrome made from the product of two 3-digit numbers.

Un número capicúa se lee igual en ambos sentidos. El mayor capicúa compuesto del producto de dos números de 2 dígitos es 9009 = 91 × 99 . Encuentra el mayor capicúa compuesto del producto de dos números de 3 cifras .

Solución paquete base

# Función para invertir cadena de texto
strReverse <- function(x)
  sapply(lapply(strsplit(x, NULL), rev), paste, collapse = "")
# Cálculos
x <- seq(100, 999)
z <- expand.grid(x = x, y = x) # Producto cartesiano
mult<- z$x*z$y
rev <- as.integer(strReverse(as.character(mult)))
df <- data.frame(z, mult, rev, dif = mult-rev)
max(subset(df, dif == 0)[ ,"mult"])
[1] 906609
 # Filtrando con dplyr
require(dplyr)
filter(df, dif == 0) %>%
  summarise(max(mult))
  max(mult)
1    906609

Solución paquete sqldf

require(sqldf)
x <- data.frame(x = 100:999)
y <- data.frame(y = 100:999)
df <- sqldf("select x, x `y`, x*y 'mult', reverse(x*y) 'rev', (x*y)-reverse(x*y) 'dif'  from x, y where (x*y)-reverse(x*y) = 0")
max(df$mult)
# O bien
max(sqldf("select x, x `y`, x*y 'mult', reverse(x*y) 'rev', (x*y)-reverse(x*y) 'dif'  from x, y where (x*y)-reverse(x*y) = 0")$mult)

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos