سؤال

كيف يمكنك عكس سلسلة من الأرقام في r؟

على سبيل المثال ، لديّ متجه يبلغ حوالي 1000 رقم ستة أرقام ، وأود أن أعرف ما إذا كانت palindromes. أرغب في إنشاء مجموعة ثانية وهي العكس الدقيق ، حتى أتمكن من القيام بالتطابق.

هل كانت مفيدة؟

المحلول

إنه في الواقع التمثيل العشري للعدد الذي تختبره ليكون palindrome ، وليس الرقم نفسه (255 هو palendrome في السداسي والثنائي ، ولكن ليس عشري).

يمكنك القيام بذلك ببساطة إلى حد ما باستخدام مطابقة الأنماط:

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

يمكنك تحويل الأرقام إلى الأحرف ، وتقسيمها إلى أحرف فردية (strsplit) ، وعكس كل رقم (sapply و rev) ، ثم الصق القيم مرة أخرى معًا (لصق) وترين إلى الأرقام (as.numeric). لكنني أعتقد أن ما ورد أعلاه أفضل إذا كنت مهتمًا فقط بـ 6 أرقام.

نصائح أخرى

لا أعتقد rev يفعل ذلك تماما. يعكس عناصر المتجه ، في حين أن السؤال هو كيفية عكس العناصر في المتجه.

> 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"

يحرر: لقد أخطأت في قراءة السؤال. ها هي إجابتي للأجيال القادمة.


يمكنك استخدام ال 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

إذا كنت مهتمًا بالانعكاسات من أجل مصلحتها ، فيمكنك استخدام Sub مع إصدار أطول من REGEXP's 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"

على الرغم من أن هذا أسرع من الانقسام/القس/لصق؟

يجب أن يعمل هذا في الحالة العامة ، مع أي خيار للقاعدة:

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))
}

هناك وظيفة في stringi حزمة لذلك - stri_reverse

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

الآن قد تكون وظيفة palindrome بسيطة مثل ذلك:

palindrome <- function(x) stri_reverse(x)==x
palindrome(c("651156","1234321"))
## [1] TRUE  TRUE
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top