পিসানো পিরিয়ড সন্ধান করুন


20

ফিবানচি ক্রম একটি ক্রম ভাল জানেন যা প্রতিটি প্রবেশ আগের দুই এবং প্রথম দুই এন্ট্রি এর সমষ্টি হয় 1. আমরা একটি ধ্রুবক ক্রম পর্যাবৃত্ত হয়ে যাবে দ্বারা প্রতিটি মেয়াদের মডিউল না নেন তাহলে হয়। উদাহরণস্বরূপ, যদি আমরা সিকোয়েন্স মোড 7 গণনা করার সিদ্ধান্ত নিয়েছিলাম তবে আমরা নিম্নলিখিতটি পেতে পারি:

1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...

এই 16-এর একটি ক্রম একটি নির্দিষ্ট সময়ের বলা হয়েছে Pisano ক্রম , এই ধরনের সংজ্ঞায়িত করা হয় যে a(n)Fibonacci ক্রম যখন গণনা মডিউল n এর সময়ের নয়।

কার্য

আপনার একটি প্রোগ্রাম বা ফাংশন লিখতে হবে যা দেওয়া nহলে ফিবোনাচি সিকোয়েন্স মোডের সময়কাল গণনা এবং আউটপুট হবে n। এটি পিসানো সিকোয়েন্সের নবম পদ।

আপনার অবশ্যই পরিসীমাতে পূর্ণসংখ্যার সমর্থন করতে হবে 0 < n < 2^30

এটি একটি প্রতিযোগিতা তাই বাইট দ্বারা স্কোর করা হিসাবে আপনার উত্স কোডের আকার হ্রাস করার লক্ষ্য করা উচিত।

পরীক্ষার মামলা

1  -> 1
2  -> 3
3  -> 8
4  -> 6
5  -> 20
6  -> 24
7  -> 16
8  -> 12
9  -> 24
10 -> 60
11 -> 10
12 -> 24

3
2 ^ 30 এর সীমাবদ্ধতা নিশ্চিত করতে পারে যে সমস্ত মধ্যবর্তী মান 2 ^ 31 এর চেয়ে কম হয় তবে এটি এখনও গ্যারান্টি দেয় না যে পিসানো পিরিয়ড 32-বিট স্বাক্ষরিত পূর্ণসংখ্যার মধ্যে উপযুক্ত হবে। (আমি মনে করি এটিই আপনার সীমাবদ্ধতার কারণ?) পিসানো পিরিয়ডগুলি তাদের এন এর চেয়ে উল্লেখযোগ্য পরিমাণে বড় হতে পারে । উদাহরণস্বরূপ, 6 এর পিসানো পিরিয়ড 24 হয়। 100 এর উপরে 10 এর শক্তি n এর চেয়ে 50 শতাংশ বড় আসে ।
ইসজি

3
পায়রাহোল নীতিটি f(i),f(i+1)সর্বাধিক n^2মানগুলিকে নিতে পারে বলে জানায় n। সুতরাং, nসীমাবদ্ধ 2^30আপ পর্যন্ত সময়কাল উত্পাদন করতে পারে 2^60। সীমাবদ্ধতা n <= 2^16দিতে হবে P(n) <= 2^32
বুথবি

@ বুথবি আমি নিশ্চিত যে আপনি কী বলছেন তা আমি ঠিক বুঝতে পারছি না, বা যদি এটি ঠিক একই সমস্যার সমাধান করে তবে আমি যা করছি। আপনি কি আরও কিছু ব্যাখ্যা করতে পারেন, সম্ভবত অতিরিক্ত লিঙ্কগুলি দিয়ে? প্রয়োজনে আমাকে বিনা দ্বিধায় আড্ডায় টানুন।
ইসজি

