মধ্য-বর্গ পদ্ধতি


19

ভূমিকা

মধ্যম বর্গ পদ্ধতি সিউডোরান্ডম সংখ্যার প্রজন্মের জন্য ব্যবহার করা হয়। যাইহোক, এটি অনুশীলনে একটি ভাল পদ্ধতি নয়, কারণ এটির সময়কাল খুব কম হয় এবং কিছু গুরুতর দুর্বলতা থাকে। কিভাবে কাজ করে? একটি উদাহরণ নেওয়া যাক:

বীজের জন্য, আমরা বাছাই 123456:

Seed     123456

বীজের স্কোয়ার (বীজ × বীজ) সমান:

Seed²  15241383936

আমরা 6-সংখ্যার নম্বর দিয়ে শুরু করেছি । এর অর্থ হল যে বীজের স্কোয়ারটি 12-সংখ্যার সংখ্যা সরবরাহ করবে। যদি এটি না হয় তবে ক্ষতিপূরণ দেওয়ার জন্য নেতৃস্থানীয় শূন্যগুলি যুক্ত করা হয়:

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

এবং এটি কিছুটা সময় ধরে রাখে ... এখন আমরা জানি মধ্যবিত্ত পদ্ধতিটি কী, আসুন আমরা চ্যালেঞ্জটি পেয়ে যাই:


কাজটি

প্রতিটি বীজের হয়েছে একটি সময়ের । একটি এন- ডিজিট বীজের সময়কাল 8 এন এর বেশি হতে পারে না । উদাহরণস্বরূপ, বীজ 82। এটি নিম্নলিখিত ক্রমটি দেবে:

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

আপনি দেখতে পাবেন যে একই অঙ্কটি আবার রাখার আগে পিরিয়ডটি সমান 5 । আপনার কাজটি হ'ল, যখন কোনও শীর্ষ শূন্যযুক্ত 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
নাইট পিক: এটি কোনও সময়কাল নয়। পিরিয়ড সূচিত করে যে ক্রমটি শেষ পর্যন্ত এটির প্রাথমিক অবস্থায় ফিরে আসে। 24(সময়ের 2, আমি বলতে চাই), পর্যায়ক্রমিক হয় 82হয় অবশেষে পর্যাবৃত্ত (সময়কাল 1 সহ)।
ডেনিস

1
সুতরাং "পিরিয়ড" হ'ল গত রাজ্যের 0-সূচক যা পূর্ববর্তী সমস্ত রাজ্যের চেয়ে পৃথক?
লুইস মেন্ডো

@ লুইসমেডো হ্যাঁ, এটি সঠিক। আমার গাণিতিক জ্ঞান সবচেয়ে ভাল নয়: পি।
আদনান

এটি 'স্থিতিশীল হওয়ার আগে পুনরাবৃত্তির সংখ্যা'র মতো হতে পারে
এএসসিআইআই-কেবল

1
@ ওয়াশিংটনগুয়েডস এই পেস্টবিনটি দেখুন । এটি কি আরও স্পষ্ট করে তোলে?
আদনান

উত্তর:


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 টি বাইট সংরক্ষণ করতে সাহায্য করার জন্য @ ডেনিসকে ধন্যবাদ

---- 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 যোগ করি।


@ ডাউনগোট একটি স্ট্রিং আকারে ইনপুট গ্রহণ করে ।
নিল

1
ওঁ হ্যাঁ, আমি অনুমান করি আমি পড়তে পারি না: |
ডাউনগোট

@ ওয়াশিংটনগুয়েডস না, মধ্যবর্তী মান পর্যাপ্ত শূন্যের সাথে শুরু হলে এটি কার্যকর হয় না। (এই কেন আমি "নষ্ট" 7 বাইট 100 ** ঠ যোগ করা হয়।)
নিল

1
@ ওয়াশিংটনগুয়েডস এমন কিছু মামলা রয়েছে যেখানে এটি কাজ করে না, উদাহরণস্বরূপ 5288 থেকে শৃঙ্খলা অনুসরণ করার চেষ্টা করুন
নিল

3

পাইথন 3 2, 139 114 97 বাইট

25 বাইটে গল্ফ করার জন্য সেককে ধন্যবাদ এবং 17 বাইট বন্ধ করে গল্ফ করার জন্য ডেনিসকে ধন্যবাদ! কোড:

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

পাইথ, 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?
ভেন

@ user1737909 যদি আমি ব্যবহার Q, আমি সমস্ত প্রতিস্থাপন করতে হবে lzসঙ্গে l`Qগুলি।
জাকুব

মিঃ, পাইথটি আশ্চর্যজনক বলে মনে হচ্ছে এটি ভাগ করে নি input। আমার ধারণা এটি সত্যই দ্বিতীয় স্তরের পড়ার অনুমতি দেওয়ার জন্য ..?
ভেন

@ ব্যবহারকারী1737909 হ্যাঁ। ইনপুট ভাগ করে নেওয়ার একমাত্র সম্ভাবনা হ'ল .zএবং .Qযদিও তারা একাধিক লাইন ইনপুট পড়ে এবং সেগুলিকে তালিকায় সংরক্ষণ করে। তবে আমি আসলে কাউকে এই বৈশিষ্ট্যটি ব্যবহার করতে দেখিনি। কোনও স্ট্রিং মূল্যায়ন করতে বা একটি সংখ্যাকে স্ট্রাইফাইকরণ করতে এটি কেবল 1 বাইট।
জাকুব

ঠিক আছে, তাই আপনি পাইথে সর্বাধিক 4 বার স্টিডিন পড়তে পারেন Qz.Q.z,?
ভেন

2

এমএটিএল , 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

ওরাকল এসকিউএল 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;

আন golfed

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;

এটি পুনরাবৃত্তিটি বন্ধ করতে বিল্ড ইন চক্র সনাক্তকরণ ব্যবহার করে।



1

গণিত, 80 বাইট

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

1

সিজেম, 37 বাইট

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

একটি বিরক্তিকর স্ট্যাক-অর্ডার ইস্যুতে দৌড়ে গেল যে আমি কীভাবে সমাধান করব তা অবিলম্বে দেখতে পাচ্ছি না। এটি অবিশ্বাস্যভাবে ধীর।

এটি কীভাবে কাজ করে: প্রতিটি পুনরাবৃত্তি স্ট্যাকের শীর্ষে নতুন মানকে ঠেলে দেয়, তারপরে আমরা স্ট্যাকটিকে একটি অ্যারেতে গুটিয়ে রাখি এবং এটি নিজের সাথে এর ইউনিয়নের মতো কিনা তা দেখতে (এটির কোনও সদৃশ উপাদান রয়েছে কিনা তা দেখতে)। যখন এতে সদৃশ উপাদান রয়েছে, থামুন এবং দেখুন স্ট্যাকের মধ্যে কতগুলি উপাদান রয়েছে।




1

ভিবিএসসিআরটি, 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

সেরা আমি ভিবিএসক্রিপ্ট দিয়ে করতে পারি, প্রথমবারের পোস্টার তাই আমার উপর সহজ হয়ে যায়!


প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ স্ট্যাক এক্সচেঞ্জে আপনাকে স্বাগতম! দুর্দান্ত প্রথম পোস্ট! আমি আপনার পোস্টটির ফর্ম্যাটিংটি আরও পঠনযোগ্য করে তুলতে এবং আমাদের মানকে আরও মানিয়ে নিতে কিছুটা সম্পাদনা করেছি। শুভ গল্ফিং!
গ্যামারকর্পস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.