Yeni bir ezoterik programlama dili tasarlıyorsunuz ve eklemeye karar verdiğiniz bir özellik dinamik bir bellek ayırıcıdır. Diliniz, kullanıcının program alanı için özel olarak ayrılmış bir sanal adres alanı belirtir. Bu, herhangi bir dahili durum için bellek ayırıcı tarafından kullanılan adres alanından ayrıdır.
Uygulamanızı dağıtmanın maliyetini azaltmaya yardımcı olmak için kodun boyutu mümkün olduğunca küçük olmalıdır.
Arayüz
Üç işlev sağlamalısınız: başlatma, tahsis etme ve dağıtma.
Başlatma
Bu işlev tek bir pozitif tamsayı parametresi alır N. Bu, bir kullanıcının programının Nadres alanında, N-1bellek ayıracak baytların bulunduğu baytlar olduğu anlamına gelir . Adres 0"null" olarak ayrılmıştır.
Herhangi bir tahsis / ayrılma çağrısından önce bu işlevin tam olarak bir kez çağrılması garanti edilir.
Bu işlevin, kullanıcı programının sanal adres alanı için herhangi bir fiziksel bellek ayırmasına gerek olmadığını unutmayın; temel olarak içi boş bir bellek ayırıcısının "görünümünü ve hissini" yaratıyorsunuz.
ayırmak
Ayırma işlevi, ayrılacak bellek bayt sayısının bir isteğini almalıdır. Girişin pozitif olduğu garanti edilir.
İşlevinizin, ayrılmış bloğun başına bir tamsayı adresi döndürmesi veya 0istenen boyutta bitişik bir blok olmadığını belirtmesi gerekir. Adres alanının herhangi bir yerinde kullanılabilir boyutta bitişik bir blok varsa, ayırmanız gerekir!
Ayrılan iki bloğun çakışmamasını sağlamalısınız.
ayırması
Deallocate işlevi tahsis edilmiş bir bloğun başlangıcının adresini almalı ve isteğe bağlı olarak verilen bloğun boyutunu da alabilir.
Ayrılan bellek yeniden tahsis için kullanılabilir. Girilen adresin geçerli bir adres olduğu varsayılmaktadır.
Örnek Python uygulaması
Dahili durumu izlemek için herhangi bir yöntem seçebileceğinizi unutmayın; bu örnekte class örneği bunu izler.
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]
puanlama
Bu kod golf; bayt cinsinden en kısa kod kazanır. Ayırma cihazınızın gerektirdiği herhangi bir dahili durum için belleğin bitmesi konusunda endişelenmenize gerek yoktur.
Standart halka delikleri uygulanır.
Liderler Sıralaması
var QUESTION_ID=67895,OVERRIDE_USER=31729;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>