Zlicz wszystkie liczby palindromowe (dziesiętnie) od 0 do n

11

Biorąc pod uwagę nieujemną liczbę całkowitą n, należy wyliczyć wszystkie liczby palindromowe (w systemie dziesiętnym) od 0 do n (zakres włącznie). Liczba palindromowa pozostaje taka sama, gdy jej cyfry są odwrócone.

Pierwsze liczby palindromowe (w bazie 10) podano tutaj :

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

To jest golf golfowy, w którym nagrodą jest jak najmniej znaków. Liczby palindromiczne powinny być wyprowadzane po jednym w wierszu na standardowe wyjście. Program powinien czytać n z wiersza poleceń lub stdin.

Wok
źródło
3
Między 1 in n (jak w tytule) lub 0 in n (jak w treści)? A który z granic obejmuje „pomiędzy”?
Peter Taylor
@wok: Nadal nie odpowiedziałeś, czy jest to zakres wyłączny czy wyłączny? Czy nnależy do tego zakresu?
mellamokb
@mellamokb Zakres obejmujący.
Wok

Odpowiedzi:

7

Golfscript, 15 znaków

~),{.`-1%~=},n*
Peter Taylor
źródło
Możesz zapisać znak porównujący ciągi zamiast liczb '~), {`.-1% =}, n *'.
Howard
@Howard, jeśli chcesz to opublikować, będę go głosować.
Peter Taylor
To byłoby jak zwykłe kopiowanie ;-)
Howard,
10

Perl 5.10, 29 (lub 39) znaków

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

Wymaga saywłączenia tej funkcji. 29 znaków, jeśli uważasz to za darmowe, w przeciwnym razie 39 do dodania use 5.010;. Argument na temat STDIN.

Perl, 35 znaków

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

używając starej konwencji perlgolfa, która #!perlnie jest liczona, ale są następujące flagi po niej.

Perl, 36 znaków

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

Jeśli żaden z pozostałych nie kwalifikuje się.

Hobbs
źródło
Czy byłbyś uprzejmy wyjaśnić, co robi $ /?
Gurzo
1
@ Gurzo $/to separator rekordów wejściowych, domyślnie nowy wiersz. Jest tylko trochę krótszy niż dosłowny "\n".
hobbs
Korzystanie z mapy jest krótsze:map{say if$_==reverse}0..<>
jho
2
@jho zło. Prześlij :)
hobbs
1
Jeśli użyjesz -Ezamiast tego -e, otrzymasz sayza darmo.
tchrist
9

Befunge 320 313 303 znaków

(w tym znaczące znaki nowej linii i białe znaki)

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

Zastanawiam się, czy mógłbym to zmniejszyć, przekierowując ścieżki ...

Edycja: zmień górną część, aby uniknąć dodatkowej linii.

Blindy
źródło
8

Perl 5.10 - 27 znaków

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

Czyta argument ze standardowego wejścia.

jho
źródło
7

Ruby 1.9, 39 znaków

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

Wejście (nie może być zakończone znakiem nowej linii) przez stdin. Przykładowe wywołanie:

echo -n 500 | ruby1.9 palinenum.rb

