反转数字的最短方法


31

编写一个函数(或等效子程序)以接受单个整数值的参数,并返回通过反转参数的以10为基数的顺序而找到的(相似类型的)值。

例如给定76543返回34567


6
返回到数字是字符串的时间,然后反转字符串
pmg 2011

2
“最短算法”的想法有点似是而非,特别是如果您允许“任何语言”。想一想一种算法,我将为您提供一个带有合适的“〜”运算符的DSL ...

3
只是一个提示:任何以0结尾的数字在反转时都会变成较短的数字...
powtac 2011年

44
我知道一个算法根本不需要时间,但是只对回文数有效;)
schnaader 2011年

抽空做自己重新写。我希望这仍然是eltond想要摆出的难题。
dmckee 2011年

Answers:


85

HTML 21 7个字符(如果我很厚脸皮,则为1个字符...)

‮n

n用您的电话号码代替


1
这只是普通的天才。我去买一个字符。还是2,因为它在UTF-16:P中编码为两个字节
断定

17
哈哈哈我在该标签上进行了Google搜索,但获得了奖励Your search -‮ -与任何文档都不匹配。
JoeFish 2012年

您可以在浏览器中尝试以下链接:data:text/html,&%238238;egnahcxEkcatS olleH
F. Hauri 2013年

3
有趣的是在谷歌翻译。@JoeFish:我无法复制,请发布链接!
F. Hauri

1
@JoeFish当我查看评论时,您的用户名被翻转,其后有一些文本。‮txetemos si ereH
Stefnotch

32

蟒蛇

int(str(76543)[::-1])

编辑:

@gnibbler建议的较短解决方案:

int(`76543`[::-1])

或者,如果以上不清楚:

x=76543
int(`x`[::-1])

4
s[::-1]''.join(reversed(s))
riza 2011年

4
您可以使用反引号(代表repr),而不使用str
gnibbler 2011年

@gnibbler感谢您的建议。我已经更新了答案。
维达

2
TBH,它不是函数/过程/您要调用的任何东西,而规范要求它。
Thomas Eding

此外,它甚至不接受值...
Exelian 2011年

28

通用(与语言无关/独立

如果您想使用只有数字(避免转换为字符串的数字)和希望使用一些特定的库(被普遍用于任何语言):

x = 76543 # or whatever is your number
y = 0
while x > 0:
    y *= 10
    y += ( x %10 )
    x /= 10 # int division 

这是python,但是可以用任何语言完成,因为它只是一种数学方法。


如果替换mod%,则表示它是有效的Python;)
phihag

您说得对,实际上:) 10倍

3
不是最短的,而是最普通和普遍的。
Kiril Kirov

3
y=y*10+x%10....
st0le 2011年

1
尽管可以计算,但BrainFuck没有。没有它的任何语言都可以a - (n * int(a/n))代替a mod n。另外,如果您在此处查看,模数运算在每种语言中的实现方式都不同。(请参阅右表。)
mbomb007

13

Perl 6

+$n.flip

要么:

$n.flip

用于动态键入的代码。

数字由于语言设计而具有字符串方法。


10

J-6个字符+变量

".|.":y

y是您的价值。


2
作为一个功能:|.&.":“反向执行”,这几乎是任务的字面意思。
FireFly 2014年


8

PHP,9个字符

(int)strrev(123);

简而言之,哪里N是一个常数:

strrev(N)

8

Befunge(3个字符)

完整的可运行程序:

N.@

N你的电话号码在哪里。规则说“接受单个整数值的参数”;在Befunge中,您只能输入0到9之间的整数。


3
这些是唯一的文字,但是其他数字肯定可以表示。否则,成功的答案将是使用空程序的Brainfuck。;-)
FireFly 2013年

8

语言无关/数学

受到上述Kiril Kirov的回答的启发。我对反转数字的数学性质感到好奇,因此我决定进行一些研究。

事实证明,如果您在某个基数中绘制n - rev(n)自然数的差,则会得到如下所示的模式(,为,包裹在列中,红色表示负数):nr(n - rev(n)) / (r - 1)r=10r

差异表

该序列可以这样生成(伪代码):

for i=1 to r:
  output 0

for m=0, 1, …
  for k=1 to (r-1):
    for d=1 to r^m:
      for i=0 to (r-1):
        output (r-1) * (r+1)^m * (k - i)

