11 = (1 + 2 + 3 + 4 + 5) - (1 + 2 + 3) + (6) - (4)


35

ধনাত্মক পূর্ণসংখ্যার এন দেওয়া , আপনার টাস্কটি N এ পৌঁছানোর জন্য নিম্নলিখিত অ্যালগরিদম দ্বারা প্রয়োজনীয় পদক্ষেপের সংখ্যাটি ফিরিয়ে আনতে হবে :

  1. ক্ষুদ্রতম ত্রিদলীয় সংখ্যা খুঁজে বের টি আমি যে এই ধরনের টি আমি  ≥ এন । সংশ্লিষ্ট তালিকাটি এল = [1, 2, ..., i] তৈরি করুন

  2. L এর শর্তগুলির যোগফল এর চেয়ে বেশি N এরহলেও তালিকা থেকে প্রথম পদটি সরিয়ে ফেলুন।

  3. যদি L এর শর্তগুলির যোগফল এখন N এর চেয়ে কম হয় , বৃদ্ধি হয় iকরুন এবং এটিকে তালিকায় যুক্ত করুন। পদক্ষেপ # 2 নিয়ে যান।

আমরা যত তাড়াতাড়ি থামি এন পৌঁছে যাওয়ার সাথে সাথে। কেবলমাত্র প্রথম পদক্ষেপটি পদ্ধতিগতভাবে কার্যকর করা হয়। # 2 এবং # 3 পদক্ষেপগুলি মোটেই প্রক্রিয়া করা যাবে না।

উদাহরণ

নীচে এন = 11 এর উদাহরণ রয়েছে :

উদাহরণ

সুতরাং এন = 11 এর প্রত্যাশিত আউটপুট হয় 4

অন্যান্য উদাহরণ:

  • এন = 5 - আমরা টি 3 = 1 + 2 + 3 = 6 দিয়ে শুরু করি , তারপরে 2 + 3 = 5 হয় । প্রত্যাশিত আউটপুট: 2
  • এন = 10 - শুধুমাত্র প্রথম পদক্ষেপের প্রয়োজন কারণ 10 ত্রিভুজাকার সংখ্যা: টি 4 = 1 + 2 + 3 + 4 = 10 । প্রত্যাশিত আউটপুট: 1

প্রথম 100 মান

নীচে 1 ≤ N ≤ 100 এর ফলাফল রয়েছে :

  1,  2,  1,  4,  2,  1,  2, 10,  2,  1,  4,  2,  6,  2,  1, 22,  8,  2, 10,  2,
  1,  2, 12,  6,  2,  4,  2,  1, 16,  2, 18, 50,  2,  6,  2,  1, 22,  6,  2,  4,
 26,  2, 28,  2,  1,  8, 30, 16,  2,  6,  4,  2, 36,  2,  1,  2,  4, 12, 40,  2,
 42, 14,  2,108,  2,  1, 46,  2,  6,  4, 50,  2, 52, 18,  2,  4,  2,  1, 56, 12,
  2, 20, 60,  4,  2, 22, 10,  2, 66,  2,  1,  4, 10, 24,  2, 40, 72,  8,  2,  6

বিধি

  • আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন, যা হয় ফলাফল মুদ্রণ করে বা ফেরত দেয়।
  • আপনাকে যে কোনও এন ≤ 65536 প্রক্রিয়াকরণ করতে হবে মধ্য পরিসীমা হার্ডওয়্যারে কম এক মিনিটে।
  • যথেষ্ট সময় দেওয়া, আপনার প্রোগ্রাম / ফাংশন উচিত তাত্ত্বিক কোন মান কাজ এন যে নেটিভ আপনার ভাষা সমর্থন করে। যদি তা না হয় তবে দয়া করে আপনার উত্তরে কেন তা ব্যাখ্যা করুন।
  • এটি কোড গল্ফ, তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর!

সম্পর্কিত। (আমি সন্দেহ করি যে আপনি এটি সম্পর্কে ইতিমধ্যে জেনে
গেছেন

আমাদের হ'ল এন এর সর্বোচ্চ মানটি কী?
লুক

@ লুক দয়া করে আপডেট হওয়া বিধিগুলি দেখুন।
আর্নল্ড

উত্তর:


4

জেলি , 29 31 বাইট

ÆDµ’H+Ṛ%1$ÐḟṂ
>TḢ_@Ç}‘Ḥ
R+\ðċȯç

একটি মোনাডিক লিঙ্ক যা ফলাফলটি দেয় (এন = 65536 দুই সেকেন্ডেরও কম সময় নেয়)।

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

কিভাবে?

অ্যালগরিদমের বিশদ ব্যাখ্যার জন্য মার্টিন ইন্ডারের দুর্দান্ত পোস্টটি দেখুন ।

ÆDµ’H+Ṛ%1$ÐḟṂ - Link 1, smallest natural number, M, that satisfies the below*, N
              - * N = T(M) - T(i) for some non-negative integer i <= M
