Enumera tutti i numeri palindromici (in decimale) tra 0 e n


11

Dato un numero intero non negativo n, enumera tutti i numeri palindromici (in decimale) tra 0 e n (intervallo compreso). Un numero palindromico rimane lo stesso quando le sue cifre sono invertite.

I primi numeri palindromici (in base 10) sono riportati qui :

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

Questo è un codice golf con il premio che va al minor numero di personaggi. I numeri palindromici dovrebbero essere emessi uno per riga su stdout. Il programma dovrebbe leggere n dalla riga di comando o stdin.


3
Tra 1 e n (come da titolo) o 0 e n (come da corpo)? E quale dei limiti include "tra"?
Peter Taylor,

@wok: non hai ancora risposto se è compreso o inclusivo? Fa nparte della gamma da includere?
mellamokb,

Gamma inclusiva @mellamokb.
Wok,

Risposte:


7

Golfscript, 15 caratteri

~),{.`-1%~=},n*

Puoi salvare un carattere confrontando le stringhe invece dei numeri '~), {`.-1% =}, n *'.
Howard,

@Howard, se vuoi postarlo tu stesso lo voterò.
Peter Taylor,

Sembrerebbe una semplice copia ;-)
Howard,

10

Perl 5,10, 29 (o 39) caratteri

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

Ha bisogno della sayfunzione abilitata. 29 caratteri se lo consideri gratuito, altrimenti 39 da aggiungere use 5.010;. Argomento su STDIN.

Perl, 35 caratteri

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

usando la vecchia convenzione perlgolf che #!perlnon viene contata ma che ne sono seguite tutte le bandiere.

Perl, 36 caratteri

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

Se nessuno degli altri si qualifica.


Saresti così gentile da spiegare cosa fa $ /?
Gurzo,

1
@Gurzo $/è il separatore del record di input, il cui valore predefinito è newline. È solo un po 'più corto di quello letterale "\n".
Hobbs,

L'uso della mappa è più breve:map{say if$_==reverse}0..<>
jho,

2
@jho evil.
Invialo

1
Se lo usi -Eal posto di -e, ricevi saygratuitamente.
tchrist,

9

Befunge 320 313 303 caratteri

(compresi nuovi spazi significativi e spazi bianchi)

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

Mi chiedo se potrei ridurlo ridirigendo i percorsi ...

Modifica: ridisegna la parte superiore per evitare una riga aggiuntiva.


8

Perl 5.10 - 27 caratteri

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

Legge l'argomento da stdin.


7

Ruby 1.9, 39 caratteri

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

Input (non deve essere terminato con una nuova riga) tramite stdin. Esempio di invocazione:

echo -n 500 | ruby1.9 palinenum.rb

40 caratteri per una versione che utilizza args a riga di comando:

puts (?0..$*[0]).select{|i|i==i.reverse}

Rohit ha proposto di salvare 3 caratteri in ognuno di questi usando pinvece di puts.
Peter Taylor,

