反转并减去


22

挑战说明

让我们取一个正整数n,反转其数字以获得rev(n)并获得这两个数字之差的绝对值:(|n - rev(n)|abs(n - rev(n)))。

例:

n = 5067 
rev(n) = 7605
|n - rev(n)| = |5067 - 7605| = |-2538| = 2538

重复多次此操作后,大多数数字将变为 0(从而终止循环)...

5067 -> 2538 -> 5814 -> 1629 -> 7632 -> 5265 -> 360 -> 297 -> 495 -> 99 -> 0

...虽然有些数字(例如 1584)陷入了无限循环:

1584 -> 3267 -> 4356 -> 2178 -> 6534 -> 2178 -> 6534 -> 2178 -> 6534 -> ...
                        ^ infinite loop starts here

您的工作是确定给定的整数是否陷入无限循环。

输入说明

一个正整数。

输出说明

如果数字陷入无限循环,则为真值(True1),否则为假值(False0),否则。

笔记

  • 尾随零应被忽略。即rev(5020) = 205
  • 请记住,这是,所以请使代码尽可能短!
  • 相关序列:A072140


一个有趣的注释:可以构造一个循环周期为2的任意长整数,如A072141的注释中所述。该方法对于其他期间相同为好,像12,14,17,和22
mbomb007

Answers:


18

Pyth,5个字节

4字节归功于FryAmTheEggman

uas_`

测试套件。

真实值是循环中的数字之一。

假值是0

说明

uas_`      Input:Q
uas_`GGQ   Implicit filling of variables.

u      Q   Set G as Q: do this repeatedly until result seen before: Set G as
 a             the absolute difference of
     G             G
    `              convert to string
   _               reverse
  s                convert to integer
      G        and G

很好地使用自动填充变量!
FryAmTheEggman

1
*滥用– – – – –
Leaky Nun

对于不认识Pyth的人,该如何工作?
致命

3
pyth怎么这么短,但仍在ASCII范围内。
Downgoat

3
@Downgoat因为它是pyth。
Leaky Nun


10

果冻6 5 字节

ṚḌạµ¡

在线尝试!

背景

它使用@ MartinEnder上界10N迭代和以下意见。

  1. 9×10 k-1具有k位数字的正整数n

  2. 数字和它的反向的差始终是9的倍数,因此在第一次迭代之后只能出现10 k-1个数字

  3. 在倍数中,超过 1/10的数字将在下一次迭代中丢失(对于初学者,所有以相同数字开头和结尾的数字,如果第一个数字既不是1也不是9,则大约是其两倍),因此进入循环或丢失数字最多需要9×10 k-2

  4. 将相同的推理应用于最终得到的k-1位整数,依此类推,最多需要9×10 k-2 + 9×10 k-2 +…≤10 k- 1≤n次迭代才能进入循环或达到0

怎么运行的

ṚḌạµ¡  Main link. Argument: n

   µ¡  Iteratively apply the chain to the left n times.
Ṛ      Reverse n (casts to digits).
 Ḍ     Undecimal; convert from base 10 to integer.
  ạ    Take the absolute difference of the result and the argument.

11
Pyth击败了Jelly吗?
Leaky Nun

3
好吧,这是一条领带。
丹尼斯

这些不是字节。
mik '16

1
@mik请单击标题中的字节链接。
丹尼斯

5

Oracle SQL 11.2,136字节

WITH v(n)AS(SELECT :1 FROM DUAL UNION ALL SELECT ABS(n-REVERSE(n||''))FROM v WHERE n>0)CYCLE n SET c TO 0 DEFAULT 1 SELECT MIN(c)FROM v;

未打高尔夫球

WITH v(n) AS
(
  SELECT :1 FROM DUAL
  UNION ALL
  SELECT ABS(n-REVERSE(n||''))FROM v WHERE n>0 
) CYCLE n SET c TO 0 DEFAULT 1
SELECT MIN(c)FROM v

5

APL,26个字符

0∘{⍵∊⍺:×⍵⋄(⍺,⍵)∇|⍵-⍎⌽⍕⍵}

我们使用left参数作为我们已经看到的值的累加器。我们将其初始化为“ 0”,这是两个终止条件之一。警卫的意思⍵∊⍺:×⍵是:“正确的参数是我们已经看到的(并且包括零)吗?如果是,则返回数字的符号,即1或0”。否则,在将当前值连接到左参数之后,通过减去的绝对值来调用自己,从而递归。


马丁·恩德(Martin Ender)对Mathematica解决方案的重铸将花费21个字符

 {×{|⍵-⍎⌽⍕⍵}⍣(10×⍵)⊣⍵}

