セブンのサイクルサムシーケンス


17

7×0から7×9までの7の乗算表を見てください。

0, 7, 14, 21, 28, 35, 42, 49, 56, 63

自分の場所の数字だけを見ると、数字0〜9の順列が得られます。

0, 7, 4, 1, 8, 5, 2, 9, 6, 3

正の10進整数Nを取り、Nの各桁Dを7×Dの場所の桁に置き換えることを検討してください。

たとえば、15209なっ75403ているため1にマップ75にマップは52にマップ40にマップ0、および9にマップ3

さて、この新しい10進整数でサイクルを見るまで、つまり、すでに見た整数が現れるまで、このプロセスを繰り返しましょう。

たとえば15209、サイクルを取得すると

15209 -> 75403 -> 95801 -> 35607 -> 15209 -> repeats...
                                      ^
                                      |
                             cycle restarts here

別の例として505、短いサイクルがあります

505 -> 505 -> repeats...
        ^
        |
cycle restarts here

すべてのNに対して、これらのサイクルには常に正確に1つまたは4つの異なる整数が含まれることがわかります。(その理由を理解するのはあなたにお任せします。)興味深いのは、サイクル内のすべての異なる整数を合計すると、ほとんどの場合、2「s 0」と「s 」のみで構成される10進整数が得られることです。

たとえば、15209 + 75403 + 95801 + 35607 = 222020。

N = 505は例外の1つです。サイクル内の唯一の整数は505なので、合計は505自体です。

N = 1〜60のサイクルの合計は次のとおりです。

N sum
1 20
2 20
3 20
4 20
5 5
6 20
7 20
8 20
9 20
10 200
11 220
12 220
13 220
14 220
15 220
16 220
17 220
18 220
19 220
20 200
21 220
22 220
23 220
24 220
25 220
26 220
27 220
28 220
29 220
30 200
31 220
32 220
33 220
34 220
35 220
36 220
37 220
38 220
39 220
40 200
41 220
42 220
43 220
44 220
45 220
46 220
47 220
48 220
49 220
50 50
51 220
52 220
53 220
54 220
55 55
56 220
57 220
58 220
59 220
60 200

これを7サイクル合計シーケンスと呼びます。

チャレンジ

正の10進整数Nを取り込んで、7サイクル合計シーケンスの対​​応する項を10進数で出力または返すプログラムまたは関数を作成します。

たとえば、入力がの場合、出力は95801である必要があります222020。入力がの場合、出力は505である必要があります505。入力がの場合、出力は54である必要があります220

バイト単位の最短コードが優先されます。


1
もちろん、あなたが1サイクルから数値を取る場合と乗算それら4によって、あなたはそれを見つけるすべてのそれらのは、その数字だけです2と0の数字与える
ピーター・テイラー

回答:


1

Pyth、14バイト

s.uieM*R7jNTTQ

誰もが数字のパターンを見て結果を決定する理由はわかりません。単純にプロセスを実行し、円のすべての数を計算し、それらを合計する方が簡単です。少なくともPythでは;-)

オンラインで試す:デモンストレーションまたはテストスイート

ところで、これは私の200番目のコードゴルフの答えです。したがって、この投稿はゴールドコードゴルフバッジを獲得します。

説明:

s.uieM*R7jNTTQ   implicit: Q = input number
 .u          Q   apply the following expression to N=Q until it reaches a circle
         jNT        convert N to base 10
      *R7           multiply each digit with 7
    eM              and perform modulo 10 for each number
   i        T       convert digits from base 10 to a number
                    update N
                 .u returns the list of all intermediate results of N, 
                 so we have now all numbers of the circle
s                sum them up

コード...待って...ゴルフ!:)おめでとう、そして良い使用.u
FryAmTheEggman

6

Python 2、69バイト

lambda n:[''.join('02'[x>'0']for x in`n`)+'0',n][set(`n`)<=set('05')]

この関数は簡単に説明できます。

  • nが0と5のみで構成されている場合は、そのまま出力します。
  • そうでない場合は、nの各桁を2に置き換えます。ただし、0が0のままである場合を除き、0を最後まで追加します。

ゴルフを改善することができます、私は主に方法を共有するために投稿しています。ネイティブの正規表現を使用する言語では、簡単な解決策が必要です。

関数の代替ステートメントは

  • nでは、各桁を5に置き換えます。ただし、0は0のままです。
  • これがnを変更した場合(0または5以外の数字があった)、結果に4を掛けます

4

Python 2、63バイト

lambda s:s.strip('05')and''.join(`(c>'0')*2`for c in s)+'0'or s

入力引数は文字列であることが期待されています。


1
うわー、私はstripこのように振る舞うとは思わなかった。
xsot

さあ、型変換(文字列&harr;数値)は楽しみの大部分です(つまり、コード長; o)!
チャーリー

4

CJam、16バイト

他の全員と同じアルゴリズムを使用する:

r_50s-{:~2fe&0}&

テストスイート。(1から入力までのすべての結果を生成します。)

