非回文数


16

严格非回文数 N是一个数字,是不是在回文任何碱基(在基材2〜N-2)。 这些号码已列在OEIS中

例如,数19在碱2,3,4,5,6,... 17是:100112011033431,... 12。这些表示都不是回文的,因此该数字严格是非回文的。

对于此挑战,如果数字不是回文数,则需要返回真实值,否则返回假值

  • 您可以假设传递给您的数字大于或等于0。
  • 您的程序应该可以使用不超过语言整数大小的值。

测试用例:

真相:

0
1
2
3
4
6
11
19
47
53
79
103
389
997
1459

虚假:

5
7
8
9
10
13
16
43
48
61
62
101
113
211
1361

这是一个,所以请使您的答案尽可能短!


2
是的,我很想念。但是,我认为,通过向其添加检查,基本上可以重用此问题的答案result < n-2
FryAmTheEggman

Answers:


6

C,82字节

p(n,a,b,c,r){c=0;for(b=1;++b<n-2;c+=r==n)for(a=n,r=0;a>0;a/=b)r=r*b+a%b;return!c;}

伊迪恩!

说明

此代码反转n的基础b并存储r

for(a=n,r=0;a>0;a/=b)r=r*b+a%b;

外环从统计的碱基数2n-1其中n是回文。

如果n为非回文计数,则计数为1n必须是以碱基为基础的回文n-1)。


因为我无法两次对SILOS答案进行投票,所以请有个赞
Rohan Jhunjhunwala

3
@RohanJhunjhunwala投票的最佳理由。
尼姑

@LeakyNun但是有点连续投票...
Outgolfer的Erik,16年


5

SILOS,206字节

GOTO e
lbld
c - 1
GOTO c
lble
readIO 
n = i
i - 3
b = i
b + 1
GOTO f
lbla
a = n
r = 0
lblb
m = a
m % b
r * b
r + m
a / b
if a b
r - n
r |
if r d
lblc
c + 1
i - 1
b - 1
lblf
if i a
c / c
c - 1
c |
printInt c

在线尝试!

我在C中答案的端口。


每个答案有两个投票,因为我不能两次投票
Rohan Jhunjhunwala

如果您可以使用一个分隔语句作为“ |”来编写代码 您可以利用\ n作为分隔

@RosLuP我现在将\ r \ n用作\ n吗?
Leaky Nun

我在您的系统中不知道,但是我在记事本中复制了上面的程序,而不是保存它:该文件的长度是241而不是206。所以在我看来,\ n是2个字符而不是1
RosLuP

@RosLuP您的记事本会自动将EOL转换为\ r \ n。
Leaky Nun

4

哈斯克尔, 75 68字节

(a!c)b|a<1=c|x<-c*b+mod a b=div a b!x$b
f n=all((/=n).(n!0))[2..n-2]

3

果冻 9 字节

bRµ⁼"US<3

在线尝试!验证所有测试用例

怎么运行的

bRµ⁼"US<3  Main link. Argument: n

 R         Range; yield [1, ..., n].
b          Convert n to all bases between 1 and n, yielding a 2D array A>
  µ        Begin a new, monadic chain. Argument: A
     U     Upend; reverse the 1D arrays in A.
   ⁼"      Zipwith equal; yield 1 for each array that matches its inverse.
      S    Sum; add the resulting Booleans.
           If n > 1, the sum will be 2 if n is strictly non-palindromic (it is only
           a palindrome in bases 1 and n - 1), and greater than 2 otherwise.
           For 0 and 1, the sum will be 0 (sum of the empty array) and 1 (only a
           palindrome in base 1); both are less than 2.
       <3  Compare the sum with 3, yielding the desired Boolean.

为+1 <3
Leaky Nun

2

Mathematica,58 43个字节

