গণিত, 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 টি ধাপে এবং যখন পৌঁছায় আমরা থামিকে ।
এটি কার্যকর হয় তা প্রমাণ করার জন্য আমাদের চারটি জিনিস দেখাতে হবে:
- f (n) = 1 ত্রিভুজাকার সংখ্যার জন্য। এটি তুচ্ছভাবে ক্ষেত্রে, কারণ প্রথম পদক্ষেপটি সমস্ত ত্রিভুজাকার সংখ্যার মাধ্যমে কেবল পুনরাবৃত্তি করে। আমরা যদি আঘাত এন এই প্রক্রিয়ার সময় ঠিক আমরা কাজ সম্পন্ন হয় এবং শুধুমাত্র এক ধাপ গনা ছিল না।
- অন্যান্য সমস্ত সংখ্যার জন্য, আমরা সর্বদা একটি মোছার পদক্ষেপের পরে শেষ করি, কখনই কোনও সন্নিবেশ পদক্ষেপের পরে নয়। তার মানে অন্য সমস্ত চ (এন) সমান।
- প্রথমটির পরে প্রতিটি সন্নিবেশ পদক্ষেপে, আমরা কেবল একটি একক সংখ্যা যুক্ত করি। এটি গ্যারান্টি দেয় যে আমরা কেজ জোড় পদক্ষেপের পরে কে সহ পচিয়ে যাব ।
- 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 গণনাও করতে পারি, তবে এটি আসলে কোনও অতিরিক্ত অন্তর্দৃষ্টি প্রদর্শন করে না):
খুব সরল রেখাগুলির বিভিন্নতার মধ্যে নজর রাখা আকর্ষণীয় হতে পারে তবে আমি এটি অন্য কারও কাছে ছেড়ে দিচ্ছি ...