একটি ব্রেইনফাক অনুবাদক লিখুন


18

যে কোন প্রোগ্রামিং বা স্ক্রিপ্টিং ভাষা এক্স , একটি প্রোগ্রাম যে stdin এবং আউটপুট থেকে একটি প্রোগ্রাম sourcecode একটি বৈধ brainfuck sourcecode লাগে, stdout- এ, ভাষা লিখিত লিখতে এক্স , যে আউটপুট would brainfuck প্রোগ্রাম করতে হবে যেমন সঠিক একই জিনিস।

আপনার প্রোগ্রামটি অবশ্যই খালি ফাইল সহ কোনও বৈধ ব্রেইনফাক প্রোগ্রামের জন্য কাজ করবে।

আপনার স্কোরটি আপনার উত্সকোডের বাইট গণনা, এবং নীচের ইনপুটটি দিয়ে দেওয়া আপনার আউটপুট বাইট গণনা সমান হবে:

+++++ [-]
+++++ +++++ [
    > +++++ ++
    > ++ +++ ++++ +
    > +++
    <<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><

উদাহরণস্বরূপ, একটি ইনপুট জন্য [-], এর আউটপুট *p=0;তুলনায় অনেক বেশি অনুকূলwhile(*p) *p--;

যদি আপনি অ-এসসিআইআই অক্ষর ব্যবহার না করে থাকেন তবে ইউটিএফ -8 এনকোডিং ব্যবহার করে বাইট গণনাটি গণনা করতে হবে।

সর্বনিম্ন স্কোর জয়। তবে, সৃজনশীল সমাধানগুলি যা আউটপুট হ্রাস করার চেষ্টা করে তা আপভোটগুলি দ্বারা উত্সাহিত করা হবে।


11
আপনি সম্ভবত একটি ধারা যুক্ত করতে চান যে লক্ষ্য ভাষাটিও ব্রেইনফাক না হয়;)
জোশ

@ জোশ ভাল, যদি কেউ একটি ছোট্ট ব্রেনফাক প্রোগ্রাম লিখতে সক্ষম হন যা অপ্রয়োজনীয় বেহুদা কোডগুলি সরিয়ে দেয়, তবে কেন তা করতে দিচ্ছেন না?
ব্যবহারকারী 12205

2
বেশ সহজভাবে কারণ উত্সটি অপরিবর্তিত রাখার তুচ্ছ সমাধানটি ব্রেনফাকের জন্য যাইহোক সত্যিই কম স্কোর পেতে চলেছে। অন্য কোনও ভাষা যদি সেটিকে পরাজিত করতে পারে তবে আমি অবাক হব।
টিম সেগুইন

@ টিম সেগুইন আমি প্রশ্নটি পরিবর্তন করতে পারতাম, তবে যারা ইতিমধ্যে উত্তর সরবরাহ করেছেন তাদের পক্ষে কি তা অন্যায় হবে? এবং যদি আমি প্রশ্নটি পরিবর্তন করি তবে আমি স্কোর গণনা পরিবর্তন করার কথা ভাবছি, এটি তৈরি করে byte count of source + (byte count of output)^2যা মানুষ আউটপুটকে সহজীকরণে আরও ফোকাস করতে উত্সাহিত করবে?
ব্যবহারকারী 12205

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

উত্তর:


12

পার্ল - 177 (উত্স) + 172 (আউটপুট) = 349

#!perl -p0
y/-+><.,[]
-~/p-w/d;s/(.)\K\1+|rs|wv[^v]*(?=w)/$+&&length$&/ge;$_="eval'r$_'=~".'s/.(\d*)/(qw(--$ ++$ -- ++ print+chr$ $$i=ord+getc; while($$i){ })[$&&v63].q($i;))x($++1)/ger'

শেবাংকে 2 বাইট হিসাবে গণনা করা হচ্ছে, প্রতিটি বিকল্পের জন্য একটি করে। প্রথমত, আটটি কমান্ডের প্রত্যেকটিরই পরিসরে অনুবাদ করা p-wহয়, একই সাথে অন্য সমস্ত অক্ষর মুছে ফেলা হয়। এই স্ট্রিংটি তখন রান-দৈর্ঘ্যের এনকোডড এবং একটি নূন্যতম ডিকোডার / দোভাষী দিয়ে আউটপুট। কয়েকটি জিনিস অপ্টিমাইজ করা হয়েছে: স্ট্রিংটি ><স্পষ্টতই কিছু করে না এবং লুপের জন্য যা সরাসরি অন্যের পরে চলে আসে তা পুরোপুরি মুছে ফেলা যেতে পারে কারণ এটি কখনও প্রবেশ করা হবে না।

