Enumere todos os números palíndricos (em decimal) entre 0 en

11

Dado um número inteiro não negativo n, enumere todos os números palindrômicos (em decimal) entre 0 e n (intervalo inclusivo). Um número palíndrico permanece o mesmo quando seus dígitos são revertidos.

Os primeiros números palíndricos (na base 10) são dados aqui :

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 é um código de golfe com o prêmio chegando ao menor número de caracteres. Os números palíndricos devem ser impressos um por linha para stdout. O programa deve ler n na linha de comando ou stdin.

Wok
fonte
3
Entre 1 e n (conforme o título) ou 0 e n (conforme o corpo)? E qual dos limites "entre" inclui?
23411 Peter Peter
@ wok: Você ainda não respondeu se é abrangente ou exclusivo? É nparte do intervalo a incluir?
Mellamokb
@mellamokb Gama inclusiva.
Wok

Respostas:

7

Golfscript, 15 caracteres

~),{.`-1%~=},n*
Peter Taylor
fonte
Você pode salvar um caractere comparando cadeias em vez de números '~), {`.-1% =}, n *'.
289 Howard
@ Howard, se você quiser publicar isso você mesmo, eu vou votar.
Peter Taylor
Que iria sentir como cópia simples ;-)
Howard
10

Caracteres Perl 5.10, 29 (ou 39)

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

Precisa do sayrecurso ativado. 29 caracteres se você considerar que isso é gratuito, caso contrário, 39 para adicionar use 5.010;. Argumento sobre STDIN.

Perl, 35 caracteres

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

usando a convenção perlgolf antiga que #!perlnão é contada, mas que qualquer sinalização a seguir.

Perl, 36 caracteres

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

Se nenhum dos outros se qualificar.

hobbs
fonte
Você gostaria de explicar o que $ / faz?
Gurzo
1
@Gurzo $/é o separador de registros de entrada, o padrão é nova linha. É apenas um pouco menor que o literal "\n".
hobbs
Usar o mapa é mais curto:map{say if$_==reverse}0..<>
jho
2
@jho evil. Envie-o :)
hobbs
1
Se você usar -Eem vez disso -e, receberá saygratuitamente.
Tchrist 28/05
9

Befunge 320 313 303 caracteres

