打印第N个非回文数


22

回文数(如果您不知道)是一个前后读相同的数字(例如11)。前15个非回文数为:10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26。这是A029742。我经常需要这些数字,但是我的便签本很小,因此您的代码必须尽可能短。

规则

  • 每个提交都必须是完整的程序或函数(例如,在C语言中,您不能只定义没有标题的函数,而可以定义具有必要标题的函数)。
  • 如果可能,请提供指向可以测试您的程序的站点的链接。
  • 您的程序不得向写入任何内容STDERR
  • 您可以将输入作为自变量,也可以取自STDIN(或使用您语言中最接近的替代物)。
  • 程序根据字节计分。通常的字符集是UTF-8,如果使用其他字符集,请指定。
  • 禁止出现标准漏洞

测试用例

1
==> 10

-----

5
==> 15

-----

12
==> 23

计分

这是,因此最少字节获胜。

意见书

为确保您的答案显示出来,请使用以下Markdown模板以标题开头。

# Language Name, N bytes

N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如:

# Ruby, <s>104</s> <s>101</s> 96 bytes

如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字:

# Perl, 43 + 2 (-p flag) = 45 bytes

您还可以将语言名称设置为链接,然后该链接将显示在页首横幅代码段中:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

排行榜

这是一个堆栈片段,用于按语言生成常规排行榜和获胜者概述。


1
有测试用例吗?
Leaky Nun

@KennyLau我会做一些。
乔治·吉布森

我们可以使用基于0的索引,15第4个数字也可以吗?
nimi

@nimi可以,但是请指定您的索引是否为0。
乔治·吉布森

@nimi对不起,这就是我的意思,已进行了编辑以弄清楚。
乔治·吉布森

Answers:


9

Pyth,7个字节

e.f!_I`

测试套件

说明:

e.f!_I`
e.f!_I`ZQ    Implicit variable introduction.
 .f     Q    Find the first Q numbers whether the following is truthy,
             starting at 1, where Q is the input.
      `Z     Convert the number to a string.
     _I      Check if it's the same when reversed.
    !        Logical not.
 e           Return the last element of the list.

5

Haskell,38个字节

([x|x<-[1..],(/=)<*>reverse$show x]!!)

