Drucken Sie die N-te nicht-palindromische Zahl


22

Eine palindromische Zahl (falls Sie sie nicht kennen) ist eine Zahl, die vor und zurück gleich lautet (Beispiel 11). Der erste 15 nicht-Zahlenpalindrom ist: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Dies ist A029742 . Ich brauche diese Nummern ständig, aber mein Notizblock ist sehr klein, sodass Ihr Code so kurz wie möglich sein muss.

Regeln

  • Jede Einreichung muss ein vollständiges Programm oder eine vollständige Funktion sein (z. B. können Sie in C nicht nur eine Funktion ohne Überschriften definieren, sondern Sie können eine Funktion mit den erforderlichen Überschriften definieren).
  • Wenn es möglich ist, geben Sie einen Link zu einer Site an, auf der Ihr Programm getestet werden kann.
  • Ihr Programm darf nichts schreiben STDERR.
  • Sie können Eingaben als Argument oder von STDIN(oder der nächstgelegenen Alternative in Ihrer Sprache) nehmen.
  • Programme werden nach Bytes bewertet . Der übliche Zeichensatz ist UTF-8. Wenn Sie einen anderen Zeichensatz verwenden, geben Sie diesen bitte an.
  • Standardlücken sind verboten.

Testfälle

1
==> 10

-----

5
==> 15

-----

12
==> 23

Wertung

Das ist , also gewinnt das Minimum an Bytes.

Einreichungen

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Bestenliste

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.


1
Irgendwelche Testfälle?
Undichte Nonne

@KennyLau Ich werde einige tun.
George Gibson

Können wir einen 0-basierten Index verwenden, also 15wäre das die 4. Nummer?
nimi

@nimi Entweder, aber bitte geben Sie an, ob Ihre 0-indiziert ist.
George Gibson

@nimi Sorry, das habe ich gemeint, habe zur Verdeutlichung editiert.
George Gibson

Antworten:


9

Pyth, 7 Bytes

