Enumere todos los números palindrómicos (en decimal) entre 0 yn

11

Dado un número entero no negativo n, enumere todos los números palindrómicos (en decimal) entre 0 yn (rango inclusivo). Un número palindrómico permanece igual cuando se invierten sus dígitos.

Los primeros números palindrómicos (en base 10) se dan aquí :

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, ...

Este es un código de golf con el premio que va a menos personajes Los números palindrómicos deben enviarse uno por línea a stdout. El programa debería leer n desde la línea de comandos o stdin.

Wok
fuente
3
¿Entre 1 yn (según el título) o 0 yn (según el cuerpo)? ¿Y cuál de los límites incluye "entre"?
Peter Taylor el
@wok: ¿Todavía no has respondido si es un rango inclusivo o exclusivo? ¿Forma nparte del rango a incluir?
mellamokb
@mellamokb Gama inclusiva.
Wok

Respuestas:

7

Golfscript, 15 caracteres

~),{.`-1%~=},n*
Peter Taylor
fuente
Puede guardar cadenas de comparación de caracteres en lugar de los números '~), {`.-1% =}, n *'.
Howard
@Howard, si quieres publicar eso tú mismo, lo votaré.
Peter Taylor
Eso parecería una simple copia ;-)
Howard
10

Perl 5.10, 29 (o 39) caracteres

say for grep$_==reverse,0..<>

Necesita la sayfunción habilitada. 29 caracteres si considera que es gratis, de lo contrario 39 para agregar use 5.010;. Argumento sobre STDIN.

Perl, 35 caracteres.

#!perl -l
print for grep $_==reverse,0..<>

usando la antigua convención de perlgolf que #!perlno se cuenta, pero sí las banderas que la siguen.

Perl, 36 caracteres

print$_,$/for grep $_==reverse,0..<>

Si ninguno de los otros califica.

hobbs
fuente
¿Sería tan amable de explicar qué hace $ / do?
Gurzo
1
@Gurzo $/es el separador de registro de entrada, que por defecto es nueva línea. Es solo un poco más corto que literal "\n".
hobbs
Usar el mapa es más corto:map{say if$_==reverse}0..<>
jho
2
@jho evil.
Enviarlo
1
Si lo usa -Een lugar de -e, lo obtiene sayde forma gratuita.
tchrist
9

Befunge 320 313 303 caracteres

(incluidas nuevas líneas y espacios en blanco significativos)

 &:#v_v#  #                  :-1<
v91:<         v          <
0     >0.@    >\25**\1-:#^_v
pv   p09+1g09<^_           >$+     v
:>:25*%\25*/:| ^:p18:+1g18\<
 :          > >90g 1-:90p  | >  ^
>|           $^     <      >-|  ^  #<
 @           > 0 81p^        >:.25*,^
            ^                      <

Me pregunto si podría hacer esto más pequeño cambiando el ruteo de los caminos ...

Editar: vuelve a hacer la parte superior para evitar una línea extra.

Ciego
fuente
8

Perl 5.10 - 27 caracteres

map{say if$_==reverse}0..<>

Lee el argumento de stdin.

jho
fuente
7

Ruby 1.9, 39 caracteres

puts (?0..gets).select{|i|i==i.reverse}

Entrada (no debe terminarse con una nueva línea) a través de stdin. Ejemplo de invocación:

echo -n 500 | ruby1.9 palinenum.rb

40 caracteres para una versión que usa argumentos de línea de comandos:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
fuente
Rohit propuso guardar 3 caracteres en cada uno de estos utilizando en plugar de puts.
Peter Taylor
Usando su código obtuve el siguiente resultado, que parece estar mal (estoy usando ruby ​​1.9.2p0 (2010-08-18) [i386-mingw32]) irb(main):023:0> p (?0..gets).select{|i|i==i.reverse} 1 ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "22", "33", "44", "55", "66", "77", "88", " 99"] => ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "22", "33", "44", "55", "66", "77", "88" , "99"] El siguiente código funciona para mí p ('0'..gets[0..-2]).select{|i|i==i.reverse} ¿Podría explicar su código?
Rohit
@PeterTaylor @Rohit py putsno son equivalentes, de hecho, el uso prompe la salida, ya que coloca cada elemento en una nueva línea, si se llama con una matriz , mientras que psimplemente llama .to_s.
Ventero
6