40 znaków dla wersji wykorzystującej argumenty wiersza poleceń:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
źródło
Rohit zaproponował zapisanie 3 znaków w każdym z nich za pomocą pzamiast puts.
Peter Taylor
Za pomocą twojego kodu otrzymałem następujące dane wyjściowe, które wydają się niepoprawne (używam 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"] Poniższy kod działa dla mnie p ('0'..gets[0..-2]).select{|i|i==i.reverse} Czy możesz wyjaśnić swój kod?
Rohit
@PeterTaylor @Rohit pi putsnie są równoważne, w rzeczywistości użycie pprzerywa wyjście, ponieważ zapisuje każdy element w nowej linii, jeśli jest wywoływany z tablicą , podczas gdy ppo prostu wywołuje .to_s.
Ventero
6

J , 20 znaków

(#~(-:|.)@":"0)>:i.n
efemeryczny
źródło
Mogę to przeczytać! :) Miło
defhlt
btw, aby spełnić wymaganie, należy wypisać po jednym numerze wyjściowym po jednym w wierszu ,"0.
defhlt
@defhlt również ,.działa
Bolce Bussiere
5

Python, 57 51 znaków

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

Stosowanie:

echo 500 | python palindromic.py
bezradny
źródło
3
Krótszy:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski
Jeśli korzystanie z interaktywnego interpretera jest uzasadnione, możesz tego uniknąć printi po prostu to zrobię if`i`==`i`[::-1]:i(mówię to, ponieważ od tego zależy rozwiązanie Scala).
Bakuriu
Zakres powinien obejmować. I myślę, że możesz zmienić liczbę bajtów na 50 (łamanie linii w Linuksie jest krótsze).
malkaroee,
5

Perl> 5,10: 25 znaków

map$_==reverse&&say,0..<>
Toto
źródło
4

APL ( 25 17)

↑t/⍨t≡∘⌽¨t←⍕¨0,⍳⎕
marinus
źródło
3

JavaScript 122 108 107 znaków ...

Jestem pewien, że można więcej grać w golfa - jestem nowy w tym!

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

lub

n=prompt(o=[]);i=-1;while(i++<n)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));
Thomas Clayson
źródło
Cóż, na początek nie varsą potrzebne, możesz po prostu sprawić, by wszystko było globalne. Nie prompt()wymaga też ściśle parametrów.
Nieświadomy
Jednakże, można użyć parametrów aby prompt()zapisać jeden średnik: n=prompt(o=[]);.
mellamokb
Również nadal masz coś, var i=0co można varusunąć w swoim for.
mellamokb
1
Sztuka polega na tym, że i++<nporównuje się i<nprzed dodaniem 1 do i. W ten sposób działa aż do i=n. Jeśli chcesz się zatrzymać i=n-1, skorzystasz ++i<nzamiast tego.
mellamokb
1
alert(o.join(" "))musi być alert(o.join("\n"))zgodny ze specyfikacją. Dodaj 1 do liczby postaci, gdy to naprawisz.
Thomas Eding,
3

Perl - 43 znaki

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

To moja pierwsza próba gry w golfa kodowego, więc jestem prawie pewien, że profesjonalista Perl mógłby to zagrać w golfa.

Gurzo
źródło
3

Haskell 66 znaków

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Thomas Eding
źródło
Błędnie napisano
Naprawiono (znaki wypełniające)
Thomas Eding
2

PHP 64 58

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

Zmieniono $ _GET ['n'] na $ argv [1] dla wprowadzania z wiersza poleceń.

Thomas Clayson
źródło
2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
nieznany użytkownik
źródło
Nie znam żadnej Scali, ale czy to naprawdę drukuje na stdout? Domyślam się, że to wyrażenie zwraca ciąg znaków.
Omar,
W interaktywnej scala REPL tak. Możesz go przetestować tutaj po prostuscala.com, ale musisz zastąpić readIntgo konkretną liczbą online.
użytkownik nieznany
2

PHP, 59 55 53 znaków

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

Stosowanie

php palindromic.php 500

Edycja: dzięki Thomas