説明

r_      e# Read input and duplicate
50s     e# Push the string "50".
-       e# Remove all '5' and '0' characters from the input.
{       e# If any characters remained in the input...
  :~    e#   Evaluate each digit character to turn it into an integer.
  2fe&  e#   Map (&& 2) over the list. Due to short-circuiting, zeros remain zeros and
        e#   everything else becomes 2.
  0     e#   Push a trailing zero.
}&

3

JavaScript(ES6)、54 51バイト

xnorのメソッドを使用:

n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n

@charlieのおかげで3バイト節約できました

説明

n=>
  (s=n+"").match`[^05]`          // if there are any digits which aren't 5 or 0
    ?s.replace(/\d/g,d=>+d&&2)+0 //     replace every digit except 0 with 2 then add a 0
  :s                             // else return the input unchanged

テスト

単純なメソッド、102バイト

n=>(c=x=>~r.indexOf(x+=m="")?eval(r.join`+`):[...r[++i]=x].map(d=>m+="0741852963"[d])&&c(m))(n,i=r=[])
n=>
  (c=x=>                  // c = recursive function
    ~r.indexOf(           // if we have calculated this number before
      x+=m="")?           // cast x to a string, m = calculated result
        eval(r.join`+`):  //     return the sum of all the calculated numbers
    [...r[++i]=x].map(d=> // else add x to the list of calculated numbers
      m+="0741852963"[d]  // map each digit of x to the "seven" digits
    )&&c(m)               // calculate the value of the result
  )(n,i=r=[])             // r = array of previously calculated values


51バイト:n=>/[^05]/.test(n)?`${n}0`.replace(/./g,d=>+d&&2):n
チャーリー

1
40バイト:n=>n-(s=`${n}`.replace(/[^0]/g,5))?s*4:n
チャーリー

1
@チャーリーうわー、そのs*4トリックは素晴らしいです!この方法は十分に異なり、私の方法よりもはるかに短いため、これを別の回答として投稿する必要があります。:)
user81655

わかりました、謙虚に; o)
チャーリー

2

Mathematica、83 77 60文字

Tr@Union@NestList[FromDigits@Mod[7IntegerDigits@#,10]&,#,4]&

非ゴルフ

Tr@
  Union@
   NestList[
    FromDigits@Mod[7 IntegerDigits@#, 10] &,
    #,
    4
   ] &

2

JavaScript(ES5)、40バイト

n=>(s=`${n}`.replace(/[^0]/g,5))^n?s*4:n

これは、xnorで説明されている代替アプローチを使用した、user81655のソリューションの進化です。

説明

4サイクルのゼロ以外の数字の合計は常に20です。これは、数字が1→7→9→3、2→4→8→6、または5→5→5→5を循環するためです。そのため、そのような数字をすべて5に置き換えても合計は変わりません。

この置換アクションは、4サイクルと1サイクルを区別するために再利用されます。置換結果が入力と異なる場合は4サイクル、そうでない場合は1サイクルです。

注意:テンプレート文字列`${n}`は読みやすくするためのもので(n+'')、同じ長さです。


正規表現なし-47バイト:n=>(s=[...`${n}`].map(d=>+d&&5).join``)^n?s*4:n
チャーリー

0

sed、26バイト

/[^05]/{s/[^0]/2/g;s/$/0/}

(もう1つは、「2の置換」アプローチを採用しています。)

echo '500' | sed '/[^05]/{s/[^0]/2/g;s/$/0/}'500

echo '501' | sed '/[^05]/{s/[^0]/2/g;s/$/0/}'2020


0

Perl 6の 68の55 53 36  33バイト

{[+] $^a,{[~] $^b.comb.map: {'0741852963'.comb[$_]}}...^{$++*?/$a/}} # 68
{$_=@=$_.comb;[~] (@$_,(|.map(2*?+*),0))[$_qw<0 5>]} # 55
{[~] ($_=@=$_.comb)⊆qw<0 5>??@$_!!(|.map(2*?+*),0)} # 53
{/^<[05]>+$/??$_!!S:g/./{2*?+$/}/~0} # 36

{m/^<[05]>+$/||S:g/./{2*?+$/}/~0} # 33

これは間違いなく数のみで構成されている場合は、これを行うには間違った方法である5のと0、それ以外の場合は、すべてを置き換えますが、それはMatchオブジェクトを返しますよ02、そして追加0最後に。
(Matchオブジェクトを1つとして使用すると、数字のように動作します)

それは間違っているので、gistメソッドを呼び出すことでまれな数字を簡単に指摘できるようにします。

使用法:

# give it a name
my &code = {...}

.say for (0..60,505,15209).flat.map({ code($_).gist.fmt: '%4s' }).rotor(1,10 xx 6,:partial)

( 0」)
(  20   20   20   20  5   20   20   20   20  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220  200)
( 220  220  220  220  220  220  220  220  220 50」)
( 220  220  220  220 55  220  220  220  220  200)
(「505」)
(222020)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.