内容为:“应用所需的10n次后,结果的符号是什么?”?


4

Python 2,50个字节

n=input()
exec'n=abs(n-int(`n`[::-1]));'*n
print n

Ideone上进行测试

背景

它使用@ MartinEnder上界10N迭代和以下意见。

  1. 9×10 k-1具有k位数字的正整数n

  2. 数字和它的反向的差始终是9的倍数,因此在第一次迭代之后只能出现10 k-1个数字

  3. 在倍数中,超过 1/10的数字将在下一次迭代中丢失(对于初学者,所有以相同数字开头和结尾的数字,如果第一个数字既不是1也不是9,则大约是其两倍),因此进入循环或丢失数字最多需要9×10 k-2

  4. 将相同的推理应用于最终的k-1位整数等,以此类推,最多需要9×10 k-2 + 9×10 k-2 +…≤10 k- 1≤n次迭代才能进入循环或达到0



3

Python中,129 120 96字节

如果捕获到异常(由于无限递归,此函数通常会抛出的唯一异常是RuntimeError),则打印1。否则,打印结果0。

def r(n):a=abs(n-int(str(n)[::-1]));return a and r(a)
try:print(r(int(input())))
except:print(1)

感谢@LeakyNun
感谢@shooqie


正式地,这是对无限递归的(不错)滥用。
Leaky Nun

return a and rev(a)
Leaky Nun

3
由于递归很长而又不一定是无限的,是否有可能得到RuntimeError?
致命

a=[n-x,x-n][n>x]
Leaky Nun

