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


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*

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.


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.


8

Perl 5.10 - 27 caractères

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

Lit l'argument depuis stdin.


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}

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


5

Python, 57 51 caractères

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

Usage:

echo 500 | python palindromic.py

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


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

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.



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.


2

Scala 59

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

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


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


2

Mathematica 61

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

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


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


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.


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

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

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}


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.


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

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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.