In số thứ N không palindromic


22

Một số palindromic (trong trường hợp bạn không biết) là một số đọc tương tự ngược và xuôi (ví dụ, 11). 15 số không palindromic đầu tiên là : 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Đây là A029742 . Tôi liên tục cần những con số này, nhưng bảng ghi chú dán của tôi rất nhỏ, vì vậy mã của bạn phải càng ngắn càng tốt.

Quy tắc

  • Mỗi lần gửi phải là một chương trình hoặc chức năng đầy đủ (ví dụ: trong C, bạn không thể chỉ định nghĩa một chức năng mà không có tiêu đề, nhưng bạn có thể xác định chức năng VỚI các tiêu đề cần thiết).
  • Nếu có thể, hãy cung cấp một liên kết đến một trang web nơi chương trình của bạn có thể được kiểm tra.
  • Chương trình của bạn không được viết bất cứ điều gì STDERR.
  • Bạn có thể lấy đầu vào làm đối số hoặc từ STDIN(hoặc thay thế gần nhất trong ngôn ngữ của bạn).
  • Các chương trình được tính theo byte . Bộ ký tự thông thường là UTF-8, nếu bạn đang sử dụng một ký tự khác, vui lòng chỉ định.
  • Sơ hở tiêu chuẩn bị cấm.

Các trường hợp thử nghiệm

1
==> 10

-----

5
==> 15

-----

12
==> 23

Chấm điểm

Đây là , vì vậy ít byte nhất sẽ thắng.

Đệ trình

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

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

Bảng xếp hạng

Dưới đây là Stack Snippet để tạo cả bảng xếp hạng thông thường và tổng quan về người chiến thắng theo ngôn ngữ.


1
Bất kỳ thử nghiệm?
Leaky Nun

@KennyLau tôi sẽ làm một số.
George Gibson

Chúng ta có thể sử dụng một chỉ số dựa trên 0, vì vậy 15sẽ là số thứ 4?
nimi

@nimi Hoặc, nhưng vui lòng chỉ định nếu bạn là 0-index.
George Gibson

@nimi Xin lỗi, đó là những gì tôi muốn nói, đã chỉnh sửa để làm rõ.
George Gibson

Câu trả lời:


9

Bình thường, 7 byte