如果您将这些值存储在列表/数组中,n - arr[n]则会得到相反的形式n。现在,为了“数学上打高尔夫球”,理想情况下,我们需要一个闭合形式的表达式,该序列在序列中给出第n个值,以便我们可以使用一个闭合形式的表达式来解决整个任务。不幸的是,我还没有找到这样的表达……但是看起来它应该是可能的。:(

是的,不是数学上的好奇心而是代码高尔夫球,但是如果上述序列有一个封闭形式的表达,那么它实际上可能对正确的PL高尔夫球比赛很有用。


7

哈斯克尔, 28 24个字符

f=read.reverse.show.(+0)

2
怎么f=read.reverse.show.(+0)
FUZxxl 2011年

2
(+0):合法的人!尽管从技术上讲您根本不需要.(+0),因为f它比问题所需要的多态的多态(允许返回“相似类型”的输出)。我会刮掉那五个字符。
Thomas Eding


6

Scala-33个字符

def r(a:Int)=(a+"").reverse.toInt

1
+1为scala,很高兴看到python / ruby​​ / perl以外的东西
lhk 2012年

如果为负,则将失败。-123应该返回-321
samach

6

红宝石(14)

x = 13456
x.to_s.reverse

3
“ no”是不确定的。我认为您是要在其中加上“ x”。
大卫·里弗斯

3
123456.to_s.reverse甚至更短。
Steffen Roller

@mmdemirbas-感谢您解决错字问题
大胆

3
需要.to_s.reverse.to_i符合规范。
histocrat

以0开头的数字似乎无效。0112.to_s.reverse.to_i => 47
Joel

5

可以将数字转换为字符串,然后反转该字符串,然后将该字符串转换回数字。这种功能可能在所有语言中都可用。如果您正在寻找一种更数学的方法,那么这可能会有所帮助:

int n = 76543;
int r = 0;

while (n > 0) {
    r *= 10;
    r += n % 10;
    n /= 10;
}

5
我的是绝对一样的(:

是的,唯一的区别是您的代码看起来像Python。

此方法溢出的语言精度有限。试试1111111119
st0le 2012年

5

Python 3+

函数形式:28个字符

r=lambda i:int(str(i)[::-1])

(子)程序形式:25个字符

print(input()[::-1])

我认为其他一些Python示例由于使用硬编码输入和/或未完全满足要求而被欺骗,或至少便宜。


5

Golfscript,5个字符

`-1%~

这在堆栈上接受一个参数,并将结果留在堆栈上。我正在使用规范中的“子程序”选项:如果您坚持使用某个函数,则需要再增加四个字符,才能将其保留在堆栈中:

{`-1%~}:r

我认为您一定`-1%~不是故意的`-1$~(我已经自由地编辑您的回答这样说)。
Ilmari Karonen 2012年

5

在shell脚本中:

  echo "your number"|rev

希望这是有用的:)


好一个!不知道bash还能做到这一点!
Pranit Bauva 2013年

1
我猜从技术上讲,它确实会返回类似类型的“数字” ...可以进一步缩短rev<<<yournumber,例如rev<<<132(对于bash / zsh,但不是按POSIX)
FireFly 2013年

1
刚刚rev够,问题不说,它成为一个功能。您可以将rev其与内置函数进行比较,即使它不是一个。
nyuszika7h 2014年

这是无效的:“ rev”不是内置函数,而是外部程序调用。
巴斯蒂安·比托夫

67字节纯POSIX shell:X = $ 1;而[$ X!= 0];执行Y = $(((Y * 10 + X%10)); X = $((X / 10)); done; echo $ Y
巴斯蒂安·比托夫


3

Mathematica,14个字节

IntegerReverse

这不是竞争,因为此功能仅在上周的10.3版本中添加,但是为了完整起见,我认为我将添加此任务唯一的内置(我认为吗?)。


2

您可以使用Java执行以下操作。请注意,这将转换为String并返回,而不是数学上的解决方案。

public class test {
    public static int reverseInt(int i) {
        return Integer.valueOf((new StringBuffer(String.valueOf(i))).reverse().toString());
    }

    public static void main(String[] args) {
        int i = 1234;
        System.out.println("reverse("+i+") -> " + reverseInt(i));
    }
}

2
这是一个数学解决方案。数学不是数字,不是算术。数学还处理符号字符串。在这种特殊情况下,字符串的转换就是以10为底的转换。
R. Martinho Fernandes

我所说的“不是数学解决方案”是我们自己没有做任何数学运算。这些方法为我们完成了所有的解析和数学运算。与例如基里尔·基洛夫的回答相反。
维克多

将溢出...
st0le 2012年

2

a

数字和字符串是可互换的,所以这很简单

string.reverse(12345)

2

实际上,这是一个输入,不同于其他一些输入:

print`input()`[::-1]

Python顺便说一句。



2

Groovy

r={"$it".reverse() as BigDecimal}

assert r(1234) == 4321
assert r(345678987654567898765) == 567898765456789876543
assert r(345346457.24654654) == 45645642.754643543

2

Perl,11个字符

p要使此功能起作用,需要包含该标志,该标志包括在计数中。

用法:

$ echo 76543 | perl -pE '$_=reverse'

我数了10个字符
F. Hauri 2013年

p标志被包括在计数
扎伊德

2

Clojure(42个字符)

#(->> % str reverse(apply str)read-string)

用法示例:

(#(->> % str reverse(apply str)read-string) 98321)

返回12389



2

K,3个字节:

.|$

计算(.)反向(|)转换为字符串($)。

用法示例:

  .|$76543
34567

2

rs,20字节

#
+#(.*)(.)/\2#\1
#/

从技术上讲,这不算数(rs是在今年早些时候创建的),但是我没有看到其他基于正则表达式的答案,我认为这很简洁。

现场演示。

说明:

#

在字符串的开头插入井号。这用作标记。

+#(.*)(.)/\2#\1

连续将主字符串的最后一个字符放在标记之前的区域,直到没有剩余字符为止。

#/

删除标记。


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.