আর, 83 76 67 বাইট
কেবল বুঝতে পেরেছি যে পরীক্ষার্থীর ইউরিনালগুলি খালি আছে কিনা তা যাচাই করে বিরক্ত না করে আমি কয়েকটি বাইট সংরক্ষণ করতে পারি। খালি খালি ইউরিনালগুলি সর্বদা একটি Infঅস্বস্তির মান ফেরত দেবে , তাই তারা গণনার সময় বাদ পড়ে। এছাড়াও, কেবল ডাইরেক্ট ইনডেক্সিং এর পরিবর্তে ব্যবহার করা হয় replace, সুতরাং এটি খাটো তবে কম মার্জিত।
x=scan()
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
x
ব্যাখ্যা
x=scan()
আমরা স্টিডিন থেকে বর্তমান অবস্থা পড়ি এবং কল করি x । আমরা ধরে নিই যে ইনপুটটি স্পেস এবং নিউলাইন দ্বারা আলাদা হওয়া 1গুলি এবং 0এর একটি ক্রম । ব্যাখ্যার উদ্দেশ্যে, আসুন আমরা ইনপুট বলি 1 0 0 0 0 0 1।
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
আমরা xএকটি নির্দিষ্ট সূচকের মান 1 এর সাথে প্রতিস্থাপন করি the এর মধ্যে সমস্ত [ ]কিছুই সেরা সূচকটি কী তা নির্ধারণ করে।
যেহেতু বিদ্যমান ইউরিনালগুলি পরিবর্তনযোগ্য নয় তাই আমাদের মধ্যে তাদের মধ্যকার দূরত্বগুলি বিবেচনা করার দরকার নেই। আমাদের কেবল অধিকৃত ইউরিনাল এবং সম্ভাব্য নতুনের মধ্যে দূরত্ব বিবেচনা করা দরকার। সুতরাং আমরা দখলযুক্ত মূত্রের সূচকগুলি নির্ধারণ করি। whichলজিকাল ভেক্টরের সূচকগুলি ফিরিয়ে আনতে আমরা একটি ফাংশন ব্যবহার করি TRUE। আর-তে সমস্ত সংখ্যা, যখন টাইপ করতে বাধ্য হয় logical, তা TRUEযদি ননজারো হয় এবং FALSEশূন্য হয়। কেবলমাত্র করছেন which(x)এক ধরনের ত্রুটি স্থাপিত হবে, argument to 'which' is not logical, যেমন xএকটি সাংখ্যিক বাহক। সুতরাং আমরা এটি যৌক্তিক জোর করতে হবে। !আর এর লজিকাল নেগ্রেশন ফাংশন, যা স্বয়ংক্রিয়ভাবে যৌক্তিকতায় প্রচ্ছন্ন হয়। এটি দুটিবার প্রয়োগ করা, এবং এর !!xএকটি ভেক্টর দেয়TRUEFALSEকোন ইউরিনাল দখল করা হয়েছে তা নির্দেশ করে। (লজিক্যাল বিকল্প বাইট সমতুল্য coercions লজিক্যাল অপারেটর জড়িত &এবং |এবং builtins Tএবং Fযেমন F|xবা T&xএবং তাই। !!xকেমন লাগে আরো বিস্ময়সূচক তাই আমরা যে ব্যবহার করব।)
which(!!x)
এটি যুক্ত করা হয়েছে seq(x), যা পূর্ণসংখ্যার ক্রমটি 1দৈর্ঘ্য থেকে xঅর্থাৎ সমস্ত প্রস্রাবের অবস্থানগুলিতে (এবং এইভাবে বিবেচনার জন্য সমস্ত সম্ভাব্য অবস্থানগুলি) প্রদান করে।
seq(x)
এখন আমাদের অর্জিত ইউরিনালগুলির সূচকগুলি: 1 7এবং আমাদের খালি ইউরিনালগুলি রয়েছে 1 2 3 4 5 6 7। "বাহ্যিক বিয়োগ" পেতে `-`ফাংশনটিতে বিয়োগ বিয়োগের কাজটি আমরা পাস করি outerযা সমস্ত ইউরিনাল এবং অধিষ্ঠিত ইউরিনালের মধ্যে দূরত্বের নিম্নলিখিত ম্যাট্রিক্স:
[, 1] [, 2]
[1,] 0 -6
[2,] 1 -5
[3,] 2 -4
[4,] 3 -3
[5,] 4 -2
[6,] 5 -1
[7,] 6 0
outer(seq(x),which(!!x),`-`)
আমরা এটিকে উত্সাহিত করি -2। (যারা কিছুটা হারিয়ে গেছেন, ওপি-তে "অস্বস্তি" হিসাবে সংজ্ঞায়িত করা হয়েছে 1 / (distance(x, y) * distance(x, y)), যা এটিকে সহজতর করে 1/d(x,y)^2, অর্থাৎ d(x,y)^-2।)
outer(seq(x),which(!!x),`-`)^-2
ম্যাট্রিক্সে প্রতিটি সারির যোগফল নিন।
rowSums(outer(seq(x),which(!!x),`-`)^-2)
ক্ষুদ্রতম মান সূচকটি পান, সর্বোত্তম ইউরিনাল। একাধিক ক্ষুদ্রতম মানগুলির ক্ষেত্রে, প্রথমটি (অর্থাত্ বামতম) একটি প্রদান করা হয়।
which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))
এবং যাইহোক, আমাদের অনুকূল মূত্রের সূচক রয়েছে। আমরা এই সূচিতে মানকে প্রতিস্থাপন xসঙ্গে 1। ক্ষেত্রে 1111যেমন ইনপুট, এটা কোন ব্যাপার না যা এক আমরা প্রতিস্থাপন, আমরা এখনও একটি বৈধ আউটপুট আছে।
x[which.min(rowSums(outer(seq(x),which(!!x),`-`)^-2))]=1
পরিবর্তিত ইনপুট ফিরিয়ে দিন।
x