!Or@@Table[#==#~IntegerReverse~i,{i,2,#-2}]&

TIL,#~IntegerReverse~i以基数i写入时反转输入的数字。


2

Pyth,12个 10字节

用丹尼斯的把戏保存了两个字节。

>3sm_IjQdS

在线尝试!

说明:

         S (Q)   Get all the bases we need by building a list from 1 to Q
   m               For all bases d in the bases list:
      jQd           cast Q to base d as a list
    _I              and check to see if the list is palindromic (invariant on reversal)
                  Compile all the results back into a list
  s                Sum the results (a shorter form of any), gives 3 or more for palindromics 
                    (2 is the usual because of bases 1 and Q-1)
>3                 And verify that the sum is greater than three to get non-palindromics

1

JavaScript(ES6),83个字节

f=(n,i=n-2,g=n=>n<i?[n]:[...g(n/i|0),n%i])=>i<2||`${a=g(n)}`!=a.reverse()&&f(n,i-1)
<input type=number oninput=o.textContent=f(this.value);><pre id=o>


1

Perl6,110 72 65

my &f={?all(map {{.reverse ne$_}(@(.polymod: $^a xx*))},2..$_-2)}

无法使用基准,因为任何大于36的基准都被破坏了。

以前的尝试

my &a={$^a??flat($a%$^b,a($a div$b,$b))!!()};my &f=-> $n {?all(map {.reverse ne$_ given @(a($n,$_))},2..$n-2)}
my &f=->\n {?all(map {.reverse ne$_ given @(n.polymod: $_ xx*)},2..n-2)}

第一次尝试时,我设法将其减少到59个字节。提示使用.polymod无限大的除数列表。1362.polymod: 226 xx *
布拉德·吉尔伯特b2gills,2016年

做出53和另一个提示{...}-> $_ {...}几乎完全相同。另外,您不必将lambda存储在任何地方,因此可以删除my &f =
布拉德·吉尔伯特b2gills,2016年

1

Brachylog,14个字节

¬{⟦₆bk∋;?ḃ₍.↔}

在线尝试!

通过谓词成功或失败进行输出,该结果可打印true.false.作为程序运行。

¬{           }    It cannot be shown that
        ?         the input
       ; ḃ₍       in a base
      ∋           which is an element of
  ⟦₆              the range from 1 to the input - 1
    b             without its first element
     k            or its last element
           .      can be unified with both the output variable
            ↔     and its reverse.

0

C,77字节

h(n,b,k,z){for(z=0,k=n;z+=k%b,k/=b;z*=b);return b+3>n?1:z==n?0:h(n,++b,0,0);}

递归练习...我在没有调试的情况下用(b + 3> n)更改了(b + 2> = n)...

main()
{int  v[]={0,1,2,3, 4, 6,11,19,47,53,79,103,389,997,1459},
  n[]={5,7,8,9,10,13,16,43,48,61,62,101,113,211,1361}, m;
    // 0 1 2 3  4  5  6  7  8  9 10  11  12  13   14
 for(m=0; m<15; ++m)
    printf("%u=%u\n", v[m], h(v[m],2,0,0));
 for(m=0; m<15; ++m)
    printf("%u=%u\n", n[m], h(n[m],2,0,0));
}

/*
 77
 0=1
 1=1
 2=1
 3=1
 4=1
 6=1
 11=1
 19=1
 47=1
 53=1
 79=1
 103=1
 389=1
 997=1
 1459=1
 5=0
 7=0
 8=0
 9=0
 10=0
 13=0
 16=0
 43=0
 48=0
 61=0
 62=0
 101=0
 113=0
 211=0
 1361=0
*/

1
不要破坏您的帖子。
DJMcMayhem

0

C,129字节

f(n,b,k,j){int a[99];for(b=2;b+2<n;++b){for(j=0,k=n;a[j]=k%b,k/=b;++j);for(;k<j&&a[k]==a[j];++k,--j);if(k>=j)return 0;}return 1;}

0

PHP,68字节

for($b=$argn;--$b;)strrev($c=base_convert($argn,10,$b))!=$c?:die(1);

接受STDIN的输入,用1虚假或真实退出0。用运行-R


如果我看到这个权利,你只能解决ñ<39
约尔格Hülsermann

0

APL(NARS),字符47,字节94

{⍵≤4:1⋄∼∨/{⍵≡⌽⍵}¨{⍵{(⍺⍴⍨⌊1+⍺⍟⍵)⊤⍵}w}¨2..¯2+w←⍵}

在哪里{(⍺⍴⍨⌊1+⍺⍟⍵)⊤⍵}将函数转换为以数字为基数的Alpha表示一个正的Ω,并且{⍵≡⌽⍵}将作为函数检查回文...测试:

  f←{⍵≤4:1⋄∼∨/{⍵≡⌽⍵}¨{⍵{(⍺⍴⍨⌊1+⍺⍟⍵)⊤⍵}w}¨2..¯2+w←⍵}
  f¨0 1 2 3 4 6 11 19 47 53 79 103 389 997 1459
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
  f¨5 7 8 9 10 13 16 43 48 61 62 101 113 211 1361
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.