পরীক্ষা প্রোগ্রামের আউটপুট:

eval'rq4vpwq9vrq6rq9rq2s2pwrq1trqtq6t1q2trq1tsq7tp7tq2tp5tp7trqtp32vt44wsps1'=~s/.(\d*)/(qw(--$ ++$ -- ++ print+chr$ $$i=ord+getc; while($$i){ })[$&&v63].q($i;))x($++1)/ger

একটি নমুনা রান:

$ perl brainfusk.pl < in.bf | perl
Hello world!

পার্ল - 232 (উত্স) + 21 (আউটপুট) = 253

#!perl -p0
y/-+><.,[]
-~/0-7/d;$_="eval'2$_'=~".'s/./qw(--$ ++$ -- ++ print+chr$ $$i=ord+getc; while($$i){ })[$&].q($i;)/ger';
/5/||fork?(wait,$?||exit):($SIG{ALRM}=sub{exit 1},alarm 9,$S=select(open 1,'>',\$o),eval,print$S "print\"\Q$o\E\"")

এটি একটি এফআইকিউর পর্যবেক্ষণের ভিত্তিতে তৈরি হয়েছে যে মূল প্রোগ্রামটিতে যদি কোনও ইনপুট বিবৃতি না থাকে তবে আউটপুট স্থির হবে, এবং তাই একক printবিবৃতিতে হ্রাস করা যেতে পারে । আপনি যদি এটিকে পছন্দ করেন তবে তার উত্তরটি একটি +1 দেওয়ার বিষয়ে নিশ্চিত হন ।

সুতরাং আমরা যা করতে পারি তা হল stdoutএকটি ভেরিয়েবলের পাইপ হ'ল evalআমাদের আউটপুট কোডটি থাকে এবং ফলাফলটি একটিতে মোড়কে দেয় print

... এটি সর্বদা কার্যকর হবে না, যদিও। যখনই অনুবাদ করা কোডটি অসীম লুপের ফলস্বরূপ হত (উদাহরণস্বরূপ +[.]), সুস্পষ্ট কারণে এটি একক বিবৃতিতে হ্রাস করা যাবে নাprint । সুতরাং পরিবর্তে, আমরা evalএকটি স্বল্প সময়সীমা সহ একটি শিশু প্রক্রিয়া ইন চালু করি , এবং যদি সেই সময়ের মধ্যে সম্পাদন শেষ না হয় তবে আমরা পূর্বের মতো অনূদিত প্রোগ্রামটি আউটপুট করব।

কাঠামোগত এবং মন্তব্য করা হয়েছে:

if(!/5/) { # no `,` in program

  if(fork) { # parent process

    # wait for child
    wait;
    # no child error, terminate without output
    $?||exit

  } else { # child process

    # alarm handler, exit with error
    $SIG{ALRM}=sub{exit 1};
    # set an alarm in 9 seconds
    alarm 9;
    # redirect STDOUT to variable $o
    $S=select open 1,'>',\$o;
    # execute translated code
    eval;
    # wrap the result in a print statement
    print$S "print\"\Q$o\E\""
  }
}

নমুনা প্রোগ্রামের জন্য আউটপুট:

print"Hello\ world\!"

এর জন্য আউটপুট ,[.]:

eval'25647'=~s/./qw(--$ ++$ -- ++ print+chr$ $$i=ord+getc; while($$i){ })[$&].q($i;)/ger

আউটপুট +[.](9 সেকেন্ড পরে):

eval'21647'=~s/./qw(--$ ++$ -- ++ print+chr$ $$i=ord+getc; while($$i){ })[$&].q($i;)/ger

1
এটা চমৎকার! মস্তিষ্ক ব্যাথা করে :)
টিমউই

আমার মনে wv.*?(?=w)হয় ভুল। আমি মনে করি এটি কেবল পরবর্তী পর্যন্ত কোড সরিয়ে ফেলবে ], তবে মিলটি খুঁজে পেতে আপনার এটি প্রয়োজন ]; আপনার বাসা
বাঁধার

@ টিমভি ফিক্সড, নেস্টেড কেসগুলিকে উপেক্ষা করে wv[^v]*(?=w), যা বিকল্পের চেয়ে উল্লেখযোগ্যভাবে খাটো।
প্রিমো

14

ব্রেইনফাক, 5 + 540 = 545 বাইট

কোডের 5 বাইট, প্রদত্ত পরীক্ষার ফাইলের আউটপুট থেকে 540 (ধরে নিলাম সেই কোডের আমার পেস্ট থেকে গণনাটি পেয়েছে)।

