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.


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*

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.


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.


8

Perl 5.10 - 27 caracteres

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

Lê o argumento de stdin.


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}

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


5

Python, 57 51 caracteres

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

Uso:

echo 500 | python palindromic.py

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..<>

4

APL ( 25 17)

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

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"));

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.



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.


2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")

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


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


2

Mathematica 61

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

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.)


+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! .


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.


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

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

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}


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.


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

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.