逆にして減算


22

チャレンジの説明

正の整数を取り、nその桁を逆にしてrev(n)、これら2つの数値の差の絶対値を取得および取得します:(|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

あなたの仕事は、与えられた整数が無限ループに陥っているかどうかを判断することです。

入力説明

正の整数。

出力の説明

truthy値(True1)数が無限ループに陥ってしまった場合、falsy値(False0)それ以外の場合。

ノート

  • 末尾のゼロは省略する必要があります。すなわちrev(5020) = 205
  • これはであるため、コードはできるだけ短くしてください。
  • 関連シーケンス:A072140


興味深いメモ:A072141のコメントで説明されているように、2のループ周期で任意の長さの整数を作成することが可能です。この方法は、同様に12、14、17、及び22のような他の期間と同一である
mbomb007

回答:


18

Pyth、5バイト

FryAmTheEggmanのおかげで4バイト

uas_`

テストスイート。

真理値は、ループ内の数値の1つです。

falsey値は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
*虐待– – – – –
リーキー修道女

Pythを知らない人にとって、それはどのように機能しますか?
Fatalize

3
pythはどのように短いのにASCIIの範囲内にありますか。
ダウンゴート

3
@Downgoatなぜなら、それはピスだからです。
リーキー修道女

11

Mathematica、39 37バイト

Nest[Abs[#-IntegerReverse@#]&,#,#]<1&

単純に逆/減算変換n時間を入力に適用しn、結果がであるかどうかを確認します010n変換によって桁数を増やすことはできず、数字が未満で10nあるため、ループに到達するためのステップを超えることはありませんnこれをに減らす方法については、デニスの証明を参照してくださいn


10

ゼリー6 5 バイト

ṚḌạµ¡

オンラインでお試しください!

バックグラウンド

この用途MartinEnderの@は、上限10Nのイテレーションと次の観察。

  1. あり9×10 1 - kの正の整数Nk個の数字が。

  2. 数とその逆の差は常に9の倍数であるため、最初の反復後に発生する可能性があるのは10 k-1だけです。

  3. 倍数のうち、1/10を超えると、次の反復で数字が失われます(スターターの場合、同じ数字で始まり、同じ数字で終わり、最初の数字が1でも9でもない場合は約2倍)ループに入るか、数字を失うのに最大で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を倒しましたか?
漏れの修道女

3
まあ、それはネクタイです。
デニス

これらはバイトではありません。
mik

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∘{⍵∊⍺:×⍵⋄(⍺,⍵)∇|⍵-⍎⌽⍕⍵}

すでに見た値のアキュムレーターとして左引数を使用します。2つの終了条件の1つである「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 1 - kの正の整数Nk個の数字が。

  2. 数とその逆の差は常に9の倍数であるため、最初の反復後に発生する可能性があるのは10 k-1だけです。

  3. 倍数のうち、1/10を超えると、次の反復で数字が失われます(スターターの場合、同じ数字で始まり、同じ数字で終わり、最初の数字が1でも9でもない場合は約2倍)ループに入るか、数字を失うのに最大で9×10 k-2かかります。

  4. 最終的な結果のk-1桁の整数などに同じ推論を適用すると、ループに入るには最大で9×10 k-2 + 9×10 k-2 +…≤10 k- 1≤nの繰り返し0に達する。



3

パイソン、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に感謝


これは公式には無限再帰の(いい)虐待です。
リーキー修道女

return a and rev(a)
リーキー修道女

3
再帰が必ずしも無限でなくても非常に長いため、RuntimeErrorを取得することはできませんか?
-14:53で

a=[n-x,x-n][n>x]
漏れの修道女

大幅に短縮できますdef rev(n):a=abs(n-int(str(n)[::-1]));return a and rev(a)。また、メソッドに短い名前を付けます(のr代わりにrev
-shooqie

3

Python、101 98バイト

カメとウサギのアルゴリズム。

Truthyはループ内の任意の値、falseyは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バイトをありがとう。


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です。

オンラインで試す

デニスのゼリーの答えで説明されている上限を使用

@Adnanのおかげで2バイト節約

では、バージョン7.9 @Adnanで述べたように05AB1Eの以下の5バイトのソリューションは、動作します

DFÂ-Ä

さて、これは少し奇妙なゴルフですがDFÂ-Äバージョン7.9では動作しますが、現在のバージョンでは動作しません。現在のバージョンでは、最初に(このようにDFÂï-Ä)intに変換する必要がありますが、バージョン7.9を使用して5バイトにすることができます:p。
アドナン

@Adnan分岐関数を忘れたとは信じられません。ただし、現在のバージョンに固執します。7.9を別の回答として投稿することもできます。それ以外の場合は、メモとして配置します。
エミグナ

この回答から1バイトしか離れていないので、おそらく投稿しません。
アドナン

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

以前にインポートと関数が実行されたことを確認しました。
ポケ

ある1truthyは?
リーキー修道女

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}

入力を受け取り$n、初期条件として無限forループを開始し$a=,0ます(これは、コンマ演算子を使用して$a1つの要素の配列に設定します0)。この$aは、すでに見た値の配列です。

各ループの繰り返しでをチェックしifます。条件は、最初に$n文字列反転と[math]::Abs.NET呼び出しを使用する次の値を設定し、その値が既にあるかどうかを確認します-in $a。その場合、とを出力$nexitます。それ以外の場合は、その値を配列に追加してループを続行します。

0無限ループに入らない入力値の出力(PowerShellでは偽です)、そうでない場合はループが発生した値を出力します(ゼロ以外の整数は真実です)。たとえば2178、inputの出力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

ルビー、57バイト

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

最初は空の配列は、h以前にヒットした値を追跡します。前の値に達するまで番号を繰り返し、最後の繰り返しで値を確認します。0は1のサイクルであるため、大きなサイクルがない場合にのみ0になります。Rubyでは0が真であるため、これをブール値に変換するために余分な2バイトを取ります。


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になります。デニスはすでにこれで十分であることを証明しました。

新しいバージョンではeval、ループのx代わりに演算子を使用して繰り返しforます。


いい答えで、PPCGへようこそ!Perlのために、コマンドラインオプションがあること注意含まれている必要があり、これがないので、あなたのバイト数にかなりの 30バイト。
AdmBorkBork

@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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.