অর্ধ-তাত্পর্যপূর্ণ কার্য


21

একটি অর্ধ-সূচকীয় ফাংশন এক যা যখন নিজেই সঙ্গে স্থিরীকৃত একটি সূচকীয় ফাংশন দেয়। উদাহরণস্বরূপ, যদি f(f(x)) = 2^x, তবে fএটি একটি অর্ধ-এক্সফেনশনিয়াল ফাংশন হবে। এই চ্যালেঞ্জের মধ্যে আপনি একটি নির্দিষ্ট অর্ধ-তদন্তকারী ফাংশন গণনা করবেন।

বিশেষত, আপনি নীচের বৈশিষ্ট্যগুলি সহ অ-নেতিবাচক পূর্ণসংখ্যার থেকে অ-নেতিবাচক পূর্ণসংখ্যায় ফাংশনটি গণনা করবেন:

  • একঘেয়েভাবে বৃদ্ধি: যদি x < y, তারপরf(x) < f(y)

  • কমপক্ষে অর্ধ-তাত্পর্যপূর্ণ: সকলের জন্য x,f(f(x)) >= 2^x

  • অভিধানের তুলনায় ক্ষুদ্রতম: উপরের বৈশিষ্ট্যগুলির সাথে সমস্ত ফাংশনের মধ্যে আউটপুটটি কোনটি ন্যূনতম করে দেয় f(0), যা সেই পছন্দটি কমিয়ে দেয় f(1), তারপরে f(2)এবং আরও অনেক কিছু।

ইনপুটগুলির জন্য এই ফাংশনের প্রাথমিক মানগুলি হ'ল 0, 1, 2, ...:

[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]

আপনি নিম্নলিখিত ফাংশন হিসাবে বা একটি সম্পূর্ণ প্রোগ্রাম হিসাবে নিম্নলিখিত যে কোনও পদ্ধতির মাধ্যমে এই ফাংশনটিকে আউটপুট দিতে পারেন:

  • xইনপুট হিসাবে নিন , আউটপুট f(x)

  • xইনপুট হিসাবে নিন , এর প্রথম xমানগুলিকে আউটপুট দিন f

  • অসীমভাবে সমস্ত আউটপুট f

আপনি নিতে চান xএবং আউটপুট f(x), xশূন্য ইন্ডেক্স হতে হবে।

রেফারেন্স বাস্তবায়ন

এটি কোড গল্ফ - বাইট জেতে সংক্ষিপ্ততম কোড। স্ট্যান্ডার্ড লুফোলগুলি বরাবরের মতো নিষিদ্ধ।


মনে হয় সংজ্ঞা 0: f (f (0)) = f (1) = 2 এর জন্য যাচাই করা হয়নি
নাহুয়েল ফুইলুল

এবং 1 এর জন্য: f (f (1)) = f (2) = 3 তবে 2 ^ 1 = 2
নাহুয়েল ফুয়েলুল

1
@ নাহুয়েলফৌইলুল প্রয়োজনীয়তা হ'ল চ (চ (এক্স)) > = 2 ^ এক্স।
মার্টিন এন্ডার

1
আমাদের কি OEIS এ জমা দেওয়া উচিত ?
জেপ্পে স্টিগ

উত্তর:


8

জাভাস্ক্রিপ্ট (ES7), 51 48 বাইট

@ আরনাউল্ডকে 3 টি বাইট সংরক্ষণ করা হয়েছে

f=i=>i?f[f[q=f(i-1),r=f[i]||q+1]=(i>1)<<i,i]=r:1

এন নেয় এবং অনুক্রমের n 'ম আইটেম আউটপুট ।


জাভাস্ক্রিপ্ট (ES7), 70 68 64 বাইট

f=(n,a=[],q=1)=>n?f(n-1,a,(n=2**a.indexOf(a.push(q)))<++q?q:n):a

একটি পুনরাবৃত্ত ফাংশন যা অনুক্রমের xপ্রথম xআইটেমগুলিকে অ্যারে হিসাবে গ্রহণ করে এবং প্রদান করে।

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