ÆD            - divisors of N
  µ           - monadic chain separation, call that d
   ’          - increment d (vectorises)
    H         - halve (vectorises
      Ṛ       - reverse d
     +        - add (vectorises)
          Ðḟ  - filter discard if:
       %1$    -   modulo one is truthy (those which are the result of even divisors)
            Ṃ - minimum

>TḢ_@Ç}‘Ḥ - Link 2, evaluate result for non-triangular: list of T(1) to T(N), N
>         - T(i) > N
 T        - truthy indexes
  Ḣ       - head (yields the first i for which T(i) > N)
     Ç}   - call last link (1) as a monad converted to a dyad using the right argument
   _@     - subtract with reverse @rguments
       ‘  - increment
        Ḥ - double 

R+\ðċȯç - Main link: N
R       - range -> [1,2,...,N]
 +\     - reduce with addition -> [1,3,6,10,...T(N)]
   ð    - dyadic chain separation, call that t
    ċ   - count occurrences of N in t (1 if N is triangular else 0)
      ç - call last link (2) as a dyad(t, N)
     ȯ  - or

বর্ণিত অ্যালগরিদমের 29 টি বাইট ফুল-প্রোগ্রাম বাস্তবায়ন আমার ল্যাপটপে এন = 65536 এর জন্য 4 মিনিট 30 নেবে, সুতরাং আমি মনে করি এটি গণনা করে না।

Ṁ‘ṭµS<³µ¿
ḊµS>³µ¿
0®Ḃ‘©¤ĿÐĿL’

প্রতিটি পদক্ষেপ 3 এর জন্য কিছুক্ষণ লুপ ব্যবহার করা এবং এটিকে 1 ম পদক্ষেপ হিসাবে পুনঃব্যবহারের সাথে তালিকার শুরুতে যা পরিচালনা করতে পারি তার দৈর্ঘ্য সমান যেহেতু পদক্ষেপ 3 তে কোনও চেক না হওয়া মানে তালিকা তৈরি করা এবং কিছুই না থাকা পর্যন্ত তালিকা তৈরি করা এবং তারপরে মানটির প্রথম সূচকটি সন্ধান করা:

ḊµS>³µ¿
Ṁ‘ṭ
Ḥ½_.ĊR®Ḃ‘©¤ĿÐĿS€i

25

