Pregunta

¿Cómo se puede revertir una serie de números en R?

Por ejemplo, tengo un vector de unos 1000 seis números de dos dígitos, y me gustaría saber si son palíndromos. Me gustaría crear un segundo conjunto que es el inverso exacto, por lo que podía hacer un duelo.

¿Fue útil?

Solución

En realidad, es la representación decimial del número que se está probando ser un palíndromo, no el propio número (255 es un palendrome en hexadecimal y binario, pero no decimal).

Se puede hacer esto bastante simple uso de la coincidencia de patrones:

> tmp <- c(100001, 123321, 123456)
> grepl( '^([0-9])([0-9])([0-9])\\3\\2\\1$', tmp )
[1]  TRUE  TRUE FALSE
> 

se podría convertir los números a carácter, dividida en caracteres individuales (strsplit), invierta cada número (sapply y rev), a continuación, pegar los valores de nuevo juntos (pegar) y de vuelta a los números encubierta (as.numeric). Pero creo que lo anterior es mejor si sólo están interesados ??en 6 palendromes dígitos.

Otros consejos

No creo rev bastante lo hace. Invierte los elementos del vector, mientras que la pregunta es cómo revertir los elementos en el vector.

> nums <- sapply(1:10,function(i)as.numeric(paste(sample(1:9,6,TRUE),collapse="")))
> nums
 [1] 912516 568934 693275 835117 155656 378192 343266 685182 298574 666354
> sapply(strsplit(as.character(nums),""), function(i) paste(rev(i),collapse=""))
 [1] "615219" "439865" "572396" "711538" "656551" "291873" "662343" "281586" "475892" "453666"

Editar: leí mal la pregunta. Aquí está mi respuesta para la posteridad.


Puede utilizar la función rev:

> 1:10
 [1]  1  2  3  4  5  6  7  8  9 10
> rev(1:10)
 [1] 10  9  8  7  6  5  4  3  2  1

Si está interesado en las reversiones por su propio bien, puede utilizar sub con una versión más larga de expresión regular de Greg:

> x
[1] 123321 343324 563660
> sub( '^([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])','\\6\\5\\4\\3\\2\\1', x)
[1] "123321" "423343" "066365"

A pesar de que es más rápido que este split / rev / pega?

Esto debería funcionar en el caso general, con cualquier opción de la base:

is.palindromic <- function(x, base=10)
{
    p <- 0
    m <- floor(log(x,base))
    sig <- -1
    for (i in m:0)
        {
        tp <- floor(x/base^i)
        a <- i+1
        b <- m+1-i
        if(a==b){c<-0}else{c<-a*b;sig<-sig*-1}
        p <- p + tp*c*sig
        x <- x - tp*base^i
        }
    return(!as.logical(p))
}

No hay función en el paquete para que stringi - stri_reverse

require(stringi)
stri_reverse("123456")
## [1] "654321"

Ahora función palíndromo fuerza tan simple como eso:

palindrome <- function(x) stri_reverse(x)==x
palindrome(c("651156","1234321"))
## [1] TRUE  TRUE
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top