Liệt kê tất cả các số palindromic (tính bằng số thập phân) trong khoảng từ 0 đến n


11

Cho một số nguyên n không âm, liệt kê tất cả các số palindromic (tính bằng số thập phân) trong khoảng từ 0 đến n (phạm vi bao gồm). Một số palindromic vẫn giữ nguyên khi các chữ số của nó được đảo ngược.

Các số palindromic đầu tiên (trong cơ sở 10) được đưa ra ở đây :

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

Đây là một golf mã với giải thưởng sẽ dành cho ít nhân vật nhất. Các số palindromic nên được xuất một trên mỗi dòng tới thiết bị xuất chuẩn. Chương trình nên đọc n từ dòng lệnh hoặc stdin.


3
Giữa 1 và n (theo tiêu đề) hoặc 0 và n (theo cơ thể)? Và giới hạn nào "giữa" bao gồm?
Peter Taylor

@wok: Bạn vẫn chưa trả lời nếu nó bao gồm hoặc phạm vi độc quyền? Là nmột phần của phạm vi bao gồm?
mellamokb

@mellamokb Phạm vi bao gồm.
Chảo

Câu trả lời:


7

Golf, 15 ký tự

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

Bạn có thể lưu một chuỗi so sánh char thay vì các số '~), {`.-1% =}, n *'.
Howard

@Howard, nếu bạn muốn đăng bài đó, tôi sẽ nâng cấp nó.
Peter Taylor

Điều đó sẽ giống như sao chép đơn giản ;-)
Howard

10

Perl 5.10, 29 (hoặc 39) ký tự

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

Cần saytính năng kích hoạt. 29 ký tự nếu bạn cho rằng đó là miễn phí, nếu không thì 39 để thêm use 5.010;. Luận cứ về STDIN.

Perl, 35 ký tự

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

sử dụng quy ước perlgolf cũ #!perlkhông được tính nhưng bất kỳ cờ nào theo sau nó.

Perl, 36 ký tự

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

Nếu không ai trong số những người khác đủ điều kiện.


Bạn có tử tế để giải thích $ / làm gì không?
Gurzo

1
@Gurzo $/là trình phân tách bản ghi đầu vào, mặc định là dòng mới. Nó chỉ ngắn hơn một chút so với nghĩa đen "\n".
hobbs

Sử dụng bản đồ ngắn hơn:map{say if$_==reverse}0..<>
jho

2
@jho ác. Gửi nó :)
hobbs

1
Nếu bạn sử dụng -Ethay cho -e, bạn nhận được saymiễn phí.
tchrist

9

Befunge 320 313 303 ký tự

(bao gồm các dòng mới và khoảng trắng quan trọng)

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

Tôi tự hỏi liệu tôi có thể làm cho nó nhỏ hơn bằng cách định tuyến lại các đường dẫn ...

Chỉnh sửa: làm lại phần trên cùng để tránh thêm một dòng.


8

Perl 5.10 - 27 ký tự

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

Đọc lập luận từ stdin.


7

Ruby 1.9, 39 ký tự

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

Đầu vào (không được kết thúc bằng một dòng mới) thông qua stdin. Ví dụ gọi:

echo -n 500 | ruby1.9 palinenum.rb

40 ký tự cho một phiên bản sử dụng dòng lệnh args:

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

Rohit đề xuất tiết kiệm 3 ký tự trong mỗi ký tự bằng cách sử dụng pthay vì puts.
Peter Taylor