Usando il tuo codice ho ottenuto il seguente output, che sembra essere sbagliato (sto 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"] Il codice qui sotto funziona per me p ('0'..gets[0..-2]).select{|i|i==i.reverse} Potresti spiegare il tuo codice.
Rohit,

@PeterTaylor @Rohit pe putsnon sono equivalenti, infatti utilizzando pinterrompe l'output, in quanto mette scrive ogni elemento su una nuova riga, se chiamato con un array , mentre psemplicemente chiama .to_s.
Ventero,

6

J , 20 caratteri

(#~(-:|.)@":"0)>:i.n

Posso leggerlo! :) Bello
defhlt

tra l'altro, per soddisfare un numero di output di un requisito per riga è necessario aggiungere ,"0.
defhlt

Anche @defhlt ,.funziona
Bolce Bussiere

5

Python, 57 51 caratteri

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

Uso:

echo 500 | python palindromic.py

3
Più breve:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski il

Se l' uso dell'interprete interattivo è legittimo, allora puoi evitare printe basta if`i`==`i`[::-1]:i(lo dico perché la soluzione Scala dipende da questo).
Bakuriu,

L'intervallo dovrebbe essere inclusivo. E penso che puoi cambiare il numero di byte in 50 (le interruzioni di riga sono più brevi su Linux).
Malkaroee,

5

Perl> 5.10: 25 caratteri

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

4

APL ( 25 17)

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

3

Javascript 122 108 107 caratteri ...

Sono sicuro che questo può essere giocato di più - ne sono nuovo!

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

Bene, per cominciare le vars non sono necessarie, puoi semplicemente rendere le cose globali. Inoltre prompt()non ha strettamente bisogno di parametri.
Clueless,

Tuttavia, è possibile utilizzare i parametri per prompt()salvare un punto e virgola: n=prompt(o=[]);.
mellamokb,

Inoltre hai ancora un var i=0che può essere varrimosso nel tuo for.
mellamokb,

1
Il trucco è che i++<nconfronta i<nprima di aggiungere 1 a i. Quindi, arriva fino a i=n. Se volessi fermarti a i=n-1, useresti ++i<ninvece.
mellamokb,

1
alert(o.join(" "))deve essere alert(o.join("\n"))conforme alle specifiche. Aggiungi 1 al conteggio dei personaggi quando risolvi questo problema.
Thomas Eding,

3

Perl - 43 caratteri

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

Questo è il mio primo tentativo di codificare il golf, quindi sono abbastanza sicuro che un professionista del Perl possa giocare a golf.



2

PHP 64 58

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

Modificato $ _GET ['n'] in $ argv [1] per l'input dalla riga di comando.


2

Scala 59

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

Non conosco nessun Scala, ma questo stampa davvero su stdout? Avrei indovinato che è un'espressione che restituisce una stringa.
Omar,

Nella scala REPL interattiva, sì. Puoi provarlo qui semplicementescala.com ma devi sostituirlo readIntcon un numero concreto, online.
utente sconosciuto

2

PHP, 59 55 53 caratteri

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

uso

php palindromic.php 500

Modifica: grazie Thomas


puoi rimuovere i {s attorno al ciclo for e rimuovere lo spazio echo "$i\n"per ottenere echo"$i\n". Questo ti farà risparmiare qualche carattere. Inoltre, se vuoi essere sfacciato, puoi cambiare \nper `` e salvare un carattere.
Thomas Clayson,

2

C, 98 caratteri

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 (dimensione della griglia 37x4 = 148)

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

Avere una risposta migliore di Befunge a questa domanda. Questo è Befunge-93 in particolare; Probabilmente potrei renderlo ancora più compatto con Befunge-98. Lo includerò in una modifica futura.

Dal momento che non puoi operare sulle stringhe in Befunge, il meglio che potevo fare era calcolare l'inversione di cifra di ogni numero (che sono sorpreso di poter gestire senza pe g) e confrontarlo con il numero originale. Il digit-reverse occupa la maggior parte del codice (sostanzialmente l'intera terza e quarta riga).

Si noti che il programma, così com'è ora, stampa i numeri all'indietro dall'input fino a 0. Se questo è un grosso problema, fatemi sapere. (La sfida dice solo di elencarli, non specificatamente in ordine crescente.)


+1. Le linee possono essere chiuse da \nsole, quindi è lungo 94 byte. Non credo che la tua "dimensione della griglia" abbia una rilevanza particolare.
Har-Wradim,

2

05AB1E , 5 byte (non concorrenti)

La lingua postdatizza la sfida ed è quindi non competitiva . Codice:

ƒNÂQ–

Spiegazione:

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

Utilizza la codifica CP-1252 . Provalo online! .


LʒÂQè 4, ancora non in competizione ..
Magic Octopus Urn,

2

Brachylog (2), domanda postdati lingua:

Con il formato I / O indicato nella domanda, 8 byte

≥ℕA↔A≜ẉ⊥

Provalo online!

Con moderne regole I / O PPCG, 4 byte

≥ℕ.↔

Provalo online!

Questa è una funzione che genera tutti gli output, non un programma completo come nell'esempio precedente, e quindi non è conforme alle specifiche scritte, ma ho pensato di mostrare come sarebbe il programma se la domanda fosse stata scritta ai moderni standard I / O (che consentono l'uso di funzioni e l'output tramite generatori).

Spiegazione

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

Per la versione completa del programma, creiamo una variabile temporanea Aper contenere l'output, etichettarlo esplicitamente (ciò viene fatto implicitamente per il predicato principale di un programma) e utilizziamo la ẉ⊥tecnica ben nota per trasmettere gli elementi di un generatore all'output standard.


Quando le moderne regole di I / O PPCG ti hanno permesso di utilizzare un generatore come invio?
Leaky Nun,

@LeakyNun: ho presentato la proposta il 30 novembre 2016 , ma il consenso è che a quel punto erano già legali (ma non documentati). Abbiamo una regola esplicita che li consente ora; per la maggior parte del 2016, non sono stati esplicitamente ammessi e nemmeno esplicitamente vietati.

Oh, beh, capisco.
Leaky Nun,

1

Pitone

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r

Hmm ... 232 caratteri non è molto competitivo. Forse potresti ridurre i nomi delle variabili a un carattere ed eliminare gli spazi tra le variabili e gli operatori?
Gareth,

Buon lavoro. Alcuni buoni consigli per giocare a golf in Python sono disponibili in questa domanda: codegolf.stackexchange.com/questions/54/…
Gareth,

Puoi sbarazzarti di n - sostituisci semplicemente int (n) con int (raw_input ()) - e puoi cambiare str (a) in r nell'istruzione if
Omar,

1

Groovy, 83

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

1

Q (34 caratteri)

Passa n anziché n + 1 come argomento per questa soluzione Q.

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


1

Q (33)

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

Probabilmente un modo più pulito per farlo, ma comunque, uso del campione (inserisci n + 1 per arrivare a n):

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

Suggerimento di tmartin, arriva a 29:

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

Stesso utilizzo.


1

Python, 106 caratteri

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)

utilizzo:

python a.py 500

1

C # ( 217 214 191 caratteri)

Versione golfizzata:

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

Leggibile:

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

Questo stampa i palindromi in ordine decrescente usando l'operatore n -> 0. (come n va a 0).

* La versione modificata sostituisce do ... while with while, salvando 3 caratteri, ma ora è necessario immettere 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();}}

* modificato: trovato un modo migliore per invertire la stringa senza convertire in 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();}}

Leggibile:

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 può essere inferiore? Quattro diverse opzioni:

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 vuoi diventare funky ...

PHP 47

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

Devi ignorare il testo dell'errore. I numeri del palindromo vengono comunque emessi sulla riga di comando.


1

Pyth, 11

VhQIq`N_`NN

Esempio:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.