Énumérer tous les nombres palindromiques (en décimal) entre 0 et n

11

Étant donné un entier non négatif n, énumérez tous les nombres palindromiques (en décimal) entre 0 et n (plage incluse). Un nombre palindromique reste le même lorsque ses chiffres sont inversés.

Les premiers nombres palindromiques (en base 10) sont donnés ici :

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

Il s'agit d'un golf de code avec le prix allant au moins de personnages. Les nombres palindromiques doivent être sortis un par ligne vers stdout. Le programme doit lire n à partir de la ligne de commande ou stdin.

Wok
la source
3
Entre 1 et n (selon le titre) ou 0 et n (selon le corps)? Et laquelle des limites "entre" inclut-elle?
Peter Taylor
@wok: Vous n'avez toujours pas répondu s'il s'agit d'une gamme inclusive ou exclusive? Une npartie de la gamme doit-elle être incluse?
mellamokb
@mellamokb Inclusive range.
Wok

Réponses:

7

Golfscript, 15 caractères

~),{.`-1%~=},n*
Peter Taylor
la source
Vous pouvez enregistrer un caractère en comparant les chaînes au lieu des nombres '~), {`.-1% =}, n *'.
Howard
@Howard, si vous voulez le poster vous-même, je le voterai.
Peter Taylor
Cela ressemblerait à une simple copie ;-)
Howard
10

Perl 5.10, 29 (ou 39) caractères

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

Nécessite la sayfonctionnalité activée. 29 caractères si vous considérez que c'est gratuit, sinon 39 à ajouter use 5.010;. Argument sur STDIN.

Perl, 35 caractères

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

en utilisant l'ancienne convention perlgolf qui #!perln'est pas comptée mais tous les drapeaux qui la suivent le sont.

Perl, 36 caractères

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

Si aucun des autres n'est admissible.

Hobbs
la source
Seriez-vous si gentil d'expliquer ce que fait $ /?
Gurzo
1
@Gurzo $/est le séparateur d'enregistrements d'entrée, qui par défaut est un saut de ligne. C'est juste un peu plus court que littéral "\n".
hobbs
L'utilisation de la carte est plus courte:map{say if$_==reverse}0..<>
jho
2
@jho evil. Soumettez-le :)
Hobbs
1
Si vous utilisez -Eà la place de -e, vous obtenez saygratuitement.
tchrist
9

Befunge 320 313 303 personnages

(y compris les nouvelles lignes et les espaces importants)

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

Je me demande si je pourrais réduire cela en redirigeant les chemins ...

Edit: refait la partie supérieure pour éviter une ligne supplémentaire.

Blindy
la source
8

Perl 5.10 - 27 caractères

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

Lit l'argument depuis stdin.

jho
la source
7

Ruby 1.9, 39 caractères

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

Entrée (ne doit pas se terminer par une nouvelle ligne) via stdin. Exemple d'appel:

echo -n 500 | ruby1.9 palinenum.rb

40 caractères pour une version qui utilise des arguments de ligne de commande:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
la source
Rohit a proposé d'enregistrer 3 caractères dans chacun d'eux en utilisant pau lieu de puts.
Peter Taylor
En utilisant votre code, j'ai obtenu la sortie suivante, qui semble être erronée (j'utilise 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"] Le code ci-dessous fonctionne pour moi p ('0'..gets[0..-2]).select{|i|i==i.reverse} Pouvez-vous expliquer votre code.
Rohit
@PeterTaylor @Rohit pet putsne sont pas équivalents, en fait, l'utilisation pinterrompt la sortie, car met écrit chaque élément sur une nouvelle ligne, s'il est appelé avec un tableau , alors qu'il pappelle simplement .to_s.
Ventero
6

J , 20 caractères

(#~(-:|.)@":"0)>:i.n
éphémère
la source
Je peux le lire! :) Nice
defhlt
btw, pour répondre à une exigence, vous devez ajouter un numéro de sortie par ligne ,"0.
defhlt
@defhlt ,.fonctionne aussi
Bolce Bussiere
5

