পূর্ণসংখ্যা থেকে বিটের একটি পরিবর্তনশীল সংখ্যায় বাইজিক ম্যাপিং


11

বিটগুলির একটি পরিবর্তনশীল সংখ্যাটি 0 বা আরও বিটের একটি অ্যারে হয়। তাই [0, 1]বিট একটি পরিবর্তনশীল সংখ্যা, কিন্তু তাই হয় []

একটি ক্রিয়াকলাপ বা প্রোগ্রাম লিখুন যা একটি nonnegative পূর্ণসংখ্যা প্রদান করে বিটগুলির একটি পরিবর্তনশীল সংখ্যার প্রতিদান দেয় যাতে প্রতিটি পূর্ণসংখ্যার একটি অ্যারে দিয়ে এক থেকে এক (বাইজিক) ম্যাপিং থাকে।

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

ওয়ান-টু ওয়ান ম্যাপিং কী নয় এর উদাহরণ হিসাবে কেবল পূর্ণসংখ্যার বাইনারি অঙ্কগুলি তালিকাভুক্ত করা হচ্ছে। এই জাতীয় সিস্টেমে 5 টি [1, 0, 1](বা 0b101) হয়ে যায় , তবে এটি এক-এক-এক নয়, কারণ 0b0101বা এর [0, 1, 0, 1]অর্থ 5ও।

এটি মোটামুটি সুস্পষ্ট হওয়া উচিত যে কোনও মানচিত্রটি যদি পূর্ণসংখ্যা এড়িয়ে যায় তবে এটি এক-এক-এক নয় (উদাহরণস্বরূপ এটি 5 এর জন্য কাজ করে না) তবে আমি এটি স্পষ্ট করে বলতে চাই যে ভেরিয়েবল বিট অ্যারে বাদ দেওয়াও এক নয় is -একজনের প্রতি. আপনাকে অবশ্যই প্রতিটি সম্ভাব্য চলক বিট অ্যারে মানচিত্র করতে হবে []


বাইটস মধ্যে সংক্ষিপ্ত কোড।


আমরা কি 0 এবং 1 এর স্ট্রিং ফিরিয়ে দিতে পারি?
xnor

@ xnor হ্যাঁ, 0 এবং 1 এর স্ট্রিং ঠিক আছে।
orlp

উত্তর:



10

পাইথন, 20 বাইট

lambda n:bin(~n)[4:]

টেস্ট:

>> [bin(~n)[4:] for n in range(16)]
['', '0', '1', '00', '01', '10', '11', '000', '001', '010', '011', '100', '101', '110', '111', '0000']

এরকম lambda n:bin(n+1)[3:]বাড়তি ইনপুট, তারপর প্রথম প্রতীক সরিয়ে বাইনারি উপস্থাপনা লাগে ( [3:]কারণ উপসর্গ 0bদুই অক্ষর অক্ষর যায়)। যেহেতু যে কোনও ধনাত্মক সংখ্যাটি বাইনারিতে 1 দিয়ে শুরু হয়, এটি অনন্যভাবে একটি বাইনারি প্রতিনিধিত্ব করে।

একটি বাইট পরিবর্তে বিট সম্পূরক ব্যবহার করে সংরক্ষিত হয় ~nঅস্বীকৃতি পেতে -(n+1)আরো এক প্রতীক বন্ধ চপ দ্বারা, এবং নেতিবাচক চিহ্ন মুছে ফেলার।


1
ইনভার্স: lambda s:int('1'+s,2)-1
orlp

2

পাইথ, 5 বাইট

t.BhQ

Xyor এর উত্তরকে পাইথের মধ্যে কেবল অনুবাদ ।

Qeval () এর d ইনপুট (), hএটি বৃদ্ধি করে, .Bএটি একটি বাইনারি স্ট্রিংয়ে রূপান্তরিত করে এবং t"লেজ" (যা প্রথম অক্ষর ব্যতীত সবকিছু) গ্রহণ করে।


2

হাস্কেল, 41 38 30 29 বাইট

l="":[b:x|x<-l,b<-"01"]
(l!!)

ব্যবহারের উদাহরণ: (l!!) 4-> "10"

প্রথম উপাদান হিসাবে খালি তালিকা দিয়ে শুরু করে, তালিকার মধ্য দিয়ে অলসভাবে হাঁটুন 0এবং এর সাথে 1এবং সামনে বর্তমান উপাদান যুক্ত করুন ।

সম্পাদনা করুন: @ xnor 3 11 বাইট সংরক্ষণ করেছে । ধন্যবাদ!


আকর্ষণীয় ধারণা। পুনরাবৃত্তি ফাংশনটি লেখা যেতে পারে[(0:),(1:)]<*>
xnor

@ এক্সনর: ওহ, আপনি আমাকে <*>আগে কৌশলটি দেখিয়েছিলেন , তবে আমি এটি ভুলে গিয়েছিলাম forgot আবার ধন্যবাদ!
নিমি

কীসব আপনি পুরো তালিকা প্রখর রৌদ্রে সংজ্ঞায়িত করতে পারেন: l=[]:[b:x|x<-l,b<-[0,1]];(l!!)
xnor

@ এক্সনর: দুর্দান্ত! অনেক ধন্যবাদ! ওহ, স্ট্রিংগুলিতে স্যুইচ করা আরও একটি বাইট সংরক্ষণ করে।
নিমি

আমি মনে করি [b:x|x<-l,b<-"01"]কোনও পণ্য বা কনক্যাট-মানচিত্রের সাথে প্রকাশ করার জন্য আরও কিছু ছোট উপায় থাকা উচিত তবে পণ্য (:)<$>[0,1]<*>lপ্রকাশটি ভুল ক্রমে চলে যায়, প্রথমে 0 টির আগে প্রিপেন্ডিং, কখনই 1 এ আসে না কারণ তালিকা অসীম। তোমার কোন ধারনা আছে?
xnor

1

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

x=>(~x).toString(2).slice(2)

Xnor হিসাবে একই ধারণা।

f=x=>(~x).toString(2).slice(2);
[...Array(100)].map((v,x)=>A.textContent+=x + ': ' + f(x) + '\n')
<pre id=A></pre>




1

হাস্কেল, 35 বাইট

h 1=[]
h n=mod n 2:h(div n 2)
h.(+1)

হাস্কেলের কোনও বাইনারি অন্তর্নির্মিত নেই, সুতরাং (বিপরীত) রূপান্তরটি ম্যানুয়ালি করা হয়। প্রাথমিক 1 টি অপসারণ করতে, বেস কেসটিতে রয়েছে1 কেসটি খালি তালিকায় রূপান্তরিত করে।

সম্পাদনা করুন: +1পরিবর্তে সংযুক্ত করে একটি বাইট সংরক্ষণ করা হয়েছে।

h 0=[]
h m=1-mod m 2:h(div(m+1)2-1)

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