মেমরি বরাদ্দকারী


11

আপনি একটি নতুন রহস্যময় প্রোগ্রামিং ভাষা ডিজাইন করছেন এবং একটি বৈশিষ্ট্য যা আপনি যুক্ত করার সিদ্ধান্ত নিয়েছেন তা হ'ল গতিশীল মেমরির বরাদ্দকারী। আপনার ভাষা ব্যবহারকারীর প্রোগ্রাম স্পেসের জন্য একটি বিশেষ উত্সর্গীকৃত ভার্চুয়াল ঠিকানা স্থান নির্দিষ্ট করে। এটি কোনও অভ্যন্তরীণ অবস্থার জন্য মেমরি বরাদ্দকারী দ্বারা ব্যবহৃত ঠিকানা স্থান থেকে পৃথক।

আপনার বাস্তবায়ন বিতরণ ব্যয় কমাতে সহায়তা করতে কোডের আকারটি যতটা সম্ভব ছোট হতে হবে।

ইন্টারফেস

আপনাকে অবশ্যই তিনটি ফাংশন সরবরাহ করতে হবে: সূচনা, বরাদ্দ এবং ডিএলোকট।

আরম্ভ

এই ফাংশনটি একটি একক ধনাত্মক পূর্ণসংখ্যা পরামিতি নেয় N। এর অর্থ একটি ব্যবহারকারীর প্রোগ্রামের Nঠিকানা স্থানে N-1বাইট রয়েছে যা থেকে মেমরি বরাদ্দ করার জন্য বাইট রয়েছে। ঠিকানাটি 0"নাল" জন্য সংরক্ষিত।

এটি গ্যারান্টিযুক্ত যে কোনও বরাদ্দ / ডিলোকেট কল করার আগে এই ফাংশনটি ঠিক একবার ডাকা হবে।

নোট করুন যে এই ফাংশনটি ব্যবহারকারীর প্রোগ্রামের ভার্চুয়াল ঠিকানা জায়গার জন্য কোনও শারীরিক মেমরি বরাদ্দ করার দরকার নেই; আপনি মূলত একটি ফাঁকা মেমরি বরাদ্দকারীর "চেহারা এবং অনুভব" তৈরি করছেন।

বরাদ্দ

বরাদ্দকরণের জন্য বরাদ্দ করতে মেমরির বাইটের সংখ্যার একটি অনুরোধ নিতে হবে take ইনপুটটি ইতিবাচক হওয়ার গ্যারান্টিযুক্ত।

আপনার ক্রিয়াকলাপটি অবশ্যই বরাদ্দকৃত ব্লকটি শুরু করার জন্য একটি পূর্ণসংখ্যার ঠিকানা ফেরত পাঠাতে হবে বা 0অনুরোধ করা আকারের কোনও সামঞ্জস্যপূর্ণ ব্লক নেই den যদি উপলব্ধ আকারের একটি সামঞ্জস্যপূর্ণ ব্লক ঠিকানা জায়গার যে কোনও জায়গায় পাওয়া যায় তবে আপনাকে অবশ্যই বরাদ্দ করতে হবে!

আপনাকে অবশ্যই নিশ্চিত করতে হবে যে কোনও দুটি বরাদ্দকৃত ব্লক ওভারল্যাপের নয়।

ডি-এলোকেট

ডিএলোকট ফাংশন অবশ্যই বরাদ্দকৃত ব্লকটি শুরু করার ঠিকানা নিতে হবে এবং optionচ্ছিকভাবে প্রদত্ত ব্লকের আকার নিতে পারে।

বরাদ্দ দেওয়ার জন্য মেমোরিটি পুনর্বিবেচিত হয়েছে। ধারণা করা হয় যে ইনপুট ঠিকানাটি একটি বৈধ ঠিকানা।

পাইথন বাস্তবায়ন উদাহরণ

নোট করুন যে আপনি অভ্যন্তরীণ অবস্থার উপর নজর রাখতে কোনও পদ্ধতি বেছে নিতে পারেন; এই উদাহরণে শ্রেণীর উদাহরণ এটি ট্র্যাক করে রাখে।