Python, 57 51 caractères

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

Usage:

echo 500 | python palindromic.py
Aucune idée
la source
3
Plus court:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski
Si l' utilisation de l'interpréteur interactif est légitime, vous pouvez l'éviter printet le faire if`i`==`i`[::-1]:i(je dis cela parce que la solution Scala en dépend).
Bakuriu
La plage doit être inclusive. Et je pense que vous pouvez changer votre nombre d'octets à 50 (les sauts de ligne sont plus courts sur Linux).
malkaroee
5

Perl> 5.10: 25 caractères

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

APL ( 25 17)

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

Javascript 122 108 107 caractères ...

Je suis sûr que cela peut être joué plus - je suis nouveau dans ce domaine!

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
la source
Eh bien, pour commencer, les vars ne sont pas nécessaires, vous pouvez simplement rendre les choses globales. N'a prompt()pas non plus strictement besoin de paramètres.
Clueless
Cependant, vous pouvez utiliser des paramètres pour prompt()sauver un point - virgule: n=prompt(o=[]);.
mellamokb
De plus, vous en avez encore un var i=0qui peut être varsupprimé dans votre for.
mellamokb
1
L'astuce consiste à i++<ncomparer i<navant d'ajouter 1 à i. Ainsi, il court jusqu'à i=n. Si vous vouliez vous arrêter i=n-1, vous utiliseriez à la ++i<nplace.
mellamokb
1
alert(o.join(" "))doit être alert(o.join("\n"))conforme aux spécifications. Ajoutez 1 à votre nombre de personnages lorsque vous corrigez ce problème.
Thomas Eding
3

Perl - 43 caractères

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

Ceci est ma première tentative de golf de code, donc je suis presque sûr qu'un pro Perl pourrait jouer au golf.

Gurzo
la source
3

Haskell 66 caractères

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Thomas Eding
la source
Mal orthographié le nom de la langue ...
eternalmatt
Corrigé (caractères de remplissage)
Thomas Eding
2

PHP 64 58

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

Changement de $ _GET ['n'] en $ argv [1] pour l'entrée en ligne de commande.

Thomas Clayson
la source
2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
Utilisateur inconnu
la source
Je ne connais pas de Scala, mais est-ce que cela s'imprime vraiment sur la sortie standard? J'aurais deviné que c'est une expression renvoyant une chaîne.
Omar
Dans la scala interactive REPL, oui. Vous pouvez le tester ici simplyscala.com mais devez le remplacer readIntpar un numéro concret, en ligne.
utilisateur inconnu
2

PHP, 59 55 53 caractères

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

Usage

php palindromic.php 500

Edit: merci Thomas

Alfwed
la source
vous pouvez supprimer les {s autour de la boucle for et supprimer l'espace echo "$i\n"pour obtenir echo"$i\n". Cela vous fera économiser quelques caractères. De plus, si vous voulez être effronté, vous pouvez changer \npour `` et enregistrer un caractère.
Thomas Clayson
2

C, 98 caractères

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
la source
2

k (23 caractères)

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

Mathematica 61

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

Befunge, 97 (taille de grille 37x4 = 148)

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

Ayez une meilleure réponse Befunge à cette question. Il s'agit spécifiquement de Befunge-93; Je pourrais probablement le rendre encore plus compact avec Befunge-98. Je vais l'inclure dans une prochaine édition.

Comme vous ne pouvez pas opérer sur des chaînes dans Befunge, le mieux que je pouvais faire était de calculer l'inverse des chiffres de chaque numéro (ce que je suis surpris d'avoir pu gérer sans pet g) et de le comparer au numéro d'origine. L'inverse des chiffres occupe la majeure partie du code (essentiellement les troisième et quatrième lignes).

Notez que le programme, tel qu'il est actuellement, imprime les nombres à l'envers de l'entrée jusqu'à 0. Si c'est un gros problème, faites le moi savoir. (Le défi dit seulement de les énumérer, pas spécifiquement dans l'ordre croissant.)

