এলোমেলোভাবে ব্রেইনফাক সংকলক


10

জো আপনার গড় বিএফ বিকাশকারী। তিনি যখন তাঁর বসের কাছ থেকে কল পান তখন তিনি তাদের কোডগুলি তাদের ভান্ডারে পরিবর্তন করে যাচ্ছেন। "জো! নতুন ক্লায়েন্টের মেশিনটি ভেঙে গেছে! প্রোগ্রাম কার্যকর করার আগে ব্রেইনফাক ইন্টারপ্রেটার সমস্ত কক্ষকে এলোমেলো মানগুলিতে সেট করে। এটি ঠিক করার সময় নেই, আপনার কোডটি এটি মোকাবেলা করতে হবে।" জো এর খুব বেশি চিন্তা করে না, এবং প্রথম মিলিয়ন কোষ শূন্যে সেট করার জন্য একটি প্রোগ্রাম লিখতে চলেছে, যখন তার বস তাকে আবার বাধা দেয় - "... এবং নিষ্ঠুর শক্তি ব্যবহার সম্পর্কে চিন্তা করবেন না, কোডটি করতে হবে যতটা সম্ভব ছোট হতে হবে। " এখন আপনাকে দরিদ্র জোকে সহায়তা করতে হবে!

বিশেষ উল্লেখ

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

স্কোরিং

তোমার সংগ্রহ বাইটে 10 বার কম্পাইলার আকার প্লাস পরীক্ষা ক্ষেত্রে আকারের যোগফল । সর্বনিম্ন স্কোর স্পষ্টতই জয়লাভ করে test টেস্ট-কেস অপ্টিমাইজেশনের বিরুদ্ধে হ্রাস করার জন্য, আমার যদি সন্দেহ হয় তবে আশেপাশে পরীক্ষা-কেসগুলি পরিবর্তন করার অধিকার আমি সংরক্ষণ করি এবং বিজয়ী বাছাইয়ের আগে সম্ভবত এটি করব।

পরীক্ষার কেস

(এগুলি এসল্যাংস পৃষ্ঠা এবং এই ওয়েবপৃষ্ঠা থেকে পেয়েছি : http://www.hevanet.com/cristofd/brainfuck/ )। সর্বশেষ পরীক্ষার মামলার জন্য @ স্পারকেও ধন্যবাদ।

  • ওহে বিশ্ব: ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
  • বিপরীত ইনপুট: >,[>,]<[.<]
  • দুটি পাওয়ার (অসীম স্ট্রিম): >++++++++++>>+<+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<]>.>[->[ <++>-[<++>-[<++>-[<++>-[<-------->>[-]++<-[<++>-]]]]]]<[>+<-]+>>]<<]
  • স্কয়ার 10000 এর নিচে: ++++[>+++++<-]>[<+++++>-]+<+[>[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+>>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<]<<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<-]
  • ফিবোনাচি স্ট্রিম: >++++++++++>+>+[[+++++[>++++++++<-]>.<++++++[>--------<-]+<<<]>.>>[[-]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[-]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<]
  • ইনপুট না হওয়া পর্যন্ত এএসসিআইআই সিকোয়েন্স: ,[.[>+<-]>-](এটির জন্য ইনপুটের উপর ভিত্তি করে পৃথক সেল সংখ্যা প্রয়োজন)

মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মার্টিন এন্ডার

উত্তর:


8

সেড, 46 বাইট সংকলক

s/</<</g
s/>/>[->[-]>[-]+<<]>/g
s/^/[-]>[-]+</

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


1
আমি বিভ্রান্ত আপনার তৃতীয় লাইনের খালি স্ট্রিং প্রতিস্থাপন? সেড মধ্যে খালি স্ট্রিং মেলে? "সেড: প্রথম আরই খালি নাও হতে পারে"
স্পার

@ স্পার ঠিক আছে, পরিবর্তে ক্যারেট দিয়ে চেষ্টা করুন।
ফেয়ারস

3
ঠিক আছে, আসুন দেখুন আমি অনুসরণ করি কিনা ... ঘর 0 শূন্য, সেল 1 সেট করুন। সমস্ত << সাথে এবং <>>> এক্স> এর সাথে প্রতিস্থাপন করুন। এখন যে কোনও সময় আসল প্রোগ্রামটি সেল এন অ্যাক্সেস করেছে নতুন প্রোগ্রামটি সেল 2n, এমনকি সংখ্যাযুক্ত কোষ অ্যাক্সেস করে। এক্স অদ্ভুত কোষটি পেরিয়ে যাচ্ছে এবং এটি যদি শূন্য না হয় তবে এটি পরবর্তী কোষটি (এমনকি একটি ঘর) শূন্য করে এবং পরবর্তী বিজোড় ঘরটি 1 এ সেট করে I আমার কি অধিকার আছে?
স্পার

2
আপনি জানেন, আপনি যদি একটি সংক্ষিপ্ত সংকলক জন্য যান, এটি রেটিনাতে কেবল 35 বাইট হবে । ;)
মার্টিন এন্ডার