Alfwed
źródło
możesz usunąć {s wokół pętli for i usunąć spację, echo "$i\n"aby uzyskać echo"$i\n". Dzięki temu zaoszczędzisz kilka znaków. Ponadto, jeśli chcesz być bezczelny, możesz zmienić \nna `` i zapisać znak.
Thomas Clayson
2

C, 98 znaków

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
źródło
2

k (23 znaki)

{i@&{&/i=|i:$x}'i:!1+x}
skeevey
źródło
2

Mathematica 61

Column@Select[0~Range~Input[],#==Reverse@#&@IntegerDigits@#&]
chyanog
źródło
2

Befunge, 97 (rozmiar siatki 37x4 = 148)

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

Uzyskaj lepszą odpowiedź Befunge na to pytanie. Jest to konkretnie Befunge-93; Prawdopodobnie mógłbym uczynić to jeszcze bardziej kompaktowym dzięki Befunge-98. Uwzględnię to w przyszłej edycji.

Ponieważ nie możesz operować na ciągach znaków w Befunge, najlepsze, co mogłem zrobić, to obliczyć cyfrę do tyłu każdej liczby (co mnie dziwi, że udało mi się bez niej pi g) i porównać ją z liczbą oryginalną. Odwrócenie cyfr zajmuje większość kodu (w zasadzie całe trzecie i czwarte wiersze).

Zauważ, że program w obecnej postaci drukuje liczby od wejścia do tyłu do 0. Jeśli to wielka sprawa, daj mi znać. (Wyzwanie mówi tylko o ich wyliczeniu, a nie w kolejności rosnącej).

Kasran
źródło
+1. Linie mogą być zamykane \nosobno, więc mają długość 94 bajtów. Nie sądzę, żeby twój „rozmiar siatki” miał jakieś szczególne znaczenie.
har-wradim
2

05AB1E , 5 bajtów (niekonkurujące)

Język jest późniejszy od wyzwania i dlatego nie konkuruje . Kod:

ƒNÂQ–

Wyjaśnienie:

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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
LʒÂQma 4 lata, ale wciąż nie konkuruje ..
Magic Octopus Urn
2

Brachylog (2), język postdates pytanie:

W formacie I / O podanym w pytaniu 8 bajtów

≥ℕA↔A≜ẉ⊥

Wypróbuj online!

Dzięki nowoczesnym regułom we / wy PPCG, 4 bajty

≥ℕ.↔

Wypróbuj online!

Jest to funkcja, która generuje wszystkie dane wyjściowe, a nie pełny program, jak w poprzednim przykładzie, a więc nie jest zgodna ze specyfikacją, jak napisano, ale pomyślałem, że pokażę, jak wyglądałby program, gdyby pytanie zostało napisane zgodnie ze współczesnymi standardami I / O (które pozwalają na korzystanie z funkcji i generowanie danych przez generatory).

Wyjaśnienie

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

W przypadku pełnej wersji programu tworzymy zmienną tymczasową Ado przechowywania danych wyjściowych, jawnego oznaczania ich etykietą (odbywa się to domyślnie dla głównego predykatu programu) i wykorzystujemy dobrze znaną ẉ⊥technikę wyprowadzania elementów generatora na standardowe wyjście.


źródło
Kiedy nowoczesne reguły we / wy PPCG zezwalają na użycie generatora do przesyłania?
Leaky Nun
@LeakyNun: Złożyłem wniosek w dniu 30 listopada 2016 r. , Ale zgodnie zgadzam się , że były one już w tym momencie legalne (po prostu nieudokumentowane). Mamy wyraźną zasadę, która pozwala im teraz; przez większość 2016 r. nie były one wyraźnie dozwolone i nie zostały również wyraźnie zbanowane.
Cóż, rozumiem.
Leaky Nun
1

Pyton

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r
użytkownik1027046
źródło
Hmm ... 232 znaki nie są zbyt konkurencyjne. Być może mógłbyś zredukować nazwy zmiennych do jednego znaku i usunąć spacje między zmiennymi a operatorami?
Gareth,
Dobra robota. Kilka dobrych wskazówek dotyczących gry w golfa Python można znaleźć w tym pytaniu: codegolf.stackexchange.com/questions/54/…
Gareth,
Możesz pozbyć się n - just replace int (n) int (raw_input ()) - i możesz zmienić str (a) na rw instrukcji if
Omar
1

Groovy, 83

System.in.eachLine{(0..it.toInteger()).each{if("$it"=="$it".reverse())println(it)}}
Armand
źródło
1

Q (34 znaki)

Podaj n zamiast n + 1 jako argument dla tego rozwiązania Q.

{i(&)({all i=(|)i:($)x}')i:(!)1+x}
skeevey
źródło
1

P, 32

{a(&)a~'((|:)')a:((-3!)')(!)1+x}
tartin
źródło
1

Q (33)

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

Prawdopodobnie fajniejszy sposób na zrobienie tego, ale mimo wszystko przykładowe użycie (wpisujesz n + 1, aby dostać się do n):

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

Sugestia tmartin, sprowadza się do 29:

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

Takie samo użycie.

sinedcm
źródło
1

Python, 106 znaków

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)

stosowanie:

python a.py 500
Ashwini Chaudhary
źródło
1

C # ( 217 214 191 znaków)

Wersja golfowa:

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

Czytelny:

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

Wyświetla palindromy w malejącej kolejności, korzystając z operatora n -> 0. (gdy n idzie do 0).

* Edytowana wersja zastępuje ... podczas gdy, oszczędzając 3 znaki, ale teraz musisz wprowadzić 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();}}

* edytowane: znalazłem lepszy sposób na odwrócenie łańcucha bez konwersji na tablicę:

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

Czytelny:

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
źródło
1

PHP 53

Czy 53 może być niższy? Cztery różne opcje:

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

Jeśli chcesz uzyskać funky ...

PHP 47

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

Musisz zignorować tekst błędu. Jednak liczby palindromów są nadal wyprowadzane do wiersza poleceń.

jdstankosky
źródło
1

Pyth, 11

VhQIq`N_`NN

Przykład:

$ 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
źródło