एक ब्रेनफैक अनुवादक लिखें


18

किसी भी प्रोग्रामिंग या स्क्रिप्टिंग लैंग्वेज x में , एक प्रोग्राम लिखें, जो स्टडआउट और आउटपुट से, स्टडआउट के लिए एक मान्य ब्रेनफक सोर्सकोड लेता है, जो प्रोग्राम का सोर्सकोड है, जिसे भाषा एक्स में लिखा गया है , जो सटीक उसी चीज को आउटपुट करेगा जैसा कि ब्रेनफैक प्रोग्राम करेगा।

आपका प्रोग्राम खाली फ़ाइल सहित किसी भी मान्य ब्रेनफक प्रोग्राम के लिए काम करना चाहिए।

आपका स्कोर आपके सोर्सकोड के बाइट काउंट के बराबर होगा, साथ ही आपके आउटपुट की बाइट काउंट निम्नलिखित इनपुट को देगी:

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

उदाहरण के लिए, के इनपुट के लिए [-], आउटपुट *p=0;अधिक से अधिक अनुकूल हैwhile(*p) *p--;

यदि आप गैर- ASCII वर्णों का उपयोग करते हैं, तो बाइट गणना की गणना UTF-8 एन्कोडिंग का उपयोग करके की जानी चाहिए।

सबसे कम स्कोर जीतता है। हालांकि, रचनात्मक समाधान जो आउटपुट को कम करने का प्रयास करते हैं, उन्हें बढ़ावा दिया जाएगा।


11
आप एक खंड जोड़ना चाह सकते हैं कि लक्ष्य भाषा भी ब्रेनफक नहीं होगी;)
जोश

@ ठीक है, अगर कोई छोटा दिमाग़ी प्रोग्राम लिखने में कामयाब रहा जो अनावश्यक बेकार कोड निकालता है, तो उन्हें ऐसा करने क्यों नहीं दिया जाता?
user12205

2
बहुत सरलता से, क्योंकि स्रोत को अपरिवर्तित करने के तुच्छ समाधान से ब्रेनफैक के लिए वैसे भी बहुत कम स्कोर होने वाला है। मुझे आश्चर्य होगा अगर कोई अन्य भाषा उसे हरा सकती है।
टिम Seguine

@ टिम Seguine मैं सवाल बदल सकता है, लेकिन क्या यह उन लोगों के साथ अन्याय होगा जिन्होंने पहले से ही एक जवाब दिया है? और अगर मैं प्रश्न को बदल देता हूं, तो मैं स्कोर गणना को बदलने के बारे में सोच रहा हूं, इसे बना रहा हूं byte count of source + (byte count of output)^2, क्या यह लोगों को आउटपुट को सरल बनाने पर अधिक ध्यान केंद्रित करने के लिए प्रोत्साहित करेगा?
user12205

आम तौर पर इस तरह के एक सवाल को बदलने के बाद इसका उत्तर पहले ही दे दिया जाता है। मैं सिर्फ एक कारण बता रहा था कि मुझे लगता है कि जोश सही था। सैंडबॉक्स में इस तरह से सामान पोस्ट करना अच्छा है, इसलिए आप सभी के लिए निष्पक्ष रहते हुए संभावित समस्याओं का समाधान कर सकते हैं।
टिम सेगिन

जवाबों:


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\"")

यह एक FIQ के अवलोकन पर आधारित है कि यदि मूल कार्यक्रम में इनपुट स्टेटमेंट नहीं है, तो आउटपुट स्टैटिक होगा, और इसलिए इसे एक 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 (यह मानते हुए कि उस कोड के मेरे पेस्ट से सही गणना मिली)।

,[.,]

माना जाता है कि ईओएफ 0 है।


@primo चूंकि यह एक दुभाषिया को पढ़ने से पहले रीसेट नहीं करता है जो ईओएफ पर मूल्य नहीं जपता है, इस प्रोग्राम को 0 बाइट्स से बड़े सभी इनपुट के लिए एक अंतहीन लूप बना देगा।
सिल्वेस्टर

मैं यह सोचने में मदद नहीं कर सकता कि इस सामान को चलाने के लिए किस सॉफ्टवेयर का उपयोग किया जाता है? xD
तेउन प्रैंक

@TeunPronk एक दिमागी दुभाषिया है जिसे bfi ( github.com/susam/bfi ) कहा जाता है । बस संकलित करें और इसे स्थापित करें, और इसे इस तरह से चलाएं: bfi input.bfजहां input.bfदिमाग की फाइल की व्याख्या की जानी है।
ब्रैडेन बेस्ट

5

PHP, 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);

त्रुटि रिपोर्टिंग बंद होनी चाहिए, अन्यथा PHP आपसे घृणा करेगी। उपयोग: इसे एक पृष्ठ के रूप में फेंक दें, और इसे script.php के साथ चलाएं? C = CODE (यदि परिणामी स्क्रिप्ट को इनपुट की आवश्यकता है, तो आप इसे out.php? I = INPUT के रूप में चलाते हैं)। इनपुट से बचने के लिए याद रखें!

मूल रूप से यह क्या करता है - अगर बीएफ स्क्रिप्ट में "," है, तो यह बहुत ही अपने आप को एक संलग्न $ = 1 के साथ परिणामस्वरूप स्क्रिप्ट के रूप में एम्बेड करता है; शीर्ष पर। यदि इसमें "" नहीं है, तो यह इसे "इको '<बीएफ आउटपुट>'" के लिए अनुकूलित करता है। आसानी से, ओपी में परीक्षण स्क्रिप्ट को किसी इनपुट की आवश्यकता नहीं है। Addlashes () भागने के लिए बस है 'और \।


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

कब

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)

अपने इनपुट से, एक अतिरिक्त '+' के साथ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.