1
@ মার্টিনব্যাটনার নির্লজ্জ প্লাগ! : পি
অপ্টিমাইজার 6

2

সি ++

সংকলক আকার: 630 বাইট (-10 বাইট Zacharý ধন্যবাদ)
হ্যালো ওয়ার্ল্ড সংকলন ফলাফলের আকার: 139
স্কয়ার 10000 এর নীচে: 319

সংকলক:

#include<string>
#include<map>
#include<stack>
#define B break
#define C case
#define S 30000
#define R m[(p<0)?(p%S)+S:p]
using s=std::string;using P=std::pair<int,int>;s a(s c){char m[S];memset(m,0,S);int p=0,i=0;P r{0,0};std::map<int,int>j;std::stack<int>t;for(int d=0;d<c.size();++d){if(c[d]==91)t.push(d);if(c[d]==93){j[d]=t.top();j[t.top()]=d;t.pop();}}while(i<c.size()){switch(c[i]){C'>':++p;B;C'<':--p;B;C'+':++R;B;C'-':--R;B;C'[':if(!R)i=j[i];B;C']':i=j[i]-1;B;default:B;}++i;r.first=p<r.first?p:r.first;r.second=p>r.second?p:r.second;}s n;for(int i=r.first;i<r.second;++i){n+="[-]>";}n+="[-]"+s(r.second,60)+c;return n;}

এলোমেলোভাবে ব্রেইনফাক দোভাষী:

void interpret(const std::string& code) {
    char memory[30000];
    for (int i = 0; i < 30000; ++i)
        memory[i] = std::rand()%256;
    int memPtr = 0, insPtr = 0;
    std::map<int, int> jump_map;

    {
        std::stack<int> jstack;
        for (int i = 0; i < code.size(); ++i) {
            if (code[i] == '[')
                jstack.push(i);
            if (code[i] == ']') {
                jump_map[i] = jstack.top();
                jump_map[jstack.top()] = i;
                jstack.pop();
            }
        }
    }
    while (insPtr < code.size()) {
        switch (code[insPtr]) {
        case '>': ++memPtr; break;
        case '<': --memPtr; break;
        case '+': ++memory[memPtr]; break;
        case '-': --memory[memPtr]; break;
        case '.': std::cout << memory[memPtr]; break;
        case ',': std::cin >> memory[memPtr]; break;
        case ']': if (memory[memPtr] != 0) insPtr = jump_map[insPtr]; break;
        case '[': if (memory[memPtr] == 0) insPtr = jump_map[insPtr]; break;
        default:break;
        }
        ++insPtr;
    }
}

কিছু নোট:

  • সংকলক ব্যবহৃত মেমরি কোষ নির্ধারণ করার জন্য প্রোগ্রামটি কার্যকর করে। যদি আপনার প্রোগ্রামটি অসীম লুপ হয় তবে সংকলক অসীমভাবে লুপ করবে।

আপনি নাম পরিবর্তন করে আপনার স্কোর কমে যায় piiথেকে P, এবং সংজ্ঞা পরিবর্তন Rকরার জন্য m[p<0?p%30000+30000:p], এবং সেই অনুযায়ী তাদের সব কল / রেফারেন্স পরিবর্তন। এছাড়াও, তিনি পরীক্ষার কেসগুলি সংশোধন করেছিলেন। আমি এটি যাচাই করে দেখিনি, তবে 30000আপনি এটি প্রায়শই ব্যবহার করার কারণে এটি কোনও কিছু হতে পারে তা সংজ্ঞায়িত করতে কিছু বাইটগুলি সংরক্ষণ করতে পারে ।
জাকারি

1
কাজ Rকরতে চান m[p<0?p%S+S:p]?
জাকারি

সংজ্ঞাটিতে প্রথম বন্ধনী সরিয়ে ফেললে Rকয়েকটি বাইট সংরক্ষণ করা উচিত।
জাকারি

1

আরএস , 33 বাইট, স্কোর: 2659

sedউত্তরের বেশিরভাগ ক্ষেত্রে কেবল একটি সাধারণ বন্দর ।

</<<
>/>[->[-]>[-]+<<]>
[-]>[-]+<

1
আপনি কি গতকাল আগে এই ভাষা প্রকাশ করেছেন? যে প্রশ্নগুলি প্রশ্ন তৈরির পরে পোস্ট করে তা উত্তর জমা দেওয়ার জন্য বৈধ নয়।
স্পার

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