গণিত, 79 বাইট

Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]-2⌊(2#)^.5+.5⌋+⌈Sqrt[8#+1]~Mod~1⌉&

ব্যাখ্যা

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

সুতরাং আমি দাবি করি যে অনুক্রমটি আমাদের গণনা করা উচিত:

f (n) = 2 * ( A212652 (n) - A002024 (n)) + 1 + A023532 (n-1)

বিকল্পভাবে, এটি f (n) = 1 যদি n ত্রিভুজাকার সংখ্যা এবং f (n) = 2 * ( A212652 (n) - A002024 (n) + 1) অন্যথায় হয়।

প্রথম অভিব্যক্তিটিতে, A023532 কেবল এই দুটি পৃথক ক্ষেত্রে এনকোড করে। অন্য দুটি সিকোয়েন্স (প্লাস 1) বৃহত্তম পূর্ণসংখ্যা মধ্যে পার্থক্য আছে দীর্ঘতম পচানি মধ্যে এন পরপর পূর্ণসংখ্যার মধ্যে (ট-ই + 1 টি) + + (ট-ই +2) ... + K = ঢ এবং বৃহত্তম সংখ্যার জে যাতে 1 + 2 + ... + জে <এন

কিছুটা সহজ কথায়, এখানে আমরা কীভাবে ত্রিভুজাকার সংখ্যাগুলির উত্তর খুঁজে পাই: প্রথমে বৃহত্তম ত্রিভুজাকার সংখ্যা টি জ সন্ধান করুন যা n এর চেয়ে কম । তারপরে j হ'ল পেনাল্টিমেট পূর্ণসংখ্যা যা প্রথম ধাপ 1 এর সময় যুক্ত হয় (কারণ j + 1 যুক্ত করার পরে আমরা n ছাড়িয়ে যাব )। তারপর পচা এন অনেক (বা ছোট হিসাবে) যতটা সম্ভব পরপর পূর্ণসংখ্যার যেমন মধ্যে এবং এই সংখ্যা মধ্যে সর্বোচ্চ কল । ফলাফলটি কেবল 2 * (কেজে) হয় । এর স্বজ্ঞাত কারণ হ'ল পচনটিতে সর্বাধিক বৃদ্ধি হয় প্রতি 1 টি ধাপে এবং যখন পৌঁছায় আমরা থামিকে

এটি কার্যকর হয় তা প্রমাণ করার জন্য আমাদের চারটি জিনিস দেখাতে হবে:

  1. f (n) = 1 ত্রিভুজাকার সংখ্যার জন্য। এটি তুচ্ছভাবে ক্ষেত্রে, কারণ প্রথম পদক্ষেপটি সমস্ত ত্রিভুজাকার সংখ্যার মাধ্যমে কেবল পুনরাবৃত্তি করে। আমরা যদি আঘাত এন এই প্রক্রিয়ার সময় ঠিক আমরা কাজ সম্পন্ন হয় এবং শুধুমাত্র এক ধাপ গনা ছিল না।
  2. অন্যান্য সমস্ত সংখ্যার জন্য, আমরা সর্বদা একটি মোছার পদক্ষেপের পরে শেষ করি, কখনই কোনও সন্নিবেশ পদক্ষেপের পরে নয়। তার মানে অন্য সমস্ত চ (এন) সমান।
  3. প্রথমটির পরে প্রতিটি সন্নিবেশ পদক্ষেপে, আমরা কেবল একটি একক সংখ্যা যুক্ত করি। এটি গ্যারান্টি দেয় যে আমরা কেজ জোড় পদক্ষেপের পরে কে সহ পচিয়ে যাব ।
  4. N এর চূড়ান্ত পচন যেটি আমরা পাই তা হ'ল n ক্রমাগত পূর্ণসংখ্যায় n এর দীর্ঘতম পচন হতে পারে বা অন্য কথায় এটি সর্বদা সংখ্যার মধ্যে সর্বনিম্ন সর্বাধিক সহ n এর ক্ষয় হয়। অন্য কথায়, আমরা যোগফলটিতে যোগ করা শেষ সংখ্যাটি সর্বদা A212652 (n) হয়

(1) কেন সত্য তা আমরা ইতিমধ্যে দেখিয়েছি। এরপরে, আমরা প্রমাণ করি যে আমরা প্রাথমিক এক (যা ত্রিভুজ সংখ্যাগুলির ক্ষেত্রে হয় না) বাদ দিয়ে সন্নিবেশ পদক্ষেপে শেষ করতে পারি না।

ধরুন আমরা একটি সন্নিবেশ পদক্ষেপ শেষ হয়েছে, পৌঁছনোর এন একটি মান যোগ করার পরে পি সমষ্টি করতে। তার মানে এই যে এই সন্নিবেশ পদক্ষেপের আগে মানটি এনপি হয়েছিল ( বা আমরা যদি একবারে একাধিক মান যুক্ত করি তবে)। তবে এই সন্নিবেশ পদক্ষেপটি একটি মোছার পদক্ষেপের আগে ছিল (যেহেতু আমরা প্রথম পদক্ষেপের সময় n টিপতে পারি না )। এই মুছে ফেলার পদক্ষেপের সময় আমরা সর্বশেষ মান q সরিয়েছি অ্যালগরিদম যেভাবে কাজ করে তার কারণে অগত্যা পি এর চেয়ে কম ছিল । তবে এর অর্থ আমরা q সরিয়ে নেওয়ার আগে আমাদের কাছে এন-পি + কিউ ( বা কম ) ছিল যা কম এন। কিন্তু যে, একটি অসঙ্গতি কারণ আমরা যখন আমরা আঘাত পূর্ণসংখ্যার সরানোর বন্ধ করতে বাধ্য হতো এন-পি + Q পরিবর্তে অন্য সরানোর কুই । এটি উপরের পয়েন্টটি (2) প্রমাণ করে। সুতরাং এখন আমরা জানি যে আমরা সর্বদা একটি মোছার পদক্ষেপে শেষ করি এবং তাই সমস্ত অ ত্রিভুজাকার সংখ্যার এমনকি ফলাফল হয়।

পরবর্তী আমরা প্রমাণ করি (3), প্রতিটি সন্নিবেশ পদক্ষেপ কেবল একটি মান সন্নিবেশ করতে পারে। এটি মূলত (2) এর একটি বাস্তবায়ন। আমরা দেখা গেছে একটি মান যোগ করার পরে আমরা আঘাত করতে পারবে না এন ঠিক এবং প্রমাণ যেহেতু একটি বৈষম্য ব্যবহার করছিলেন, আমরা নীচে শেষ হতে পারে না এন (যেহেতু তারপর এন-পি + Q এখনও কম হবে এন এবং আমরা সরিয়েছি করা উচিত নয় যে প্রথম স্থানে অনেক মান)। সুতরাং আমরা যখনই একটি মান যুক্ত করি তখন আমাদের n এর চেয়ে বেশি গ্যারান্টিযুক্ত হয় কারণ আমরা একটি ছোট মান সরিয়ে N এর নীচে গিয়েছিলাম । সুতরাং, আমরা জানি যে যোগফলের উপরের প্রান্তটি প্রতি অন্য ধাপে 1 দ্বারা বৃদ্ধি পায় । আমরা এই ঊর্ধ্ব শেষ প্রাথমিক মান জানি (এটা ক্ষুদ্রতম এর মি যেমন যেটি মি> এন ) একবার আমরা চূড়ান্ত সমষ্টিতে পৌঁছানোর পরে আমাদের কেবলমাত্র এই উপরের প্রান্তটি বের করতে হবে। তারপরে পদক্ষেপের সংখ্যা কেবল দ্বিগুণ (পার্স 1) twice

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

N এর আদি / দীর্ঘতম পচন হ'ল কিছু a + (a + 1) + ... (খ -1) + বি , a ≤ বি , এবং আলগোরিদম এড়িয়ে চলে তা বলে। সময় যে তার মানে যোগ পরার, একটি আবশ্যক আর সমষ্টি অংশ হতে। যদি একটি সমষ্টি অংশ ছিল গুলি , তাহলে আমরা চাই এন ≤ গুলি সেই মুহুর্তে। সুতরাং হয় সমষ্টি শুধুমাত্র থেকে মানগুলি রয়েছে একটি থেকে যা সমান, এন এবং আমরা থামান (অত: পর আমরা এই পচানি লাফালাফি করা হয়নি), অথবা সেখানে অন্তত একটি মান কম একটি সমষ্টি এ, win যে ক্ষেত্রে এন <গুলিএবং আমরা সঠিক যোগফল না দেওয়া পর্যন্ত সেই মানটি মুছে ফেলা হবে (আবার, পচনটি এড়ানো হয়নি)। সুতরাং আমরা যোগ করার আগে একটি পরিত্রাণ পেতে চাই । তবে এর অর্থ আমাদের এমন পরিস্থিতিতে পৌঁছাতে হবে যেখানে একটি যোগফলের সবচেয়ে ক্ষুদ্রতম উপাদান এবং বৃহত্তমটি এখনও বি হয় না । যাইহোক, যে সময়ে আমরা সরাতে পারবেন না একটি কারণ সমষ্টি পরিষ্কারভাবে চেয়ে কম হয় এন (যেহেতু অনুপস্থিত), তাই আমরা প্রথম মানগুলি যোগ করতে না হওয়া পর্যন্ত আমরা যোগ প্রয়োজন করছি এবং আঘাত এন ঠিক। এটি প্রমাণিত (4)।

সুতরাং এই জিনিসগুলিকে একসাথে নিয়ে যাওয়া: আমরা জানি যে প্রথম জোড়া পদক্ষেপ আমাদের সর্বাধিক A002024 (n) এর মান দেয় । আমরা জানি যে চূড়ান্ত পচনটির সর্বাধিক মান A212652 (n) । এবং আমরা জানি যে প্রতিটি সর্বোচ্চ পদক্ষেপে এই সর্বোচ্চটি একবারে বাড়ানো হয়। সুতরাং, চূড়ান্ত প্রকাশটি 2 * ( A212652 (n) - A002024 (n) + 1) । এই সূত্রটি প্রায় ত্রিভুজাকার সংখ্যার জন্য কাজ করে, তাদের ব্যতীত আমাদের কেবল 2 এর পরিবর্তে 1 টি পদক্ষেপ প্রয়োজন, যার কারণেই আমরা ত্রিভুজাকার সংখ্যার সূচক ফাংশন (বা এর বিপরীত, যেটি আরও সুবিধাজনক) দিয়ে ফলাফলটি সংশোধন করি।

অবশেষে, বাস্তবায়ন হিসাবে। পূর্ববর্তী ক্রমের জন্য, আমি ওইআইএস থেকে এমআইএন (বিজোড় ডি | এন; ডি / ডি + (ডি -1) / 2) সূত্রটি ব্যবহার করছি । এমআইএন (বিজোড় ডি | এন; 2 এন / ডি + ডি -1 ) পাওয়ার জন্য আমরা যদি 2 টির ফ্যাক্টরটি এই অভিব্যক্তিতে নিয়ে যাই তবে এটি কয়েক বাইট সংরক্ষণ করতে পারে , কারণ -1 এর পরে আমার প্রথম সংস্করণে +1 বাতিল হবে এর চ (এন) যা ত্রিভুজাকার এবং অ ত্রিভুজাকার সংখ্যাগুলির জন্য দুটি ক্ষেত্রে সরাসরি এনকোড করে। কোডটিতে, এটি হ'ল:

Min[2#/(d=Divisors@#~Cases~_?OddQ)+d]

পরবর্তী ক্রম ( 1, 2, 2, 3, 3, 3, ...) এর জন্য, আমরা একটি সহজ বদ্ধ ফর্ম ব্যবহার করতে পারি:

⌊(2#)^.5+.5⌋

এবং পরিশেষে, ত্রিভুজাকার সংখ্যার বিপরীত নির্দেশক ফাংশন 0 হয় যখনই 8n + 1 একটি নিখুঁত বর্গ হয়। এটি গণিত হিসাবে প্রকাশ করা যেতে পারে

⌈Sqrt[8#+1]~Mod~1⌉

এই শেষ দুটি ক্রমটি প্রকাশ করার এবং তাদের মধ্যে কিছু ধ্রুবক অফসেট স্থানান্তরিত করার জন্য অনেকগুলি উপায় রয়েছে, সুতরাং আমি নিশ্চিত যে এটি এখনও একটি অনুকূল বাস্তবায়ন নয়, তবে আমি আশা করি যে এটি অন্যদের মধ্যে নতুন পদ্ধতির সন্ধানের জন্য একটি প্রাথমিক পয়েন্ট দেবে তাদের নিজস্ব ভাষা।

যেহেতু আমি এই সমস্ত সমস্যার মুখোমুখি হয়েছি, এখানে এন = 1000 পর্যন্ত সিকোয়েন্সের প্লট রয়েছে (আমি কয়েক সেকেন্ডের মধ্যে 100k গণনাও করতে পারি, তবে এটি আসলে কোনও অতিরিক্ত অন্তর্দৃষ্টি প্রদর্শন করে না):

এখানে চিত্র বর্ণনা লিখুন

খুব সরল রেখাগুলির বিভিন্নতার মধ্যে নজর রাখা আকর্ষণীয় হতে পারে তবে আমি এটি অন্য কারও কাছে ছেড়ে দিচ্ছি ...


আপনার উত্তরটি পুরোপুরি পড়ার জন্য আমি অবশেষে সময় নিয়েছি। ইহা অসাধারণ. লক্ষ্য করুন (3) ইতিমধ্যে অ্যালগোরিদমের মধ্যে যা হওয়ার তাই হল (ধাপ # 3 একটি হল যদি একটি না সময় ), কিন্তু প্রমাণ - অবশ্যই - অনেক স্বাগত জানান।
আর্নল্ড

@ আরনাউল্ড আপনাকে ধন্যবাদ :) অংশটি অবশ্যই / আমি অবশ্যই উপেক্ষা / ভুল বুঝেছি। ভাল জিনিস এটি তখন কোনও পার্থক্য রাখে না।
মার্টিন এন্ডার

7

গণিত, 72 বাইট

(For[l=u=c=k=0,k!=#,c++,If[#>k,While[#>k,k+=++u],While[#<k,k-=l++]]];c)&

একটি পূর্ণসংখ্যার যুক্তি গ্রহণ করে খাঁটি ফাংশন।

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

For[ ... ]

একটি Forলুপ।

l=u=c=k=0

আরম্ভ; সেট l(লোয়ার), u(উপরের), c(পাল্টা), এবং k(যোগফল) 0।

k!=#

অবস্থা; kইনপুট সমান না যখন পুনরাবৃত্তি ।

c++

বৃদ্ধি; কাউন্টার বৃদ্ধি c

If[#>k,For[,#>k,,k+=++u],For[,#<k,,k-=l++]]

শরীর

If[#>k, ... ]

যদি ইনপুটটি এর চেয়ে বেশি হয় k:

While[#>k,k+=++u]

যদিও ইনপুট চেয়ে বেশী k, বৃদ্ধি uএবং বৃদ্ধি kদ্বারা u

যদি ইনপুটটি এর চেয়ে বড় না হয় k:

While[#<k,k-=l++]

যদিও ইনপুট চেয়ে কম হয় k, হ্রাস kদ্বারা lএবং বৃদ্ধি l

( ... ;c)

cলুপ পরে ফিরে আসুন ।


1
For[,...]beats While[...]
মার্টিন এন্ডার


5

হাস্কেল , 70 63 68 64 বাইট

সম্পাদনা করুন:

  • -7 বাইট: একটি স্পেস, দুটি লক্ষণ এবং কিছু প্যারেনেসিস থেকে অবজ্ঞা পেয়ে এড়িয়ে গেছেন a। ব্যাখ্যায় একের পর এক ত্রুটি স্থির করে।
  • +5 বাইট: আরগ, 65536 প্রয়োজনীয়তা সম্পূর্ণরূপে মিস হয়েছে এবং এটি প্রমাণিত হয় (1) 2 পাওয়ারগুলি বিশেষত ব্যয়বহুল, কারণ কেবলমাত্র যখন আপনি নিজেই সংখ্যায় পৌঁছান তখনই তারা আঘাত পান (2) সুতরাং দীর্ঘ পরিসীমাগুলি সংশ্লেষ করা হয় (যা প্রায় মোড়ানো) শূন্য) সব সময়। অঙ্কটি গাণিতিক সূত্রে প্রতিস্থাপন করে।
  • -4 বাইট: সমন্বিত ab সূত্রের শর্তাবলী বাতিল করতে এবং রৈখিকভাবে।

1#1 একটি পূর্ণসংখ্যা গ্রহণ করা এবং ফিরিয়ে দেওয়া একটি বেনামী ফাংশন।

ব্যবহৃত হচ্ছে (1#1) 100

1#1
(a#b)n|s<-a*a-b*b=sum$[a#(b+2)$n|s>8*n]++[(b#a)(-n)+1|s<8*n]

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

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

  • (a#b)nগণনার বর্তমান ধাপটি উপস্থাপন করে। a, bসংখ্যা হয়1, 3, 5, .. , তবে nধাপের উপর নির্ভর করে হয় ধনাত্মক বা নেতিবাচক হতে পারে।
    • পদক্ষেপ 1 বা 3 এ গেলে, এটি তালিকার প্রতিনিধিত্ব করে [(a+1)/2,(a+3)/2..(b-1)/2] এবং লক্ষ্য সংখ্যাটি-n
    • পদক্ষেপ 2 এ, এটি তালিকা [(b+1)/2,(b+3)/2..(a-1)/2]এবং লক্ষ্য নম্বর উপস্থাপন করেn
  • a, bসংক্ষেপে সংক্ষিপ্ত প্রকাশের সাথে সামঞ্জস্য করতে সক্ষম হওয়ার জন্য এবং তালিকাগুলির মধ্যে অদ্ভুত চিঠিপত্রs=a*a-b*b
    • পদক্ষেপ 1 এবং 3 এ, এটি একই s= -8*sum[(a+1)/2..(b-1)/2]
    • পদক্ষেপ 2 এ, এটি একই s=8*sum[(b+1)/2..(a-1)/2]
  • ব্রঞ্চিং তালিকার বোধগম্যতা দ্বারা সম্পন্ন হয় যা প্রতিটি কেবল একটি ক্ষেত্রে উপাদান সরবরাহ করে এবং ফলাফলগুলি সংক্ষেপ করে।
    • যদি s>8*n, তবেb পুনরাবৃত্তি করার আগে 2 দ্বারা বাড়ানো হয়।
      • পদক্ষেপ 1 এবং 3 এ, এটি তালিকাটি বাড়ায়, দ্বিতীয় ধাপে, এটি এটি সঙ্কুচিত করে।
    • যদি s<8*n, তবে পুনরাবৃত্তি অদলবদল aএবং b, এবং উপেক্ষা করে পদক্ষেপ পরিবর্তন করেn এবং 1 টি ফলাফলের সাথে যুক্ত হয়।
    • তাহলে s==8*n, তারপর দুই তালিকা comprehensions তন্ন তন্ন কোনো উপাদান দেয় তাই সমষ্টি 0
  • (1#1) nশুরু করার আগে একটি ডামি "পর্যায় 2" উপস্থাপন করে যা তাত্ক্ষণিকভাবে ধাপ 1 এ পরিবর্তিত হয়ে তালিকাটি তৈরি করে [1..0]=[]

4

পিএইচপি> = 7.0, 74 বাইট

while($i=$r<=>$argn)for($s++;($r<=>$argn)==$i;)$r+=$i+1?-++$y:++$x;echo$s;

স্পেসশিপ অপারেটর ব্যবহার করুন

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

সম্প্রসারিত

while($i=$r<=>$argn) # if input is not equal sum of array
  for($s++;  # raise count steps
  ($r<=>$argn)==$i;)
  # so long as value compare to input has not change to lower/higher to higher/lower or equal  
    $r+=$i+1
      ?-++$y # if $i was higher remove the first integer
      :++$x;} # if $i was lower add the next highest integer     
echo$s; # Output steps

কি $argn?
chx

@chx একটি পরিবর্তনশীল যা আপনি যখন -R বিকল্পের সাথে কমান্ড লাইন থেকে পিএইচপি করুন তখন পাওয়া যায় php.net/manual/en/features.commandline.options.php
জার্গ হালসারম্যান

কি দারুন. আমি কখনও -Rখুব কম argvবা এর কথা শুনিনি argi। আমি অবশ্যই আরগসি এবং আরজিভি সম্পর্কে জানতাম। খুব আকর্ষণীয়, ধন্যবাদ।
chx

4

সি, 94 91 বাইট

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

c;s;m;M;f(n){while(s-n){while(s<n)s+=++M;c++;if(s==n)break;while(s>n)s-=++m;c++;}return c;}


সি-এ ওয়াইএসসি, নির্বিঘ্নিত বিশ্বব্যাপী ঘোষিত পূর্ণসংখ্যাগুলি সংকলনের সময় শূন্যে সেট করা আছে। আরও পড়ুন
খালেদ.কে

এই সম্পর্কে ভুলে গেছি। এই অনুস্মারক জন্য আপনাকে ধন্যবাদ।
ওয়াইএসসি

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

3

জাভাস্ক্রিপ্ট (ES6), 82 বাইট

D=(o,a=0,b=1,d=1,c=0)=>a<o?D(o,a+=b,b+1,d,c+(a>=o)):a>o?D(o,a-=d,b,d+1,c+(a<=o)):c

পরীক্ষার স্নিপেট


এটি বলার জন্য দুঃখিত, তবে প্রতিটি 3 বাইট হিসাবে গণনা করা হয়। আমি অনুমান করি যেহেতু এটি তুচ্ছভাবে পুনরায় নামকরণযোগ্য matter
আরজান জোহানসেন

@ আরজান জোহেনসেন আমাকে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ। আমার কোডটি দৈর্ঘ্যের চেয়ে বাইট দ্বারা স্কোর করা সত্যিই মনে রাখা উচিত। আমি মনে করি না "তুচ্ছ পুনঃনামকরণযোগ্য [পরিবর্তনশীল]" সম্পর্কে একটি সম্প্রদায়ের sensক্য আছে তাই আমি পোস্টটি সম্পাদনা করেছি। আচ্ছা ভালো.
আর কাপ,

3
স্নিপেট 6553-তে "খুব বেশি পুনরাবৃত্তি" দিয়ে ব্যর্থ।
eush77

3

ডিসি , 61 বাইট

dsN[ddd9k4*d2*1+dv-0k2/-d1+*2/-d[q]s.0=.-lN-0lN-sNlFx]dsFxz2-

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

ব্যাখ্যা

প্রধান পুনরাবৃত্তি ম্যাক্রো:

ddd9k4*d2*1+dv-0k2/-d1+*2/-d[q]s.0=.-lN-0lN-sNlFx
   9k4*d2*1+dv-0k2/-                              # Compute triangular root
                    d1+*2/                        # Compute triangular number
  d                       -d[q]s.0=.              # Check if sum is exact
 d                                  -lN-          # Compute S-N or S+N
                                        0lN-sN    # Update N := -N
d                                             lFx # Leave the trail and recurse

এই ম্যাক্রো:

  1. স্ট্যাকের বর্তমান সংখ্যাকে ছাড়িয়ে যাওয়া ন্যূনতম ত্রিভুজাকার সংখ্যা সন্ধান করে (পরিবর্তিত ত্রিভুজাকার মূল সূত্র ব্যবহার করে )।
  2. ত্রিভুজাকার যোগটি Sবর্তমান সংখ্যাটিকে হুবহু উপস্থাপন করে কিনা তা পরীক্ষা করে । এটি যদি প্রস্থান করে।
  3. হয় S+N(অতিরিক্ত-আনুমানিক) বা S-N(অধীনে-আনুমানিক) দিয়ে 1 ধাপে এগিয়ে যায় , পছন্দটি পুনরাবৃত্তির মধ্যে বিকল্প হয়।

এটি প্রস্থান করার পরে, স্ট্যাকের বাম ট্রেইলটি মূল প্রোগ্রামটিকে বলে যে এটি কতবার পুনরাবৃত্তি করেছে।


3

পাইথন 3, 150 138 বাইট

n=int(input())
S=sum
l=[1]
i=s=1
while S(l)<n:i+=1;l+=[i]
while S(l)!=n:
 while S(l)>n:l.pop(0)
 s+=1
 if S(l)<n:i+=1;l+=[i];s+=1
print(s)

পরিবর্তণের:

  • + = এ পরিশিষ্ট পরিবর্তন করা হয়েছে, অন্যটি সরানো হয়েছে (ধন্যবাদ সংগীতানুষ্ঠান 523, লুভজো; -১২ বাইট)

1
পদক্ষেপ # 2 তালিকা থেকে একবারে এক বা একাধিক পদ সরিয়ে ফেলতে পারে (এন = 11 এর উদাহরণে 1, 2 এবং 3 এর মতো) তবে এটি উভয় পদক্ষেপ হিসাবে গণ্য হয়।
আর্নল্ড

@ আরনাউল্ড এটিকে উপেক্ষা করেছেন; স্থির করেছি।
L3viathan

1
কেন আপনি elseপ্রয়োজনীয় তা ব্যাখ্যা করতে পারেন ? আমি elseপ্রতিবার রানগুলি বিশ্বাস করি , কারণ লুপটি সর্বদা স্বাভাবিকভাবে (বিনা break) বন্ধ হয়ে যায় , এবং এটি ছাড়া এটি ঠিকঠাক কাজ করে বলে মনে হয়
musicman523

আপনি A=l.appendঅংশটি এড়িয়ে যেতে পারেন এবং l+=[x]পরিবর্তে ব্যবহার করতে পারেন ।
লুভজো

3

ব্যাচ, 126 বাইট

@echo off
set/an=s=l=u=0
:l
if %s% lss %1 set/as+=u+=1,n+=!!l&goto l
if %s% gtr %1 set/as-=l+=1&goto l
cmd/cset/an+n+2-!l

ব্যাখ্যা: lদ্বিতীয় পদক্ষেপটি কখনও কার্যকর না হলে শূন্য। এটি n৩ য় ধাপের পুনরাবৃত্তির সংখ্যা ট্র্যাক করতে দেয় যেহেতু অ্যালগরিদম কখনই ৩ য় ধাপে থামে না, সুতরাং অবশ্যই এটি ধাপ 1 একবার এবং n+1মোট n+n+2পদক্ষেপের জন্য 2 বার পদক্ষেপ নেওয়া উচিত। তবে যদি প্যারামিটারটি ত্রিভুজাকার সংখ্যা হয় তবে দ্বিতীয় পদক্ষেপটি কখনই কার্যকর হয় না তাই আমাদের একটি পদক্ষেপ বিয়োগ করা দরকার।


3

পাইথন 2, 86 81 বাইট

n=input()
l=u=i=s=0
while n:k=n>0;i+=k^s;s=k;l+=k;n-=l*k;u+=k^1;n+=u*-~-k
print i

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

নির্ণয় করে 65536 পরীক্ষার ক্ষেত্রে 0.183sTio উপর।


84 বাইটে এই পুনরাবৃত্ত সংস্করণ 65536 অবধি সমস্ত মান গণনা করতে সক্ষম নয়:

def f(n,l=[0],m=1):k=n>sum(l);return n==sum(l)or f(n,[l[1:],l+[l[-1]+1]][k],k)+(m^k)

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


2

গণিত, 92 বাইট

(For[q=a=b=0;t={},t~AppendTo~q;q!=#,If[q<#,q+=++b,q-=++a]];Length@Split@Sign@Differences@t)&

খাঁটি ফাংশন একটি পূর্ণসংখ্যার যুক্তি গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়।

ভেরিয়েবল aএবং bজন্য দাঁড়ানো (ক্রমাগত পরিবর্তন) শুরু এবং বিবেচনা অধীনে সমষ্টি শেষ সংখ্যা, যখন qচলমান মোট (সংখ্যার থেকে ব্রিদিং a+1থেকে b); এখনও পর্যন্ত সম্মুখীন tহওয়া সমস্ত মান ট্র্যাক করে q। এই ভেরিয়েবলগুলির সূচনা করার পরে, Forলুপটি কার্যকর করতে থাকে If[q<#,q+=++b,q-=++a], যা হয় শেষে একটি নতুন সংখ্যা যুক্ত করে বা স্পেক অনুসারে সামনের নম্বরটি বিয়োগ করে, যতক্ষণ নাq সমতুল্য না ।

এখন আমাদের কেবলমাত্র পদক্ষেপের সংখ্যাটি বের করতে হবে t, পথে qমূল্যগুলির তালিকা । উদাহরণস্বরূপ, যখন ইনপুট হয় 11, Forলুপ tসমান হয়ে প্রস্থান করে {0,1,3,6,10,15,14,12,9,15,11}। এর থেকে পদক্ষেপের সংখ্যা গণনা করার জন্য আমি সবচেয়ে ভাল উপায়টি খুঁজে পেয়েছি যে পার্থক্যটি নীচে যেতে কতবার পরিবর্তিত হয়; ভার্বোজ কমান্ড এটিই Length@Split@Sign@Differences@tকরে, তবে আমি সন্দেহ করি যে এটি উন্নত করা যেতে পারে।


2

সি (টিসিসি), 71 বাইট (61 + 10)

কমান্ড-লাইন আর্গুমেন্ট (একটি স্থান সহ):

-Dw=while

সূত্র:

c,m,M,s;f(n){w(++c,s-n){w(c&s<n)s+=++M;w(~c&s>n)s-=m++;}--c;}

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

cপদক্ষেপের সংখ্যা গণনা করে। mএবং Mসর্বনিম্ন এবং সীমা সর্বাধিক সঞ্চিত,s যোগফল সঞ্চয় করে। প্রাথমিকভাবে, তারা সব শূন্য।

ক্রমাগত, cবৃদ্ধি করা হয়, এবং sতুলনা করা হয় n। যতক্ষণ না তারা অসম:

  • যদি cবিজোড় হয়, তাহলে যতদিন s<nবৃদ্ধি: একটি পূর্ণসংখ্যা সারির শেষ জুড়তে Mএক, এবং দ্বারা sদ্বারা M

  • তাহলে cযতদিন এমনকি তারপর s>n, পরিসর শুরু থেকে একটি পূর্ণসংখ্যা সরান: হ্রাস sদ্বারা m, এবং বৃদ্ধি mএকের পর।

যখন লুপটি প্রস্থান করে, c অনেকবার বাড়ানো হয়। এটি হ্রাস করার ফলে সঠিক ফলাফল পাওয়া যায়, এবং এটি রিটার্নের মান হিসাবে কাজ করার জন্য সঠিক রেজিস্টারে গণনা করা হয়।

মজাদারভাবে খালেদ.কে এর সি উত্তর হিসাবে ঠিক একই পরিবর্তনশীল নাম ব্যবহার করতে দেখা যায় । তারা অনুলিপি করা হয় না।


1

পার্ল 6 , 114 বাইট

{((0,0,1),->(\a,\b,\c){b,(a..*).first(->\d{(d,b).minmax.sum*c>=$_*c}),-c}...->(\a,\b,\c){(a,b).minmax.sum==$_})-1}

(পূর্বের হাস্কেল প্রয়োগ দ্বারা অনুপ্রাণিত )

চেষ্টা করে দেখুন
এটি আমার কম্পিউটারে 45 সেকেন্ডের নীচে 5৫৫3636 ইনপুট দিয়ে চলে তবে আমি এটি টিআইওআরুন দিয়ে 60০ সেকেন্ডের মধ্যেও চালাতে পারিনি।
আমার কাছে রাকুডো ভি2017.04 + রয়েছে, যেখানে এটিতে v2017.01 রয়েছে
রাকুডো / এনকিউপি / মোআরভিএম প্রায় প্রতিদিনই অপ্টিমাইজেশন পায়, তাই অন্তর্বর্তীকালীন সময়ে এগুলির মধ্যে যে কোনও সংখ্যক এটি থাকতে পারে যা সময়সীমার মধ্যে এটি প্রয়োজন।


সম্প্রসারিত

{
  (

    # generate a sequence

    (0,0,1),           # initial value 

    -> (\a,\b,\c) {
      b,               # swap the first two values

      (a..*)
      .first(          # find the first number that brings us to or past the input

        -> \d {
          (d,b).minmax # get a Range object regardless of which is larger
          .sum * c     # sum it, and negate it every other time

          >=           # is it equal to or greater than

          $_ * c       # negate the original input every other time
        }

      ),

      -c               # invert for next round
    }

    ...                # keep doing that until

    -> (\a,\b,\c) {
     (a,b).minmax.sum == $_ # it finally reaches the input
    }

  ) - 1 # count the number of elements in the sequence
        # and subtract one for the initializer
}

নোট করুন যে রাকুডোর জন্য একটি অপ্টিমাইজেশন রয়েছে Range.sum যাতে এটি সমস্ত মানগুলির মধ্যে পুনরাবৃত্তি করতে না পারে।

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