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.


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*

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


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.


8

Perl 5.10 - 27 znaków

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

Czyta argument ze standardowego wejścia.


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}

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


5

Python, 57 51 znaków

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

Stosowanie:

echo 500 | python palindromic.py

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,



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

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.



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


2

Scala 59

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

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


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


2

Mathematica 61

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

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


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


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.


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

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

1

Q (34 znaki)

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

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


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.


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

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.