,[.,]

ধরে নিচ্ছি EOF 0 হয়।


@ প্রিমো যেহেতু এটি কোনও দোভাষী পড়ার আগে রিসেট হয় না যা ইওএফ-তে মান অনুমান করে না এই প্রোগ্রামটি 0 বাইটের চেয়ে বড় সমস্ত ইনপুটটির জন্য একটি অন্তহীন লুপ তৈরি করবে।
সিলেস্টার

আমি ভাবতে পারি না, এই জিনিসগুলি চালাতে কোন সফ্টওয়্যার ব্যবহার করা হয়? এক্সডি
তেউন প্রোঙ্ক

@ টিউনপ্রঙ্ক সেখানে একটি মস্তিষ্ক ফেলা দোভাষী রয়েছে bfi ( github.com/susam/bfi )। এটি কেবল সংকলন এবং ইনস্টল করুন, এবং এটির মতো চালান: ব্রেইনফাক ফাইলটি ব্যাখ্যা করার জন্য bfi input.bfকোথায় input.bf
ব্র্যাডেন সেরা

5

পিএইচপি, 553 + 27 = 580 বাইট

(553 বাইটস সমস্ত সাদা স্থানের সাথে, যেমন নিউলাইন এবং স্পেসগুলি অপসারণ করা হয়েছে)

আমি গল্ফ পিএইচপি এ খারাপভাবে স্তন্যপান, তাই এই পদ্ধতির ভারী অনুকূলিত করা যেতে পারে। আমি বেশিরভাগ ক্ষেত্রে বিএফ-তে নয় এমন সমাধানে আমার দৃষ্টিভঙ্গি দেখাতে চেয়েছিলাম।

<?php
echo "<?php ";
$x = 'if (!$b) $c = $_GET[c];
$x=$y=$n[0]=$p=0;$o[0]=1;$d="";
while($a=$c[$x++]){
    if($o[$p]){
        if($a=="-")$m[$y]--;
        if($a=="+")$m[$y]++;
        $m[$y]=$m[$y]%256;
        if($a=="<")$y--;
        if($a==">")$y++;
        if($a=="."){
            $e=chr($m[$y]);
            if ($b) echo $e;
            else $d.=addslashes($e);
        }
        if($a==",")$m[$y]=($b=$_GET[i])?ord($b):0;
    }if($a=="["){
        $p++;
        $n[$p]=$x-1;
        $o[$p]=$o[$p-1]?$m[$y]:0;
    }
    if($a=="]"){
        if($o[$p])$x=$n[$p];
        $p--;
        if($p=-1)$p=0;
    }
}
if (!$b) echo "echo \'$d\';";';
if (strstr($_GET['c'],",")) {
    $x = '$b=1;'.$x;
    echo '$c="'.addslashes($_GET[c]).'";'.$x;
    return;
}
eval($x);

ত্রুটি রিপোর্টিং অবশ্যই বন্ধ রাখতে হবে, অন্যথায় পিএইচপি আপনাকে ঘৃণা করবে। ব্যবহার: এটিকে একটি পৃষ্ঠা হিসাবে ফেলে দিন এবং স্ক্রিপ্ট.এফপি? সি = কোডের সাহায্যে চালান (ফলাফলের স্ক্রিপ্টটির যদি ইনপুট প্রয়োজন হয় তবে আপনি এটিকে আউটএইফপি? I = INPUT হিসাবে চালান)। ইউআরপলটি ইনপুট থেকে পালাতে ভুলবেন না!

এটি যা করে তা মূলত এটি - বিএফ স্ক্রিপ্টে যদি "," থাকে তবে এটি একটি সংযুক্ত $ b = 1 সহ ফলাফল স্ক্রিপ্ট হিসাবে নিজেকে আরও এম্বেড করে; উপরে. যদি এতে "," থাকে না তবে এটি এটিকে "প্রতিধ্বনি <<বিএফ আউটপুট> '" এ উন্নত করে। সুবিধাজনকভাবে, ওপিতে টেস্ট স্ক্রিপ্টের জন্য কোনও ইনপুট লাগবে না। অ্যাডল্যাশগুলি () কেবলমাত্র পালানোর জন্য রয়েছে 'এবং \।


4

সি ++, 695 + 510 = 1205 বাইট

কোড:

