세븐의 사이클 합계 시퀀스


17

7x0에서 7x9까지의 7 곱셈표를 살펴보십시오.

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

한 자리의 숫자 만 보면 0에서 9까지의 숫자가 치환됩니다.

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

양의 십진 정수 N을 취하고 N의 각 숫자 D를 7xD 자리의 숫자로 바꾸는 것을 고려하십시오.

예를 들어, 15209되고 75403있기 때문 1으로지도 7, 5에 매핑 5, 2에 매핑 4, 0에 매핑 0하고, 9매핑 3.

이제 순환을 볼 때까지, 즉 이미 본 정수가 나타날 때까지이 새로운 십진 정수로이 과정을 반복합니다.

예를 들어, 15209우리는주기를 얻습니다

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

다른 예로서, 505사이클이 짧다

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

N에 대해 이러한 사이클은 항상 정확히 1 또는 4 개의 고유 정수를 포함한다는 것이 밝혀졌습니다. 흥미로운 이유는 사이클에서 모든 고유 정수를 합산하면 거의 항상 2'와 0'으로 만 구성된 10 진수 정수를 얻는다는 것입니다 .

예를 들어, 15209 + 75403 + 95801 + 35607 = 222020입니다.

N = 505는 예외 중 하나입니다. 사이클에서 유일한 정수는 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의주기 합 시퀀스라고합니다.

도전

양의 십진 정수 N을 취하고 7의주기 합 시퀀스의 해당 항을 10 진수로 인쇄 또는 리턴하는 프로그램 또는 함수를 작성하십시오.

예를 들어, 입력이 95801이면 출력은이어야합니다 222020. 입력이 505이면 출력은이어야합니다 505. 입력이 54이면 출력은이어야합니다 220.

바이트 단위의 가장 짧은 코드가 이깁니다.


1
물론, 한 사이클에서 숫자를 가져 와서 4를 곱하면 모두 숫자가 2와 0 인 숫자를 갖게됩니다.
Peter Taylor

답변:


1

Pyth, 14 바이트

s.uieM*R7jNTTQ

왜 모든 사람들이 숫자의 패턴을보고 결과를 결정하는지 모르겠습니다. 간단히 프로세스를 수행하고 원의 모든 수를 계산하고 합산하는 것이 더 짧습니다. 적어도 Pyth ;-)

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

Btw, 이것은 내 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

파이썬 2, 69 바이트

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

이 기능은 설명하기 간단합니다.

  • n이 0과 5로만 구성된 경우 변경하지 않고 출력합니다.
  • 그렇지 않으면 0을 0으로 유지하고 끝까지 0을 고정한다는 점을 제외하고 n의 각 숫자를 2로 바꾸십시오.

골프는 향상 될 수 있습니다. 나는 주로 방법을 공유하기 위해 게시하고 있습니다. 정규 표현식을 사용하는 언어는 짧은 해결책을 허용해야합니다.

기능의 대체 진술은 다음과 같습니다.

  • n에서 0은 0으로 유지되는 것을 제외하고 각 숫자를 5로 바꿉니다.
  • 이 값이 n (0 또는 5 이외의 숫자가 있음)을 변경 한 경우 결과에 4를 곱하십시오.

4

파이썬 2, 63 바이트

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

입력 인수는 문자열이어야합니다.


1
와우, 나는 strip이런 식으로 행동 하지 않았다 .
xsot

자, 타입 변환 (문자열 및 숫자)은 재미의 상당 부분입니다 (예 : 코드 길이; 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

자바 스크립트 (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
charlie

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

자바 스크립트 (ES5), 40 바이트

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

그것은 진화의 user81655 에 의해 기술 된 다른 방법 사용, 솔루션의 ' 배타적 부정을 .

설명

4 사이클에서 0이 아닌 숫자의 합은 항상 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
Charlie Charlie

0

sed, 26 바이트

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

(또 다른 방법으로 "2로 대체"접근 방법을 사용하십시오.)

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

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


0

펄 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

이것은 5s와 0s 로만 구성된 경우 Match 객체를 반환하고 그렇지 않으면 모든 것을 0a로 바꾸고 끝에 2a 0를 추가합니다 .
(Match 객체는 숫자로 사용하면 숫자처럼 동작합니다)

잘못하고 있기 때문에 전화를 걸어서 드문 숫자를 쉽게 지적 할 수 있습니다. 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.