Hitung semua angka palindrom (dalam desimal) antara 0 dan n

11

Dengan bilangan bulat n-negatif, sebutkan semua angka palindromik (dalam desimal) antara 0 dan n (rentang inklusif). Angka palindromik tetap sama ketika digitnya dibalik.

Angka palindromik pertama (dalam basis 10) diberikan di sini :

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 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, ...

Ini adalah kode golf dengan hadiah mencapai karakter paling sedikit. Angka-angka palindrom harus merupakan keluaran satu per baris ke stdout. Program harus membaca n dari commandline atau stdin.

Wok
sumber
3
Antara 1 dan n (sesuai judul) atau 0 dan n (sesuai tubuh)? Dan yang mana dari batasan yang "antara" termasuk?
Peter Taylor
@wok: Anda masih belum menjawab apakah rentang inklusif atau eksklusif? Apakah nbagian dari rentang termasuk?
mellamokb
@mellamokb Kisaran inklusif.
Wok

Jawaban:

7

Golfscript, 15 karakter

~),{.`-1%~=},n*
Peter Taylor
sumber
Anda dapat menyimpan karakter yang membandingkan string bukan angka '~), {`.-1% =}, n *'.
Howard
@ Howard, jika Anda ingin mempostingnya sendiri, saya akan membatalkannya.
Peter Taylor
Itu akan terasa seperti menyalin biasa ;-)
Howard
10

Perl 5.10, 29 (atau 39) karakter

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

Membutuhkan sayfitur yang diaktifkan. 29 karakter jika Anda menganggap itu gratis, sebaliknya 39 ditambahkan use 5.010;. Argumen tentang STDIN.

Perl, 35 karakter

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

menggunakan konvensi perlgolf lama yang #!perltidak dihitung tetapi ada flag yang mengikutinya.

Perl, 36 karakter

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

Jika tidak ada yang memenuhi syarat.

hobbs
sumber
Apakah Anda akan dengan baik hati menjelaskan apa yang $ / lakukan?
Gurzo
1
@Gurzo $/adalah pemisah rekaman input, yang default ke baris baru. Hanya sedikit lebih pendek dari literal "\n".
hobbs
Menggunakan peta lebih pendek:map{say if$_==reverse}0..<>
jho
2
@ yang jahat. Kirimkan itu :)
hobbs
1
Jika Anda menggunakan -Esebagai pengganti -e, Anda dapatkan saysecara gratis.
tchrist
9

Befunge 320 313 303 karakter

(termasuk baris baru dan spasi yang signifikan)

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

Aku ingin tahu apakah aku bisa membuat ini lebih kecil dengan mengubah rute jalan ...

Sunting: redid bagian atas untuk menghindari garis tambahan.

Buta
sumber
8

Perl 5.10 - 27 karakter

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

Membaca argumen dari stdin.

jho
sumber
7

Ruby 1.9, 39 karakter

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

Input (tidak boleh diakhiri dengan baris baru) via stdin. Doa contoh:

echo -n 500 | ruby1.9 palinenum.rb

40 karakter untuk versi yang menggunakan arg baris perintah:

puts (?0..$*[0]).select{|i|i==i.reverse}
Ventero
sumber
Rohit mengusulkan untuk menyimpan 3 karakter di masing-masing dengan menggunakan palih-alih puts.
Peter Taylor
Menggunakan kode Anda, saya mendapatkan output berikut, yang tampaknya salah (saya menggunakan 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"] Kode di bawah ini berfungsi untuk saya p ('0'..gets[0..-2]).select{|i|i==i.reverse} Bisakah Anda menjelaskan kode Anda.
Rohit
@PeterTaylor @Rohit pdan putstidak setara, sebenarnya menggunakan pistirahat output, seperti menempatkan menulis setiap elemen pada baris baru, jika dipanggil dengan array , sedangkan phanya memanggil .to_s.
Ventero
6

J , 20 karakter

(#~(-:|.)@":"0)>:i.n
singkat
sumber
Saya bisa membacanya! :) Bagus
defhlt
btw, untuk memenuhi nomor keluaran persyaratan satu per baris Anda harus menambahkan ,"0.
defhlt
@defhlt juga ,.bekerja
Bolce Bussiere
5

Python, 57 51 karakter

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

Pemakaian:

echo 500 | python palindromic.py
Tidak mengerti
sumber
3
Lebih pendek:for i in range(input()):if`i`==`i`[::-1]:print i
Steven Rumbalski
Jika menggunakan interpreter interaktif adalah sah, maka Anda dapat menghindari printdan hanya melakukan if`i`==`i`[::-1]:i(saya katakan ini karena solusi Scala tergantung pada ini).
Bakuriu
Kisarannya harus inklusif. Dan saya pikir Anda dapat mengubah jumlah byte Anda menjadi 50 (linebreak lebih pendek di linux).
malkaroee
5

Perl> 5.10: 25 karakter

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

APL ( 25 17)

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

Javascript 122 108 107 karakter ...

Saya yakin ini bisa bermain golf lebih banyak - saya baru dalam hal ini!

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

atau

n=prompt(o=[]);i=-1;while(i++<n)if(i+''==(i+'').split("").reverse().join(""))o.push(i);alert(o.join("\n"));
Thomas Clayson
sumber
Nah, sebagai permulaan, varini tidak dibutuhkan, Anda bisa menjadikannya global. Juga prompt()tidak sepenuhnya membutuhkan parameter.
Clueless
Namun, Anda dapat menggunakan parameter untuk prompt()menyelamatkan satu titik koma: n=prompt(o=[]);.
mellamokb
Anda juga masih memiliki var i=0yang dapat vardihapus di Internet for.
mellamokb
1
Kuncinya adalah i++<nmembandingkan i<nsebelum menambahkan 1 ke i. Dengan demikian, semua berjalan ke i=n. Jika Anda ingin berhenti i=n-1, Anda akan menggunakannya ++i<n.
mellamokb
1
alert(o.join(" "))harus alert(o.join("\n"))sesuai dengan spesifikasi. Tambahkan 1 ke jumlah karakter Anda ketika Anda memperbaikinya.
Thomas Eding
3

Perl - 43 karakter

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

Ini adalah upaya pertama saya di kode golf, jadi saya cukup yakin seorang pro Perl bisa menurunkannya.

Gurzo
sumber
3

Haskell 66 karakter

main=do n<-readLn;mapM_ putStrLn[s|s<-map show[0..n],s==reverse s]
Thomas Eding
sumber
Salah
mengeja
Diperbaiki (pengisi pengisi)
Thomas Eding
2

PHP 64 58

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

Mengubah $ _GET ['n'] menjadi $ argv [1] untuk input baris perintah.

Thomas Clayson
sumber
2

Scala 59

(0 to readInt)filter(x=>""+x==(""+x).reverse)mkString("\n")
Pengguna tidak diketahui
sumber
Saya tidak tahu Scala, tetapi apakah itu benar-benar mencetak di stdout? Saya akan menduga itu adalah ekspresi yang mengembalikan string.
Omar
Dalam scala REPL interaktif, ya. Anda dapat mengujinya di sini simplyscala.com tetapi harus mengganti readIntdengan nomor konkret, online.
pengguna tidak diketahui
2

PHP, 59 55 53 karakter

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

Pemakaian

php palindromic.php 500

Sunting: terima kasih Thomas

Alfwed
sumber
Anda dapat menghapus {s di sekitar for loop dan menghapus spasi echo "$i\n"untuk mendapatkannya echo"$i\n". Itu akan menghemat beberapa karakter. Juga, jika Anda ingin nakal, Anda dapat mengubah \nuntuk `` dan menyimpan char.
Thomas Clayson
2

C, 98 karakter

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
sumber
2

k (23 karakter)

{i@&{&/i=|i:$x}'i:!1+x}
skeevey
sumber
2

Mathematica 61

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

Befunge, 97 (ukuran kotak 37x4 = 148)

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

Dapatkan jawaban Befunge yang lebih baik untuk pertanyaan ini. Ini Befunge-93 secara khusus; Saya mungkin bisa membuatnya lebih ringkas dengan Befunge-98. Saya akan memasukkannya dalam sunting mendatang.

Karena Anda tidak dapat beroperasi pada string di Befunge, yang terbaik yang bisa saya lakukan adalah menghitung angka-kebalikan dari setiap nomor (yang saya terkejut saya bisa kelola tanpa pdan g) dan membandingkannya dengan nomor asli. Digit-reverse mengambil sebagian besar kode (pada dasarnya seluruh baris ketiga dan keempat).

Perhatikan bahwa program, seperti yang ada sekarang, mencetak angka mundur dari input ke 0. Jika ini masalah besar, beri tahu saya. (Tantangannya hanya mengatakan untuk menyebutkan mereka, tidak secara khusus dalam urutan meningkat.)

Kasran
sumber
+1. Garis dapat ditutup \nsendiri, jadi panjangnya 94 byte. Saya tidak berpikir "ukuran grid" Anda memiliki relevansi khusus.
har-wradim
2

05AB1E , 5 byte (tidak bersaing)

Bahasa ini mengungguli tantangan dan karenanya tidak bersaing . Kode:

ƒNÂQ–

Penjelasan:

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

Menggunakan pengodean CP-1252 . Cobalah online! .

Adnan
sumber
LʒÂQadalah 4, masih belum bersaing ..
Magic Octopus Mm
2

Brachylog (2), pertanyaan tanggal bahasa:

Dengan format I / O yang dinyatakan dalam pertanyaan, 8 byte

≥ℕA↔A≜ẉ⊥

Cobalah online!

Dengan aturan I / O PPCG modern, 4 byte

≥ℕ.↔

Cobalah online!

Ini adalah fungsi yang menghasilkan semua output, bukan program lengkap seperti contoh sebelumnya, dan karenanya tidak sesuai dengan spesifikasi seperti yang tertulis, tapi saya pikir saya akan menunjukkan bagaimana program akan terlihat seperti jika pertanyaan telah ditulis dengan standar I / O modern (yang memungkinkan penggunaan fungsi, dan output melalui generator).

Penjelasan

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

Untuk versi program lengkap, kami membuat variabel sementara Auntuk menahan output, secara eksplisit melabelnya (ini dilakukan secara implisit untuk predikat utama program), dan menggunakan ẉ⊥teknik terkenal untuk mengeluarkan elemen generator ke output standar.


sumber
Kapan aturan I / O PPCG modern memungkinkan Anda menggunakan generator sebagai submisi?
Leaky Nun
@LeakyNun: Saya membuat proposal pada 30 November 2016 , tetapi konsensusnya adalah bahwa mereka sudah legal pada saat itu (tidak didokumentasikan). Kami memiliki aturan eksplisit yang memungkinkan mereka sekarang; sampai sebagian besar tahun 2016, mereka tidak diizinkan secara eksplisit dan mereka juga tidak secara eksplisit dilarang.
Oh, begitu.
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
pengguna1027046
sumber
Hmm ... 232 karakter sebenarnya tidak terlalu kompetitif. Mungkin Anda bisa mengurangi nama variabel menjadi satu karakter dan menghapus spasi antara variabel dan operator?
Gareth
Kerja bagus. Beberapa tips yang baik untuk bermain golf Python dapat ditemukan dalam pertanyaan ini: codegolf.stackexchange.com/questions/54/…
Gareth
Anda dapat menyingkirkan n - cukup ganti int (n) dengan int (raw_input ()) - dan Anda dapat mengubah str (a) menjadi r dalam pernyataan if
Omar
1

Groovy, 83

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

Q (34 karakter)

Lewati n daripada n +1 sebagai argumen untuk solusi Q ini.

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

Q, 32

{a(&)a~'((|:)')a:((-3!)')(!)1+x}
tmartin
sumber
1

Q (33)

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

Mungkin cara yang lebih rapi untuk melakukan ini tetapi bagaimanapun, sampel penggunaan (Anda memasukkan n +1 untuk sampai ke n):

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

Saran oleh tmartin, turun ke 29:

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

Penggunaan yang sama.

sinedcm
sumber
1

Python, 106 karakter

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)

pemakaian:

python a.py 500
Ashwini Chaudhary
sumber
1

C # ( 217 214 191 karakter)

Versi golf:

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

Dapat dibaca:

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

Ini mencetak palindrom dengan urutan menurun menggunakan operator n -> 0. (seperti n pergi ke 0).

* Versi yang sudah diedit menggantikan do ... while with while, menyimpan 3 karakter, tetapi sekarang Anda harus memasukkan dengan 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();}}

* diedit: menemukan cara yang lebih baik untuk membalikkan string tanpa mengubah ke 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();}}

Dapat dibaca:

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
sumber
1

PHP 53

Bisakah 53 lebih rendah? Empat opsi berbeda:

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

Jika Anda ingin ...

PHP 47

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

Anda harus mengabaikan teks kesalahan. Namun, nomor palindrome masih ditampilkan ke baris perintah.

jdstankosky
sumber
1

Pyth, 11

VhQIq`N_`NN

Contoh:

$ 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
sumber