সুরেলা "রূপান্তর"


16

পর্যায়ক্রমে হারমনিক সিরিজ একটি সুপরিচিত কেন্দ্রমুখী সিরিজ।

1/1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...

"স্পষ্টতই", এটি স্পষ্টতই স্পষ্ট যে এটি 2 এর প্রাকৃতিক লগে রূপান্তরিত হয়েছে বা এটি আছে?

যেহেতু সিরিজগুলি একেবারে অভিজাত নয় , কেবলমাত্র শর্তাদি পুনর্বিন্যাসের মাধ্যমে, আমি এটিকে আমার যা কিছু চাই যেতে চাই। ধরুন আমি চাই সিরিজটি ই- তে রূপান্তরিত করব । আমাকে যা করতে হবে তা হ'ল:

1/1 + 1/3 + ... + 1/65 - 1/2 + 1/67 + ... + 1/175 - 1/4

আপনি যদি প্যাটার্নটি ধরেন না, তবে একটি সুস্পষ্ট চিত্র নেই। এখানে কিভাবে এটা কাজ করে:

  1. ইতিবাচক এবং নেতিবাচক পদগুলির ক্ষেত্রে বিকল্প হারমোনিক সিরিজের শর্তাদি বিবেচনা করুন।
  2. আমাদের লক্ষ্য (ই) ছাড়িয়ে যাওয়ার জন্য কেবলমাত্র যথেষ্ট ইতিবাচক শর্তাদি একসাথে যুক্ত করুন। (ওরফে sum > target)
  3. পরবর্তী নেতিবাচক শব্দটি বিয়োগ করুন।
  4. ফিরে যান 2।

নোট করুন যে পদক্ষেপ 2 এ, যদি আমাদের হয় sum == targetতবে আপনার আরও একটি ইতিবাচক পদ যুক্ত করা উচিত।

এটি থেকে আমরা প্রতিটি সংখ্যার সাথে সম্পর্কিত একটি ক্রমটি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করতে পারি:

  • উপরের অ্যালগরিদম অনুসরণ করুন
  • প্রতিটি ধনাত্মক মেয়াদে আউটপুট 1।
  • প্রতিটি নেতিবাচক শর্তের জন্য, আউটপুট 0।

আসুন এই ক্রমটিকে একটি সংখ্যার "সুরেলা বিট প্যাটার্ন" বলি। উদাহরণস্বরূপ, ই এর এইচবিপি শুরু হয়:

1, 1, 1, 1, <32 times>, 0, 1, 1, <54 times>, 0, 1, 1, ...

আপনার চ্যালেঞ্জ:

আপনাকে দেওয়া হবে:

  • পরিসরে একটি যৌক্তিক ইনপুট লক্ষ্য [-10, 10] (দ্রষ্টব্য: এমনকি সুরেলা সিরিজের মাধ্যমে 10 এ পৌঁছাতে অনেক মিলিয়ন শর্তাদি লাগে)। এটি একটি দশমিক (ওরফে 1.1) হতে পারে বা আপনি সরাসরি যুক্তি নিতে পারেন (ওরফে 12/100)
  • ধনাত্মক int এন ইনপুট, আউটপুটে সুরেলা বিট প্যাটার্নের পদগুলির সংখ্যা উল্লেখ করে।

আপনি লক্ষ্যটির সঠিক সুরেলা বিট প্যাটার্নটি নির্দিষ্ট শর্তাবলীতে আউটপুট আশা করছেন । আপনি স্থান বিভাজিত মান আউটপুট করতে পারেন, কমা পৃথকীকরণ, কোন বিচ্ছেদ, ইত্যাদি; ঠিক যতক্ষণ 0s এবং 1 এর প্যাটার্নটি স্পষ্টভাবে দৃশ্যমান এবং ধারাবাহিক পৃথকীকরণের সাথে বাম থেকে ডানদিকে পড়া হয়।

পরীক্ষার কেস