অ্যারে একটি procedurally উৎপন্ন হয়, একটি সময়ে একটি আইটেম পর্যন্ত তা-ই চেয়েছি দৈর্ঘ্য ছুঁয়েছে। ( এক্সনরের দুর্দান্ত পাইথন উত্তরে ব্যবহৃত অসীম প্রযুক্তির একটি বন্দর সম্ভবত আরও ছোট হবে))

আমরা প্রতিটি সূচী i (0-indexed) এর জন্য নিম্নলিখিত পর্যবেক্ষণ করতে পারি :

  • তাহলে আমি এ একটি আইটেম হিসাবে বিদ্যমান একটি সূচিতে ( একটি [ঞ] = আমি ), তারপর একটি [আমি] অন্তত হওয়া প্রয়োজন 2

এই সত্য কারণ চ (চ (ঞ)) অন্তত হওয়া প্রয়োজন 2 , এবং চ (চ (ঞ)) সমতূল্য একটি [একটি [ঞ]] , যা পালা সমতুল্য হয় একটি [আমি]

সাধারণত সঠিক বিকল্পটি হ'ল 2 জে । তবে, একক ক্ষেত্রে i = 2 , 2 সূচিতে অ্যারের মধ্যে বিদ্যমান ঞ = 1 , যার মানে 2 হবে 2 এর মানে -কিন্তু আমরা হবে 2 উভয় সময়ে একটি [1] এবং একটি [2] । এটি পেতে, আমরা সর্বাধিক 2 এবং একটি [i-1] + 1 (পূর্ববর্তী আইটেমের তুলনায় আরও একটি) নিই , যা i = 2 এর জন্য 3 দেয় ।

এই কৌশলটি জে রয়েছে কিনা তা স্থির করে নিতেও যত্ন নিতে দেখা যায় - যদি তা না থাকে তবে জেএসের .indexOf()পদ্ধতিটি -1 ফেরত আসে , যা সর্বাধিক একটি [i-1] + 1 এবং 2 -1 = 0.5 গ্রহণ করার দিকে পরিচালিত করে । যেহেতু ক্রমের সমস্ত আইটেম কমপক্ষে 1 , এটি সর্বদা পূর্ববর্তী আইটেম প্লাস একটিকে ফিরিয়ে দেবে।

(আমি গভীর রাতে এই ব্যাখ্যাটি লিখছি, সুতরাং কিছু বিভ্রান্তিকর হয় বা আমার কোনও কিছু মিস হয়ে যায় তবে দয়া করে আমাকে জানান)


নোট করুন যে 272পূর্ণসংখ্যা ওভারফ্লো সমস্যার কারণে ইনপুটগুলি এবং আপগুলি ভুল উত্তর দেয়। এটি ঠিক আছে, কারণ এটি ডেটাটাইপের সীমা অবধি কাজ করে।
isaacg

আশাকরি সমস্যাটির 2**পরিবর্তে ব্যবহার করুন 1<<
ব্যবহারকারী 202729

এখন .99সমাধানটিকে হত্যা করে। তবে কেন +.99এবং ব্যবহার করছেন না +.9? পার্থক্য কি?
ব্যবহারকারী 202729

@ user202729 আমার বোকা মনে হচ্ছে - এটি আগের সংস্করণ থেকে যেখানে আমি ব্যবহার করছিলাম সেখানে রেখে গিয়েছিলাম এবং Math.log2(...)সিলিংটি গণনা করতে হয়েছিল। এখন একেবারেই দরকার নেই। ধন্যবাদ! আমি 2**জিনিসটি সন্ধান করব - আমি 2**...+.99|0মূলত ব্যবহার করছিলাম তবে 1<<ছোট ছিল কারণ আমার দরকার নেই |0। এখন আমি মনে করি কোন পার্থক্য নেই ...
ETH প্রোডাকশনগুলি




1

জেলি , 14 বাইট

iL’2*»Ṁ‘$ṭ
⁸Ç¡

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

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