#include<iostream>
#include<utility>
#include<vector>
#define D "\n#define "
using namespace std;using S=string;int main(){vector<pair<S,S>>m={{"--------","(*p)-=8;"},{"<>",""},{"[]","F;"},{"+","A;"},{"-","B;"},{">","C;"},{"<","D;"},{"[","F{"},{"]","}"},{".","E;"},{",","std::cin>>*p;"}};S s;char c;while(cin>>c)if(S("+-><[].,").find(c)<8)s+=c;for(int i=0;i<s.length();i++)if(s.substr(i,4)=="[][]")s=s.replace(i--,4,"[]");cout<<"#include<iostream>" D"A ++*p" D"B --*p" D"C p++" D"D p--" D"E std::cout<<*p" D"F while(*p)\nint main(){char*p=new char[1<<19]();";while(s.size())for(auto p:m)if(s.substr(0,p.first.length())==p.first){s=s.substr(p.first.length());cout<<p.second;break;}cout<<"}";}

আউটপুট:

#include<iostream>
#define A ++*p
#define B --*p
#define C p++
#define D p--
#define E std::cout<<*p
#define F while(*p)
int main(){char*p=new char[1<<19]();A;A;A;A;A;F{B;}A;A;A;A;A;A;A;A;A;A;F{C;A;A;A;A;A;A;A;C;A;A;A;A;A;A;A;A;A;A;C;A;A;A;D;D;D;B;}C;A;A;E;C;A;E;A;A;A;A;A;A;A;E;E;A;A;A;E;C;A;A;E;D;A;A;A;A;A;A;A;A;E;(*p)-=8;E;A;A;A;E;B;B;B;B;B;B;E;(*p)-=8;E;C;A;E;(*p)-=8;(*p)-=8;(*p)-=8;(*p)-=8;B;F{E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;E;}F;D;B;D;D;}

আসল কোড:

#include <iostream>
#include <utility>
#include <vector>
using namespace std;
int main() {
    vector<pair<string, string>> m={
    {"--------","(*p)-=8;"},
    {"<>",""},
    {"[]","F;"},
    {"+","A;"},
    {"-","B;"},
    {">","C;"},
    {"<","D;"},
    {"[","F{"},
    {"]","}"},
    {".","E;"},
    {",","std::cin>>*p;"}};
    string s;
    char c;
    while (cin >> c)
        if (string("+-><[].,").find(c) < 8)
            s += c;
    for(int i = 0; i < s.length(); i++)
        if(s.substr(i, 4) == "[][]")
            s = s.replace(i--, 4, "[]");
    cout << "#include<iostream>\n"
            "#define A ++*p\n"
            "#define B --*p\n"
            "#define C p++\n"
            "#define D p--\n"
            "#define E std::cout<<*p\n"
            "#define F while(*p)\n"
            "int main(){char*p=new char[1<<19]();";
    while (s.size())
        for (auto p : m)
            if (s.substr(0, p.first.length()) == p.first) {
                s = s.substr(p.first.length());
                cout << p.second;
                break;
            }
    cout << "}";
}

2

পাইথন - 514 + 352 = 866

কোড:

import sys,zlib,base64
s,i="import sys\na,i=[0]*300000,0\n",0
for c in sys.stdin.read():
 if c in"+-><,.[]":
  s+=" "*i+{'+':"a[i]+=1\n",'-':"a[i]-=1\n",'>':"i+=1\n",'<':"i-=1\n",',':"a[i]=(lambda x:0if x==''else ord(x))(sys.stdin.read(1))\n",".":"sys.stdout.write(chr(a[i]))\n","[":"while a[i]!=0:\n","]":"pass\n"}[c]
  i+={'[':1,']':-1}.get(c,0)
print('import zlib,base64\nexec(zlib.decompress(base64.b64decode("'+base64.b64encode(zlib.compress(bytes(s,"utf8"),9)).decode("utf8")+'")).decode("utf8"))')

আউটপুট:

import zlib,base64
exec(zlib.decompress(base64.b64decode("eNrLzC3ILypRKK4s5krUybSNNojVMjYAAR0DrsTozFhtW0OCdHlGZk6qAoinaGtgxQVm6QLFFQoSi4uJNoVc2zJBggowWTIZVDGEEvMzddFJ1FDMxBYUwFjTKy5JyS8t0SsvyixJ1UjOKNIASWpqomrAp5DceMBnJjn2Ee0ZojToUiGlEfIFzA5yaGqHELXtp5XfMukVwMOFRi/u8IXZqOSo5KjkqOSIlAQ3k9BLy1HBUcFRwVFBOgpmIrfeMhGE9ihrpLEAudg3NA==")).decode("utf8"))

1

IO

659 + 553 = 1212

