Imprima el enésimo número no palindrómico

22

Un número palindrómico (en caso de que no lo sepa) es un número que lee el mismo hacia atrás y hacia adelante (ejemplo, 11). Los primeros números 15 no palindrómicas son: 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23, 24, 25, 26. Este es A029742 . Constantemente necesito estos números, pero mi bloc de notas adhesivas es muy pequeño, por lo que su código debe ser lo más corto posible.

Reglas

  • Cada envío debe ser un programa o función completa (por ejemplo, en C, no puede simplemente definir una función sin encabezados, sino que puede definir una función CON encabezados necesarios).
  • Si es posible, proporcione un enlace a un sitio donde se pueda probar su programa.
  • Su programa no debe escribirle nada STDERR.
  • Puede tomar la entrada como argumento o desde STDIN(o la alternativa más cercana en su idioma).
  • Los programas se puntúan según los bytes . El juego de caracteres habitual es UTF-8; si está utilizando otro, especifíquelo.
  • Las lagunas estándar están prohibidas.

Casos de prueba

1
==> 10

-----

5
==> 15

-----

12
==> 23

Tanteo

Este es el , por lo que gana menos bytes.

Envíos

Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:

# Language Name, N bytes

¿Dónde Nestá el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:

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

Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:

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

También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:

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

Tabla de clasificación

Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.

George Gibson
fuente
1
¿Algún caso de prueba?
Leaky Nun
@KennyLau Haré algunos.
George Gibson
¿Podemos usar un índice basado en 0, entonces 15sería el 4to número?
nimi
@nimi Cualquiera de los dos, pero especifique si el suyo está indexado en 0.
George Gibson
@nimi Lo siento, eso es lo que quise decir, he editado para aclarar.
George Gibson

Respuestas:

9

Pyth, 7 bytes

