سؤال
كيف يمكنك عكس سلسلة من الأرقام في 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