e.f!_I`

Bộ kiểm tra

Giải trình:

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 byte

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

Sử dụng chỉ số dựa trên 0. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Kiểm tra xem có giữ một số (/=)<*>reverse$show xdịch sang hay không (show x) /= (reverse (show x)), tức là kiểm tra xem biểu diễn chuỗi của số đó có bằng với đảo ngược của biểu diễn chuỗi hay không.


4

Brachylog , 14 11 byte

;0{<≜.↔¬}ⁱ⁽

-3 byte bể để Fatalize

Giải trình

; {      }ⁱ⁽        --  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

Hãy thử trực tuyến!


;İ{ℕ≜.↔¬}ᶠ⁽tngắn hơn 2 byte.
Gây tử vong

Trên thực tế, việc sử dụng iteratengắn hơn 1 byte:;0{<≜.↔¬}ⁱ⁽
Fatalize

3

Thạch, 9 byte

1 byte nhờ @ Sp3000 .

ṚḌ_
0dz#Ṫ

Hãy thử trực tuyến!

Bộ thử nghiệm.

Giải trình

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
Sự thật thú vị: thử123Ṛ
Sp3000

@ Sp3000 Thực sự rất thú vị!
Nữ tu rò rỉ

Bạn có thể thả ³. Nếu bạn đặt đầu vào trên STDIN, bạn cũng có thể thả đầu 0vào. (Trong phiên bản mới nhất của Jelly, ṚḌ_ø#Ṫcũng hoạt động, nhưng nó mới hơn thử thách này.)
Dennis

Không làm việc cho tôi ...
Leaky Nun

7 byte nhưng nó có thể sử dụng các tính năng mới hơn
caird coinheringaahing

3

05AB1E , 8 byte

Mã số:

µNÂÂQ>i¼

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


Điều này rất có thể có liên quan đến phiên bản cũ của 05AB1E, nhưng vì tò mò: tại sao lại chia đôi Â? PS cho bất cứ ai khác đọc điều này: Bây giờ có thể là 5 byte µNÂʽ.
Kevin Cruijssen

@KevinCruijssen: Có thể do không có đầu ra ngầm định của N (chỉ đầu ngăn xếp). Ngoài ra, bây giờ nó có thể là 4 byte vì ½nó cũng ẩn.
Emigna

@Emigna Ah, tôi hoàn toàn quên mất việc ½ẩn ý, ​​mặc dù tôi đã đề cập đến nó trong một mẹo mà tôi đã tự viết ..>. <Nghĩ rằng ¼(tăng phản đối 1) đã ẩn trong vòng lặp µmột lúc, nhưng thực sự đó là ½( thay vào đó, nếu đỉnh của ngăn xếp là 1: tăng counter_variable thêm 1) thay vào đó ..
Kevin Cruijssen

3

Clojure, 62 byte

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

Chỉ số 0. Tạo phạm vi vô hạn của các số không thuộc nhóm palindromic bằng cách hiểu danh sách và lấy isố thứ nhất. Xem trực tuyến: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 byte

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

Vòng lặp thông qua các số từ 0(giá trị ngầm định cho chưa được khởi tạo $i) cho đến khi chúng tôi tìm thấy đầu vào $args[0]nhiều kết quả khớp, sau đó xuất kết quả cuối cùng. Lưu ý rằng chúng tôi không khởi tạo vòng lặp, vì vậy $j=0là ẩn.

Mỗi lần lặp lại, chúng tôi tăng trước $ivà kiểm tra xem nó không bằng với $iđảo ngược. Nếu vậy, điều đó có nghĩa là chúng tôi đã tìm thấy một không phải là palindrom, vì vậy tăng dần $j. Vòng lặp sau đó tiếp tục nhiều lần khi cần thiết.

Ví dụ

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 byte

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

Hàm một chỉ mục nhận đầu vào nthông qua đối số và trả về số nkhông phải là palindromic.

Làm thế nào nó hoạt động

Đây là một tìm kiếm đệ quy toàn diện, liên tục kiểm tra các số nguyên itrong phạm vi [1,∞)cho đến khi ntìm thấy các số không phải là palindromic; kể từ ikhi tăng trước, i-1sau đó được trả lại. Kiểm tra xem một số có phải là palindromic hay không bằng cách chuyển đổi thành một chuỗi, đảo ngược và sau đó kiểm tra xem các chuỗi gốc và chuỗi đảo ngược có bằng nhau không.

Mã này tương đương với:

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)

mà bản thân nó là:

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

Hãy thử nó trên Ideone


2

Clojure, 62 byte

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

Một cách tiếp cận khá khác so với câu trả lời khác, nhưng độ dài bằng nhau.


2

R , 133 117 93 76 byte

-16 byte nhờ JayCe. -41 byte nhờ Giuseppe.

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

Hãy thử trực tuyến!


1
Bạn có thể lạm dụng một số byte F, v.v.: TIO . Ngoài ra, tại sao bạn hạn chế vòng lặp đến (0:97)+10?
JayCe

1
sử dụng mẹo số 3 từ câu trả lời của tôi Mẹo chơi gôn trong R để trích xuất các chữ số; bạn có thể làm all(D==rev(D))ở đâu Dlà một vectơ chữ số. Tôi tin rằng một whilevòng lặp sẽ ngắn hơn và như @JayCe hỏi, tại sao bạn chỉ kiểm tra các số trong khoảng từ 10 đến 107?
Giuseppe

@Giuseppe Cập nhật với các khuyến nghị của bạn. Vẫn còn một chút bối rối về cách thực hiện một whilevòng lặp trong khi đồng thời tiết kiệm byte.
Robert S.

1
@RobertS. nếu bạn có bất kỳ câu hỏi nào, vui lòng ping tôi trong phòng chat R !
Giuseppe

2

Forth (gforth) , 103 99 byte

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

Hãy thử trực tuyến!

Giải trình

Lặp lại n lần, mỗi lần lặp lại tìm thấy số không phải là palindromic tiếp theo bằng cách tăng bộ đếm lên 1 cho đến khi số đó không bằng chính nó đảo ngược

Mã bị đánh cắp

Thông thường tôi sẽ không "ungolf" mã, nhưng vì mã này hơi lộn xộn nên tôi nghĩ nó sẽ giúp

: 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
;

Giải thích mã

: 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 byte

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

(sử dụng chỉ số dựa trên 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
}

Sử dụng:

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

Trên thực tế, 17 byte

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

Hãy thử trực tuyến!

Các giá trị được lập chỉ mục 1. Điều này có thể dễ dàng thay đổi thành 0 được lập chỉ mục bằng cách thay thế đầu tiên Rbằng r. Nhưng,R là những gì tôi đã gõ ban đầu, vì vậy đó là những gì tôi sẽ làm.

Các số nonpalindromic đáp ứng a(n) ≈ n + 10, vì vậy2n+9 là một giới hạn trên đủ.

Giải trình:

;τ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 byte

Sử dụng lập chỉ mục dựa trên 1. Chỉ hoạt động cho đến số thứ 7624.

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

Sử dụng

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 byte

Không sử dụng đệ quy và do đó có thể xử lý các đầu vào lớn hơn nhiều.

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

Sử dụng

(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 (sử dụng thư viện bên ngoài) (97 byte)

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

Liên kết đến lib: https://github.com/mvegh1/Enumerable

Giải thích mã: Thư viện có phương thức tĩnh gọi là Chuỗi, trong đó param đầu tiên xác định có bao nhiêu phần tử mà chuỗi sẽ đảm bảo tạo và tham số thứ 2 là một vị từ chấp nhận giá trị lặp hiện tại, "i". Vị từ chuyển đổi số nguyên thành một chuỗi, được chuyển đổi thành một mảng char bằng cách gọi _.From. Mảng char được so sánh với sự đảo ngược của mảng char và nếu chúng không bằng nhau thì mảng char được nối lại thành một chuỗi và được trả về. Mặt khác, không có gì được trả về (tức là kết quả không xác định, mà thư viện sẽ luôn bỏ qua). Cuối cùng, phần tử cuối cùng của chuỗi, tức là phần tử thứ N được trả về

nhập mô tả hình ảnh ở đây


1

C, 84 byte

Hàm f(n)lấy số nguyên nvà trả về số n-thkhông palindromic (dựa trên 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;}

Kiểm tra nó trên Ideone!

Đó là mã khá tầm thường, do đó có lẽ có không gian để cải thiện.


Đề xuất n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;thay vìreturn n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)==s&&s++);return s;
trần mèo

1

Ruby, 54 byte

Chức năng này được lập chỉ mục 1 và một phần dựa trên câu trả lời Javascript của Dom Hastings . Tôi nghĩ rằng có một cách để chơi golf tốt hơn, đặc biệt là với tình trạng ternary cuối cùng đó. Ngoài ra, chức năng này hiện trả về một chuỗi, có thể cần phải chỉnh sửa sau. Bất kỳ đề nghị chơi golf đều được chào đón.

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

Ung dung:

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 byte

Nó dựa trên 1 và thuật toán thực sự ngây thơ

#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 liên quan đến chỉnh sửa của bạn: #importlà phần mở rộng trình biên dịch của gcc. Nó bị phản đối, nhưng điều này không thực sự quan trọng ở đây
OVS

1

APL NARS 35 ký tự

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

nó là hàm v; "" R trasTable số r trong chuỗi, đảo ngược chuỗi đó, trasTable từ chuỗi sang số. Chức năng kiểm tra và trợ giúp:

  ⍝ 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 byte

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

1 lập chỉ mục Thử trên Trả lời. Nó

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

Tôi không nghĩ điều này sử dụng bất kỳ tính năng ngôn ngữ nào từ c # 7, nhưng tôi đã đặt nó ở đó vì đó là những gì tôi đã thử nghiệm


Chào mừng đến với PPCG.
Jonathan Frech


1

Java 8, 117 95 94 byte

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

Chỉ số 0

Giải trình:

Hãy thử nó ở đây.

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 Điều đó cho kết quả không chính xác .. new StringBuffer(int)không bằng new StringBuffer(String), cũng không phải String.equals(StringBuffer)thay vì String.equals(String).. Đây là một câu trả lời cũ, vì vậy tôi có thể sử dụng (++r+"").contains(new StringBuffer(r+"").reverse())để lưu 1 byte.
Kevin Cruijssen

-2

TCC, 11 byte

?>!~<>;i;'T

Hãy thử trực tuyến!

            | 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
Điều này không hoạt động với tcc.luatệp có dấu thời gian 16-07-26 12:46 UTC, không có ?>lệnh. Nếu câu trả lời của bạn yêu cầu một phiên bản ngôn ngữ trì hoãn thử thách, bạn phải gắn nhãn đó là không cạnh tranh trong tiêu đề. Tôi sẽ loại bỏ downvote của tôi khi bạn làm.
Dennis

@Dennis Tôi tình cờ thấy bài đăng hai năm tuổi này và muốn đề cập rằng câu trả lời bây giờ không còn được đánh dấu là không cạnh tranh khi ngôn ngữ của họ sau ngày thử thách.
Jonathan Frech
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.