N番目の非回文数を印刷する


22

回文数(分からない場合)は、同じ前後を読み取る数です(例、11)。最初の15の非回文数字は次のとおり10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26です。これはA029742です。私はこれらの数字を常に必要としていますが、私のメモ帳は非常に小さいため、コードはできるだけ短くする必要があります。

ルール

  • 各サブミッションは完全なプログラムまたは関数でなければなりません(たとえば、Cでは、ヘッダーなしで関数を定義することはできませんが、必要なヘッダーを使用して関数を定義できます)。
  • 可能であれば、プログラムをテストできるサイトへのリンクを提供します。
  • プログラムはに何も書き込まないでくださいSTDERR
  • 入力を引数として、またはfrom STDIN(または言語の最も近い代替)として使用できます。
  • プログラムは、バイトに従ってスコア付けされます。通常の文字セットはUTF-8です。別の文字セットを使用している場合は指定してください。
  • 標準的な抜け穴は禁止されています。

テストケース

1
==> 10

-----

5
==> 15

-----

12
==> 23

得点

これはであるため、最小バイト数が優先されます。

提出

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。


1
テストケースはありますか?
リーキー修道女

@KennyLauいくつかやります。
ジョージギブソン

0から始まるインデックスを使用できます15か?
nimi

@nimiどちらかですが、あなたのインデックスが0かどうかを指定してください。
ジョージギブソン

@nimi申し訳ありませんが、それは私が意図したもので、明確にするために編集しました。
ジョージギブソン

回答:


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

オンラインでお試しください!


;İ{ℕ≜.↔¬}ᶠ⁽t2バイト短くなります。
致命的

実際には、使用してはiterate:短い1バイトである;0{<≜.↔¬}ⁱ⁽
Fatalize

3

ゼリー、9バイト

@ Sp3000のおかげで1バイト。

ṚḌ_
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

@ Sp3000本当に興味深い!
リーキー修道女

をドロップできます³。STDINに入力を配置する場合、0同様にドロップできます。(Jellyの最新バージョンでṚḌ_ø#Ṫも動作しますが、このチャレンジよりも新しいものです。)
デニス

...私のために動作しません
漏れ修道女に

7つのバイトが、それは新しい機能を使用可能
coinheringaahing caird

3

05AB1E、8バイト

コード:

µNÂÂQ>i¼

CP-1252エンコードを使用します。オンラインでお試しください!


これは、古いバージョンの05AB1Eと関係がある可能性が最も高いですが、好奇心からではありÂません:なぜ二重分岐しているのですか?これを読んでいる他の人のためのPS:今5バイトにすることができますµNÂʽ
ケビンCruijssen

@KevinCruijssen:Nの暗黙的な出力がないためと思われます(スタックのトップのみ)。また、これは½暗黙的であるため、4バイトになります。
エミグナ

@Emignaああ、完全に忘れ½ていても、暗黙的であること、私は自分自身を書いた先端で、私はそれを言及した ...>。<思想は、¼(1増のcounter_variable)は、whileループのための暗黙的だったµ瞬間のために、それは確かです½(スタックの最上位は、1:1である場合による増加counter_variable)の代わりに...
ケビンCruijssen

3

Clojure、62バイト

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

0インデックス。リスト内包表記を使用して非パリンドローム数の遅延無限範囲を生成し、i1つを取得します。オンラインで見る: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逆に等しくないかどうかをチェックします。もしそうなら、それは非回文を見つけたことを意味するので、increment $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]))

の入力を受け取る1つのインデックス付き関数 nvia引数の、n非回文数を返す。

使い方

これは徹底的な再帰検索で、非パリンドローム数が見つかるまでi範囲内の整数を連続的にテストします。以来、プリインクリメントされ、[1,∞)nii-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バイト

JayCeのおかげで-16バイト。ジュゼッペのおかげで-41バイト。

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
私の回答のヒント#3を使用して、Rでのゴルフのヒントを使用して数字を抽出します。あなたは桁のベクトルがall(D==rev(D))どこにDあるかを行うことができます。私は信じているwhileループが短くなり、そして@JayCeが尋ねると、なぜあなたは唯一の10と107の間の数字をチェックしていますか?
ジュゼッペ

@Giuseppeが推奨事項で更新されました。まだwhileバイトを節約しながらループを実装する方法について少し混乱しています。
ロバートS.

1
@RobertS。ご質問がある場合は、Rチャットルームでお気軽にpingしてください!
ジュゼッペ

2

Forth(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、29バイト

{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から始まります。これは、最初のRをに置き換えることで0インデックスに簡単に変更できますr。しかし、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という静的メソッドがあります。最初のparamは、シーケンスが作成することを保証する要素の数を定義し、2番目のパラメーターは、現在の反復値「i」を受け入れる述語です。述語は整数を文字列に変換し、_。Fromを呼び出すことで文字配列に変換されます。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

ルビー、54バイト

この関数は1から始まり、Dom HastingsのJavascript answerに部分的に基づいています。特に最後の3分の1の状態では、これをより良くゴルフする方法があると思います。また、この関数は現在文字列を返しますが、後で編集する必要がある場合があります。ゴルフの提案は大歓迎です。

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インデックス 作成済み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)もなりません。しかし、これは古い答えなので、1バイトを節約するために使用できます。String.equals(StringBuffer)String.equals(String)(++r+"").contains(new StringBuffer(r+"").reverse())
ケビンクルーッセン

-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のファイルでは機能せず、?>コマンドがありませんでした。回答がチャレンジをポストデートする言語のバージョンを必要とする場合、ヘッダーで非競合としてラベル付けする必要があります。あなたがするとき、私は私のdownvoteを削除します。
デニス

@Dennis私はこの2年前の投稿に出くわし、その言語が課題を投稿したときに回答が非競合としてマークされなくなったことに言及したかったのです。
ジョナサンフレッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.