중간 사각형 방법


19

소개

중간 평방 방법은 의사 난수의 생성에 사용됩니다. 그러나 이것은 일반적으로 기간이 매우 짧고 심각한 약점이 있기 때문에 실제로는 좋은 방법이 아닙니다. 어떻게 작동합니까? 예를 들어 보자.

씨앗의 경우 다음을 선택합니다 123456.

Seed     123456

종자 제곱 (종자 × 종자)은 다음과 같습니다.

Seed²  15241383936

우리는 6 자리 숫자로 시작했습니다 . 즉, 시드 제곱은 12 자리 숫자를 전달해야합니다 . 그렇지 않은 경우 다음을 보상하기 위해 선행 0이 추가됩니다.

Seed²  015241383936

그런 다음 씨앗 과 같은 크기 로 숫자의 중간 부분을 가져옵니다 .

Seed²  015241383936
          ^^^^^^

이는 우리의 것입니다 새 씨앗 : 241383. 위와 같은 과정을 반복합니다. 우리는 다음을 얻습니다.

0:     123456
    015241383936
       |    |
1:     241383
    058265752689
       |    |
2:     265752
    070624125504
       |    |
3:     624125
    389532015625
       |    |
4:     532015
    283039960225
       |    |
5:     039960
    001596801600
       |    |
6:     596801

그리고 이것은 잠시 동안 계속됩니다 ... 이제 우리는 중간 사각형 방법이 무엇인지 알고 있습니다.


작업

모든 씨앗 기간 . a의 기간 N -digit 씨는 8 초과 할 수 없습니다 없음 . 예를 들어 seed 82입니다. 이것은 다음 순서를 제공합니다.

82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0    1    2    3    4    5    6    7    8    9

같은 숫자를 다시 포함하기 전에 기간이 5 와 같다는 것을 알 수 있습니다 . 당신의 작업은 선행 0을 포함하지 않는 0보다 큰 시드가 주어지면 시드의 기간을 출력합니다 . 따라서이 경우을 출력해야합니다 5.

또 다른 예는 24다음과 같습니다.

24 > 57 > 24
|____|____|___...
0    1    2

보시다시피 모든 시퀀스가로 끝나는 것은 아닙니다 0. 이주기의 기간은 1 입니다.


테스트 사례

Input   >   Output
24      >   1
82      >   5
123456  >   146
8989    >   68
789987  >   226

123456 , 8989 , 789987에 대한 서열을 갖는 페이스트 빈

이것은 이므로 바이트 수가 가장 적은 제출이 승리합니다!

입력에 고르지 않은 숫자가 있다고 가정 할 수 있습니다.


10
Nit pick : 마침표가 아닙니다. 주기는 시퀀스가 ​​결국 초기 상태로 되돌아 간다는 것을 의미합니다. 24(기간 2, 내가 말할 것), 주기적 82이다 결국 정기 (기간 1).
Dennis

1
"마침표"는 모든 이전 상태와 다른 마지막 상태의 0 인덱스입니까?
Luis Mendo

@LuisMendo 예, 맞습니다. 내 수학적 지식은 최고가 아닙니다 : p.
Adnan

'안정화 전 반복 횟수'와 비슷할 것입니다
ASCII 전용

1
@WashingtonGuedes이 pastebin을보십시오 . 더 명확 해 집니까?
Adnan

답변:


3

젤리, 26 24 18 바이트

³DL⁵*
²:¢½¤%¢µÐĿL’

온라인으로 사용해보십시오!

작동 원리

³DL⁵*         Helper link. No arguments.

³             Yield the original input.
 D            Convert from integer to base 10.
  L           Get l, the length of the decimal representation.
   ⁵*         Compute 10 ** l.


²:¢½¤%¢µÐĿL’  Main link. Input: n (integer)

²             Square n.
  ¢½¤         Call the helper link and take the square root of the result.
 :            Integer division; divide the left result by the right one.
      ¢       Call the helper link.
     %        Take the left result modulo the right one.
       µ      Convert the previous chain into a link, and begin a new chain.
        ÐĿ    Repeat the previous chain until the results are no longer unique,
              updating n in each iteration. Collect the intermediate results.
          L   Get the length of the list of results.
           ’  Decrement.

5

순수 떠들썩한 파티, 162 131 116 113 107

를 사용하여 3 바이트를 저장했습니다 $c...

6 바이트를 더 절약 할 수 있도록 @Dennis 에게 감사드립니다 .

