Zählen Sie alle palindromischen Zahlen (in Dezimalzahlen) zwischen 0 und n auf


11

Zählen Sie bei einer nicht negativen Ganzzahl n alle palindromischen Zahlen (in Dezimalzahlen) zwischen 0 und n (einschließlich Bereich) auf. Eine palindromische Zahl bleibt gleich, wenn ihre Ziffern umgekehrt werden.

Die ersten palindromischen Zahlen (in Basis 10) sind hier angegeben :

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

Dies ist ein Code-Golf, bei dem der Preis an die wenigsten Charaktere geht. Die palindromischen Zahlen sollten eine pro Zeile an stdout ausgegeben werden. Das Programm sollte n von der Kommandozeile oder stdin lesen.


3
Zwischen 1 und n (gemäß Titel) oder 0 und n (gemäß Text)? Und welche der Grenzen schließt "zwischen" ein?
Peter Taylor

@wok: Sie haben noch nicht geantwortet, ob es sich um eine inklusive oder exklusive Reichweite handelt? Ist ein nTeil des Sortiments einzuschließen?
Mellamokb

@mellamokb Inklusive Reichweite.
Wok

Antworten:


7

Golfscript, 15 Zeichen

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

Sie können ein Zeichen speichern, indem Sie Zeichenfolgen anstelle der Zahlen '~), {`.-1% =}, n *' vergleichen.
Howard

@ Howard, wenn du das selbst posten willst, werde ich es positiv bewerten.
Peter Taylor

Das würde sich wie einfaches Kopieren anfühlen ;-)
Howard

10

Perl 5.10, 29 (oder 39) Zeichen

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

Muss die sayFunktion aktiviert sein. 29 Zeichen, wenn Sie das für kostenlos halten, andernfalls 39 hinzufügen use 5.010;. Argument zu STDIN.

Perl, 35 Zeichen

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

unter Verwendung der alten Perlgolf-Konvention, #!perldie nicht gezählt wird, aber alle darauf folgenden Flags sind.

Perl, 36 Zeichen

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

Wenn sich keiner der anderen qualifiziert.


Würden Sie so freundlich erklären, was $ / tut?
Gurzo

1
@Gurzo $/ist das Trennzeichen für Eingabedatensätze, das standardmäßig Zeilenumbruch verwendet. Es ist nur ein bisschen kürzer als wörtlich "\n".
Hobbs

Die Verwendung der Karte ist kürzer:map{say if$_==reverse}0..<>
jho

2
@jho böse. Senden Sie es :)
hobbs

1
Wenn Sie -Eanstelle von verwenden -e, erhalten Sie saykostenlos.
Tchrist

9

Befunge 320 313 303 Zeichen

(einschließlich bedeutender Zeilenumbrüche und Leerzeichen)

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

Ich frage mich, ob ich das durch Umleiten der Pfade verkleinern könnte ...

Bearbeiten: Den oberen Teil neu gestalten, um eine zusätzliche Linie zu vermeiden.


8

Perl 5.10 - 27 Zeichen

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

Liest das Argument von stdin.


7

Ruby 1.9, 39 Zeichen

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

Eingabe (darf nicht mit einem Zeilenumbruch abgeschlossen werden) über stdin. Beispielaufruf:

echo -n 500 | ruby1.9 palinenum.rb

40 Zeichen für eine Version, die Befehlszeilenargumente verwendet:

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

Rohit schlug vor, jeweils 3 Zeichen zu speichern, indem panstelle von verwendet wird puts.
Peter Taylor

Mit Ihrem Code habe ich die folgende Ausgabe erhalten, die falsch zu sein scheint (ich verwende 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"] Der folgende Code funktioniert für mich. Können p ('0'..gets[0..-2]).select{|i|i==i.reverse} Sie Ihren Code erklären ?
Rohit

@PeterTaylor @Rohit pund putssind nicht äquivalent, in der Tat unterbricht pdie Ausgabe, da jedes Element in eine neue Zeile geschrieben wird, wenn es mit einem Array aufgerufen wird , während peinfach aufgerufen wird.to_s .
Ventero

6

J , 20 Zeichen

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

Ich kann es lesen! :) Schön
defhlt

