পুনরাবৃত্তাকার কুইন্স দ্বারা নিউটনের পদ্ধতি


32

আপনার টাস্কটি নিউটনের পদ্ধতিটি ব্যবহার করে 2 এর বর্গমূলকে সামান্য মোচড় দিয়ে গণনা করা। আপনার প্রোগ্রামটি নিউটনের পদ্ধতিটি ব্যবহার করে একটি পুনরাবৃত্তি গণনা করা এবং নিম্নলিখিত পুনরাবৃত্তির জন্য উত্স কোড আউটপুট করা (যা অবশ্যই এটি করতে সক্ষম হবে)।

নিউটনের পদ্ধতিটি উইকিপিডিয়ায় মোটামুটি বিবর্ণভাবে বর্ণনা করা হয়েছে

নিউটোন পদ্ধতি ব্যবহার করে বর্গমূল 2 গণনা করতে, আপনি:

  • নির্ধারণ করা f(x) = x^2 - 2
  • নির্ধারণ করা f'(x) = 2x
  • সংজ্ঞায়িত করুন x[0](প্রাথমিক অনুমান)= 1
  • নির্ধারণ করা x[n+1] = x[n] - (f[n] / f'[n])

প্রতিটি পুনরাবৃত্তি x [n] দুটি বর্গমূলের কাছাকাছি চলে যাবে। সুতরাং -

  • x[0] = 1
  • x[1] = x[0] - f(x[0])/f'(x[0]) = 1 - (1 ^ 2 - 2) / (2 * 1) = 1.5
  • x[2] = x[1] - f(x[1])/f'(x[1]) = 1.5 - (1.5 ^ 2 - 2) / (2 * 1.5) = 1.416666667
  • x[3] = x[2] - f(x[2])/f'(x[1]) = 1.416666667 - (1.416666667 ^ 2 - 2) / (2 * 1.416666667) = 1.414215686
  • ইত্যাদি

আপনার প্রোগ্রামটি করবে:

  • হিসাব x[n]যেখানে nসময়ের পরিমাণ প্রোগ্রাম চালানো হয়েছে হয়
  • উত্স কোডটি একই ভাষায় একটি বৈধ প্রোগ্রামে আউটপুট করুন যা অবশ্যই x[n+1]এই প্রশ্নের একই মানদণ্ডটি গণনা এবং সন্তুষ্ট করতে হবে।
  • উত্স কোডের প্রথম লাইনটি অবশ্যই গণনার ফলাফল, সঠিকভাবে মন্তব্য করা উচিত। যদি প্রথম লাইনে উত্সটির জন্য বিশেষ কিছু (যেমন একটি শেবাং) প্রয়োজন হয় তবে ফলাফলটি দ্বিতীয় লাইনে রাখা যেতে পারে।

মনে রাখবেন যে

  • আপনার প্রোগ্রাম অবশ্যই একটি প্রাথমিক অনুমান ব্যবহার করা উচিত x[0] = 1
  • স্ট্যান্ডার্ড সমস্যা আবেদন
  • যে কোনও অন্তর্নির্মিত শক্তি, বর্গক্ষেত্র বা xroot ফাংশন নিষিদ্ধ
  • আপনার প্রোগ্রাম অবশ্যই কোনও ইনপুট গ্রহণ করতে হবে না। এটি অবশ্যই সম্পূর্ণরূপে স্ব অন্তর্ভুক্ত থাকতে হবে।

আপনার স্কোরটি ইউটিএফ -8 বাইটে আপনার প্রাথমিক প্রোগ্রামের আকার। সর্বনিম্ন স্কোর জয়।


আমাদের কি ফাংশনগুলি সংজ্ঞায়িত করতে হবে, না আমরা লেখার মাধ্যমে সহজ করতে পারি x = x-(x*x-2)/(2*x)?
কাইল কানোজ

সরলীকরণটি আমার কাছে বৈধ বলে মনে হচ্ছে। যতক্ষণ না এটি নিউটনের পদ্ধতিটি ব্যবহার করে গণনা সম্পাদন করে
lochok

প্রোগ্রামটি আউটপুটটি কি আনুমানিক বা কেবল উত্স কোড দেয়? এটি কি পূর্ববর্তী সমাধানটিকে তার ইনপুট হিসাবে গ্রহণ করতে পারে?
এমিলি

পরের পুনরাবৃত্তির উত্স কোড সহ এটি প্রথম লাইনে আনুমানিক (মন্তব্য করা) আউটপুট দিতে হবে। ভাষাটির প্রয়োজন হলে প্রায় একটি শেবাংয়ের আগে অনুমান করা যেতে পারে। প্রোগ্রাম (বা এটি তৈরি করে না প্রোগ্রাম) অবশ্যই কোনও ইনপুট গ্রহণ করবেন না।
lochok

উত্তর:


19

কমন লিস্প, 223 95 68 66

(#1=(lambda(x p)(format t"~S~%~S"p`(,x',x,(+(/ p 2)(/ p)))))'#1#1)

এখন যেহেতু আমি সমস্যার বিবৃতিটি আরও মনোযোগ সহকারে পড়েছি (ধন্যবাদ, প্রিমো !) আমি লক্ষ্য করেছি যে প্রথম লাইনটি অবশ্যই গণনার ফলাফল হতে হবে , এটির ফলাফল ধারণ করার দরকার নেই । সুতরাং, আমি মনে করি আমার আগের প্রচেষ্টাগুলি নিয়মগুলি পুরোপুরি অনুসরণ করেনি। এই এক করা উচিত।

উদাহরণ ব্যবহার (এসবিসিএল 1.1.15):

$ sbcl --script nq.lisp | tee nq2.lisp
1
((LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 '(LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P))))) 3/2)
$ sbcl --script nq2.lisp | tee nq3.lisp
3/2
((LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 '(LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P))))) 17/12)
$ sbcl --script nq3.lisp | tee nq4.lisp
17/12
((LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 '(LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P))))) 577/408)
$ sbcl --script nq4.lisp | tee nq5.lisp
577/408
((LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 '(LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 665857/470832)
$ sbcl --script nq5.lisp | tee nq6.lisp
665857/470832
((LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 '(LAMBDA (X P) (FORMAT T "~S~%~S" P `(,X ',X ,(+ (/ P 2) (/ P)))))
 886731088897/627013566048)
$

আমি বেশিরভাগ সিসিএল দিয়ে পরীক্ষা করে চলেছি তবে এসবিসিএল এবং সিআইএলএসপি উভয়ের সাথে এটি একইভাবে কাজ করে।
jlahd

1
এটি আমার প্রত্যাশার মতো আরও বেশি। +1
প্রিমো

17

পাইথন 60 বাইট

x=1.
o='x=%s\no=%r;print o%%(x/2+1/x,o)';print o%(x/2+1/x,o)

নিম্নলিখিত সূত্রগুলি ব্যবহার করে আমি সূত্রটি কিছুটা সহজ করেছি:

  x-(x²-2)/(2x)
= (2x²)/(2x)-(x²-2)/(2x)
= (2x²-x²+2)/(2x)
= (x²+2)/(2x)
= (x+2/x)/2
= x/2+1/x

আমি আশা করি এটি কোনও সমস্যা নয়।

প্রোগ্রামটি নিম্নলিখিত পদ্ধতিতে এগিয়ে চলেছে:

$ python newton-quine.py
x=1.5
o='x=%s\no=%r;print o%%(x/2+1/x,o)';print o%(x/2+1/x,o)

$ python newton-quine.py
x=1.41666666667
o='x=%s\no=%r;print o%%(x/2+1/x,o)';print o%(x/2+1/x,o)

$ python newton-quine.py
x=1.41421568627
o='x=%s\no=%r;print o%%(x/2+1/x,o)';print o%(x/2+1/x,o)

$ python newton-quine.py
x=1.41421356237
o='x=%s\no=%r;print o%%(x/2+1/x,o)';print o%(x/2+1/x,o)

প্রভৃতি


আমি জানি না এটি আইনী কিনা না তবে আপনি আপনার প্রাথমিক কোডটি g="x=%s;o=%r;print o%%(x/2+1/x,o)";print g%(1.5,g)@ 50 অক্ষরে সংক্ষেপণ করতে পারেন ।
সিজেফুরে

@ ত্রিস্টি আমার মনে হয় এটি কিছুটা সমস্যাযুক্ত যে 1) এটি আসলে প্রথম পুনরাবৃত্তির গণনা করে না, এবং 2) প্রথম লাইনে বর্তমান ফলাফল নেই। যেহেতু আমি সমস্যার বর্ণনাটি বুঝতে পারি, মূল প্রোগ্রাম এবং পরবর্তী প্রজন্ম উভয়েরই এই মানদণ্ডগুলি পূরণ করা উচিত।
প্রিমো

13

সিজোম, 20 বাইট

1
{\d_2/1@/+p"_~"}_~

এটি অনলাইনে চেষ্টা করুন।

আউটপুট

$ cjam <(echo -e '1\n{\d_2/1@/+p"_~"}_~'); echo
1.5
{\d_2/1@/+p"_~"}_~
$ cjam <(cjam <(echo -e '1\n{\d_2/1@/+p"_~"}_~')); echo
1.4166666666666665
{\d_2/1@/+p"_~"}_~
$ cjam <(cjam <(cjam <(echo -e '1\n{\d_2/1@/+p"_~"}_~'))); echo
1.4142156862745097
{\d_2/1@/+p"_~"}_~
$ cjam <(cjam <(cjam <(cjam <(echo -e '1\n{\d_2/1@/+p"_~"}_~')))); echo
1.4142135623746899
{\d_2/1@/+p"_~"}_~

কিভাবে এটা কাজ করে

1       " Push the initial guess.                                                 ";
{       "                                                                         ";
  \d    " Swap the code block with the initial guess and cast to Double.          ";
  _2/   " Duplicate the initial guess and divide the copy by 2.                   ";
  1@/   " Push 1, rotate the initial guess on top and divide.                     ";
  +p    " Add the quotients and print.                                            ";
  "_~"  " Push the string '_~'.                                                   ";
}       "                                                                         ";
_~      " Duplicate the code block (to leave a copy on the stack) and execute it. ";

2
ভাল যে চিত্তাকর্ষক। +1
কাইল কানোজ

8

ইসমাস্ক্রিপ্ট 6, 38 36

(f=x=>"(f="+f+")("+(x/2+1/x)+")")(1)
(f=x=>"(f="+f+")("+(x/2+1/x)+")")(1.5)
(f=x=>"(f="+f+")("+(x/2+1/x)+")")(1.4166666666666665)
(f=x=>"(f="+f+")("+(x/2+1/x)+")")(1.4142156862745097)
(f=x=>"(f="+f+")("+(x/2+1/x)+")")(1.4142135623746899)

জাভাস্ক্রিপ্ট, 51

(function f(x){return "("+f+")("+(x/2+1/x)+")"})(1)

পুরানো ব্রাউজারগুলির জন্য এটি উপরের মতোই।


1
কখনও কখনও আমি কেবল আশ্চর্য হয়েছি কীভাবে সহজ জাভাস্ক্রিপ্ট জিনিসগুলি তৈরি করতে পারে। +1
সেকেন্ড

এই (আউটপুট কোন ধরণের উদাসীন বলে মনে হয় print, putstr, console.log, ইত্যাদি)।
প্রিমো

@ প্রিমো - যখন জাভাস্ক্রিপ্ট কোনও কনসোলে চালানো হয় তখন প্রত্যাবর্তিত মানটি স্বয়ংক্রিয়ভাবে মুদ্রিত হয়।
ডেরেক 朕 會

@ ডেরেক 朕 會 功夫 অনেকগুলি ভাষা REPL হিসাবে চালানো যেতে পারে - এটি একটি প্রকাশ, এবং একটি সম্পূর্ণ প্রোগ্রাম নয়। দেখুন: স্ট্যান্ডার্ড "লুফোলস" যা আর মজার নয়
প্রিমো

1
@ ডেরেক 朕 會 problem সমস্যার বর্ণনাটি বিশেষত একটি প্রোগ্রামের জন্য জিজ্ঞাসা করে - বেশ কয়েকটি জায়গায়। সরবরাহিত প্রোগ্রামটি কিছুই করে না। উত্তর: i.stack.imgur.com/Te7Vf.png উপরেরটি একটি অভিব্যক্তি যা একটি অভিব্যক্তির মূল্যায়ন করে। এটির নিজস্ব যোগ্যতা রয়েছে তবে এটি কোনও প্রোগ্রাম নয়।
প্রিমো

6

লুয়া 129

সম্ভবত বেশ দীর্ঘ পথ, তবে লুয়া কুইন সফল হয় কারণ নেস্টেড [[ ]]একটি অবহেলিত বৈশিষ্ট্য। তবে এটি নির্বিশেষে কাজ করে:

x=1.0;x=x/2.+1./x;l=[[io.write('x=',x,';x=x/2.+1./x;l=[','[',l,']','];',l)]];io.write('x=',x,';x=x/2.+1./x;l=[','[',l,']','];',l)

আপনি কলোনগুলির পরিবর্তে নতুন লাইন যুক্ত করেছেন কিনা তা দেখতে কিছুটা সুন্দর:

x=1.0
x=x/2.+1./x
l=[[io.write('x=',x,'\nx=x/2.+1./x\nl=[','[',l,']','];',l)]];io.write('x=',x,'\nx=x/2.+1./x\nl=[','[',l,']','];',l)

4

জে - 102 88 বাইট

এটি আমি কুইন তৈরির মতোই ভয়ঙ্কর (যখন আমি আরও ভাল ধারণা পাই তখন সম্ভবত আমি এটি সংশোধন করব)। জে এর ফ্লোটগুলি 5 দশমিক স্থানে সীমাবদ্ধ তবে এর সাথে প্রথম লাইনটি প্রতিস্থাপনের x=:1xমাধ্যমে অসীম নির্ভুলতার সাথে একটি ভগ্নাংশ হবে।

Edit 1: I got better idea. Also added the explanation.

x=:1
((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'x=:((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'''

প্রথম কয়েকটি পুনরাবৃত্তি:

x=:1.5
((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'x=:((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'''

x=:1.41667
((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'x=:((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'''

x=:1.41422
((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'x=:((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'''

ব্যাখ্যা

((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'x=:((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:)'''
((3&{.,[:":(x%2)+1%x"_),:3&}.,],{:,{:) The quine-function
                         3&}.,],{:,{:  Build the second row
                         3&}.          Get everything but the first 3 characters from the string
                             ,]        Get the whole string and concat
                               ,{:     Get the last item (') and concat
                                  ,{:  -||-
 (3&{.,[:":(x%2)+1%x"_)                Build the first row
       [:":(x%2)+1%x"_                 Calculate x/2 + 1/x (stolen from Pythoneer) and stringify
  3&{.                                 Take the first 3 characters from the string (x=:)
      ,                                Concatenate 'x=:' and the result
                       ,:              Concatenate the two rows

1
আমি আসলে এই প্রোগ্রামটি কতটা সহজ (গম্ভীর জন্য) ভালবাসি।
seequ

আমি যদি আরও সময় পাই তবে আমি দেখতে যাচ্ছি যে আমি কোনার জন্য উপরের পরিবর্তন করতে পারি।
কাইল কানোজ

@ কাইলি ক্যানোস কমপক্ষে ডিজিট-রোটেশন-টাইটি যথেষ্ট পরিমাণে একই রকম ছিল তবে আমি কোনাকে জানি না। শুভকামনা! :)
seequ

1%xহিসাবে একই %x। পরিবর্তে (x%2)+1%x, আপনি করতে পারেন (%&2+%)x
কনর ও'ব্রায়েন

3

রুবি, 65

x=1.0
puts"x=#{x/2+1/x}",<<'1'*2,1
puts"x=#{x/2+1/x}",<<'1'*2,1
1

যেমনটি প্রায়শই ঘটে থাকে এটি পাইথন সমাধানের প্রায় একটি সোজা বন্দর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.