Kasran
la source
+1. Les lignes peuvent être fermées \nseules, c'est donc 94 octets de long. Je ne pense pas que votre "taille de grille" ait une pertinence particulière.
har-wradim
2

05AB1E , 5 octets (non concurrents)

La langue est postérieure au défi et n'est donc pas compétitive . Code:

ƒNÂQ–

Explication:

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

Utilise l' encodage CP-1252 . Essayez-le en ligne! .

Adnan
la source
LʒÂQa 4 ans mais ne participe toujours pas à la compétition.
Magic Octopus Urn
2

Brachylog (2), question post-langue:

Avec le format d'E / S indiqué dans la question, 8 octets

≥ℕA↔A≜ẉ⊥

Essayez-le en ligne!

Avec des règles d'E / S PPCG modernes, 4 octets

≥ℕ.↔

Essayez-le en ligne!

Il s'agit d'une fonction qui génère toutes les sorties, pas un programme complet comme l'exemple précédent, et donc ne respecte pas les spécifications telles qu'écrites, mais j'ai pensé montrer à quoi ressemblerait le programme si la question avait été écrite aux normes d'E / S modernes (qui permettent l'utilisation de fonctions et la sortie via des générateurs).

Explication

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

Pour la version complète du programme, nous créons une variable temporaire Apour contenir la sortie, la étiquetons explicitement (cela se fait implicitement pour le prédicat principal d'un programme) et utilisons la ẉ⊥technique bien connue pour sortir les éléments d'un générateur en sortie standard.


la source
Quand les règles d'E / S PPCG modernes vous ont-elles permis d'utiliser un générateur comme soumission?
Leaky Nun
@LeakyNun: J'ai fait la proposition le 30 novembre 2016 , mais le consensus est qu'ils étaient déjà légaux à ce stade (tout simplement pas documentés). Nous avons une règle explicite qui les autorise maintenant; pendant la majeure partie de 2016, ils n'étaient pas explicitement autorisés et n'étaient pas explicitement interdits non plus.
Oh, eh bien, je vois.
Leaky Nun
1

Python

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r
user1027046
la source
Hmm ... 232 caractères n'est pas vraiment très compétitif. Peut-être pourriez-vous réduire les noms de variables à un caractère et supprimer les espaces entre les variables et les opérateurs?
Gareth
Bon travail. Quelques bons conseils pour jouer au golf Python peuvent être trouvés dans cette question: codegolf.stackexchange.com/questions/54/…
Gareth
Vous pouvez vous débarrasser de n - remplacez juste int (n) par int (raw_input ()) - et vous pouvez changer str (a) en r dans l'instruction if
Omar
1

Groovy, 83

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

Q (34 caractères)

Passez n plutôt que n + 1 comme argument pour cette solution Q.

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

Q, 32

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

Q (33)

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

Probablement une façon plus nette de le faire, mais de toute façon, exemple d'utilisation (vous entrez n + 1 pour arriver à n):

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

Suggestion de tmartin, descend à 29:

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

Même usage.

sinedcm
la source
1

Python, 106 caractères

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)

usage:

python a.py 500
Ashwini Chaudhary
la source
1

C # ( 217 214 191 caractères)

Version golfée:

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

Lisible:

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

Ceci imprime les palindromes dans l'ordre décroissant en utilisant l'opérateur n -> 0. (comme n va à 0).

* La version éditée remplace do ... while avec while, économisant 3 caractères, mais maintenant vous devez entrer avec 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();}}

* édité: a trouvé un meilleur moyen d'inverser la chaîne sans convertir en tableau:

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

Lisible:

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
la source
1

PHP 53

53 peut-il être inférieur? Quatre options différentes:

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 vous voulez devenir funky ...

PHP 47

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

Vous devez ignorer le texte d'erreur. Cependant, les numéros de palindrome sont toujours affichés sur la ligne de commande.

jdstankosky
la source
1

Pyth, 11

VhQIq`N_`NN

Exemple:

$ 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
la source