Sử dụng mã của bạn Tôi nhận được kết quả đầu ra sau, có vẻ như đã sai (Tôi đang sử dụng 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"] Mã bên dưới hoạt động với tôi p ('0'..gets[0..-2]).select{|i|i==i.reverse} Bạn có thể giải thích mã của mình không.
Rohit

@PeterTaylor @Rohit pputskhông tương đương, trên thực tế, sử dụng pngắt đầu ra, vì đặt ghi mọi phần tử trên một dòng mới, nếu được gọi bằng một mảng , trong khi pchỉ đơn giản là gọi .to_s.
Ventero


5

Python, 57 51 ký tự

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

Sử dụng:

echo 500 | python palindromic.py

3
Ngắn for i in range(input()):if`i`==`i`[::-1]:print i
gọn

Nếu sử dụng trình thông dịch tương tác là hợp pháp, thì bạn có thể tránh printvà chỉ cần làm if`i`==`i`[::-1]:i(tôi nói điều này vì giải pháp Scala phụ thuộc vào điều này).
Bakuriu

Phạm vi nên được bao gồm. Và tôi nghĩ rằng bạn có thể thay đổi số byte của bạn thành 50 (ngắt dòng ngắn hơn trên linux).
malkaroee

5

Perl> 5.10: 25 ký tự

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


3

Javascript 122 108 107 ký tự ...

Tôi chắc chắn rằng điều này có thể được đánh gôn nhiều hơn - Tôi mới biết điều này!

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

hoặc là

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

Chà, đối với người mới bắt đầu varthì không cần thiết, bạn chỉ có thể làm mọi thứ trở nên toàn cầu. Cũng prompt()không cần tham số nghiêm ngặt.
Cluless

Tuy nhiên, bạn có thể sử dụng các tham số prompt()để lưu một dấu chấm phẩy : n=prompt(o=[]);.
mellamokb

Ngoài ra, bạn vẫn có một var i=0cái có thể varloại bỏ trong của bạn for.
mellamokb

1
Bí quyết là i++<nso sánh i<ntrước khi thêm 1 vào i. Vì vậy, nó chạy tất cả các cách để i=n. Nếu bạn muốn dừng lại i=n-1, bạn sẽ sử dụng ++i<nthay thế.
mellamokb

1
alert(o.join(" "))cần phải alert(o.join("\n"))theo thông số kỹ thuật. Thêm 1 vào số lượng nhân vật của bạn khi bạn sửa lỗi này.
Thomas Eding

3

Perl - 43 ký tự

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

Đây là nỗ lực đầu tiên của tôi về môn đánh gôn, vì vậy tôi khá chắc chắn rằng một Perl pro có thể đánh gôn.



2

PHP 64 58

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

Đã thay đổi $ _GET ['n'] thành $ argv [1] cho đầu vào dòng lệnh.


2

Scala 59

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

Tôi không biết Scala nào, nhưng nó có thực sự in trên thiết bị xuất chuẩn không? Tôi đã đoán nó là một biểu thức trả về một chuỗi.
Omar

Trong REPL tương tác, có. Bạn có thể kiểm tra nó ở đây Simplyscala.com nhưng phải thay thế readIntbằng một con số cụ thể, trực tuyến.
người dùng không xác định

2

PHP, 59 55 53 ký tự

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

Sử dụng

php palindromic.php 500

Chỉnh sửa: cảm ơn Thomas


bạn có thể xóa {s xung quanh vòng lặp for và xóa khoảng trống echo "$i\n"để lấy echo"$i\n". Điều đó sẽ giúp bạn tiết kiệm một vài ký tự. Ngoài ra, nếu bạn muốn táo tợn, bạn có thể thay đổi \ncho `` và lưu một char.
Thomas Clayson

2

C, 98 ký tự

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

Toán học 61

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

2

Befunge, 97 (kích thước lưới 37x4 = 148)

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

Có một câu trả lời Befunge tốt hơn cho câu hỏi này. Đây là Befunge-93 cụ thể; Tôi có thể làm cho nó nhỏ gọn hơn nữa với Befunge-98. Tôi sẽ bao gồm điều đó trong một chỉnh sửa trong tương lai.

Vì bạn không thể hoạt động trên các chuỗi trong Befunge, điều tốt nhất tôi có thể làm là tính toán đảo ngược chữ số của mỗi số (điều tôi ngạc nhiên là tôi có thể quản lý mà không pg) và so sánh nó với số ban đầu. Việc đảo ngược chữ số chiếm phần lớn mã (về cơ bản là toàn bộ dòng thứ ba và thứ tư).

Lưu ý rằng chương trình, như hiện tại, in các số ngược từ đầu vào xuống 0. Nếu đây là một vấn đề lớn, hãy cho tôi biết. (Thử thách chỉ nói để liệt kê chúng, không đặc biệt theo thứ tự tăng dần.)


+1. Các dòng có thể được đóng \nmột mình, vì vậy nó dài 94 byte. Tôi không nghĩ "kích thước lưới" của bạn có bất kỳ sự liên quan cụ thể nào.
har-wradim

2

05AB1E , 5 byte (không cạnh tranh)

Ngôn ngữ hoãn thách thức và do đó không cạnh tranh . Mã số:

ƒNÂQ–

Giải trình:

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

Sử dụng mã hóa CP-1252 . Hãy thử trực tuyến! .


LʒÂQlà 4, mặc dù không cạnh tranh ..
Bạch tuộc ma thuật Urn

2

Brachylog (2), câu hỏi postdates ngôn ngữ:

Với định dạng I / O được nêu trong câu hỏi, 8 byte

≥ℕA↔A≜ẉ⊥

Hãy thử trực tuyến!

Với quy tắc I / O PPCG hiện đại, 4 byte

≥ℕ.↔

Hãy thử trực tuyến!

Đây là một hàm tạo ra tất cả các kết quả đầu ra, không phải là một chương trình đầy đủ như ví dụ trước và do đó không tuân thủ thông số kỹ thuật như được viết, nhưng tôi nghĩ tôi sẽ cho thấy chương trình sẽ như thế nào nếu câu hỏi được viết theo tiêu chuẩn I / O hiện đại (cho phép sử dụng các chức năng và đầu ra thông qua các máy phát).

Giải trình

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

Đối với phiên bản chương trình đầy đủ, chúng tôi tạo một biến tạm thời Ađể giữ đầu ra, gắn nhãn rõ ràng cho nó (điều này được thực hiện hoàn toàn cho vị từ chính của chương trình) và sử dụng ẉ⊥kỹ thuật nổi tiếng để đưa các phần tử của trình tạo thành đầu ra tiêu chuẩn.


Khi nào các quy tắc I / O PPCG hiện đại cho phép bạn sử dụng một trình tạo như là đệ trình?
Leaky Nun

@LeakyNun: Tôi đã đưa ra đề xuất vào ngày 30 tháng 11 năm 2016 , nhưng sự đồng thuận là họ đã hợp pháp tại thời điểm đó (chỉ không được ghi nhận). Chúng tôi có một quy tắc rõ ràng cho phép họ bây giờ; trong hầu hết năm 2016, họ không được phép rõ ràng và họ cũng không bị cấm rõ ràng.

Ồ, tôi hiểu rồi.
Leaky Nun

1

Con trăn

n=raw_input('')
for a in range(0,int(n)+1):
    r=str(a)
    if str(a)==r[::-1]:
        print r

Hmm ... 232 nhân vật không thực sự rất cạnh tranh. Có lẽ bạn có thể giảm tên biến thành một ký tự và xóa khoảng trắng giữa các biến và toán tử?
Gareth

Làm tốt lắm. Một số mẹo hay để chơi gôn Python có thể được tìm thấy trong câu hỏi này: codegolf.stackexchange.com/questions/54/ mẹo
Gareth

Bạn có thể loại bỏ n --just thay thế int (n) bằng int (raw_input ()) - và bạn có thể thay đổi str (a) thành r trong câu lệnh if
Omar

1

Groovy, 83

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

1

Q (34 ký tự)

Truyền n chứ không phải n + 1 làm đối số cho giải pháp Q này.

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


1

Q (33)

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

Có lẽ là một cách gọn gàng hơn để làm điều này nhưng dù sao, sử dụng mẫu (bạn nhập n + 1 để đến n):

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

Đề xuất của tmartin, giảm xuống còn 29:

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

Cách sử dụng giống nhau.


1

Con trăn, 106 ký tự

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)

sử dụng:

python a.py 500

1

C # ( 217 214 191 ký tự)

Phiên bản chơi gôn:

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

Có thể đọc được

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

Điều này in ra các palindromes theo thứ tự giảm dần sử dụng toán tử n -> 0. (khi n đi về 0).

* Phiên bản đã chỉnh sửa thay thế làm ... trong khi với, lưu 3 ký tự, nhưng bây giờ bạn phải nhập bằng 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();}}

* đã chỉnh sửa: tìm thấy một cách tốt hơn để đảo ngược chuỗi mà không chuyển đổi thành mảng:

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

Có thể đọc được

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

53 có thể thấp hơn không? Bốn lựa chọn khác nhau:

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

Nếu bạn muốn có được ...

PHP 47

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

Bạn phải bỏ qua văn bản lỗi. Tuy nhiên, các số palindrom vẫn xuất ra dòng lệnh.


1

Bình thường, 11

VhQIq`N_`NN

Thí dụ:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.