Übrigens, um eine Anforderung zu erfüllen, sollten Sie eine Nummer pro Zeile hinzufügen ,"0.
defhlt

@defhlt ,.funktioniert auch
Bolce Bussiere

5

Python, 57 51 Zeichen

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

Verwendung:

echo 500 | python palindromic.py

3
Kürzere:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski

Wenn die Verwendung des interaktiven Interpreters legitim ist, können Sie dies vermeiden printund einfach tun if`i`==`i`[::-1]:i(ich sage dies, weil die Scala-Lösung davon abhängt).
Bakuriu

Der Bereich sollte inklusive sein. Und ich denke, Sie können Ihre Byteanzahl auf 50 ändern (Zeilenumbrüche sind unter Linux kürzer).
Malkaroee

5

Perl> 5.10: 25 Zeichen

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


3

Javascript 122 108 107 Zeichen ...

Ich bin mir sicher, dass dies mehr Golf gespielt werden kann - ich bin neu in diesem Bereich!

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

oder

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

Nun, für den Anfang sind die vars nicht erforderlich, Sie können die Dinge einfach global machen. Auch prompt()nicht streng Parameter benötigen.
Ahnungslos

Sie können jedoch Parameter verwenden prompt(), um ein Semikolon zu speichern : n=prompt(o=[]);.
Mellamokb

Auch Sie haben noch eine var i=0, die die varin Ihrem entfernt haben kann for.
Mellamokb

1
Der Trick ist, dass vor dem Hinzufügen von 1 zu i++<nverglichen . Somit läuft es den ganzen Weg nach . Wenn Sie bei anhalten möchten, würden Sie stattdessen verwenden. i<nii=ni=n-1++i<n
Mellamokb

1
alert(o.join(" "))muss alert(o.join("\n"))den Spezifikationen entsprechen. Fügen Sie Ihrer Charakterzahl 1 hinzu, wenn Sie dies beheben.
Thomas Eding

3

Perl - 43 Zeichen

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

Dies ist mein erster Versuch, Code-Golf zu spielen, daher bin ich mir ziemlich sicher, dass ein Perl-Profi Golf spielen könnte.



2

PHP 64 58

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

$ _GET ['n'] wurde für die Befehlszeileneingabe in $ argv [1] geändert.


2

Scala 59

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

Ich kenne keine Scala, aber druckt das wirklich auf stdout? Ich hätte gedacht, dass es ein Ausdruck ist, der eine Zeichenfolge zurückgibt.
Omar

In der interaktiven Scala REPL ja. Sie können es hier auf simplyscala.com testen, müssen es jedoch readIntonline durch eine konkrete Nummer ersetzen .
Benutzer unbekannt

2

PHP, 59 55 53 Zeichen

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

Verwendung

php palindromic.php 500

Edit: danke Thomas


