PowerShell: 98
รหัส Golfed:
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)}
Ungolfed พร้อมความคิดเห็น:
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 ด้วยสคริปต์นี้ มันอาจจะน้อยกว่า 2 ^ 30 เนื่องจาก $ x อาจล้น int32 ก่อนที่ $ n จะไปถึงที่นั่น นอกจากนั้นฉันยังไม่ได้ทดสอบขีด จำกัด สูงสุดเพราะเวลารันสคริปต์นานถึง 30 วินาทีสำหรับระบบของฉันในราคา $ n = 1e7 (ซึ่งน้อยกว่า 2 ^ 23) ด้วยเหตุผลเดียวกันฉันไม่อยากทดสอบและแก้ไขปัญหาอะไรเพิ่มเติมไวยากรณ์ใด ๆ ที่จำเป็นในการอัพเกรดตัวแปรเป็น uint32, int64 หรือ uint64 ตามต้องการเพื่อขยายช่วงของสคริปต์นี้
ตัวอย่างผลลัพธ์:
ฉันห่อสิ่งนี้ไว้ในห่วงอีกอันหนึ่ง:
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
Sidenote: ฉันไม่แน่ใจจริงๆว่าช่วงเวลา Pisano บางช่วงสั้นกว่า $ n อย่างมาก นี่เป็นเรื่องปกติหรือเป็นสิ่งผิดปกติกับสคริปต์ของฉันหรือไม่ ไม่เป็นไร - ฉันก็จำได้ว่าหลังจากที่ 5 ตัวเลข Fibonacci อย่างรวดเร็วกลายเป็นมากมีขนาดใหญ่กว่าสถานที่ในลำดับ ดังนั้นตอนนี้ก็สมเหตุสมผลแล้ว