PowerShell : 98
골프 코드 :
for($a,$b=0,(1%($n=read-host))){$x++;if($a+$b-eq0-or("$a$b"-eq10)){$x;break}$a,$b=$b,(($a+$b)%$n)}
코멘트가없는 언 골프 드 :
for
(
# Start with $a as zero, and $b as 1%$n.
# Setting $b like this at the start helps catch the exceptional case where $n=1.
$a,$b=0,(1%
(
# Grab user input for n.
$n=read-host
))
)
{
# Increasing the counter ($x) and testing for the end of the period at the start ensures proper output for $n=1.
$x++;
# Test to see if we've found the end of the Pisano Period.
if
(
# The first part catches $n=1, since $a and $b will both be zero at this point.
$a+$b-eq0-or
(
# A shorter way of testing $a-eq1-and$b-eq0, which is the end of a "normal" Pisano Period.
"$a$b"-eq10
)
)
{
# Pisano Period has reached its end. Output $x and get out of the loop.
$x;break
}
# Pisano Period still continues, perform operation to calculate next number.
# Works pretty much like a Fibonacci sequence, but uses ($a+$b)%$n for the new $b instead.
# This takes advantage of the fact we don't really need to track the actual Fibonacci numbers, just the Fibonacci pattern of %$n.
$a,$b=$b,(($a+$b)%$n)
}
# Variable cleanup - not included in golfed code.
rv n,a,b,x
노트:
이 스크립트를 사용하여 $ n에 대한 최대 신뢰할 수있는 제한이 정확히 무엇인지 잘 모르겠습니다. $ n은 $ n에 도달하기 전에 int32를 오버플로 할 수 있기 때문에 2 ^ 30보다 적을 수 있습니다. 게다가 스크립트의 실행 시간이 이미 내 시스템에서 $ n = 1e7 (2 ^ 23을 약간 넘음) 동안 30 초 정도 걸렸기 때문에 상한을 직접 테스트하지 않았습니다. 같은 이유로이 스크립트의 범위를 확장하기 위해 필요한 경우 변수를 uint32, int64 또는 uint64로 업그레이드하는 데 필요한 추가 구문을 테스트하고 문제를 해결하려는 경향이 없습니다.
샘플 출력 :
나는 이것을 다른 for 루프로 감쌌다.
for($i=1;;$i++)
그런 다음 $n=$i
대신 설정 하고 스크립트의 일반적인 안정성에 대한 아이디어를 얻 =read-host
도록 출력을 변경했습니다 "$i | $x"
. 출력 결과는 다음과 같습니다.
1 | 1
2 | 3
3 | 8
4 | 6
5 | 20
6 | 24
7 | 16
8 | 12
9 | 24
10 | 60
11 | 10
12 | 24
13 | 28
14 | 48
15 | 40
16 | 24
17 | 36
18 | 24
19 | 18
20 | 60
...
9990 | 6840
9991 | 10192
9992 | 624
9993 | 4440
9994 | 1584
9995 | 6660
9996 | 1008
9997 | 1344
9998 | 4998
9999 | 600
10000 | 15000
10001 | 10212
10002 | 3336
10003 | 5712
10004 | 120
10005 | 1680
10006 | 10008
10007 | 20016
10008 | 552
10009 | 3336
10010 | 1680
주석 : 일부 Pisano 기간이 $ n보다 얼마나 짧은 지 잘 모르겠습니다. 이것이 정상입니까, 아니면 내 스크립트에 문제가 있습니까? 신경 쓰지 마라-나는 5 후 피보나치 수가 시퀀스에서 자신의 자리보다 훨씬 빨리 커진다는 것을 기억했다 . 이제 이것은 완전히 이해됩니다.