2
@ ইসজি লক্ষ করুন যে f(i+2) = f(i+1)+f(i), সময়কালে লুপিং মেশিনের 'স্টেট' একজোড়া পূর্ণসংখ্যা মোডের সাথে বর্ণনা করা যেতে পারে n। বেশিরভাগ n^2রাজ্য রয়েছে, তাই সময়কাল সর্বাধিক n^2। উহু! উইকিপিডিয়া দাবি করেছে যে সময়কাল সর্বাধিক 6n। আমার তুচ্ছ কথা মনে রাখবেন না।
বুথবি

উত্তর:


11

গল্ফস্ক্রিপ্ট ( 28 25 24 23 অক্ষর)

~1.{(2$+}{.@+2$%}/+\-,)

স্টিডিনে ইনপুট নেয়, স্টাডআউটে ফেলে দেয় (বা স্ট্যাক, যদি আপনি আরও প্রক্রিয়া করতে চান তবে ...)

এটি সঠিকভাবে কোণার কেসগুলি ( ডেমো ) পরিচালনা করে ।

গল্ফস্ক্রিপ্ট প্রোগ্রামারদের আগ্রহের বিষয় হিসাবে, আমি মনে করি এটি প্রথম প্রোগ্রাম যা আমি প্রকাশিত না দিয়ে লিখেছি যা আমি চেষ্টা করেছি অন্যান্য পদ্ধতির তুলনায় প্রকৃতপক্ষে ছোট out


7

গল্ফস্ক্রিপ্ট, 24 টি অক্ষর