class myallocator:
    def __init__(self, N):
        # address 0 is special, it's always reserved for null
        # address N is technically outside the address space, so use that as a
        # marker
        self.addrs = [0, N]
        self.sizes = [1, 0]

    def allocate(self, size):
        for i,a1,s1,a2 in zip(range(len(self.addrs)),
                                 self.addrs[:-1], self.sizes[:-1],
                                 self.addrs[1:]):
            if(a2 - (a1+s1) >= size):
                # enough available space, take it
                self.addrs.insert(i+1, a1+s1)
                self.sizes.insert(i+1, size)
                return a1+s1
        # no contiguous spaces large enough to take our block
        return 0

    def deallocate(self, addr, size=0):
        # your implementation has the option of taking in a size parameter
        # in this implementation it's not used
        i = self.addrs.index(addr)
        del self.addrs[i]
        del self.sizes[i]

স্কোরিং

এটি কোড গল্ফ; বাইটস মধ্যে সংক্ষিপ্ত কোড। আপনার বরাদ্দকারী দ্বারা প্রয়োজনীয় কোনও অভ্যন্তরীণ অবস্থার জন্য মেমরি ফুরিয়ে যাওয়ার বিষয়ে আপনার চিন্তা করার দরকার নেই।

স্ট্যান্ডার্ড লুপ গর্ত প্রয়োগ।

লিডারবোর্ড


3
আমি সন্দেহ করি পাইথন তালিকাগুলি প্রতি উপাদান হিসাবে ঠিক একটি বাইট নেয়। "বরাদ্দ মেমরি" কি বাইটে থাকতে হবে, বা এটি কেবল "আপনার ভাষার জেনেরিক অ্যারে / তালিকার ধরণ" হতে পারে?
ডুরকনব

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

To help reduce the cost of distributing your implementation the size of the code must be as small as possibleঅথবা এটি কীভাবে সম্ভব দক্ষ (ছোট এবং দক্ষ এক নয়) সম্ভব? : ডি
কোডার


যদিও এই চ্যালেঞ্জটি ভাষা নকশার পটভূমিতে উত্সাহিত হয়েছে, কোনও ভাষা ডিজাইন করা আসলে কাজের অংশ নয় (বরং একটির অংশ প্রয়োগ করে), তাই আমি ট্যাগটি সরিয়েছি।
মার্টিন এন্ডার

উত্তর:


4

রুবি, 80

i,a,d=->n{$m=?o*n},->n{$m.sub!(/\B#{?o*n}/,?f*n);"#$`".size},->n,s{$m[n,s]=?o*s}

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

?o*n এন "ও" এর একটি স্ট্রিং সূচনা করে।

/\B#{?o*n}/একটি নিয়মিত অভিব্যক্তি যা টানা "ও" এর সাথে মিলবে যা প্রথম অক্ষরকে অন্তর্ভুক্ত করে না। sub!প্রথম ম্যাচটি এন "এফ" এর সাথে প্রতিস্থাপন করে।

"#$`" ম্যাচের বাম দিকে স্ট্রিং দেয় বা কোনও মিল না থাকলে খালি স্ট্রিং দেয়, সুতরাং আকারটি বরাদ্দ সূচক বা 0 হয়।

ডিলোকট কেবল স্ট্রিংয়ের মনোনীত বিভাগটি "ও" এস-তে সেট করে।


4

জাভাস্ক্রিপ্ট (ES6), 88

ট্র্যাক রাখতে বিশ্বব্যাপী ভেরিয়েবল _( খুব স্পার্স অ্যারে) ব্যবহার করা।

এখন আমি কীভাবে এটি পরীক্ষা করতে পারি?

I=n=>(_=[1],_[n]=0)
A=n=>_.some((x,i)=>i-p<n?(p=i+x,0):_[p]=n,p=1)?p:0
D=p=>delete _[p]

3

রুবি, 135

প্রতিটি কক্ষ বরাদ্দ করা হয়েছে কিনা তা একটি বিশ্বব্যাপী অ্যারে রাখে।

i=->n{$a=[!0]*n;$a[0]=0}
a=->n{s=$a.each_cons(n).to_a.index{|a|a.none?};n.times{|i|$a[s+i]=0}if s;s||0}
d=->s,n{n.times{|i|$a[s+i]=!0}}

1

গণিত, 152

i=(n=#;l={{0,1},{#,#}};)&
a=If[#=={},0,l=l~Join~#;#[[1,1]]]&@Cases[l,{Except@n,e_}:>{e,e+#}/;Count[l,{a_,_}/;e<=a<e+#]<1,1,1]&
d=(l=l~DeleteCases~{#,_};)&

nমোট আকার lসঞ্চয় করুন, অভ্যন্তরীণ অবস্থা সঞ্চয় করে। বরাদ্দকারী বরাদ্দ করার চেষ্টা করবে বরাদ্দ মেমরির অন্য অংশের ঠিক পিছনে।

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