使用基于0的索引。([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23

测试是否保留数字会(/=)<*>reverse$show x转换为(show x) /= (reverse (show x)),即检查数字的字符串表示形式是否与字符串表示形式相反。


4

Brachylog14 11字节

;0{<≜.↔¬}ⁱ⁽

-3字节坦克致命

说明

; {      }ⁱ⁽        --  Find the nth number
 0                  --      (starting with 0)
   <                --      which is bigger then the previous one
    ≜               --      make explicit (otherwise it fucks up)
      .             --      which is the output
       ↔            --      and if reversed
        ¬           --      is not the output

在线尝试!


;İ{ℕ≜.↔¬}ᶠ⁽t短2个字节。
致命的

实际上,使用iterate时间要短1个字节:;0{<≜.↔¬}ⁱ⁽
致命一击

3

果冻,9个字节

1个字节,感谢@ Sp3000

ṚḌ_
0dz#Ṫ

在线尝试!

测试套件。

说明

DUḌ_   Helper link. Check if x is not palindrome.

D      Convert to decimal.
 U     Reverse.
  Ḍ    Convert back to integer.
   _   Subtract x from the result above.
       For 23, this will yield 32-23 = 9.
       Only yield 0 (falsy) if x is palindrome.
       If x is not a palindrome,
       it will return a truthy number.


0dz#Ṫ  Main link.

0      Start from 0.
   #   Find the first         numbers:
  ³                   <input>
 Ç         where the above link returns a truthy number.
    Ṫ  Yield the last of the matches.

1
有趣的事实:尝试123Ṛ
Sp3000 '16

@ Sp3000确实非常有趣!
Leaky Nun

您可以删除³。如果将输入放置在STDIN上,则也可以将其删除0。(在最新版本的Jelly中ṚḌ_ø#Ṫ也可以使用,但是比这项挑战要新。)
Dennis

我不工作...
漏尼姑

7个字节,但可能会使用较新的功能
caird coinheringaahing

3

05AB1E,8个字节

码:

µNÂÂQ>i¼

使用CP-1252编码。在线尝试!


这很可能与05AB1E的旧版本有关,但出于好奇:为什么将双叉式分叉Â?PS,供其他阅读此文档的人使用:现在可以为5个字节µNÂʽ
凯文·克鲁伊森

@KevinCruijssen:可能是由于没有隐式输出N(仅是堆栈的顶部)。此外,由于½也是隐含的,因此现在可以为4个字节。
Emigna '18

@Emigna啊,完全忘了½是隐含的,尽管我提到它在提示我写我自己 ..>。<思想¼(增加counter_variable 1)是隐含的,而循环µ了一会儿,但它确实是½(如果堆栈的顶部是1:1增加counter_variable)代替..
凯文Cruijssen

3

Clojure,62个字节

#(nth(for[i(range):when(not=(seq(str i))(reverse(str i)))]i)%)

0索引。使用列表推导生成懒惰的无限范围的非回文数并取i一个。在线查看:https//ideone.com/54wXI3


2

PowerShell v2 +,65个字节

for(;$j-lt$args[0]){if(++$i-ne-join"$i"["$i".length..0]){$j++}}$i

0(未初始化的隐式值$i)循环遍历数字,直到找到输入$args[0]很多匹配项,然后输出最后一个匹配项。注意,我们不初始化循环,所以$j=0是隐式的。

每次迭代时,我们都会预先递增$i,然后检查它是否等于$i反向。如果是这样,则意味着我们找到了一个非回文,所以增加$j。然后,循环将根据需要继续进行多次。

例子

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 100
120

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 5
15

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 55
70

PS C:\Tools\Scripts\golfing> .\print-nth-palindromic-number.ps1 212
245

2

Python 2,60个字节

f=lambda n,i=0,j=1:j>n and i-1or f(n,i+1,j+(`i`!=`i`[::-1]))

一索引函数,它接受nvia参数的输入并返回n第一个非回文数。

怎么运行的

这是一个详尽的递归搜索,它连续测试i范围内的整数,[1,∞)直到找到n非回文数为止。由于i已预先增加,i-1因此返回。通过将数字转换为字符串,取反,然后检查原始字符串和取反的字符串是否相等,来测试数字是否为回文。

该代码在逻辑上等效于:

def f(n,test=0,count=1):
    if count>n:
        return test
    elif str(test)!=reversed(str(test)):
        return f(n,test+1,count+1)
    else:
        return f(n,test+1,count)

本质上是:

def f(n):
    test=0
    count=1
    while count<=n:
        if str(test)!=reversed(str(test)):
            count+=1
        test+=1
    return test-1

在Ideone上尝试


2

Clojure,62个字节

#(nth(filter(fn[i](not=(seq i)(reverse i)))(map str(range)))%)

与其他答案完全不同的方法,但是长度相等。


2

R133 117 93 76个字节

-16字节的感谢JayCe。-41字节,感谢Giuseppe。

x=scan();while({F=F+any((D=T%/%10^(1:nchar(T)-1)%%10)!=rev(D));F<=x})T=T+1;T

在线尝试!


1
您可以滥用一些字节F,等等:TIO。另外,为什么将循环限制为(0:97)+10
JayCe

1
使用我的答案R中的技巧 3 提取数字;您可以在all(D==rev(D))哪里D是数字向量。我相信while循环会更短,并且正如@JayCe所问,为什么只检查10到107之间的数字?
朱塞佩

@Giuseppe更新了您的建议。在如何实现while循环的同时还节省字节还有一点困惑。
罗伯特S.18年

1
@RobertS。如果您有任何疑问,请随时在R聊天室中 ping我!
朱塞佩

2

第四(gforth)103 99字节

: f 9 swap 0 do begin 1+ dup 0 over begin 10 /mod >r swap 10 * + r> ?dup 0= until = 0= until loop ;

在线尝试!

说明

循环n次,每次迭代通过将计数器加1直到数字不等于自身倒数来找到下一个非回文数

非高尔夫代码

通常我不会“解开”代码,但是由于此代码有些混乱,我认为这会有所帮助

: reverse ( s -- s )
    0 swap 
    begin 
        10 /mod
        >r swap
        10 * +
        r> ?dup 0=
    until 
; 

: f ( s -- s )
    9 swap 0
    0
    do
        begin
            1+ dup dup
            reverse =
        0= until
    loop
;

代码说明

: f                \ start a new word definition
  9                \ start at 9, since all positive ints < 10 are palindromic
  swap 0           \ set up loop parameters from 0 to n-1
  do               \ start a counted loop       
    begin          \ start an indefinite loop
      1+ dup       \ increment counter and place a copy on the stack
      ( Reverse )
      0 over       \ add 0 to the stack (as a buffer) and copy the top counter above it
      begin        \ start another indefinite loop
        10 /mod    \ get the quotient and remainder of dividing the number by 10
        >r         \ store the quotient on the return stack
        swap 10 *  \ multiply the current buffer by 10
        +          \ add the remainder to the buffer
        r>         \ grab the quotient from the return stack
        ?dup       \ duplicate if not equal to 0
        0=         \ check if equal to 0
      until        \ end inner indefinite loop if quotient is 0
      ( End Reverse )
      = 0=         \ check if counter =/= reverse-counter            
    until          \ end the outer indefinite loop if counter =/= reverse-counter
  loop             \ end the counted loop
;                  \ end the word definition 

1

Perl 6字节

{grep({$_!= .flip},^Inf)[$_]}

(使用基于0的索引)

{         # The $_ is implied above
  grep(   # V
    { $_ != $_.flip }, # only the non-palindromic elements of
    ^Inf               # an Infinite list ( 0,1,2,3 ...^ Inf )
  )[ $_ ]              # grab the value at the given index
}

用法:

my &non-palindrome = {grep({$_!= .flip},^Inf)[$_]}

say non-palindrome 1  - 1; # 10
say non-palindrome 5  - 1; # 15
say non-palindrome 12 - 1; # 23

# this also works:
say non-palindrome 0..20;
# (10 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 28 29 30 31 32)

1

其实是17个位元组

;τR9+;`$;R=Y`M@░E

在线尝试!

值是1索引的。这可以容易地改变至0索引通过更换第一Rr。但,R是我最初输入的内容,所以这就是我要处理的内容。

非回文数满足a(n) ≈ n + 10,因此2n+9足够的上限。

说明:

;τR9+;`$;R=Y`M@░E
;τ9+R;             push n, range(1,(2*n)+10)
      `$;R=Y`M@░   take values that are not palindromic
                E  take nth element

1

JavaScript(ES6),54个字节

使用基于1的索引。仅工作到第7624号。

d=(i,a=0)=>i?d(i-=++a!=[...''+a].reverse().join``,a):a

用法

d=(i,a=0)=>i?d(i-=++a!=[...''+a].reverse().join``,a):a
d(1)
10
d(123)
146
d(7624)
7800
d(7625)
// Uncaught RangeError: Maximum call stack size exceeded

JavaScript(ES6),59个字节

不使用递归,因此可以处理更大的输入。

i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a")

用法

(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(1)
10
(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(7625)
7801
(i=>eval("for(a=9;i-=++a!=[...`${a}`].reverse().join``;);a"))(123456)
124579

1

Javascript(使用外部库)(97字节)

n=>_.Sequence(n,i=>{i=_.From(i+"");if(!i.Reverse().SequenceEqual(i)){return i.Write("")}}).Last()

链接到lib:https : //github.com/mvegh1/Enumerable

代码说明:库具有称为Sequence的静态方法,其中第一个参数定义该序列将保证创建的元素数量,而第二个参数是接受当前迭代值“ i”的谓词。谓词将整数转换为字符串,然后通过调用_.From将其转换为char数组。将char数组与char数组的反转进行比较,如果不相等,则将char数组重新连接回字符串并返回。否则,不返回任何内容(即结果是不确定的,库将始终忽略该结果)。最后,返回序列的最后一个元素,即第N个元素

enter image description here


1

C,84字节

函数f(n)采用整数,n并返回n-th非回文数(从1开始)。

g(n,r){return n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;}

Ideone测试!

这是相当琐碎的代码,因此可能还有改进的空间。


建议n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;而不是return n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;
ceilingcat

1

Ruby,54个字节

此函数是1索引的,部分基于Dom Hastings的Javascript答案。我认为,有一种方法可以更好地打高尔夫球,尤其是在最后的三元条件下。另外,此函数当前返回一个字符串,以后可能需要对其进行编辑。欢迎任何打高尔夫球的建议。

f=->x,y=?9{x<1?y:(y.next!.reverse!=y)?f[x-1,y]:f[x,y]}

取消高尔夫:

def f(x, y="9")
 if x<1
  return y
 else
  y = y.next
  if y.reverse != y
   return f(x-1, y)
  else
   return f(x, y)
  end
 end
end

1

C ++(GCC),148个字节

它是基于1的,算法真的很幼稚

#import <iostream>
using namespace std;int n,i=1;string s;main(){cin>>n;while(s=to_string(i+1),(n+=equal(begin(s),end(s),s.rbegin()))-i++);cout<<i;}

关于您的编辑,@ enedil:#import是gcc的编译器扩展。已弃用,但这在这里并不重要
ovs

1

APL NARS 35个字符

r←v a;c
r←c←0
A:r+←1⋄c+←r≠⍎⌽⍕r⋄→A×⍳c<a

它是函数v; “⍎⌽⍕” r将数字r转换为字符串中的数字,将其反转,将其从字符串转换为数字。测试和帮助功能:

  ⍝ return the one string for the basic types ('Char', 'Int', 'Float', 'Complex or Quaternion or Oction')
  ⍝ or one string for composite types ('Tensor 3' 'Tensor 4' etc 'Matrix', 'List', 'String')
  ⍝ follow the example in: /codegolf//a/39745
  type←{v←⍴⍴⍵⋄v>2:'Tensor ',⍕v⋄v=2:'Matrix'⋄(v=1)∧''≡0↑⍵:'String'⋄''≡0↑⍵:'Char'⋄v=1:'List'⋄⍵≢+⍵:'Complex or Quaternion or Oction'⋄⍵=⌈⍵:'Int'⋄'Float'}
  h←{'Int'≢type ⍵:¯1⋄(⍵<1)∨⍵>2e5:¯1⋄v ⍵} 
  h 1
10
  h 1.32
¯1
  h 7878
8057
  h¨3 5 12
13 15 23 
  h 6 7 8
¯1
  h '123'
¯1
  h '1'
¯1
  h 1.0
10
  h 1.0003
¯1
  h ¯2
¯1
  h 0
¯1
  h 200000
201200
  h 200001
¯1



1

C#7,89字节

n=>{int i=9;for(;n-->0;)if(Enumerable.SequenceEqual(++i+"",(""+i).Reverse()))i++;return i;}

1个索引为 Try on Repl.It

n=>
  int i = 9;                                  | Start at 9. Iterate exactly n times. Assume n >= 1      
  for(;n-->0;)                                | Iterate n times
  if(EnumerableSequenceEqual(                 | Compare two sequences
  ++i+"",(""+i).Reverse())                    | Generate the forward and backward strings, which behave like char sequences for Linq
  i++                                         | If the sequences are equal, the number is a palindrome. Increment i to skip
  return i;                                   | Return the number after the for loop exits

我不认为这会使用c#7中的任何语言功能,但我放在那里,因为这是我针对的测试内容


欢迎来到PPCG。
乔纳森·弗雷希


1

Java 8,117 95 94字节

n->{int r=10;for(;n-->0;)if((++r+"").contains(new StringBuffer(r+"").reverse()))r++;return r;}

0索引

说明:

在这里尝试。

n->{             // Method with integer as both parameter and return-type
  int r=10;      //  Result-integer, starting at 10
  for(;n-->0;)   //  Loop an amount of times equal to the input
    if((++r+"")  //   First raise `r` by 1, and then check if `r`
               .contains(new StringBuffer(r+"").reverse()))
                 //   is the same as `r` reversed (and thus a palindrome)
      r++;       //    And if it is: raise `r` by 1 again
  return r;}     //  Return result-integer

@ceilingcat给出不正确的结果.. new StringBuffer(int)不等于new StringBuffer(String),也不是String.equals(StringBuffer)代替String.equals(String)..但是,这是一个旧答案,因此我可以(++r+"").contains(new StringBuffer(r+"").reverse())节省1个字节。
凯文·克鲁伊森

-2

TCC,11个字节

?>!~<>;i;'T

在线尝试!

            | Printing is implicit
?>          | Find n-th number for which the following is "T":
  !~        | If not equal...
    <>;     | reverse. No value specified, so input is assumed.
       i;   | Input, since double semicolons are ignored
         'T | ... print string "T"

1
不适tcc.lua用于时间戳记为16-07-26 12:46 UTC 的文件,该文件没有?>命令。如果您的答案需要挑战后使用的语言版本,则必须在标题中将其标记为“ 非竞争 ”。当您这样做时,我将删除我的弃权票。
丹尼斯

@Dennis我偶然发现了这个两年前的帖子,想提一提,当他们的语言将挑战发布之后,答案不再被标记为不竞争
乔纳森·弗雷奇
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.