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.


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*

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.


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.


8

Perl 5.10 - 27 karakter

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

Membaca argumen dari stdin.


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}

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

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

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


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

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.



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.


2

Scala 59

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

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


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


2

Mathematica 61

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

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


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


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.


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

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

1

Q (34 karakter)

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

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


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.


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

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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.