您可以大幅缩短:def rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)。另外,将该方法命名为简短的名称(例如r代替rev
shooqie

3

Python,101 98字节

乌龟和野兔算法。

真值是循环中的任何值,假值是0

g=lambda n:abs(n-int(str(n)[::-1]))
def r(n):
    t=g(n);h=g(t)
    while t-h:h=g(g(h));t=g(t)
    return h

伊迪恩!


3

Python 2,85 84 83字节

L=[]
def f(n,L=L):
    if n<1or n in L:print n<1
    else:L+=[n];f(abs(n-int(`n`[::-1])))

另一个Python答案。它将为每个迭代将n添加到列表中,如果n已经在列表中,则输出False。否则,它将降低到0。

感谢@NonlinearFruit一个字节。


1
我相信这是print n<1可行的(因为n总是非负的),并且它节省了一个字节
NonlinearFruit

def f(n,L=[]):¶ if n<1or n in L:print n<1¶ else:f(abs(n-int(`n`[::-1])),L+[n])保存5个字节
Leaky Nun

3

05AB1E,11 8 6字节

DFÂï-Ä

讲解

DF          # input number of times do
  Â         # push current number and its reverse
   ï-       # convert reverse to int and subtract
     Ä      # absolute value
            # implicitly print after loop ends

真实值是循环中的数字。
虚假值为0。

在线尝试

使用Dennis的果冻答案中解释的上限

@Adnan节省了2个字节

在05AB1E的7.9版中,按@Adnan所述,以下5字节解决方案有效

DFÂ-Ä

好的,这有点奇怪,但是DFÂ-Ä7.9版中有效,但在当前版本中无效。在当前版本中,您需要先将其转换为int(例如DFÂï-Ä),但是您可以使用7.9版将其转换为5个字节:p。
阿德南

@Adnan我不敢相信我忘记了分叉功能。我会坚持使用当前版本。如果愿意,您可以将7.9版作为单独的答案发布。否则,我将其作为笔记。
Emigna '16

我可能不会发布它,因为它与这个答案只有1个字节:p。
阿德南

1

Java 7,161字节

这需要导入,但是我将其编写为函数。如果在这种情况下首选完整程序,请在评论中对我大喊。如果存在无限循环,则输出1;如果值变为0,则输出0。

import java.util.*;int z(int a){int o,r,c=a;Set s=new HashSet();while(c!=0){for(r=0,o=c;o!=0;r=r*10+o%10,o/=10);c=Math.abs(c-r);if(!s.add(c))return 1;}return 0;}

注意,我之前已经看过导入和函数。示例

1真的吗?
Leaky Nun

1
@LeakyNun 1在Java中不被认为是真实的,但是OP列出了(True,1)和(False,0)作为可接受的输出。

@LeakyNun Java甚至有诚实或虚假的感觉吗?
尼尔

@Neil Java有垂直的市场环境中充分利用协同机会的感觉-这就是它

1

Brachylog49 32 23字节

:10*N,?:N:{r:?-+.}itT'0

返回true无限循环,false否则返回。

这是Martin Ender算法的无耻修改。

上一个答案,32个字节

g{tTr:T-+U(0!\;?:ImU;?:[U]c:1&)}

先前答案的解释

g{                             } Call predicate with [Input] as input
  tT                             T is the last element of Input
    r:T-                         Subtract T from the reverse of T
        +U                       U is the absolute value of T
          (0!\                   If U is 0, return false
              ;                  Or
               ?:ImU             If U is in Input, return true
                    ;            Or
                     ?:[U]c:1&)  Recursive call with U concatenated to the Input

0

PowerShell v2 +,94个字节

param($n)for($a=,0;){if(($n=[math]::Abs($n-(-join"$n"["$n".length..0])))-in$a){$n;exit}$a+=$n}

接受input $n,开始一个无限for循环,$a=,0其初始条件为(使用逗号运算符将其设置$a为一个元素的数组0)。这$a是我们已经看到的值的数组。

每次循环迭代时,我们都会检查一个if。该条件首先设置$n使用字符串反转和[math]::Abs.NET调用的下一个值,并检查该值是否已经-in $a。如果是这样,我们输出$nexit。否则,我们将该值添加到数组并继续循环。

输出0不会进入无限循环的输入值(在PowerShell中为false),否则将输出遇到循环的值(非零整数为true)。例如,输入2178的输出1584


0

Haskell,65个字节

_#0=0
a#n|elem n a=1|1<2=(n:a)#abs(n-(read$reverse$show n))
([]#)

返回0False和1True。用法示例:([]#) 1584 -> 1

最明显的方法是:列出到目前为止已看到的所有结果。计算下一个数字,直到0或它在列表中。


0

JavaScript(ES6),75个字节

f=(n,...a)=>a.includes(n=n<0?-n:n)?n:f([...n+``].reverse().join``-n,n,...a)

n<0?n=-n:n并且n*=n>0||-1还工作。尽管这是递归公式,但算法在某种程度上类似于PowerShell的答案。


0

Ruby,57个字节

->n,*h{h[n]=n=(n-"#{n}".reverse.to_i).abs until h[n];n>0}

最初为空的数组将h跟踪先前命中的值。我们迭代该数字,直到达到前一个值,然后在最后一次迭代中检查该值。由于0是一个1的周期,因此,当且仅当没有更大的周期时,它才会为0。我花了额外的2个字节将其转换为布尔值,因为在Ruby中0是正确的。


0

Perl 6  58 53 33  30字节

sub {$/=%;$^a,{return ?1 if $/{$_}++;abs $_-.flip}...0;?0}
{$/=%;?($_,{last if $/{$_}++;abs $_-.flip}...0)[*-1]}
{?($_,{abs $_-.flip}...0)[10**$_]}

{?($_,{abs $_-.flip}...0)[$_]}

说明:

{ # block lambda with implicit parameter $_

  # coerce the following to Bool
  # ( False for Nil or 0, True otherwise )
  ?

  (

    $_, # start a sequence with the input

    # block lambda with implicit parameter $_
    # subtracts the previous value in the sequence and its reverse
    # ( .flip is short for $_.flip where a term is expected )
    { abs $_ - .flip } 

    ... # repeat that lambda
    0   # until you get 0

  # get the element indexed with the block's input
  # may be 0, Nil, or a number that is part of a repeating sequence
  )[ $_ ]
}

(根据之前的观察,您最多只需要执行此转换n


0

Perl 5中,31 29个字节

perl -pe'for$x(1..$_){$_=abs$_-reverse}'

perl -pe'eval"\$_=abs\$_-reverse;"x$_'

迭代 n=|n-rev(n)| n次,因此如果没有循环,则输出为0,否则为> 0。丹尼斯已经证明这足够了。

新版本使用evalx重复运算符而不是for循环。


好的答案,欢迎来到PPCG!需要注意的是为Perl,命令行选项必须包含在你的字节数,所以这不是相当 30个字节。
AdmBorkBork '16

@TimmyD ok,-p选项+1 ,-l对于单个输入不是必需的
mik

0

Matlab,89 84字节

n=input('');z=n;while n
z=abs(z-str2num(fliplr(num2str(z))));n=[n z]*all(n~=z);end
z

简单方法-堆叠所有数字并检查数字是否出现在前面。

说明

n=input('');z=n;  -- take input, initiate z
while n           -- n is said to be positive
z=abs(z-str2num(fliplr(num2str(z)))) -- calculate the "reverse and substract"
n=[n z]           -- put the value at the end of the vector
       *all(n~=z) -- make the n all zeroes if z is previously in the vector (break the loop)
end
z                 -- print z (0 when not entered loop, >0 otherwise)
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.