Sie können die {s um die for-Schleife entfernen und das Leerzeichen entfernen echo "$i\n", um zu erhalten echo"$i\n". Das erspart Ihnen ein paar Zeichen. Wenn Sie frech sein möchten, können Sie auch \nfür `` wechseln und ein Zeichen speichern.
Thomas Clayson

2

C, 98 Zeichen

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 (Rastergröße 37x4 = 148)

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

Haben Sie eine bessere Antwort auf diese Frage. Dies ist speziell Befunge-93; Mit Befunge-98 könnte ich es wahrscheinlich noch kompakter machen. Ich werde das in eine zukünftige Bearbeitung aufnehmen.

Da Sie in Befunge keine Zeichenfolgen bearbeiten können, war das Beste, was ich tun konnte, die Umkehrung der Ziffern jeder Zahl zu berechnen (was ich überrascht bin, dass ich ohne pund auskommen konnte g) und sie mit der ursprünglichen Zahl zu vergleichen. Die Ziffernumkehr nimmt den größten Teil des Codes ein (im Grunde die gesamte dritte und vierte Zeile).

Beachten Sie, dass das Programm in seiner jetzigen Form die Zahlen von der Eingabe bis 0 rückwärts druckt. Wenn dies eine große Sache ist, lassen Sie es mich wissen. (Die Herausforderung besteht nur darin, sie aufzuzählen, nicht speziell in aufsteigender Reihenfolge.)


+1. Zeilen können \nalleine geschlossen werden , sodass sie 94 Byte lang sind. Ich denke nicht, dass Ihre "Gittergröße" eine besondere Relevanz hat.
Har-Wradim

2

05AB1E , 5 Bytes (nicht konkurrierend)

Die Sprache datiert die Herausforderung nach und ist daher nicht konkurrierend . Code:

ƒNÂQ–

Erläuterung:

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

Verwendet die CP-1252- Codierung. Probieren Sie es online aus! .


LʒÂQist 4, aber immer noch nicht konkurrierend.
Magic Octopus Urn

2

Brachylog (2), Frage nach den Sprachdaten:

Mit dem in der Frage angegebenen E / A-Format 8 Bytes

≥ℕA↔A≜ẉ⊥

Probieren Sie es online aus!

Mit modernen PPCG-E / A-Regeln 4 Bytes

≥ℕ.↔

Probieren Sie es online aus!

Dies ist eine Funktion, die alle Ausgaben generiert, kein vollständiges Programm wie im vorherigen Beispiel, und daher nicht der angegebenen Spezifikation entspricht, aber ich dachte, ich würde zeigen, wie das Programm aussehen würde, wenn die Frage geschrieben worden wäre nach modernen E / A-Standards (die die Verwendung von Funktionen und die Ausgabe über Generatoren ermöglichen).

Erläuterung

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

Für die vollständige Programmversion erstellen wir eine temporäre Variable A, um die Ausgabe zu speichern, sie explizit zu kennzeichnen (dies erfolgt implizit für das Hauptprädikat eines Programms) und verwenden die bekannte ẉ⊥Technik zum Ausgeben der Elemente eines Generators an die Standardausgabe.


Wann konnten Sie nach modernen PPCG-E / A-Regeln einen Generator als Übermittlung verwenden?
Undichte Nonne

@LeakyNun: Ich habe den Vorschlag am 30. November 2016 gemacht , aber der Konsens ist, dass sie zu diesem Zeitpunkt bereits legal waren (nur nicht dokumentiert). Wir haben eine explizite Regel, die sie jetzt erlaubt; Während des größten Teils des Jahres 2016 waren sie nicht ausdrücklich erlaubt und auch nicht ausdrücklich verboten.

Na ja, ich verstehe.
Undichte Nonne

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 Zeichen sind nicht wirklich sehr wettbewerbsfähig. Vielleicht könnten Sie die Variablennamen auf ein Zeichen reduzieren und die Leerzeichen zwischen den Variablen und Operatoren löschen?
Gareth

Gut gemacht. Einige gute Tipps zum Golfen Python finden Sie in dieser Frage: codegolf.stackexchange.com/questions/54/…
Gareth

Sie können n loswerden - ersetzen Sie einfach int (n) durch int (raw_input ()) - und Sie können str (a) in der if-Anweisung in r ändern
Omar

1

Groovy, 83

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

1

Q (34 Zeichen)

Übergeben Sie n anstelle von n + 1 als Argument für diese Q-Lösung.

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


1

Q (33)

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

Wahrscheinlich ein besserer Weg, dies zu tun, aber trotzdem, Beispielverwendung (Sie geben n + 1 ein, um zu n zu gelangen):

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

Vorschlag von tmartin, bringt es auf 29:

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

Gleiche Verwendung.


1

Python, 106 Zeichen

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)

Verwendung:

python a.py 500

1

C # ( 217 214 191 Zeichen)

Golfversion:

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

Lesbar:

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

Dies druckt Palindrome in absteigender Reihenfolge unter Verwendung des Operators n -> 0 aus. (wenn n auf 0 geht).

* Die bearbeitete Version ersetzt do ... während mit while und spart 3 Zeichen, aber jetzt müssen Sie mit n + 1 eingeben.

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

* bearbeitet: Es wurde eine bessere Möglichkeit gefunden, Zeichenfolgen umzukehren, ohne sie in ein Array zu konvertieren:

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

Lesbar:

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

Kann 53 niedriger sein? Vier verschiedene Optionen:

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

Wenn du funky werden willst ...

PHP 47

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

Sie müssen den Fehlertext ignorieren. Die Palindromnummern werden jedoch weiterhin in der Befehlszeile ausgegeben.


1

Pyth, 11

VhQIq`N_`NN

Beispiel:

$ 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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.