>>> 0, 1
1
>>> 0, 2
10
>>> 0, 7
1000010
>>> 1, 10
1101011011
>>> 1.01, 3
110
>>> 1.01, 24
110101101101101101101101
>>> 2.71, 32
11111111111111111111111111111111
>>> 2.71, 144
111111111111111111111111111111110111111111111111111111111111111111111111111111111111111101111111111111111111111111111111111111111111111111111111
>>> -9.8, 100
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

দ্রষ্টব্য যেহেতু -9.8এত বড়, প্রথম 1যেটি আউটপুট হবে তা কোথাও কোথাও কোথাও 149496620(এটি ফ্লোটের মাধ্যমে গণনা করা হয়েছিল, সুতরাং মানটি সঠিক নাও হতে পারে)।

উত্তর:


3

পার্ল, 69 বাইট

use bigrat;$s+=.5/($s>$ARGV[$_=0]?-++$n:++$p-++$_/2),print for 1..pop

কমান্ড লাইন আর্গুমেন্ট হিসাবে ইনপুট নেয়।

ব্যাখ্যা : bigratনির্ভুল গণনার জন্য সর্বত্র ভগ্নাংশ সক্ষম করে। $sপদ বর্তমান সমষ্টি, $ARGV[0]লক্ষ্য মান, হয় pop(হিসাবে একই $ARGV[1]) শর্তাবলী সংখ্যা প্রতিনিধিত্ব করে, $pএবং $nইতিবাচক ও নেতিবাচক শব্দ গন্য প্রতিনিধিত্ব করে। $_হয় 1বা 0ইতিবাচক বা নেতিবাচক পদ যুক্ত হয়েছিল কিনা তার উপর নির্ভর করে।


3

হাস্কেল, 92 91 90 বাইট

import Data.Ratio
f=(.h 0 1 2).take
h a p q z|a>z=0:h(a-1%q)p(q+2)z|1<2=1:h(a+1%p)(p+2)q z

ব্যবহারের উদাহরণ: f 24 1.01-> [1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1,1,0,1]

hচারদিকে চারটি প্যারামিটার বহন করে অসীম বিট প্যাটার্ন তৈরি করে: aএটি বর্তমান যোগফল। নেতিবাচক পদগুলির জন্য pপরবর্তী ধনাত্মক পদটির ডিনোমিনেটর qzলক্ষ্য সংখ্যা। fসবকিছু শুরু করে এবং ফলাফলকে দৈর্ঘ্যে ছাঁটাই করেn

সম্পাদনা করুন: @ জগারব সংরক্ষণ করতে একটি বাইট খুঁজে পেয়েছে। ধন্যবাদ!


ডিফাইনিং h a p qপরিবর্তে h p q aএকটি বাইট পরিমাণ সঞ্চয় হয়।
Zgarb

উল্লেখ্য যে 7 বাইট কেবলমাত্র অসীম ফলাফলের তালিকাকে একটি দৈর্ঘ্যে ছাঁটাইতে ব্যয় করা হয় । ফলাফল হিসাবে কেবল অসীম তালিকা দেওয়া এটি আসলে অনেক ভাল লাগবে।
ঘড়ির

1

পাইথন 3, 128 124 বাইট

from fractions import*
F=Fraction
*c,s=2,1,0
t=F(input())
for i in'x'*int(input()):w=s<=t;s+=F(w*2-1,c[w]);c[w]+=2;print(+w)

এটি পাইথনের Fractionক্লাস ব্যবহার করে ।

from fractions import* 
F=Fraction
*c,s=2,1,0                # c = [2, 1]. s = 0
                          # c is my positive/negative term counter, s is the sum
t=F(input())              # input a fraction
for i in'x'*int(input()): # Do this for for the chosen number of terms, as per the spec
  w=s<=t;                 # "w" or which one do we choose? Positive or negative?
  s+=F(w*2-1,c[w]);       # w*2-1 gives 1 if w else -1. Gives 1 if we need to add, else -1
  c[w]+=2;                # Increment the coefficient we chose
  print(+w)               # Output that. The +w coerces the bool to an int.

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