Palindromik olmayan Nth sayısını yaz


22

Palindromik sayı (bilmemeniz durumunda), aynı geriye ve ileri doğru okuyan bir sayıdır (örneğin, 11). İlk 15 palindromik olmayan sayılardır: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Bu A029742 . Bu numaralara sürekli ihtiyacım var, ancak yapışkan not defterim çok küçük, bu nedenle kodunuz mümkün olduğunca kısa olmalıdır.

kurallar

  • Her gönderim tam bir program veya işlev olmalıdır (örneğin, C'de, başlıkları olmayan bir işlevi tanımlayamazsınız, ancak gerekli başlıkları içeren bir işlevi tanımlayabilirsiniz).
  • Mümkünse, programınızın test edilebileceği bir siteye bağlantı sağlayın.
  • Programınız hiçbir şey yazmamalı STDERR.
  • Girdiyi argüman olarak veya STDINdilinden alabilirsiniz (veya kendi dilinizde en yakın alternatif).
  • Programlar baytlara göre puanlanır . Normal karakter seti UTF-8'dir, başka bir tane kullanıyorsanız lütfen belirtin.
  • Standart boşluklar yasaktır.

Test Kılıfları

1
==> 10

-----

5
==> 15

-----

12
==> 23

puanlama

Bu , yani en az bayt kazanır.

gönderimler

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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

Liderler Sıralaması

Burada hem düzenli bir lider tablosu hem de kazananların dile göre bir genel bakışını oluşturmak için bir Stack Snippet'i var.


1
Test sınavı var mı?
Sızdıran Rahibe,

@KennyLau Biraz yaparım.
George Gibson

0 tabanlı bir dizin kullanabilir miyiz 15, 4. sayı olur mu?
nimi

@nimi Her ikisi de, ancak lütfen sizinki 0 dizinli olup olmadığını belirtin.
George Gibson

@nimi Üzgünüm, demek istediğim, açıklığa kavuşturmak için değiştirdim.
George Gibson

Yanıtlar:


9

Pyth, 7 bayt

e.f!_I`

Test odası

Açıklama:

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 bayt

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

0 tabanlı dizini kullanır. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Bir numara tutmak ister testi (/=)<*>reverse$show xiçin çevirir (show x) /= (reverse (show x))sayının dize gösterimi dize temsil ters eşit değilse, yani çek.


4

Brachylog , 14 11 bayt

;0{<≜.↔¬}ⁱ⁽

-3 bayt tankını öldürmek için

açıklama

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

Çevrimiçi deneyin!


;İ{ℕ≜.↔¬}ᶠ⁽t2 bayt daha kısa.
18'de

Aslında, iteratekullanımı 1 bayt daha kısadır:;0{<≜.↔¬}ⁱ⁽
Ağustos'ta

3

Jöle, 9 bayt

@ Sp3000 sayesinde 1 bayt .

ṚḌ_
0dz#Ṫ

Çevrimiçi deneyin!

Test odası.

açıklama

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
Eğlenceli gerçek: deneyin123Ṛ
Sp3000

@ Sp3000 Gerçekten çok ilginç!
Sızdıran Rahibe,

Bırakabilirsiniz ³. Girişi STDIN'e yerleştirirseniz, girişi de düşürebilirsiniz 0. (Jelly'in en son sürümünde de ṚḌ_ø#Ṫçalışır, ancak bu zorluktan daha
Dennis,

Benim için işe yaramıyor ...
Leaky Nun

7 byte ancak daha yeni özellikler kullanabilir
caird coinheringaahing

3

05AB1E , 8 bayt

Kod:

µNÂÂQ>i¼

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


Bunun en büyük olasılıkla 05AB1E'nin eski sürümüyle bir ilgisi var, ama meraktan: neden çift çatallanmış Â? Bunu okuyan herkes için PS: Şimdi 5 bayt olabilir µNÂʽ.
Kevin Cruijssen

@KevinCruijssen: N'in örtük çıkmadığı için (sadece yığının üstü). Ayrıca şu anda da olduğu gibi 4 bayt olabilir ½.
Emigna

@Emigna Ah tamamen unutmuş ½olsa bile, örtülü olmanın kendimi yazdığı bir ucunda o bahsedilen ..>. <Düşünce ¼(1 ile artış counter_variable) while-döngü için örtülü idi µbir an için, ama aslında var ½( yığının üstü 1 ise: counter_variable değerini 1) artırın ..
Kevin Cruijssen

3

Clojure, 62 bayt

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

0 endeksli. Liste kavrayışını kullanarak tembel sonsuz palindromik sayılar yelpazesi oluşturun ve ibir tanesini kullanın. Çevrimiçi görün: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 bayt

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

Çok sayıda eşleşme bulana kadar 0(başlatılmamışlar için örtülü değer $i) sayılar arasında dolaşıp $args[0]sonuncuyu çıkarır . Döngüyü başlatamadığımızı unutmayın $j=0, dolaysızdır.

Her yineleme, önceden yükselir $ive $itersine eşit olup olmadığını kontrol ederiz . Öyleyse, bu palindrom olmayan bir şey bulduğumuz anlamına gelir, bu yüzden artış $j. Döngü daha sonra gerektiği kadar devam eder.

Örnekler

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 bayt

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

nArgüman yoluyla giriş alan ve npalindromik olmayan sayıyı döndüren tek indeksli bir fonksiyon .

Nasıl çalışır

Bu, palindromik olmayan rakamlar bulunana kadar iaralıktaki tam sayıları ardışık olarak test eden kapsamlı bir özyinelemeli aramadır; çünkü önceden artırılır, daha sonra döndürülür. Bir sayının palindromik olup olmadığını test etmek, bir dizgeye dönüştürmek, ters çevirmek ve ardından orijinal ve ters çevrilmiş dizgelerin eşit olup olmadığını kontrol etmek suretiyle yapılır.[1,∞)nii-1

Kod mantıksal olarak şuna eşittir:

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)

esasen kendisi:

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

Ideone'da dene


2

Clojure, 62 bayt

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

Diğer cevaptan oldukça farklı bir yaklaşım, ancak eşit uzunluk.


2

R , 133 117 93 76 bayt

JayCe sayesinde -16 bayt. Giuseppe sayesinde -41 bayt.

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

Çevrimiçi deneyin!


1
Bazı bazı bayt kötüye olabilir F, vs .: Tio . Ayrıca, neden döngüyü kısıtlıyorsunuz (0:97)+10?
JayCe

1
cevabımdaki ipucu # 3'ü kullanarak rakamları çıkarmak için R'de Golf için İpuçları ; bir basamak vektörünü all(D==rev(D))nerede yapabilirsiniz D. Bir whiledöngünün daha kısa olacağına inanıyorum ve @JayCe'nin dediği gibi, neden sadece 10 ile 107 arasındaki sayıları kontrol ediyorsunuz?
Giuseppe

@Giuseppe Önerilerinizle güncellendi. Yine de küçük bir whiledöngü nasıl uygulanırken , aynı zamanda bayt tasarrufu yaparken biraz karıştı .
Robert S.,

1
@RobertS. Herhangi bir sorunuz varsa, beni R sohbet odasında ping atmaktan çekinmeyin !
Giuseppe

2

İleri (gforth) , 103 99 bayt

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

Çevrimiçi deneyin!

açıklama

N kere döngü, her yineleme, bir sonraki palindromik olmayan sayıyı, sayı ters çevrilinceye kadar bir sayacı 1 artırarak bulur.

Ungolfed Kodu

Normalde kodu "ungolf" yapmazdım, ancak bu kod biraz dağınık olduğundan yardımcı olacağını düşündüm

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

Kod Açıklaması

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

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

(0 tabanlı dizin kullanır)

{         # 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
}

Kullanımı:

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

Aslında, 17 bayt

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

Çevrimiçi deneyin!

Değerler 1 indekslidir. Bu kolayca değiştirilebilir ilk değiştirerek 0 endeksli Rile r. Ama Rbaşlangıçta yazdığım şey buydu, bu yüzden birlikte gidiyorum.

Palindromik olmayan sayılar yeterlidir a(n) ≈ n + 10, bu nedenle 2n+9yeterli bir üst sınırdır.

Açıklama:

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

1 tabanlı indeksleme kullanır. Sadece 7624 numaraya kadar çalışır.

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

kullanım

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 bayt

Özyineleme kullanmaz ve çok daha büyük girişleri kaldırabilir.

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

kullanım

(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 (harici kütüphaneyi kullanarak) (97 bayt)

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

Lib için bağlantı: https://github.com/mvegh1/Enumerable

Kod açıklaması: Kitaplık, ilk paramın dizinin oluşturmayı garanti edeceği tanımları tanımladığı ve ikinci parametrenin geçerli yineleme değerini "i" kabul eden bir yordam olduğu tanımlandığı, Sıra adlı statik yönteme sahiptir. Öngörü, tamsayıyı _.From öğesini çağırarak char dizisine dönüştüren bir dizeye dönüştürür. Char dizisi, char dizisinin tersine çevrilmesiyle karşılaştırılır ve eşit değilse, char dizisi bir dizeye geri birleştirilir ve döndürülür. Aksi takdirde, hiçbir şey döndürülmez (yani sonuç tanımsızdır, ki bu kitaplığın her zaman yoksayacağı). Son olarak dizinin son elemanı, yani ikinci eleman döndürülür.

görüntü tanımını buraya girin


1

C, 84 bayt

İşlev f(n)tamsayı alır nve n-thpalindromik olmayan bir sayı döndürür (1 tabanlı).

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

İdeone üzerinde test et!

Oldukça önemsiz bir kod, bu yüzden muhtemelen iyileştirme için alan var.


Öner n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;yerinereturn 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 bayt

Bu fonksiyon 1 indekslidir ve kısmen Dom Hastings'in Javascript cevabına dayanmaktadır . Bence daha iyi golf oynamanın bir yolu var, özellikle de bu son üçlü durumla. Ayrıca, bu işlev şu anda daha sonra düzenlenmesi gerekebilecek bir dize döndürür. Herhangi bir golf önerisi açıktır.

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

Ungolfed:

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 bayt

1 tabanlı ve algoritma gerçekten saf

#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;}

Düzenleme ile ilgili @enedil: gcc'nin #importbir derleyici uzantısı Bu itiraz edildi, ama bu gerçekten burada önemli değil
ovs

1

APL NARS 35 karakter

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

bu fonksiyon v'dir; "⍎⌽⍕" r string'deki r sayısını traslate eder, string'i tersine çevirir, string'den numaraya çevirir. Test ve yardım fonksiyonları:

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

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

1 indexed Repl üzerinde deneyin.

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

Bunun c # 7'den herhangi bir dil özelliği kullandığını sanmıyorum, ancak test ettiğimden bu yana koydum.


PPCG'ye Hoşgeldiniz.
Jonathan Frech


1

Java 8, 117 95 94 bayt

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

0 endeksli

Açıklama:

Burada dene.

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 Yanlış sonuç veren .. new StringBuffer(int)eşit değil new StringBuffer(String), ne de String.equals(StringBuffer)yerine String.equals(String).. Bu eski bir cevap, bu yüzden (++r+"").contains(new StringBuffer(r+"").reverse())1 byte tasarruf etmek için kullanabilirim .
Kevin Cruijssen

-2

TCC, 11 bayt

?>!~<>;i;'T

Çevrimiçi deneyin!

            | 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
Bu tcc.lua, ?>komutu olmayan 16-07-26 12:46 UTC zaman damgası olan dosyayla çalışmaz . Cevabınız, meydan okumayı yayınlayan bir dilin bir versiyonunu gerektiriyorsa, onu başlıkta rekabet etmeyen olarak etiketlemelisiniz . Ne zaman yaptıysam olumsuz oyumu kaldıracağım.
Dennis,

@Dennis Bu iki yaşındaki yazıya tökezledim ve artık cevaplarının artık dilleri mücadeleyi geçtikten sonra rekabet dışı olarak işaretlenmediğini belirtmek istedim .
Jonathan Frech
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.