~:&1.{.2$+&%.2$(|}do](-,

গল্ফস্ক্রিপ্ট প্রয়োগের পরবর্তী পুনরাবৃত্তি। দ্বিতীয় সংস্করণ এখন 1 টি সঠিকভাবে পরিচালনা করে। এটি বেশ দীর্ঘ হয়ে গেছে তবে সম্ভবত কেউ এই সংস্করণটি সংক্ষিপ্ত করার জন্য কোনও উপায় খুঁজে পেতে পারেন। আপনি উপরের সংস্করণটি অনলাইনে চেষ্টা করতে পারেন ।


এই হ্যান্ডেলটি কি 1সঠিকভাবে ইনপুট দেয় ?
পিটার টেলর

@ পিটারটেলর নাপ, কর্নারের কেসটি পরীক্ষা করেননি। অঙ্কন বোর্ড ফিরে।
হাওয়ার্ড

@ পিটারটেলর নতুন কোডটি ইনপুটটির জন্যও কাজ করে 1- এবং এখনও কেবল 24 টি অক্ষর।
হাওয়ার্ড

4

পাইথন, 188 132 101 95 87 টি অক্ষর

n=input()
s=[]
a=k=0
b=1
while s[:k]!=s[k:]or k<1:s+=[a%n];k=len(s)/2;a,b=b,a+b
print k

ব্যবহার

$ echo 10 | python pisano.py
60

উদাহরণ স্বরূপ:

$ for i in {1..50}; do; echo $i | python pisano.py; done
1
3
8
6
20
24
16
12
24
60
10
24
28
48
40
24
36
24
18
60
16
30
48
24
100
84
72
48
14
120
30
48
40
36
80
24
76
18
56
60
40
48
88
30
120
48
32
24
112
300

অতিরিক্ত গল্ফিংয়ের জন্য , beary605 ধন্যবাদ !
সুলতানিক

আপনি আবার আপনার অক্ষর গণনা করতে চাইতে পারেন। আমার আপনার প্রতিক্রিয়া গণনা আপনার প্রতিক্রিয়া গণনা নীচে
ডেভিডসি

@ ডেভিড: আপনি কি শ্বেত স্পেস গণনা করছেন? আমি শুধু ডাবল চেক করা (দ্বারা catকরা Ting wc -cএবং আমি একই নম্বর পেতে।
ESultanik

আমি ওল্ফ্রাম রিসার্চ দ্বারা সজ্জিত একটি রুটিন ব্যবহার করি। এটি প্রয়োজনীয় সাদা স্থান গণনা করে, আমি মনে করি।
ডেভিডসি

if k>0 and s[0:k]==s[k:]:breakথেকে পরিবর্তন করা যেতে পারে if s and s[:k]==s[k:]:break। আপনি পুনরুক্তিটি সরিয়ে, forলুপটি পরিবর্তন করে while 1:এবং লুপটির a,b=a,a+bশেষে সঞ্চালন করে উল্লেখযোগ্যভাবে কাটতে পারেন ।
স্ট্রাইকয়েড

4

পাইথন 90 85 96 94 90 82

n=input();c=[1,1];a=[]
while(c in a)<1%n:a+=[c];c=[c[1],sum(c)%n]
print len(a)or 1

সম্পাদনা করুন: বিয়ারী এবং প্রিমো দ্বারা কার্যকরিত পরামর্শসমূহ


85 a.append(c) -> a+=[c]((n>1)>>(c in a)) -> (n>1)>>(c in a)
:,

appendআসলে এর চেয়ে আলাদা কার্যকারিতা রয়েছে +=। যদিও টিপস জন্য ধন্যবাদ।
স্কিলেভার

আমি মনে করি এটি এই ক্ষেত্রে একইভাবে কাজ করে।
beary605

(n>1)>>(c in a) -> (c in a)<1%n3 বাইট জন্য। এবং আমি সংযোজন সম্পর্কে বেয়ারির সাথে একমত। আপনি কোনও রেফারেন্স যুক্ত করেছেন cবা aএর মান দ্বারা প্রসারিত cহোন না cকেন , এটি উভয় দিক থেকেই ঠিক একইরকম (যেমন আপনি যেভাবে আপনার প্রসঙ্গটি তত্ক্ষণাত ধ্বংস করেছেন )।
primo

আহ ঠিক আছে, আমার ভুল যে আমি ব্যবহার ছিল a+=cপরিবর্তেa+=[c]
scleaver

2

গণিত 73

p = {1, 0}; j = 0; q = p;
While[j++; s = Mod[Plus @@ p, n]; p = RotateLeft@p; p[[2]] = s; p != q]; j

2

পিএইচপি - 61 57 বাইট

<?for(;1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN););echo$i;

এই স্ক্রিপ্টটি ভুল রিপোর্ট হবে 2জন্য n=1, কিন্তু সব অন্যান্য মান সঠিক।

নমুনা I / O, একটি বাম-কাটা কাটা সিরিজ যেখানে π (n) = 2n + 2:

$ echo 3 | php pisano.php
8
$ echo 13 | php pisano.php
28
$ echo 313 | php pisano.php
628
$ echo 3313 | php pisano.php
6628
$ echo 43313 | php pisano.php
86628
$ echo 543313 | php pisano.php
1086628
$ echo 4543313 | php pisano.php
9086628
$ echo 24543313 | php pisano.php
49086628

1
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)ওহ godশ্বর, এটি ঠিক সেখানে অপারেশন শোষণের কিছু আদেশ।
মিঃ লালমা

1

পাওয়ারশেল: 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

মন্তব্য:

এই স্ক্রিপ্টটি সহ reliable n সর্বাধিক নির্ভরযোগ্য সীমাটি ঠিক কী তা আমি নিশ্চিত। এটি সম্ভবত 2 ^ 30 এরও কম, কারণ $ x int n সেখানে পৌঁছানোর আগে একটি ইনট 32 ভেসে যেতে পারে। X তদ্ব্যতীত, আমি নিজেও উপরের সীমাটি পরীক্ষা করিনি কারণ স্ক্রিপ্টটির জন্য রান সময়গুলি ইতিমধ্যে আমার সিস্টেমে 30 n = 1e7 (যা কেবলমাত্র 2 ^ 23 এর চেয়ে বেশি) সেকেন্ডে প্রায় 30 সেকেন্ডের মধ্যে ফেলেছে। একই কারণে, আমি এই স্ক্রিপ্টের ব্যাপ্তিটি প্রসারিত করতে যেখানে ভেরিয়েবলগুলি 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

