গ # বাইনারি সংখ্যায় প্রথম 1 (ডান থেকে বাম)


10

আমি সংখ্যার বাইনারি উপস্থাপনায় প্রথম 1 (ডান থেকে বাম) এর সূচকটি খুঁজতে সি # ব্যবহার করার চেষ্টা করছি। উদাহরণস্বরূপ, 100 বাইনারি হ'ল:

0b1100100

প্রথম 1 টি ডান থেকে তৃতীয় অবস্থানে রয়েছে, সুতরাং এটির ফলন 3 হওয়া উচিত।

234 এর 2, 0 টি প্রদান করা উচিত ইত্যাদি

এখানে আমার বর্তমান সমাধান:

k < 1 ? 0 :(int)Math.Log(k & -k, 2) + 1;

এই সংক্ষিপ্ত করতে পারি কোনও উপায়?


1
সুস্পষ্ট টিপটি হ'ল আপনার বহির্মুখী সাদা স্থান সরিয়ে ফেলা। আমি 10 টি স্পেস দেখতে পাচ্ছি যা আপনি সহজেই সরিয়ে ফেলতে পারেন।
জেমস 20

Convert.ToString(k,2).IndexOf("1")আপনি যা চান তা হ'ল বা অনুরূপ কিছু, ভুল সাইট।
যাদু অক্টোপাস উর্ন

14
@ নিকট-ভোটাররা - নিকটতম ভোট কেন? আমি মনে করি এটি একটি বিষয় সম্পর্কিত টিপস প্রশ্ন। বা এই ক্ষেত্রে আমি কোন নিয়ম পরিবর্তন মিস করেছি?
ডিজিটাল ট্রমা

উত্তর:


3

যদি কেবল সি # সমর্থিত মেশিন-নির্দিষ্ট অন্তর্নিহিত ... একটি একক নির্দেশ রয়েছে যা এটি x86 সমাবেশ ভাষায় এবং বেশিরভাগ অন্যান্য প্রসেসরের আর্কিটেকচারেও করতে পারে। তারপরে আপনি কেবল সংক্ষিপ্ততম কোডই নন, তবে খুব সম্ভবত দ্রুততম।

প্রকৃতপক্ষে, এই কোডটি দ্রুত তৈরি করার তুলনায় এই কোডটিকে সংক্ষিপ্ত করে তোলা একটি অত্যন্ত বিরক্তিকর সমস্যা । সত্যই ঝরঝরে, দক্ষ, বিট-টুইডলিং সমাধানগুলির সব ধরণের রয়েছে এবং আপনি কোনও সারণী ব্যবহার করে বিবেচনা করতে পারেন using

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

k<1?0:(int)Math.Log(k&-k,2)+1

আমি ব্যক্তিগতভাবে এটি লিখতে হবে:

k>0?(int)Math.Log(k&-k,2)+1:0

কারণ আমি মনে করি শর্তসাপেক্ষ পরীক্ষার দিকটি সেইভাবেই শূন্যের সাথে তুলনা করার জন্য এটি পরিষ্কারভাবে পরিষ্কার হয়েছে তবে আমি অনুমান করি এটি ছয়টি এক উপায়, অন্য অর্ধ ডজন অন্যান্য।

C # এর থেকে অন্তর্নিহিত রূপান্তর সমর্থন করে না intথেকে boolতাই আপনি সত্যিই শর্তসাপেক্ষ পরীক্ষা কোনও কমান পারে না, সি এবং সি ++ মত না।

আপনি double(আমার ফেরত হিসাবে Math.Log) থেকে স্পষ্ট কাস্টের সাথেও আটকে আছেন int, কারণ সি # এটি সুস্পষ্টভাবে ঘটতে দেয় না। অবশ্যই, এটি সাধারণত একটি ভাল জিনিস কারণ এটি নির্দেশ করে যে আপনার একটি আছে বড় কর্মক্ষমতা এখানে সমস্যা: একটি প্রচার intএকটি থেকে double, একটি লগ কম্পিউটিং double, এবং তারপর রূপান্তর doubleএকটি থেকে ফলাফলের পিছনে intহতে হবে ব্যাপক ধীর, তাই এটি সাধারণত কিছু যা আপনি এড়াতে চান কোড গল্ফ খেলে আপনি এগুলি ধরণের বিভ্রান্তি পোষণ করতে পারেন।


আমি প্রথমদিকে এসেছি

k > 0
      ? ((k & -k) >> 1) + 1
      : 0

(অবশ্যই স্পষ্টতার জন্য অবরুদ্ধ), যা লগারিদম গ্রহণ করা এড়িয়ে যায় এবং তাই কোডের আকার এবং গতির উন্নতি। দুর্ভাগ্যক্রমে, এটি সর্বদা সঠিক উত্তর পায় না এবং আমি ধরে নিই যে এটি একটি জটিল নয়। :-) বিশেষত, যদি ইনপুট মান ( k) 8 এর গুণক হয় তবে এটি ব্যর্থ হয় fix এটি স্থিরযোগ্য, তবে Math.Logসংস্করণটির চেয়ে কোডটি দীর্ঘ না করেই নয় ।


নোট করুন যে কোড গল্ফের জন্য Mathপুরোপুরি যোগ্যতা অর্জন করতে হবে তাই আপনার অন্যান্য সংস্করণটি আরও ভাল হওয়া উচিত যদিও আমি আসলে বাইটগুলি গণনা করি নি।
TheLethalCoder

আপনি বোঝাচ্ছেন যে ভুল আউটপুট উত্পাদন করে? @ এটি
কোডি গ্রে

ঠিক আছে আপনি বলেছিলেন এটির একটা ঠিক আছে তবে এটি আরও দীর্ঘায়িত করবে। ওপিএস সংস্করণটি অন্তর্ভুক্ত করার চেয়ে যদি ফিক্সটি System.সংক্ষিপ্ত হয় তবে তা ছোট এবং সঠিক হওয়া উচিত।
TheLethalCoder
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.