Thread overview
BrainFuck
Feb 29, 2012
Salih Dinçer
Feb 29, 2012
Salih Dinçer
Feb 29, 2012
Salih Dinçer
Feb 29, 2012
Salih Dinçer
Feb 29, 2012
Salih Dinçer
Feb 29, 2012
Salih Dinçer
February 29, 2012

Merhaba,

Fazla söze gerek yok, ismi yeter ama şu viki maddesi (http://tr.wikipedia.org/wiki/Brainfuck)nde kendisi hakkında Türkçe bilgi alabilirsiniz...:)

Ayrıca hemen şu js yorumlayıcı (http://www.undermined.org/tools/programming/brainfuck.php)sıyla, aşağıdaki sonsuza giden kodu deneyebilirsiniz:
(Debugger ile denemenizi ve Run to Breakpoint ile devam etmenizi öneririm)

++++++++++>>+>>+
[
   [
       +++++[<++++++++>-]<.
       >++++++[<-------->-]
       +<<<
   ]<.>>>>
   [
       -<[<+>>+<-]
       <[>+<-[>+<-[>+<-[>+<-[>+<-
           [>+<-[>+<-[>+<-[>+<-.
           [>[-]>>+>>[-]+<<<<<-
           [>+<-]]]]]]]]]]]
       >>[<<+>>-]
       +>>>
   ]<<<
]

Daniel B. Cristofani (cristofd@hevanet.com)

Kodun dilediğiniz yerine diyez(#~breakpoint) işareti koyunca orada durur ve adım adım devam edebilirsiniz. Küçüktür (<~sola kayma) işaretinin soluna veya ekrana çıktı veren nokta (.) işareti sağına koymanızı öneririm...

Ezoterik (http://esolangs.org/wiki/Main_Page) bir dil olan BF, dosyalarının uzantıları kısaca .b veya karışıklık olmaması için .bf şeklinde adlandırılabiliyor. Basit bir şekilde C'ye dönüştürmek de mümkün:

/*
* BF2C
* Copyright (C) 2003 Thomas Cort
* Code edited by Salih Dincer (2012.02.29)
* Version:       1.0 -> 1.1b
* Date:          2003-03-18
* Description:   Converts Brainfuck source to C source
* License:       GPL
* Download:      http://web.archive.org/web/20031030035801/http://www.brainfuck.ca/BF2C.c
* Developer:     Thomas Cort <tom@brainfuck.ca>
* Interfaces:    Command Line
*/

#include<stdio.h>

int main(int argc, char **argv) {
 int pc,               /* program counter            */
     prog_len = 0;     /* length of program          */
 int c[32768];          /* storage space for the code */

 FILE *stream, *fopen();

 /* Open stream file */
 stream = fopen(argv[1], "r");

 /* read the file and store it in c[] */
 for (pc = 0; pc < 32768 && (c[pc] = getc(stream)) != EOF; pc++) prog_len++;

 /* Close stream file */
 fclose(stream);

 /* print the beginning of the program */
 printf("// %s convert...\n", argv[1]);
 printf("\n\nint main() {\nint m[255], x;\n");
 printf("for(x = 0; x < 255; x++) m[x] = 0;\nx=0;\n");

 /* visit every element that has part of the bf program in it */
 for(pc = 0; pc < prog_len; pc++) switch (c[pc]) {
   case 43: printf("m[x]++;\n");break;         // '+' increment current memory
   case 45: printf("m[x]--;\n");break;         // '-' decrement current memory
   case 62: printf("x++;\n");break;            // '>' increment pointer
   case 60: printf("x--;\n");break;            // '<' decrement pointer
   case 91: printf("while(m[x]!=0) {\n");break;// '[' if pointer is nonzero
   case 93: printf("}\n");break;               // ']' end loop
   case 46: printf("putchar(m[x]);\n");break;  // '.' output a character
   case 44: printf("m[x] = getchar();\n");     // ',' accept one byte of input
 }
 printf("}\n");
 return 0;
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

Tekrar Merhaba...:)

Yukarıdaki dönüştürücüyü, D diline (yine D kodu üretecek şekilde) çevirmeye çalıştım ama 'putchar()''ın karşılığını bulamadım. Zaten D'ye çevirmek basit ama yine C kodu üretecek şekilde anlamsız olacaktı. Acaba _getc, _putc benzeri komutlarımız var mı?

Bu kafa zorlayan (!) programlama dilini biraz inceledim de diğer ezoterik diller nasıl bilmiyorum ama ASCII kod tablosu üzerinde gezinen bir Turing makinesinden (-bknz. Turing Computation (http://en.wikipedia.org/wiki/Turing-complete)) farksızmış. Örneğin geleneksel Merhaba Dünya BF kodu (http://en.wikipedia.org/wiki/Brainfuck#Hello_World.21)nu inceleyelim. En basit haliyle C'ye aşağıdaki gibi çevrilebilir. Tabi işin için 'getchar()' ve 'while()' girince, (sanırım) neredeyse aklınıza gelebilecek her türlü yazılım yazılabilir gibi görünüyor. Kuramsal açıdan belleği arttırmakta mümkün olduğuna göre belki en fazla çok adımlı yavaş bir kodunuz olur. İlginç değil mi?

// helloworld.bf convert...

int m[255], x = 0;

void seekMem (int _x, int _m) {
   x += _x;
   m[x] += _m;
}

int main() {
   // Initialize...
   seekMem(0, 10);
   while(m[x] != 0) {
       seekMem(1, 7);
       seekMem(1, 10);
       seekMem(1, 3);
       seekMem(1, 1);
       seekMem(-4, -1);
   }
   // Printing...
   seekMem(1, 2);
   putchar(m[x]);  // print 'H'
   seekMem(1, 1);
   putchar(m[x]);  // print 'e'
   seekMem(0, 7);
   putchar(m[x]);  // print 'l'
   putchar(m[x]);  // print 'l'
   seekMem(0, 3);
   putchar(m[x]);  // print 'o'
   seekMem(1, 2);
   putchar(m[x]);  // print ' ' (space)
   seekMem(-2, 15);
   putchar(m[x]);  // print 'W'
   seekMem(1, 0);
   putchar(m[x]);  // print 'o'
   seekMem(0, 3);
   putchar(m[x]);  // print 'r'
   seekMem(0, -6);
   putchar(m[x]);  // print 'l'
   seekMem(0, -8);
   putchar(m[x]);  // print 'd'
   seekMem(1, 1);
   putchar(m[x]);  // print '!'
   seekMem(1, 0);
   putchar(m[x]);  // print \n
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

Vayy, Whitespace (http://en.wikipedia.org/wiki/Whitespace_(programming_language)) de çok seksi görünüyor. Aslında bir de BF2.0 varmış ve tıpkı karekod (QR code) gibi renkli kutular var. Hatta WS'yi görünce aklıma geldi. Belki bu yöntem ile basit karekodlar için yoğun içerikli uygulama (yazılım) gömülebilir.

Tamam, her türlü veri temsil edilebiliyor da belki atıştırmalık değil faydalı bir uygulama mümkündür; ne dersin? Gerçi ticari getirisi yoksa bunların hepsi boş şeyler olsa gerek...:)
Alıntı ("Ali Çehreli"):

>

Bir de goto'nun tersi olan comefrom'u kullanan diller var:

http://en.wikipedia.org/wiki/COMEFROM

Program akışını başka bir yere yönlendirmiyor da, başka bir yerden buraya çekiyor. (?) :)
Bir yaşıma daha girdim! İnsanların aklı nelere çalışıyormuş... 8-(

Ayrıca şurada ezoterik dillerin (WS dahil) resmi sitelerine yönlendirme var: http://esco.sourceforge.net/?page=elang

Orada en alttaki Befunge-93 sanki diğerlerinden ayrılıyor! Hatta 1998'de yeni sürümüyle (-bknz. Funge-98 Final Specification (http://quadium.net/funge/spec98.html)) çok iyi bir hale getirilmiş:
' Befunge-93 32-bit Befunge-98
========== =================
0 x 79 |-2,147,483,648
0+-------------+ |
| | x
| -----+-----
y| -2,147,483,648 | 2,147,483,647
| |
| y|2,147,483,647
24+'

Yine de BrainFuck (bundan sonra Befunge ile karışmaması için kısaltmayacağım!) basitliğini ve desteği iyimiş:
http://esoteric.sange.fi/brainfuck/

Alıntı (Salih Dinçer):

>

Yukarıdaki dönüştürücüyü, D diline (yine D kodu üretecek şekilde) çevirmeye çalıştım ama 'putchar()''ın karşılığını bulamadım. Zaten D'ye çevirmek basit ama yine C kodu üretecek şekilde anlamsız olacaktı. Acaba _getc, _putc benzeri komutlarımız var mı?

D dilinde, 'putchar()''ın tam karşılığı ne olabilir?

Sevgiler, saygılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

Bunu denedim maalesef rakamlar çıkıyor...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

He he! :) Bunlardan çok var. Aklıma gelen başka birisi de Whitespace dili. Yalnızca boşluk ve tab karakterlerinden oluşuyor:

http://en.wikipedia.org/wiki/Whitespace_(programming_language)

Bir de goto'nun tersi olan comefrom'u kullanan diller var:

http://en.wikipedia.org/wiki/COMEFROM

Program akışını başka bir yere yönlendirmiyor da, başka bir yerden buraya çekiyor. (?) :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

'cast()' kullanmak aklıma gelmemişti, teşekkürler...

İşin ilginci 'char' türünde bir dizi işlenmesine rağmen ekrana abidik gubidik karakterli (-bknz. aşağıdaki ilk iki satır) anlamsız şeyler çıkıyordu. Aslında D'nin bunu ilklediğine güvendiğim için sorunun başka yerde olduğunu düşünmüştüm. Kendim ilklediğimde ise sorun düzeldi (-bknz. diğer iki satır) ama fazla kod kullanmak içime sinmedi...:)
' @ Z a a d � O d g a Y
64, 90, 97, 97, 100, 28, 79, 100, 103, 97, 89, 29, 8
72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 10
H e l l o W o r l d !'

Ben de bahsettiğim gibi sorunu şu şekilde çözmek yerine:

// helloworld.bf convert...
import std.stdio;

char[255] m;
int x = 0;
: : :
void main() {
   // Initialize...
   for(x=0; x<255; x++) m[x] = 0;
   x = 0;
   : : :

Alıntı:

>

.
'int' üzerinden hesaplatıp 'char' türünde yazdırdım...

int[255] m;
   : : :
   writeln(cast(char)m[x]);

Özetle, 'cast()' çok çok iyi bir yardımcı! Sanki D dili de C# gibi (herhalde CLR mimarisı üzerine inşaa edildiğinden olsa gerek!) önerdiği her yerde tür dönüşümü (C#!da Convert.To... (http://msdn.microsoft.com/en-us/library/system.convert(v=vs.110).aspx)) kullanmak zorundasınız! Bu C#'da bazen işkence haline alıyor ama D'de gerektiğinde kullanabilme serbestli çok hoş. HuffmanCode'da da işime çok yaramıştı.

Başarılar...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

Alıntı (Ali Çehreli):

>

Daha kısa olarak: ;)

>     char[255] m = '\0';
> ```

Teşekkürler Ali Hocam, bunu da hatırlattığın çok iyi oldu; unutmuşum... :rolleyes:

Ancak yasal olmayan değeri bilmiyordum. Demek ki kullandığımız değişken türüne göre, her zaman 0 ile ilkleneceği aklımıza gelmemesi gerekiyor...:)

Sevgiler, saygılar...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
February 29, 2012

Alıntı (Salih Dinçer):

>

D dilinde, 'putchar()''ın tam karşılığı ne olabilir?

Yine std.stdio.write:

   write(c);

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

c'nin türü tamsayı ise tamsayı çıkar. Şöyle olur:

   write(cast(dchar)(c));

Eğer kesinlikle ASCII olduğunu biliyorsan:

   write(cast(char)(c));

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 29, 2012

Alıntı (Salih Dinçer):

>

Aslında D'nin bunu ilklediğine güvendiğim için

D, karakterleri yasal olmayan bir karakter değeri ile ilkler. Tablodaki "İlk Değeri" sütununda her karakter türü için farklı:

http://ddili.org/ders/d/temel_turler.html

Alıntı:

>
> char[255] m;
> // ...
>     // Initialize...
>     for (x=0; x<255; x++) m[x] = 0;
> ```


Daha kısa olarak: ;)


char[255] m = '\0';



Alıntı:
> Özetle, 'cast()' çok çok iyi bir yardımcı!

Öyle bir aracımızın olması güzel ama her kullandığımızda gerçekten gerekip gerekmediğine bakmalıyız.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]