⁸Ç¡         Main link. No arguments.

⁸           Set the left argument and the return value to [].
 Ç¡         Read an integer n from STDIN and call the helper link n times, first on
            [], then on the previous result. Return the last result.


iL’2*»Ṁ‘$ṭ  Helper link. Argument: A (array)

 L          Take the length of A. This is the 0-based index of the next element.
i           Find its 1-based index in A (0 if not present).
  ’         Decrement to a 0-based index (-1 if not present).
   2*       Elevate 2 to the 0-based index.
      Ṁ‘$   Take the maximum of A and increment it by 1.
            Note that Ṁ returns 0 for an empty list.
     »      Take the maximum of the results to both sides.
         ṭ  Tack (append) the result to A.

0

পাইথন 2 , 111 বাইট

def f(x):
 a=range(1,2**x)
 for i in range(1,x):a[i]=max(a[i],a[i-1]+1);a[a[i]]=max(a[a[i]],2**i)
 return a[:x]

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

এটি ব্যবহারকারীর উত্তরের 202729 এর উল্লেখযোগ্য পরিবর্তন । আমি একটি মন্তব্য হিসাবে এই উন্নতি পোস্ট করেছি, কিন্তু উত্তর মুছে ফেলা এবং তাই মন্তব্য অক্ষম করা আছে।


এটি ইনপুট 258 ইনপুটটিতে "তালিকা সূচকের বাইরে" ব্যর্থ হয়েছে I আমার মনে হয় সমস্যাটি x**2খুব ছোট।
isaacg

আচ্ছা ... পাইথন 2 পাইথন 3 থেকে আলাদা (প্রায়শই কম বাইট)
ব্যবহারকারী 202729

1
প্রত্যাশিত হিসাবে, অর্ধ-তাত্পর্যটি চতুষ্কোণের চেয়ে অনেক বড়। সমাধানটিতে "তালিকা সূচকের বাইরে" পাওয়া যায় x=1000। আপনি চেষ্টা করতে পারেন 2**x- মারাত্মক আকারে বড় তবে কোডগোল্ড কোডগল্ফ।
ব্যবহারকারী 202729

@ ব্যবহারকারী 202729 আহ, এটি সত্য। দুর্ভাগ্যক্রমে এটি এখন বৃহত্তর ইনপুটগুলির সাথে সম্পূর্ণ ভিন্ন সমস্যার মুখোমুখি হয় যা 2**xপাইথন চালিয়ে যাওয়ার জন্য অনেক বড় পরিসীমা তৈরি করে।
notjagan

0

সুইফ্ট , 137 বাইট

func f(n:Int){var l=Array(1...n).map{$0>3 ?0:$0},p=8;if n>3{for i in 3..<n{if l[i]<1{l[i]=l[i-1]+1};if l[i]<n{l[l[i]]=p};p*=2}};print(l)}

Int(পূর্ণসংখ্যা) হিসাবে ইনপুট নেয় এবং [Int](পূর্ণসংখ্যা অ্যারে) হিসাবে মুদ্রণ করে ।

উদার সংস্করণ

func f(n:Int){
    var l = Array(1...n).map{$0 > 3 ? 0 : $0} // Create the range from 1 to n and set all
    var p = 8                                 // values greater than 3 to 0
    if n > 3 {
        for i in 3 ..< n {
            if l[i] < 1 {
                l[i] = l[i - 1] + 1
            }
            if l[i] < n {
                l[l[i]] = p
            }
            p *= 2
        }
    }
    print(l)
}

আমি কৌতূহলী, আপনি যদি জায়গাটির আগে জায়গাটি সরিয়ে ফেলেন তবে কি হবে ??
ইটিএইচ প্রডাকশনগুলি

@ETH প্রোডাকশনগুলি যা সংকলক ত্রুটির দিকে পরিচালিত করে, যেহেতু পূর্ণসংখ্যাগুলি alচ্ছিকভাবে বেঁধে রাখা যায় না
হারমান এল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.