---- begin middleSquare ----

for((b=$1;i[c=10#$b]<2;)){ a=${#b}
printf -v b %0$[a*2]d $[c*c]
b=${b:a/2:a};((i[10#$b]++))
};echo ${#i[@]}

---- end middleSquare ----

for testCase in 24 82 123456 8989 789987 111111;do
    printf "%12s: " $testCase
    bash middleSquare $testCase
  done
          24: 2
          82: 5
      123456: 146
        8989: 68
      789987: 226
      111111: 374

정사각형 형식, 131

---- begin middleSquare ----

for((b=$1;i[
10#$b]<2;1))
do a="${#b}" 
printf -v b\
 %0$[a*2]d \
$[10#$b**2];
b=${b:a/2:a}
((i[10#$b]++
));done;ech\
o ${#i[@]:0}

---- end middleSquare ----

for testCase in 24 82 123456 8989 789987 111111;do
    printf "%12s: %9d\n" $testCase $(
        bash middleSquare $testCase)
  done
          24:         2
          82:         5
      123456:       146
        8989:        68
      789987:       226
      111111:       374

오래되었지만 멋진 결과물, 162

---- begin middleSquare ----

for((b=$1;i[10#$b
]<2;1))do a=${#b}
printf -v b %0$[a
*2]d  $[10#$b**2]
b=${b:a/2:a};((i[
10#$b]++));print\
f "%9d %s\n" ${#\
i[@]} $b;done;ec\
ho -- ${#i[@]} --

---- end middleSquare ----

bash middleSquare 24
        1 57
        2 24
        2 57
-- 2 --

for testCase in 24 82 123456 8989 789987 111111
    do while read f v f
        do r=$v;done < <(
        bash middleSquare $testCase)
    printf "%12s: %11d\n" $testCase $r
  done
          24:           2
          82:           5
      123456:         146
        8989:          68
      789987:         226
      111111:         374

3

자바 스크립트 (ES7), 82 바이트

f=(n,p={},m=-1,l=n.length)=>p[n]?m:f(`${n*n+100**l}`.substr(l/2+1,l,p[n]=1),p,++m)

문자열 형식의 입력 (예 : "82")을 허용하고 정수를 반환합니다. 이미 본 종자의 해시에 대해 각 종자를 차례로 확인하는 간단한 꼬리 재귀 기술. 일정한 길이를 유지하기 위해 사각형에 100 ** l을 추가합니다.


@Downgoat 문자열 형식의 입력을 허용 합니다 .
Neil

1
아 그래, 난 읽을 수없는 것 같아요 : |
Downgoat

@WashingtonGuedes 아니요, 중간 값이 충분한 0으로 시작하면 작동하지 않습니다. (이것이 내가 100 ** l을 더한 7 바이트를 "낭비"한 이유이다.)
Neil

1
@WashingtonGuedes 작동하지 않는 경우가 있습니다. 예를 들어 5288의 체인을 따라보십시오.
Neil

3

파이썬 (3) (2), 139 (114) 97 바이트

25 바이트 골프는 Seeq에게, 17 바이트 골프는 Dennis에게 감사합니다! 암호:

s=`input()`;u=[];l=len(s)/2
while not s in u:u+=[s];s=`int(s)**2`.zfill(l*4)[l:3*l]
print~-len(u)

확실히 더 골프 수 있습니다. 이것은 또한 테스트 케이스를 만드는 데 사용되는 코드였습니다.


2

Pyth, 21 바이트

tl.us_<>_`^N2/lz2lzsz

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

편집 : 1000이전 코드와 함께 작동하지 않는 경우를 발견 했습니다. 1 바이트로 수정했습니다.

설명:

tl.us_<>_`^N2/lz2lzsz   implicit: z = input string
  .u               sz   apply the following instructions to N, starting with N = int(z), 
                        until it runs into a loop:
          ^N2              square it
         `                 convert it to a string
        _                  reverse order
       >     /lz2          remove the first len(z)/2
      <          lz        remove everything but the first len(z)  
     _                     reverse order
    s                      convert to int
  .u                   returns the list of all intermediate values
 l                     compute the length of this list
t                      minus 1

sz대신에 어떤 이유가 Q있습니까?
Ven

내가 사용하는 경우 @ user1737909 Q, 나는 모든 교체해야 lzl`Q의.
Jakube

흠, Pyth가 공유하지 않는 것은 놀라운 것 같습니다 input. 나는 그것이 두 번째 표준 읽기를 허용하기위한 것 같아요 ..?
Ven

@ user1737909 예. 입력을 공유 할 수있는 유일한 방법은 .zand 로만 가능 .Q하지만 여러 줄의 입력을 읽고 목록에 저장하는 것입니다. 그러나 실제로 누군가이 기능을 사용하는 것을 보지 못했습니다. 문자열을 평가하거나 숫자를 문자열 화하는 것은 1 바이트입니다.
Jakube

Pyth에서 stdin을 최대 4 번 읽을 수 있습니다 Qz.Q.z.
Ven

2

MATL , 33 35 40 바이트

`t0)2^10GVnXK2/^/k10K^\vtun@>]n2-

온라인으로 사용해보십시오!

`           % do...while
  t         %   duplicate. Take input implicitly on first iteration
  0)        %   pick last value of array
  2^        %   square
  10        %   push 10
  GVn       %   number of digits of input
  XK        %   copy that to clipboard K
  2/        %   divide by 2
  ^         %   power
  /k        %   divide and floor. This removes rightmost digits from the square value
  10K^      %   10 ^ number of digits of input
  \         %   modulo. This takes the central part of the squared number
  v         %   concatenate this new number to array of previous numbers
  tun@>     %   does the number of unique values exceed the iteration index?
]           % if so: next iteration. Else: exit loop
n2-         % desired result is the amount of numbers minus 2. Implicitly display

2

Oracle SQL 11.2, 184 바이트

WITH v(v,p,n)AS(SELECT:1,'0',-1 FROM DUAL UNION ALL SELECT SUBSTR(LPAD(POWER(v,2),LENGTH(v)*2,0),LENGTH(v)/2+1,LENGTH(v)),v,n+1 FROM v)CYCLE v SET c TO 1 DEFAULT 0 SELECT MAX(n)FROM v;

언 골프

WITH v(v,p,n) AS
(
  SELECT :1,'0',-1 FROM DUAL
  UNION ALL
  SELECT SUBSTR(LPAD(POWER(v,2),LENGTH(v)*2,0), LENGTH(v)/2+1, LENGTH(v)),v,n+1 FROM v
)
CYCLE v SET c TO 1 DEFAULT 0
SELECT MAX(n) FROM v;

빌드 인 사이클 감지를 사용하여 재귀를 중지합니다.


2

줄리아, 64 바이트

f(n,A=[],p=10^endof(dec(n)))=n∈A?-1:f(n^2÷√p%p,[A...n],p)+1

Coding Ground 와 함께 사용해보십시오 .


1

Mathematica, 80 바이트

(a=10^⌊Log10@#+1⌋;Length@NestWhileList[⌊#^2/a^.5⌋~Mod~a&,#,Unequal,All]-2)&

1

CJam, 37 바이트

q{__,W*:D;~_*sD2/<D>]___|=:A;~A}g],((

해결 방법을 즉시 확인할 수없는 성가신 스택 순서 문제가 발생했습니다. 또한 매우 느립니다.

작동 방식 : 각 반복은 스택의 맨 위에 새로운 값을 푸시 한 다음 스택을 배열로 랩핑하고 스택과 자신의 합집합과 동일한 지 확인합니다 (중복 요소가 있는지 확인). 중복 요소가있는 경우 중지하고 스택에 몇 개의 요소가 있는지 확인하십시오.


1

파이썬 2, 82 바이트

def f(n,A=[],l=0):l=l or len(`n`)/2;return-(n in A)or-~f(n*n/10**l%100**l,A+[n],l)

Ideone에서 사용해보십시오 .


1

파이썬, 124 바이트

def f(s,p=-1,n=0,m=[]):
 x=len(str(s))*2
 while n not in m:m+=[s];y=str(s*s).zfill(x);n=int(y[x/4:x*3/4]);p+=1;s=n
 return p

1

VBSCRIPT, 131 바이트

s=inputbox(c):l=len(s):do:t=t&","&s:s=space(l*2-len(s*s))&s*s:s=mid(s,l/2+1,l):i=i+1:loop until instr(t,","&s)>0:msgbox i-1

내가 vbscript로 할 수있는 최선, 처음 포스터 그래서 나에게 쉽게 간다!


프로그래밍 퍼즐과 코드 골프 스택 교환에 오신 것을 환영합니다! 첫 번째 게시물! 글의 형식을 좀 더 쉽게 편집하고 표준을 더 잘 따르도록 편집했습니다. 행복한 골프!
GamrCorps
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.