J , 20 caracteres

(#~(-:|.)@":"0)>:i.n
efímero
fuente
¡Puedo leerlo! :) Agradable
defhlt
por cierto, para cumplir con un requisito, los números de salida uno por línea que debe agregar ,"0.
defhlt
@defhlt también ,.funciona
Bolce Bussiere
5

Python, 57 51 caracteres

for i in range(input()):
 if`i`==`i`[::-1]:print i

Uso:

echo 500 | python palindromic.py
Despistado
fuente
3
Más corto:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski el
Si el uso del intérprete interactivo es legítimo, puede evitarlo printy hacerlo if`i`==`i`[::-1]:i(lo digo porque la solución de Scala depende de esto).
Bakuriu
El rango debe ser inclusivo. Y creo que puede cambiar su número de bytes a 50 (los saltos de línea son más cortos en Linux).
malkaroee
5

Perl> 5.10: 25 caracteres

map$_==reverse&&say,0..<>
Toto
fuente
4

APL ( 25 17)

↑t/⍨t≡∘⌽¨t←⍕¨0,⍳⎕
marinus
fuente
3

Javascript 122 108 107 caracteres ...

Estoy seguro de que esto se puede jugar más, ¡soy nuevo en esto!

n=prompt(o=[]);for(i=0;i<=n;i++)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));

o

n=prompt(o=[]);i=-1;while(i++<n)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));
Thomas Clayson
fuente
Bueno, para empezar, los vars no son necesarios, puedes hacer que las cosas sean globales. Tampoco prompt()necesita estrictamente parámetros.
Ni idea
Sin embargo, se puede utilizar parámetros para prompt()salvar una coma: n=prompt(o=[]);.
mellamokb
También todavía tiene un var i=0que puede tener el vareliminado en su for.
mellamokb
1
El truco es que se i++<ncompara i<nantes de sumar 1 a i. Por lo tanto, se ejecuta todo el camino hasta i=n. Si quisieras detenerte i=n-1, lo usarías en su ++i<nlugar.
mellamokb
1
alert(o.join(" "))necesita estar de alert(o.join("\n"))acuerdo con las especificaciones. Agrega 1 a tu cuenta de personaje cuando arregles esto.
Thomas Eding
3

Perl - 43 caracteres

for$i(0..<>){if($i==reverse$i){print$i,$/}}

Este es mi primer intento de código de golf, así que estoy bastante seguro de que un profesional de Perl podría jugarlo.

Gurzo
fuente
3

Haskell 66 personajes

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Thomas Eding
fuente
Escribe mal el nombre del idioma ...
eternalmatt
Solucionado (caracteres de relleno)
Thomas Eding
2

PHP 64 58

for($i=0;$i<=$argv[1];print$i==strrev($i)?$i.'\n':'',$i++)

Se cambió $ _GET ['n'] a $ argv [1] para la entrada de línea de comando.

Thomas Clayson
fuente
2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
usuario desconocido
fuente
No conozco ningún Scala, pero ¿eso realmente se imprime en stdout? Habría adivinado que es una expresión que devuelve una cadena.
Omar
En la escala interactiva REPL, sí. Puede probarlo aquí en simplyscala.com pero debe reemplazarlo readIntpor un número concreto, en línea.
Usuario desconocido el
2

PHP, 59 55 53 caracteres

for($i=0;$i++<$argv[1];)if($i==strrev($i))echo"$i\n";

Uso

php palindromic.php 500

Editar: gracias Thomas