e.f!_I`

Banco de pruebas

Explicación:

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.
isaacg
fuente
5

Haskell, 38 bytes

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

Utiliza índice basado en 0. ([x|x<-[1..],(/=)<*>reverse$show x]!!) 11-> 23.

La prueba de si mantener un número se (/=)<*>reverse$show xtraduce (show x) /= (reverse (show x)), es decir, verificar si la representación de cadena del número no es igual al reverso de la representación de cadena.

nimi
fuente
4

Brachylog , 14 11 bytes

;0{<≜.↔¬}ⁱ⁽

-3 tanques de bytes para Fatalizar

Explicación

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

Pruébalo en línea!

Kroppeb
fuente
;İ{ℕ≜.↔¬}ᶠ⁽tes 2 bytes más corto.
Fatalize
En realidad, el uso iteratees 1 byte más corto:;0{<≜.↔¬}ⁱ⁽
Fatalize
3

Jalea, 9 bytes

1 bytes gracias a @ Sp3000 .

ṚḌ_
0dz#Ṫ

Pruébalo en línea!

Banco de pruebas.

Explicación

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.
Monja permeable
fuente
1
Dato 123Ṛ
curioso
@ Sp3000 Muy interesante de hecho!
Leaky Nun
Puedes soltar el ³. Si coloca la entrada en STDIN, también puede soltarla 0. (En la última versión de Jelly, ṚḌ_ø#Ṫtambién funciona, pero es más nuevo que este desafío.)
Dennis
No funciona para mí ...
Leaky Nun
7 bytes pero puede usar funciones más nuevas
caird coinheringaahing
3

05AB1E , 8 bytes

Código:

µNÂÂQ>i¼

Utiliza la codificación CP-1252 . Pruébalo en línea! .

Adnan
fuente
Lo más probable es que esto tenga algo que ver con la versión anterior de 05AB1E, pero por curiosidad: ¿por qué la doble bifurcación Â? PD para cualquiera que lea esto: ahora puede tener 5 bytes µNÂʽ.
Kevin Cruijssen
@KevinCruijssen: Probablemente debido a que no hay salida implícita de N (solo la parte superior de la pila). Además, ahora puede tener 4 bytes, ya que ½también está implícito.
Emigna
@Emigna Ah, olvidó por completo ½de ser implícita, a pesar de que lo he mencionado en una punta que escribí yo mismo ..>. <Pensó que el ¼(aumento counter_variable por 1) estaba implícito para el bucle, mientras que µpor un momento, pero es de hecho el ½( si la parte superior de la pila es 1: aumente counter_variable en 1) en su lugar ..
Kevin Cruijssen
3

Clojure, 62 bytes

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

0 indexado. Genere un rango perezosamente infinito de números no palindrómicos usando la comprensión de la lista y tome el iprimero. Véalo en línea: https://ideone.com/54wXI3

acantilado
fuente
2

PowerShell v2 +, 65 bytes

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

Recorre los números desde 0(valor implícito para no inicializados $i) hasta que encontremos $args[0]muchas coincidencias de entrada , luego genera la última. Tenga en cuenta que no inicializamos el ciclo, por lo que $j=0está implícito.

En cada iteración, realizamos un incremento previo $iy verificamos si no es igual a $iinvertido. Si es así, eso significa que hemos encontrado un no palíndromo, así que incremente $j. El ciclo luego continúa tantas veces como sea necesario.

Ejemplos

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
AdmBorkBork
fuente
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]))

Una función de un índice que toma la entrada de nvía argumento y devuelve eln número no palindrómico.

Cómo funciona

Esta es una búsqueda recursiva exhaustiva, que prueba consecutivamente enteros ien el rango [1,∞)hasta que nse hayan encontrado números no palindrómicos; dado que ise incrementa previamente, i-1luego se devuelve. La prueba de si un número es palindrómico se realiza convirtiendo a una cadena, invirtiendo y luego verificando si las cadenas originales e inversas son iguales.

El código es lógicamente equivalente a:

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)

que en sí mismo es esencialmente:

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

Pruébalo en Ideone

TheBikingViking
fuente
2

Clojure, 62 bytes

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

Un enfoque bastante diferente al de la otra respuesta, pero de igual longitud.

NikoNyrh
fuente
2

R , 133 117 93 76 bytes

-16 bytes gracias a JayCe. -41 bytes gracias a Giuseppe.

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

Pruébalo en línea!

Robert S.
fuente
1
Puede abusar de algunos bytes F, etc .: TIO . Además, ¿por qué estás restringiendo el ciclo (0:97)+10?
JayCe
1
use el consejo # 3 de mi respuesta Consejos para jugar golf en R para extraer los dígitos; puedes hacer all(D==rev(D))donde Destá un vector de dígitos. Creo que el whileciclo será más corto y, como @JayCe pregunta, ¿por qué solo verificas números entre 10 y 107?
Giuseppe
@Giuseppe actualizado con sus recomendaciones. Todavía estoy un poco confundido sobre cómo implementar un whilebucle y al mismo tiempo guardar bytes.
Robert S.
1
@RobertS. Si tiene alguna pregunta, ¡no dude en enviarme un ping en la sala de chat R !
Giuseppe
2

Adelante (gforth) , 103 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 ;

Pruébalo en línea!

Explicación

Bucle n veces, cada iteración encuentra el siguiente número no palindrómico incrementando un contador en 1 hasta que el número no sea igual a sí mismo invertido

Código sin golf

Normalmente no "desligaría" el código, pero dado que este código es algo desordenado, pensé que ayudaría

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

Explicación del código

: 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 
reffu
fuente
1

Perl 6 , 29 bytes

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

(usa índice basado en 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
}

Uso:

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)
Brad Gilbert b2gills
fuente
1

En realidad, 17 bytes

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

Pruébalo en línea!

Los valores están indexados en 1. Esto podría cambiarse fácilmente a 0 indexado reemplazando el primero Rconr . Pero,R es lo que escribí inicialmente, así que con eso voy.

Los números no palindrómicos satisfacen a(n) ≈ n + 10, así que2n+9 es un límite superior suficiente.

Explicación:

;τ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
Mego
fuente
1

JavaScript (ES6), 54 bytes

Utiliza indexación basada en 1. Solo funciona hasta el número 7624.

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

Uso

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 bytes

No utiliza la recursividad y, por lo tanto, puede manejar entradas mucho más grandes.

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

Uso

(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
Dom Hastings
fuente
1

Javascript (usando una biblioteca externa) (97 bytes)

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

Enlace a lib: https://github.com/mvegh1/Enumerable

Explicación del código: la biblioteca tiene un método estático llamado Secuencia, donde el primer parámetro define cuántos elementos garantizará la secuencia para crear, y el segundo parámetro es un predicado que acepta el valor de iteración actual, "i". El predicado convierte el entero en una cadena, que se convierte en una matriz de caracteres llamando a _.From. La matriz de caracteres se compara con la inversión de la matriz de caracteres, y si no son iguales, la matriz de caracteres se une de nuevo en una cadena y se devuelve. De lo contrario, no se devuelve nada (es decir, el resultado no está definido, lo que la biblioteca siempre ignorará). Finalmente, se devuelve el último elemento de la secuencia, es decir, el enésimo elemento

ingrese la descripción de la imagen aquí

applejacks01
fuente
1

C, 84 bytes

La función f(n)toma un entero ny devuelven-th un número no palindrómico (basado en 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;}

Pruébalo en ¡Pruébalo Ideone!

Es un código bastante trivial, por lo tanto, probablemente haya espacio para mejorar.

Jasmes
fuente
Sugerir en n=n?g(n/10,r*10+n%10):r;}s;f(n){for(s=9;n--;g(++s,0)-s||s++);n=s;lugar dereturn 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

Esta función está indexada en 1 y se basa parcialmente en la respuesta Javascript de Dom Hastings . Creo que hay una manera de jugar mejor al golf, especialmente con esa última condición ternaria. Además, esta función actualmente devuelve una cadena, que puede necesitar editarse más tarde. Cualquier sugerencia de golf es bienvenida.

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

Sin golf:

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
Sherlock9
fuente
1

C ++ (GCC), 148 bytes

Está basado en 1 y el algoritmo es realmente ingenuo

#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;}
FoxyZ
fuente
@enedil con respecto a su edición: #importes una extensión del compilador de gcc. Se está en desuso, pero esto no importa realmente aquí
ovs
1

APL NARS 35 caracteres

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

es la función v; "⍎⌽⍕" r traduce el número r en una cadena, invierte esa cadena, traduce de una cadena a otra. Funciones de prueba y ayuda:

  ⍝ 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
RosLuP
fuente
1

Casco , 6 bytes

Yay por :)

!fS≠↔N

Pruébalo en línea!

Explicación

 f   N  -- filter the naturals by:
  S≠    --   is it not equal to..
    ↔   --   ..itself reversed
!       -- index into that list
ბიმო
fuente
1

C # 7, 89 bytes

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

1 indexado Probar en Rep.

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

No creo que esto use ninguna función de lenguaje de c # 7, pero lo puse allí ya que eso es lo que probé

ryzngard
fuente
Bienvenido a 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 indexado

Explicación:

Pruébalo aquí

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
Kevin Cruijssen
fuente
@ceilingcat Eso da resultados incorrectos ... new StringBuffer(int)no es igual new StringBuffer(String)ni es en String.equals(StringBuffer)lugar de String.equals(String)... Sin embargo, esta es una respuesta antigua, así que puedo usar (++r+"").contains(new StringBuffer(r+"").reverse())para guardar 1 byte.
Kevin Cruijssen
-2

TCC, 11 bytes

?>!~<>;i;'T

Pruébalo en línea!

            | 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"
brianush1
fuente
1
Esto no funciona con el tcc.luaarchivo con la marca de tiempo 16-07-26 12:46 UTC, que no tenía el ?>comando. Si su respuesta requiere una versión del idioma posterior al desafío, debe etiquetarla como no competitiva en el encabezado. Eliminaré mi voto negativo cuando lo hagas.
Dennis
@Dennis Me topé con esta publicación de dos años y quería mencionar que las respuestas ya no se marcarán como no competitivas cuando su idioma sea posterior al desafío.
Jonathan Frech