列举0到n之间的所有回文数(十进制)


11

给定一个非负整数n,请列举介于0和n(包括范围)之间的所有回文数(十进制)。回数数字相反时,其数字保持不变。

第一个回文数(以10为底)在这里给出:

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

这是一场代码高尔夫,奖金最少的人物。回文编号应每行输出到stdout。该程序应从命令行或标准输入中读取n。


3
是1到n(按标题)还是0到n(按正文)?“之间”包括哪些界限?
彼得·泰勒

@wok:您是否仍未回答包含范围或专有范围?是否n包括在内?
mellamokb 2011年

@mellamokb包含范围。
炒锅

Answers:


7

Golfscript,15个字符

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

您可以保存一个比较字符串而不是数字'〜),{`.-1%=},n *'的字符。
霍华德

@Howard,如果您要自己张贴,我会投票赞成。
彼得·泰勒

感觉就像是普通复制;-)
霍华德

10

Perl 5.10,29(或39)个字符

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

需要say启用该功能。如果您认为免费,则为29个字符,否则为39个字符use 5.010;。关于STDIN的争论。

Perl,35个字符

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

使用#!perl不计算在内的旧perlgolf约定,但遵循该约定的任何标志。

Perl,36个字符

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

如果没有其他人有资格。


您愿意解释$ /做什么吗?
Gurzo 2011年

1
@Gurzo $/是输入记录分隔符,默认为换行符。它比文字短一点"\n"
hobbs

使用地图的时间更短:map{say if$_==reverse}0..<>
jho 2011年

2
@jho邪恶。提交:)
hobbs

1
如果您使用-E代替-e,则可以say免费获得。
tchrist 2012年

9

Befunge 320个 313 303字符

(包括重要的换行符和空格)

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

我想知道是否可以通过重新路由路径来减小此尺寸...

编辑:重做顶部以避免多余的线条。


8

Perl 5.10-27个字符

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

从stdin读取参数。


7

Ruby 1.9,39个字符

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

通过stdin输入(不得以换行符终止)。调用示例:

echo -n 500 | ruby1.9 palinenum.rb

使用命令行参数的版本为40个字符:

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

罗希特(Rohit)建议使用p代替来在每个字符中保存3个字符puts
彼得·泰勒2012年