File standardInput readBufferOfLength(1)সত্যিই বাইট গণনাটি মেরে ফেলার মতো জিনিস তবে আমি এটি কাছাকাছি পেতে পারি না। আমি বিএফ প্রোগ্রামে পুনরাবৃত্ত প্রতীক বা ইনপুটটির অভাবের জন্য অপ্টিমাইজেশন করি নি, তবে এটিতে কাজ চালিয়ে যাব, এছাড়াও আইওর রূপক দক্ষতাগুলির ব্যবহারের ক্ষেত্রে কাজ করব।

"v :=Vector clone setSize(30000)
p :=0
z :=getSlot(\"method\")
j :=z(p=p+1)
k :=z(p=p-1)
a :=z(v at(p))
l :=z(v atPut(p,a+1))
m :=z(v atPut(p,a-1))
n :=z(a asCharacter print)
u :=getSlot(\"while\")
o :=z(v atPut(p,File standardInput readBufferOfLength(1)))"println
z :=getSlot("method")
g :=z(a,b,if(a,a,b))
v :=z(e,f,if((x :=s)==e,nil,f .. g(w(x),"")))
s :=z(File standardInput readBufferOfLength(1))
w :=z(c,c switch(">",v("<","j"),"<","k","+","l","-","m",".","n",",","o","[",v("]","u(a>0,"),"]",")"))
while((c :=s)!=nil,if((t :=w(c))!=nil,t println))

পরীক্ষামূলক

cat test.bf | io bftrans.io > out.io && io out.io && echo && echo  $(cat out.io | wc -c) " + " $(cat bftrans.io | wc -c) " = "$(($(cat bftrans.io | wc -c) + $(cat out.io | wc -c)))

উৎপাদনের

Hello world!
659  +  553  = 1212


0

লুয়া - 328 + 2256 = 2584

(ওহ আমি ঠিক বুঝতে পেরেছিলাম যে আপনার ফলাফলের দৈর্ঘ্যও খুব কম দরকার, খারাপ স্কোর, দেখে মনে হচ্ছে)

print((("l,m,p=loadstring,{0},1 z,y,x,w,v,u=l'io.write(string.char(@))',l'@=io.read(1):byte()',l'p=p-1',l'p=p+1 @=@or 0',l'@=(@+1)%256',l'@=(@-1)%256'"..io.read"*a":gsub("[^.,<>[%]+-]",""):gsub(".",{["."]="z()",[","]="y()",["<"]="x()",[">"]="w()",["["]="while @~=0 do ",["]"]="end ",["+"]="v()",["-"]="u()"})):gsub("@","m[p]")))

আমার এই উত্তর থেকে নেওয়া ।


0

লুয়া - 319 + 21 = 340

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

loadstring("o=\"\";d={"..string.rep("0,",30000).."}p=1;"..io.read():gsub("[^%+%-<>%.,%[%]]+",""):gsub(".",{["+"]="d[p]=d[p]+1;",["-"]="d[p]=d[p]-1;",[">"]="p=p+1;",["<"]="p=p-1;",["."]="o=o..string.char(d[p])",[","]="d[p]=io.read()",["["]="while d[p]~=0 do ",["]"]="end;"}))()print("print("..string.format("%q",o)..")")

লুয়া - 376 + 366 = 742

এই সংস্করণটি প্রমাণ করতে লুয়া 2584 এর চেয়ে আরও ভাল করতে পারে: ডি

print('loadstring("d={"..string.rep("0,",30000).."}p=1;"..('..string.format("%q",io.read():gsub("[^%+%-<>%.,%[%]]+",""):gsub("%[[^%+%-<>%,%[%]]*%]",""):match("(.*[.,]).-"))..'):gsub(".",{["+"]="d[p]=d[p]+1;",["-"]="d[p]=d[p]-1;",[">"]="p=p+1;",["<"]="p=p-1;",["."]="io.write(string.char(d[p]))",[","]="d[p]=string.byte(io.read())",["["]="while d[p]~=0 do ",["]"]="end;"}))()')

উভয় সংস্করণ 30000 বাইট ডেটা যুক্ত করে। আমার দ্বিতীয় সংস্করণ ইনপুট / আউটপুট: একটি 'পরে সমস্ত কিছু উপর ভিত্তি করে। বা ',' সরানো হবে। আমার দ্বিতীয় সংস্করণ অসীম লুপগুলিকে অনুমতি দেয় না ([।,], [], ইত্যাদি)

আমার ধারণাটি হ'ল:

print("Hello world!"..string.char(string.byte(io.read())+1)

অতিরিক্ত ', +' সহ আপনার ইনপুট থেকে।

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