(incluindo novas linhas e espaços em branco 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*,^
            ^                      <

Eu me pergunto se eu poderia fazer isso menor redirecionando os caminhos ...

Editar: refez a parte superior para evitar uma linha extra.

Blindy
fonte
8

Perl 5.10 - 27 caracteres

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

Lê o argumento de stdin.

jho
fonte
7

Ruby 1.9, 39 caracteres

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

Entrada (não deve ser finalizada com uma nova linha) via stdin. Exemplo de invocação:

echo -n 500 | ruby1.9 palinenum.rb

40 caracteres para uma versão que usa argumentos de linha de comando:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
fonte
Rohit propôs salvar 3 caracteres em cada um deles usando em pvez de puts.
Peter Taylor
Usando seu código, obtive a seguinte saída, que parece estar errada (estou usando ruby ​​1.9.2p0 (18-08-2010) [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"] O código abaixo funciona para mim p ('0'..gets[0..-2]).select{|i|i==i.reverse} Você poderia explicar seu código.
Rohit 23/05
@PeterTaylor @Rohit pe putsnão são equivalentes, na verdade, o uso de pquebras na saída, pois o put escreve todos os elementos em uma nova linha, se chamada com uma matriz , enquanto psimplesmente chama .to_s.
Ventero 23/05
6

J , 20 caracteres

(#~(-:|.)@":"0)>:i.n
efémero
fonte
Eu posso lê-lo! :) Nice
defhlt 17/08/2012
btw, para atender a um número de saída de requisito um por linha, você deve adicionar ,"0.
defhlt
@defhlt também ,.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
Sem noção
fonte
3
Mais curto:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski
Se o uso do intérprete interativo é legítimo, você pode evitar o printe apenas o faz if`i`==`i`[::-1]:i(digo isso porque a solução Scala depende disso).
Bakuriu 26/03
O intervalo deve ser inclusivo. E eu acho que você pode alterar sua contagem de bytes para 50 (quebras de linha são mais curtas no linux).
Malkaroee
5

Perl> 5.10: 25 caracteres

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

APL ( 25 17)

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

Javascript 122 108 107 caracteres ...

Tenho certeza de que isso pode ser mais jogado de golfe - sou novo nisso!

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

ou

n=prompt(o=[]);i=-1;while(i++<n)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));
Thomas Clayson
fonte
Bem, para iniciantes, os vars são desnecessários, você pode simplesmente tornar as coisas globais. Também prompt()não precisa estritamente de parâmetros.
Clueless
No entanto, você pode usar parâmetros para prompt()salvar um ponto e vírgula: n=prompt(o=[]);.
Mellamokb
Além disso, você ainda tem um var i=0que pode ser varremovido no seu for.
Mellamokb
1
O truque é i++<ncomparar i<nantes de adicionar 1 a i. Assim, ele corre até o fim i=n. Se você quisesse parar i=n-1, usaria ++i<n.
precisa saber é o seguinte
1
alert(o.join(" "))precisa estar de alert(o.join("\n"))acordo com as especificações. Adicione 1 à sua contagem de caracteres quando você corrigir isso.
Thomas Eding
3

Perl - 43 caracteres

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

Esta é a minha primeira tentativa de código de golfe, por isso tenho certeza de que um profissional de Perl poderia jogar golfe de baixo.

Gurzo
fonte
3

Haskell 66 caracteres

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Thomas Eding
fonte
Erro de ortografia no nome do idioma ...
eternalmatt
Corrigido (caracteres de preenchimento)
Thomas Eding
2

PHP 64 58

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

Alterou $ _GET ['n'] para $ argv [1] para entrada de linha de comando.

Thomas Clayson
fonte
2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
Usuário desconhecido
fonte
Não conheço nenhum Scala, mas isso realmente imprime no stdout? Eu acho que é uma expressão retornando uma string.
Omar
Na escala interativa REPL, sim. Você pode testá-lo aqui simplyscala.com, mas precisa substituir readIntpor um número concreto, online.
usuário desconhecido
2

PHP, 59 55 53 caracteres

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

Uso

php palindromic.php 500

Edit: obrigado Thomas

Alfwed
fonte
você pode remover os {s ao redor do loop for e remover o espaço echo "$i\n"para obter echo"$i\n". Isso economizará alguns caracteres. Além disso, se você quiser ser atrevido, pode mudar \npara `` e salvar um caractere.
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
fonte
2

k (23 caracteres)

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

Mathematica 61

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

Befunge, 97 (tamanho da grade 37x4 = 148)

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

Tenha uma resposta melhor do Befunge para esta pergunta. Este é o Befunge-93 especificamente; Eu provavelmente poderia torná-lo ainda mais compacto com o Befunge-98. Vou incluir isso em uma edição futura.

Como você não pode operar em seqüências de caracteres no Befunge, o melhor que pude fazer foi calcular o dígito inverso de cada número (o que me surpreende ter sido capaz de gerenciar sem pe g) e compará-lo com o número original. O dígito reverso ocupa a maior parte do código (basicamente a terceira e quarta linhas inteiras).

Observe que o programa, como está agora, imprime os números de trás para frente a zero. Se isso é um grande problema, me avise. (O desafio diz apenas enumerá-las, não especificamente em ordem crescente.)

Kasran
fonte
+1. As linhas podem ser fechadas \nsozinhas, por isso têm 94 bytes. Eu não acho que o seu "tamanho da grade" tenha alguma relevância particular.
precisa saber é o seguinte
2

05AB1E , 5 bytes (não concorrente)

O idioma é posterior ao desafio e, portanto, não é competitivo . Código:

ƒNÂQ–

Explicação:

ƒ      # 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

Usa a codificação CP-1252 . Experimente online! .

Adnan
fonte
LʒÂQé 4, ainda não competindo ..
Magic Octopus Urn
2

Brachylog (2), pergunta após a data do idioma:

Com o formato de E / S indicado na pergunta, 8 bytes

≥ℕA↔A≜ẉ⊥

Experimente online!

Com as modernas regras de E / S PPCG, 4 bytes

≥ℕ.↔

Experimente online!

Essa é uma função que gera todas as saídas, não um programa completo como o exemplo anterior, e portanto não está em conformidade com as especificações escritas, mas pensei em mostrar como seria o programa se a pergunta tivesse sido escrita aos modernos padrões de E / S (que permitem o uso de funções e saída via geradores).

Explicação

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

Para a versão completa do programa, criamos uma variável temporária Apara armazenar a saída, rotulá-la explicitamente (isso é feito implicitamente para o principal predicado de um programa) e usamos a ẉ⊥técnica conhecida para enviar os elementos de um gerador para a saída padrão.


fonte
Quando as regras modernas de E / S do PPCG permitem usar um gerador como envio?
Freira vazada
@LeakyNun: Fiz a proposta em 30 de novembro de 2016 , mas o consenso é que eles já eram legais naquele momento (apenas não documentados). Temos uma regra explícita que os permite agora; durante a maior parte de 2016, eles não foram explicitamente permitidos e também não foram explicitamente banidos.
Bem, entendo.
Freira vazada
1

Pitão

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r
user1027046
fonte
Hmm ... 232 caracteres não são realmente muito competitivos. Talvez você possa reduzir os nomes das variáveis ​​para um caractere e excluir os espaços entre as variáveis ​​e os operadores?
Gareth
Bom trabalho. Algumas boas dicas para jogar golfe no Python podem ser encontradas nesta pergunta: codegolf.stackexchange.com/questions/54/…
Gareth
Você pode se livrar de n --apenas substituir int (n) por int (raw_input ()) - e você pode mudar str (a) para r na instrução if
Omar
1

Groovy, 83

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

Q (34 caracteres)

Passe n em vez de n + 1 como argumento para esta solução Q.

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

Q, 32

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

Q (33)

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

Provavelmente, é uma maneira mais clara de fazer isso, mas, de qualquer maneira, use exemplos (você insere n + 1 para chegar a n):

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

Sugestão de tmartin, reduz para 29:

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

Mesmo uso.

sinedcm
fonte
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
fonte
1

C # ( 217 214 191 caracteres)

Versão Golfed:

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

Legível:

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

Isso imprime palíndromos em ordem decrescente, usando o operador n -> 0. (como n vai para 0).

* A versão editada substitui do ... while com while, economizando 3 caracteres, mas agora você deve inserir com 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: encontrou uma maneira melhor de reverter a string sem converter em array:

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

Legível:

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
fonte
1

PHP 53

53 pode ser mais baixo? Quatro opções 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";

Se você quiser se divertir ...

PHP 47

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

Você precisa ignorar o texto do erro. Os números do palíndromo ainda são exibidos na linha de comando.

jdstankosky
fonte
1

Pyth, 11

VhQIq`N_`NN

Exemplo:

$ 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
fonte