{"id":243,"date":"2010-08-15T20:00:16","date_gmt":"2010-08-15T19:00:16","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=243"},"modified":"2010-08-15T20:00:16","modified_gmt":"2010-08-15T19:00:16","slug":"fucking-c","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=243","title":{"rendered":"fucking C"},"content":{"rendered":"<p>Bei <a href=\"http:\/\/www.linusakesson.net\/programming\/brainfuck\/index.php\">Lft Craft<\/a> habe ich den wohl schrecklichsten C Code aller Zeiten gefunden.<\/p>\n<p><code>char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;main(){for(read(0,r,4000);c=*r;<br \/>\nr++)c-']'||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-'['||d++||(*++s=r),d||(*p+=c==<br \/>\n'+',*p-=c=='-',p+=c=='>',p-=c=='<',c-'.'||write(2,p,1),c-','||read(2,p,1));}<\/code><\/p>\n<p>Leute die meinen Style schlecht reden habe einfach keine Ahnung ;)<\/p>\n<p>Und ja, das Ding compiliert wirklich. In den letzten zwei Tage habe ich das mal in lesbares C \u00fcbersetzt<\/p>\n<p><code><br \/>\n\/\/ m enthaelt den kompletten bf code und den programm pointer<br \/>\n\/\/ also programm und daten, so ist es moeglich eine quine zu programmieren<br \/>\n\/\/ 0 bis 4999 ist der bf code in plain text<br \/>\n\/\/ n und s sind mir noch nicht so ganz klar<br \/>\n\/\/ r zeigt auf das aktuelle zeichen im bf code<br \/>\n\/\/ p der programm pointer<br \/>\n\/\/ d hat irgendwas mit schleifen zu tun<br \/>\n\/\/ c das aktuelle zeichen im bf code<\/p>\n<p>char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;<\/p>\n<p>main(){<br \/>\n\/\/ Lese maximal 4000 zeichen von stdin<br \/>\n\/\/ (was mag passieren wenn der bf code groesser als 4000 zeicen ist<br \/>\n\/\/ naja, wird wohl einfach ueberschrieben)<br \/>\nfor(read(0,r,4000);c=*r;r++)<br \/>\n{<br \/>\n  \/\/c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--);<br \/>\n  if(c == ']')<br \/>\n  {<br \/>\n    if(d <= 1)\n    {\n      if(*p)\n      {\n        r = *s;\n      }\n      else\n      {\n        --s;\n      }\n    }\n\n    if(d)\n      d--;\n  }\n\n  \/\/c- '[' || d++ || (*++s=r),\n  if(c == '[')\n  {\n    if(d == 0)\n    {\n      d++;\n      *(++s) = r;\n\n    }\n  }\n\n\/\/d|| (\n  if(d == 0)\n  {\n    \/\/*p+=c=='+',\n    if(c == '+')\n      *p += 1;\n\n    \/\/*p-=c=='-',\n    if(c == '-')\n      *p -= 1;\n\n    \/\/p+=c=='>',<br \/>\n    if(c == '>')<br \/>\n      p += 1;<\/p>\n<p>    \/\/p-=c=='<';\n    if(c == '<')\n      p -= 1;\n\n    \/\/c-'.'||write(2,p,1);\n    if(c == '.')\n      write(2,p,1);\n\n    \/\/c-','||read(2,p,1);\n    if(c == ',')\n      read(2,p,1);\n\/\/ )\n  }\n}\n}<\/code><br \/>\n(Leider geht die Formatierung in WordPress verloren).<\/p>\n<p>Aber jetzt erstmal ein paar Erkl\u00e4rungen. Wenn man sich den Code genauer anschaut, wird man feststellen, dass wohl alle \";\" durch \",\" ersetzt wurden. So kann man mehrere Anweisungen in eine Zeile schreiben.<\/p>\n<p>a = 0, b = a+1, c = a+b;<\/p>\n<p>Weiterhin f\u00e4llt auf, dass es kein einziges if() gibt. Man kann ein if() durch ein logisches ODER ersetzen:<\/p>\n<p>a || b++;<\/p>\n<p>Der Ausdruckt stimmt so. Normalerweise erwartet man sowas in einer if(), aber es geht auch ohne. Das Programm wird von links nach rechts abgearbeitet.<br \/>\nEin ODER ist dann wahr, wenn einer von beiden Argumenten wahr ist. <\/p>\n<p>Also wenn a ungleich 0 ist, z\u00e4hlt das als wahr. Aber sagen wir lieber true, spricht sich sch\u00f6ner.<br \/>\nWenn also a true ist, muss b++ nicht mehr ausgef\u00fchrt werden.<br \/>\nIst a hingegen 0, wird b++ ausgef\u00fchrt.<br \/>\nSo einfach kann es sein :)<\/p>\n<p>Dann fallen Sachen wie  p+=c=='>' auf. Auch das ist ganz einfach. Der Operator == wird vor += ausgewertet. Wenn also c=='>' ist, ergibt das true, also 1. Dann steht als zweites p+=1 da. Sollte c irgendein anderes Zeichen sein, wird p+=0 ausgef\u00fchrt.<\/p>\n<p>Folgender Code ist auch noch erw\u00e4hnenswert<\/p>\n<p>c- '[' || d++ || blubb<\/p>\n<p>Das ist wieder eine geschachtelte if(). In c steht ein Zeichen vom Bf Code. Sollte in C nun das Zeichen '[' stehen, und subtrahiert man nun ein '[', ist das ergebis 0. Unsere if() wird also wahr und der n\u00e4chste Ausdruck wird in Angriff genommen.<\/p>\n<p>d++ || blubb<\/p>\n<p>Das Problem mit dem ++ sollte ja bekannt sein, bei d++ wird erst d bentuzt, dann um eins erh\u00f6ht. Bei ++d wird erst d um ein erh\u00f6ht und dann benutzt. Ist also d gleich 0. Wird d um eins erh\u00f6ht und dann blubb ausgewetet.<\/p>\n<p>Mit diesem Wissen kann man schon fast den kompletten Code verstehen. Nur diese eine Zeile hat mich eine Weile besch\u00e4ftigt<\/p>\n<p>c- ']' || (d>1 || (r=*p?*s:(--s,r)) , !d||d--)<\/p>\n<p>Schaut erstmal eine Weile drauf. Am Anfang eine if(), noch eine if(), noch eine if() und dann noh eine if() ;)<\/p>\n<p>Interesannt ist nur der innerste Teil<\/p>\n<p>r=*p?*s:(--s,r)<\/p>\n<p>Da steht <expression>?<true>:<false><br \/>\nUnd ?: geht vor dem = Operator. Wenn also *p nicht 0 ist, dann wird r = *s ausgef\u00fchrt. Sollte *p 0 ergeben. Wird erst s um eins erniedrigt und dann r=r ausgef\u00fchrt.<br \/>\nr=r ist nat\u00fcrlich doof, aber ohne das w\u00fcrde da stehen r=--s; und das ist ja nicht gewollt.<\/p>\n<p>So und was ist das nun f\u00fcr ein Programm? Na ein Brainfuck Interpreter. Sieht man doch ;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bei Lft Craft habe ich den wohl schrecklichsten C Code aller Zeiten gefunden. char m[9999],*n[99],*r=m,*p=m+5000,**s=n,d,c;main(){for(read(0,r,4000);c=*r; r++)c-']'||(d>1||(r=*p?*s:(--s,r)),!d||d--),c-'['||d++||(*++s=r),d||(*p+=c== '+',*p-=c=='-',p+=c=='>',p-=c=='', if(c == '>') p += 1; \/\/p-=c=='' auf. Auch das ist ganz einfach. Der Operator == wird vor += ausgewertet. Wenn also c=='>' ist, ergibt das true, also 1. Dann steht als zweites p+=1 da. Sollte c irgendein [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[15,14],"class_list":["post-243","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-bf","tag-c"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=243"}],"version-history":[{"count":6,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/243\/revisions"}],"predecessor-version":[{"id":249,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/243\/revisions\/249"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=243"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}