使用您的代码,我得到以下输出,这似乎是错误的(我正在使用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"] 下面的代码对我 有用 p ('0'..gets[0..-2]).select{|i|i==i.reverse} 请您解释一下代码。
罗希特

@PeterTaylor @Rohit pputs不是等效的,实际上使用p会中断输出,因为puts 将每个元素写入换行符(如果使用数组p调用),而只是调用.to_s
Ventero


5

Python,57个 51个字符

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

用法:

echo 500 | python palindromic.py

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

如果使用交互式解释器是合法的,那么您可以避免使用print和这样做if`i`==`i`[::-1]:i(我这样说是因为Scala解决方案取决于此)。
巴库里

该范围应包括在内。而且我认为您可以将字节数更改为50(Linux上的换行符较短)。
malkaroee 2014年

5

Perl> 5.10:25个字符

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


3

Java脚本 122 108 107个字符...

我敢肯定,这可以打得更多-我是新手!

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

要么

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

好吧,对于初学者来说,var不需要s,您可以将其全局化。也prompt()并不严格需要的参数。
笨拙的

但是,您可以使用参数prompt()来保存一个分号:n=prompt(o=[]);
mellamokb 2011年

另外,您仍然var i=0可以var删除其中的一个for
mellamokb 2011年

1
诀窍是在将1加到之前i++<n进行比较。因此,它一直运行到。如果您想在停留,请改用。i<nii=ni=n-1++i<n
mellamokb

1
alert(o.join(" "))需要alert(o.join("\n"))根据规格。解决此问题时,请在字符数上加1。
Thomas Eding

3

Perl-43个字符

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

这是我第一次尝试打高尔夫,所以我很确定Perl专业人士可以打高尔夫。



2

的PHP 64 58

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

将用于命令行输入的$ _GET ['n']更改为$ argv [1]。


2

斯卡拉59

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

我不知道任何Scala,但这真的可以在stdout上打印出来吗?我猜想这是一个返回字符串的表达式。
奥马尔

在交互式scala REPL中,可以。您可以在simplyscala.com上对其进行测试,但必须readInt在线替换为具体数字。
用户未知,

2

PHP,59 55 53字符

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

用法

php palindromic.php 500

编辑:谢谢托马斯


您可以删除for循环周围的{s,并删除中的空格echo "$i\n"以获取echo"$i\n"。这样可以节省一些字符。另外,如果您想厚脸皮,可以将其更改\n为``并保存一个字符。
Thomas Clayson

2

C,98个字符

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(网格尺寸37x4 = 148)

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

对这个问题有更好的Befunge答案。特别是Befunge-93;我可能可以使用Befunge-98使它更加紧凑。我将在以后的编辑中添加它。

由于您无法在Befunge中对字符串进行操作,因此,我能做的最好的事情是计算每个数字的反向数字(我很惊讶没有p和就能管理g),并将其与原始数字进行比较。反向数字占用大部分代码(基本上是整个第三和第四行)。

请注意,该程序从现在开始将数字从输入向下打印到0。如果这很重要,请告诉我。(挑战只是说要枚举它们,而不是按递增的顺序。)


+1。行可以单独关闭\n,因此长度为94个字节。我认为您的“网格大小”没有任何特殊意义。
har-wradim 2014年

2

05AB1E,5个字节(非竞争)

语言是挑战的最早发布日期,因此是非竞争性的。码:

ƒNÂQ–

说明:

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

使用CP-1252编码。在线尝试!


LʒÂQ4,非竞争依旧,但..
魔术八达通金塔

2

Brachylog(2),语言发布日期问题:

使用问题中说明的I / O格式,即8个字节

≥ℕA↔A≜ẉ⊥

在线尝试!

使用现代的PPCG I / O规则,4个字节

≥ℕ.↔

在线尝试!

这是一个生成所有输出的函数,而不是像上一个示例那样的完整程序,因此不符合所编写的规范,但是我想我将展示该程序在编写问题后的外观。符合现代I / O标准(允许使用功能,并通过生成器输出)。

说明

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

对于完整的程序版本,我们创建一个临时变量A来保存输出,将其显式标记(对程序的主谓词隐式完成),然后使用众所周知的ẉ⊥技术将生成器的元素输出到标准输出。


现代PPCG I / O规则何时允许您使用生成器作为提交?
Leaky Nun

@LeakyNun:我是在2016年11月30日提出提案的,但共识是他们当时已经合法(只是没有记录在案)。我们现在有一条明确的规则允许他们这样做;在2016年的大部分时间里,都没有明确允许使用它们,也没有明确禁止使用它们。

哦,我知道了。
Leaky Nun

1

蟒蛇

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

嗯... 232个字符并不是很有竞争力。也许您可以将变量名简化为一个字符,然后删除变量和运算符之间的空格?
加雷斯

做得好。在这个问题中可以找到一些关于Python高尔夫的好技巧:codegolf.stackexchange.com/questions/54/…–
Gareth

您可以摆脱n-只需将int(n)替换为int(raw_input())-并可以在if语句中将str(a)更改为r
奥马尔

1

Groovy,83岁

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

1

Q(34个字符)

传递n而不是n + 1作为此Q解的参数。

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


1

问(33)

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

这样做可能是更整洁的方法,但是无论如何,请使用示例用法(输入n + 1到n):

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

tmartin的建议,将其降至29:

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

用法相同。



1

C#(217 214 191个字符)

高尔夫球版:

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

可读性:

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

这将使用n-> 0运算符以降序打印回文。(当n变为0时)。

*编辑后的版本将do ... while替换为while,节省了3个字符,但是现在您必须输入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();}}

*编辑:找到了一种无需转换为数组即可反转字符串的更好方法:

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

可读性:

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可以更低吗?四种不同的选择:

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

如果你想变得时髦...

PHP 47

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

您必须忽略错误文本。但是,回文编号仍会输出到命令行。


1

珀斯,11岁

VhQIq`N_`NN

例:

$ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.