e.f!_I`

Testsuite

Erläuterung:

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 Bytes

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

Verwendet einen 0-basierten Index. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

Der Test, ob eine Zahl aufbewahrt werden (/=)<*>reverse$show xsoll (show x) /= (reverse (show x)), führt zu dem Ergebnis, dass überprüft wird, ob die Zeichenfolgendarstellung der Zahl nicht der Umkehrung der Zeichenfolgendarstellung entspricht.


4

Brachylog , 14 11 Bytes

;0{<≜.↔¬}ⁱ⁽

-3 Bytes Panzer zu töten

Erläuterung

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

Probieren Sie es online!


;İ{ℕ≜.↔¬}ᶠ⁽tist 2 Bytes kürzer.
Fatalize

Tatsächlich ist using iterate1 Byte kürzer:;0{<≜.↔¬}ⁱ⁽
Fatalize

3

Gelee, 9 Bytes

1 Byte dank @ Sp3000 .

ṚḌ_
0dz#Ṫ

Probieren Sie es online!

Testsuite.

Erläuterung

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Ṛ
Unterhaltsame

@ Sp3000 Sehr interessant in der Tat!
Undichte Nonne

Sie können die fallen lassen ³. Wenn Sie den Eingang auf STDIN legen, können Sie ihn auch löschen 0. (In der neuesten Version von Jelly ṚḌ_ø#Ṫfunktioniert es auch, aber es ist neuer als diese Herausforderung.)
Dennis

Funktioniert nicht für mich ...
Undichte Nonne

7 Bytes, aber es kann neuere Funktionen verwenden
Caird Coinheringaahing

3

05AB1E , 8 Bytes

Code:

µNÂÂQ>i¼

Verwendet die CP-1252- Codierung. Probieren Sie es online! .


Dies hat höchstwahrscheinlich etwas mit der alten Version von 05AB1E zu tun, aber aus Neugier: Warum wurde das Doppel gegabelt Â? PS für alle anderen, die dies lesen: Kann jetzt 5 Bytes sein µNÂʽ.
Kevin Cruijssen

@ KevinCruijssen: Vermutlich aufgrund der fehlenden impliziten Ausgabe von N (nur oben im Stapel). Es können jetzt auch 4 Bytes sein, da dies ½ebenfalls implizit ist.
Emigna

@Emigna Ah, völlig vergessen ½implizit zu sein, obwohl ich es in einer Spitze erwähnte ich selbst geschrieben habe ..>. <Dachte der ¼(Erhöhung counter_variable von 1) war implizit für die while-Schleife µfür einen Moment, aber es ist in der Tat die ½( Wenn oben auf dem Stapel 1 ist, erhöhen Sie stattdessen counter_variable um 1).
Kevin Cruijssen

3

Clojure, 62 Bytes

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

0-indiziert. Generieren Sie mit Hilfe des Listenverständnisses ieinen trägen unendlichen Bereich von nicht-palindromen Zahlen und nehmen Sie diese . Sehen Sie es online: https://ideone.com/54wXI3


2

PowerShell v2 +, 65 Byte

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

Durchläuft die Zahlen von 0(impliziter Wert für nicht initialisiert $i) bis zur Eingabe $args[0]vieler Übereinstimmungen und gibt dann die letzte aus. Beachten Sie, dass wir die Schleife nicht initialisieren, also $j=0implizit.

Jede Iteration wird vorab inkrementiert $iund geprüft, ob sie nicht $iumgekehrt ist. Wenn ja, bedeutet dies, dass wir ein Nicht-Palindrom gefunden haben $j. Die Schleife wird dann so oft wie nötig fortgesetzt.

Beispiele

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 Bytes

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

Eine Funktion mit einem Index, die die Eingabe eines nvia-Arguments annimmt und die nnicht-palindromische Zahl zurückgibt .

Wie es funktioniert

Dies ist eine umfassende rekursive Suche, bei der ganze Zahlen iim Bereich nacheinander getestet werden, [1,∞)bis nnicht-palindrome Zahlen gefunden wurden. da ivorinkrementiert wird, i-1wird dann zurückgegeben. Das Testen, ob eine Zahl palindrom ist, wird durchgeführt, indem in eine Zeichenfolge konvertiert wird, umgekehrt wird und dann überprüft wird, ob die ursprüngliche und die umgekehrte Zeichenfolge gleich sind.

Der Code ist logisch äquivalent zu:

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)

was selbst ist im Wesentlichen:

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

Probieren Sie es auf Ideone


2

Clojure, 62 Bytes

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

Ein ganz anderer Ansatz als die andere Antwort, aber gleich lang.


2

R , 133 117 93 76 Byte

-16 Bytes dank JayCe. -41 Bytes dank Giuseppe.

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

Probieren Sie es online!


1
Sie können einige Bytes missbrauchen F, etc .: TIO . Warum beschränken Sie die Schleife auch auf (0:97)+10?
JayCe

1
Verwenden Sie Tipp 3 aus meiner Antwort. Tipps zum Golfen in R , um die Ziffern zu extrahieren. Sie können tun, all(D==rev(D))wo Dein Vektor von Ziffern ist. Ich glaube, eine whileSchleife wird kürzer sein, und wie @JayCe fragt, warum überprüfen Sie nur Zahlen zwischen 10 und 107?
Giuseppe

@Giuseppe Mit Ihren Empfehlungen aktualisiert. Immer noch ein wenig verwirrt darüber, wie eine whileSchleife implementiert wird, während gleichzeitig Bytes gespart werden.
Robert S.

1
@RobertS. Wenn Sie Fragen haben, können Sie mich gerne im R-Chat anrufen !
Giuseppe

2

Viertens (gviertens) , 103 bis 99 Bytes

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

Probieren Sie es online!

Erläuterung

Bei jeder Iteration wird n-mal die nächste nicht-palindromische Zahl gefunden, indem ein Zähler um 1 erhöht wird, bis die Zahl nicht mehr umgekehrt ist

Ungolfed Code

Normalerweise würde ich den Code nicht "ungolfen", aber da dieser Code etwas chaotisch ist, dachte ich, dass es helfen würde

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

Code-Erklärung

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

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

(verwendet 0-basierten Index)

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

Verwendung:

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

Eigentlich 17 Bytes

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

Probieren Sie es online!

Die Werte sind 1-indiziert. Dies könnte leicht geändert werden 0-indiziert durch die erste ersetzt Rmit r. Aber Rgenau das habe ich anfangs geschrieben, also gehe ich damit um.

Die nichtpalindromischen Zahlen genügen a(n) ≈ n + 10also 2n+9einer ausreichenden Obergrenze.

Erläuterung:

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

Verwendet 1-basierte Indizierung. Funktioniert nur bis zur 7624. Nummer.

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

Verwendung

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

Verwendet keine Rekursion und kann daher viel größere Eingaben verarbeiten.

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

Verwendung

(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 (mit externer Bibliothek) (97 Bytes)

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

Link zu lib: https://github.com/mvegh1/Enumerable

Codeerklärung: Die Bibliothek verfügt über eine statische Methode namens Sequence, wobei der erste Parameter definiert, wie viele Elemente die Sequenz garantiert erstellt, und der zweite Parameter ein Prädikat ist, das den aktuellen Iterationswert "i" akzeptiert. Das Prädikat konvertiert die Ganzzahl in eine Zeichenfolge, die durch Aufrufen von _.From in ein Zeichen-Array konvertiert wird. Das char-Array wird mit der Umkehrung des char-Arrays verglichen. Wenn sie nicht gleich sind, wird das char-Array wieder zu einer Zeichenfolge zusammengefügt und zurückgegeben. Andernfalls wird nichts zurückgegeben (dh das Ergebnis ist undefiniert, was die Bibliothek immer ignoriert). Schließlich wird das letzte Element der Sequenz, dh das N-te Element, zurückgegeben

Bildbeschreibung hier eingeben


1

C 84 Bytes

Die Funktion f(n)akzeptiert eine Ganzzahl nund gibt eine n-thnicht-palindromische Zahl zurück (1 basierend).

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

Teste es auf Ideone!

Es ist ein ziemlich trivialer Code, daher gibt es wahrscheinlich Raum für Verbesserungen.


Schlagen Sie n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;stattdessen vorreturn 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 Bytes

Diese Funktion ist 1-indiziert und basiert teilweise auf der Javascript-Antwort von Dom Hastings . Ich denke, es gibt eine Möglichkeit, dies besser zu spielen, insbesondere bei dieser letzten ternären Bedingung. Außerdem gibt diese Funktion derzeit eine Zeichenfolge zurück, die möglicherweise später bearbeitet werden muss. Anregungen zum Golfen sind willkommen.

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 Bytes

Es ist 1-basiert und der Algorithmus ist wirklich naiv

#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 bezüglich deiner Bearbeitung: #importist eine Compiler-Erweiterung von gcc. Es ist veraltet, aber das spielt hier keine Rolle
Ovs

1

APL NARS 35 Zeichen

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

es ist die Funktion v; "⍎⌽⍕" r setzt die Zahl r in der Zeichenkette um, kehrt diese Zeichenkette um und setzt sie von Zeichenkette zu Zahl um. Test- und Hilfefunktionen:

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

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

1 indiziert Versuchen Sie es mit 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

Ich glaube nicht, dass dies irgendwelche Sprachfunktionen aus C # 7 verwendet, aber ich habe es da hingestellt, da ich das getestet habe


Willkommen bei PPCG.
Jonathan Frech


1

Java 8, 117 95 94 Bytes

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

0-indiziert

Erläuterung:

Probieren Sie es hier aus.

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 Das gibt falsche Ergebnisse .. new StringBuffer(int)ist nicht gleich new StringBuffer(String), noch ist String.equals(StringBuffer)anstelle von String.equals(String).. Dies ist jedoch eine alte Antwort, damit ich (++r+"").contains(new StringBuffer(r+"").reverse())1 Byte speichern kann.
Kevin Cruijssen

-2

TCC, 11 Bytes

?>!~<>;i;'T

Probieren Sie es online!

            | 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
Dies funktioniert nicht mit der tcc.luaDatei mit dem Zeitstempel 16-07-26 12:46 UTC, die den ?>Befehl nicht hatte. Wenn für Ihre Antwort eine Version der Sprache erforderlich ist, in der die Herausforderung nachgestellt ist, müssen Sie sie im Header als nicht konkurrierend kennzeichnen. Ich werde meine Ablehnung entfernen, wenn Sie dies tun.
Dennis

@Dennis Ich bin über diesen zwei Jahre alten Beitrag gestolpert und wollte erwähnen, dass Antworten jetzt nicht mehr als nicht konkurrierend zu kennzeichnen sind , wenn ihre Sprache die Herausforderung postdatiert .
Jonathan Frech
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.