Alfwed
fuente
puedes eliminar los {s alrededor del bucle for y eliminar el espacio echo "$i\n"para obtener echo"$i\n". Eso te ahorrará algunos caracteres. Además, si quieres ser descarado, puedes cambiar \npor `` y guardar un personaje.
Thomas Clayson
2

C, 98 caracteres

n,i,j,t;main(){for(scanf("%d",&n);i<=n;i-j?1:printf("%d ",i),i++)for(t=i,j=0;t;t/=10)j=j*10+t%10;}
saeedn
fuente
2

k (23 caracteres)

{i@&{&/i=|i:$x}'i:!1+x}
skeevey
fuente
2

Mathematica 61

Column@Select[0~Range~Input[],#==Reverse@#&@IntegerDigits@#&]
chyanog
fuente
2

Befunge, 97 (tamaño de cuadrícula 37x4 = 148)

#v&#:< ,*25-$#1._.@
:>:::01-\0v >-!#^_$1-
*\25*/:!#v_::1>\#* #*25*#\/#$:_$\25*%
   `-10:\<+_v#

Tener una mejor respuesta Befunge a esta pregunta. Este es Befunge-93 específicamente; Probablemente podría hacerlo aún más compacto con Befunge-98. Lo incluiré en una edición futura.

Como no puede operar con cadenas en Befunge, lo mejor que pude hacer fue calcular el reverso de dígitos de cada número (que me sorprende poder manejar sin py g) y compararlo con el número original. El reverso de dígitos ocupa la mayor parte del código (básicamente las líneas tercera y cuarta completas).

Tenga en cuenta que el programa, tal como está ahora, imprime los números hacia atrás desde la entrada hasta 0. Si esto es un gran problema, avíseme. (El desafío solo dice enumerarlos, no específicamente en orden creciente).

Kasran
fuente
+1. Las líneas pueden cerrarse \nsolas, por lo que tiene 94 bytes de longitud. No creo que su "tamaño de cuadrícula" tenga ninguna relevancia particular.
har-wradim el
2

05AB1E , 5 bytes (no competitivos)

El lenguaje es posterior al desafío y, por lo tanto, no es competitivo . Código:

ƒNÂQ–

Explicación:

ƒ      # For N in range(0, input() + 1)
 N     #   Push N
  Â    #   Bifurcate (pushes N and N[::-1])
   Q   #   Check for equality
    –  #   If true, pop and print N

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

Adnan
fuente
LʒÂQes 4, que no compiten todavía, aunque ..
Magia pulpo Urna
2

Brachylog (2), pregunta de fechas posteriores al idioma:

Con el formato de E / S indicado en la pregunta, 8 bytes

≥ℕA↔A≜ẉ⊥

Pruébalo en línea!

Con reglas modernas de E / S PPCG, 4 bytes

≥ℕ.↔

Pruébalo en línea!

Esta es una función que genera todas las salidas, no un programa completo como el ejemplo anterior, y por lo tanto no cumple con la especificación tal como está escrita, pero pensé que mostraría cómo se vería el programa si la pregunta hubiera sido escrita a los estándares modernos de E / S (que permiten el uso de funciones y salida a través de generadores).

Explicación

≥ℕ.↔ 
 ℕ    Generate natural numbers
≥     less than or equal to the input
  .   but output only the ones
   ↔  that would produce the same output if reversed

Para la versión completa del programa, creamos una variable temporal Apara contener la salida, etiquetarla explícitamente (esto se hace implícitamente para el predicado principal de un programa) y usar la ẉ⊥técnica bien conocida para enviar los elementos de un generador a la salida estándar.


fuente
¿Cuándo le permitieron las reglas modernas de E / S PPCG utilizar un generador como envío?
Leaky Nun
@LeakyNun: Hice la propuesta el 30 de noviembre de 2016 , pero el consenso es que ya eran legales en ese momento (simplemente no documentado). Tenemos una regla explícita que los permite ahora; durante la mayor parte de 2016, no se les permitió explícitamente y tampoco se les prohibió explícitamente.
Oh, bueno, ya veo.
Leaky Nun
1

Pitón

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r
usuario1027046
fuente
Hmm ... 232 caracteres no es realmente muy competitivo. ¿Quizás podría reducir los nombres de las variables a un carácter y eliminar los espacios entre las variables y los operadores?
Gareth
Buen trabajo. Algunos buenos consejos para jugar al golf en Python se pueden encontrar en esta pregunta: codegolf.stackexchange.com/questions/54/…
Gareth
Puede deshacerse de n, simplemente reemplace int (n) por int (raw_input ()), y puede cambiar str (a) a r en la instrucción if
Omar
1

Groovy, 83

System.in.eachLine{(0..it.toInteger()).each{if("$it"=="$it".reverse())println(it)}}
Armand
fuente
1

Q (34 caracteres)

Pase n en lugar de n + 1 como argumento para esta solución Q.

{i(&)({all i=(|)i:($)x}')i:(!)1+x}
skeevey
fuente
1

Q, 32

{a(&)a~'((|:)')a:((-3!)')(!)1+x}
tmartin
fuente
1

Q (33)

{if[x="I"$(|:) -3!x;:x]} each til

Probablemente una forma más ordenada de hacer esto, pero de todos modos, muestra el uso (ingresas n + 1 para llegar a n):

q){if[x="I"$(|:) -3!x;:x]} each til  10
0 1 2 3 4 5 6 7 8 9

La sugerencia de tmartin lo reduce a 29:

({$[x="I"$(|:) -3!x;x;]}')(!)

Mismo uso.

sinedcm
fuente
1

Python, 106 caracteres

import sys as a
print(type(a.argv[1]))
for x in range(int(a.argv[1])+1):
 x=str(x)
 if x==x[::-1]:print(x)

uso:

python a.py 500
Ashwini Chaudhary
fuente
1

C # ( 217 214 191 caracteres)

Versión de golf:

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());do{var t=(n+"").ToArray();Array.Reverse(t);Console.Write(n+""==new string(t)?n+"\n":"");}while(n-->0);Console.ReadLine();}}

Legible:

using System;
using System.Linq;
class P
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        do
        {
            var t = (n + "").ToArray();
            Array.Reverse(t);
            Console.Write(n + "" == new string(t) ? n + "\n" : "");
        } while (n-->0);

        Console.ReadLine();
    }
}

Esto imprime palíndromos en orden descendente haciendo uso del operador n -> 0. (como n va a 0).

* La versión editada reemplaza do ... while con while, guardando 3 caracteres, pero ahora debe ingresar con n + 1.

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());while(n-->0){var t=(n+"").ToArray();Array.Reverse(t);Console.Write(n+""==new string(t)?n+"\n":"");}Console.ReadLine();}}

* editado: encontró una mejor manera de invertir la cadena sin convertirla en una matriz:

using System;using System.Linq;class P{static void Main(){int n=int.Parse(Console.ReadLine());while(n-->0)Console.Write(n+""==string.Join("",(""+n).Reverse())?n+"\n":"");Console.ReadLine();}}

Legible:

using System;
using System.Linq;
class P
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        while (n-->0)
            Console.Write(n + "" == string.Join("", ("" + n).Reverse()) ? n + "\n" : ""); 
        Console.ReadLine();
    }
}
Xantix
fuente
1

PHP 53

¿Puede 53 ser más bajo? Cuatro opciones diferentes:

for($i=$argv[1];$i-->0;)echo$i==strrev($i)?"$i\n":"";
for($i=$argv[1];$i-->0;)if($i==strrev($i))echo"$i\n";
while(($i=$argv[1]--)>0)echo$i==strrev($i)?"$i\n":"";
while(($i=$argv[1]--)>0)if($i==strrev($i))echo"$i\n";

Si quieres ponerte funky ...

PHP 47

while(($i=$argv[1]--)>0)if($i==strrev($i))`$i`;

Tienes que ignorar el texto de error. Sin embargo, los números de palíndromo todavía se envían a la línea de comando.

jdstankosky
fuente
1

Pyth, 11

VhQIq`N_`NN

Ejemplo:

$ pyth -c 'VhQIq`N_`NN' <<< 200
0
1
2
3
4
5
6
7
8
9
11
22
33
44
55
66
77
88
99
101
111
121
131
141
151
161
171
181
191
isaacg
fuente