সিডিনোট: কিছু পিসানো পিরিয়ডগুলি কীভাবে $ n এর চেয়ে উল্লেখযোগ্যভাবে খাটো হবে তা আমি সত্যিই নিশ্চিত নই। এটি কি স্বাভাবিক, বা আমার স্ক্রিপ্টে কিছু ভুল আছে? কিছু মনে করবেন না - আমি ঠিক যে, 5 পর ফিবানচি সংখ্যার দ্রুত হয়ে মনে অনেক ক্রমানুসারে তাদের জায়গা চেয়ে বড়। সুতরাং, এটি এখন মোটামুটি বোঝায়।


1

পার্ল, 75 , 61 , 62 + 1 = 63

$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)until$h{"$m,$k"}++;say$a-1

ব্যবহার

$ echo 8 | perl -n -M5.010 ./pisano.pl
12

Ungolfed

$k = 1 % $_;
$a++, ($m, $k) = ($k, ($m + $k) % $_) until $h{"$m,$k"}++;
say $a - 1

-nপতাকা জন্য +1 বাইট । গ্যাব্রিয়েল বেনামিকে ধন্যবাদ 13 বাইট বন্ধ।


1
আপনি $n=<>;(-6) থেকে মুক্তি পেতে এবং এটি -nপতাকা (+1) $nদিয়ে প্রতিস্থাপন করতে পারেন , তারপরে সমস্ত দৃষ্টান্ত প্রতিস্থাপন করা যেতে পারে $_। আপনি -M5.010বিনামূল্যে ব্যবহার করতে পারেন , যা আপনাকে (-2) এর sayপরিবর্তে কমান্ডটি ব্যবহার করতে দেয় print। সংশোধনকারী whileস্টেটমেন্টগুলির শর্তের আশেপাশে প্রথম বন্ধনীর প্রয়োজন নেই (-2)। পরিবর্তে @{[%h]}/2, আপনার $a++,আগে একটি পাল্টা থাকতে পারে ($m,$k)=এবং তারপরে ঠিক say$a-1(-2) এ থাকতে পারে। পরিবর্তে "$m,$k"ব্যবহার $m.$k(-2)। এটি 61 + 1 = 62 বাইটের জন্য পতাকা $k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1সহ প্রকাশিত হওয়া উচিত -n
গ্যাব্রিয়েল বেনামি

স্পষ্টতই আমি পার্লের সাথে তেমন চতুর নই যে আমি ভেবেছিলাম আমি ছিলাম। টিপস জন্য ধন্যবাদ।
সিলভিও মায়োলো

পার্ল থ্রেডে গল্ফ করার টিপসে প্রচুর দরকারী পয়েন্টার রয়েছে ! শুভকামনা! ^^
গ্যাব্রিয়েল বেনামি

বাস্তবিক, আমি ভুল ছিল - আপনি প্রয়োজন "$m,$k"পরিবর্তে $m.$k, (+2), কিন্তু আপনি পরিবর্তন করে 1 বাইট সংরক্ষণ করতে পারবেন while!$hকরার until$h(-1)। দুঃখিত!
গ্যাব্রিয়েল বেনামি

হুঁ? কোন ইনপুট অধীনে $m.$kব্যর্থ হয়? এটা আমার শেষ পর্যন্ত কাজ বলে মনে হচ্ছে।
সিলভিও মায়োলো

0

Clojure, 102 বাইট

খুব উত্তেজনাপূর্ণ নয়, আমাদের ফিরে না আসা পর্যন্ত সূত্রটি পুনরাবৃত্তি করে [1 1](আমি আশা করি এটি সর্বদা ক্ষেত্রে থাকে)। (f 1)রূপান্তরিত হওয়ার সাথে সাথে বিশেষ পরিচালনা পরিচালনা [0 0]

#(if(< % 2)1(+(count(take-while(fn[v](not=[1 1]v))(rest(iterate(fn[[a b]][b(mod(+ a b)%)])[1 1]))))1))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.