July 04, 2023

Merhaba,

Şurada çözmeye çalıştığım sorunun nedenini bulamadım ve ben de çıktı ekranının farklı olmasının başka bir sebebi olacağını düşünerek ve ilk Beyin Farkı (BF) 1.04 sürümünü duyuruyorum! Çünkü içe içe döngüler çalışıyor...

Aşağıdaki tek örnekli kod, orijinal BF'ye göre 4 ekstra komuta (#&^v) daha sahiptir:

enum countToFifty = "+++>++^[-<^>]<&>+++++"~
                    "[->++^^+[-<<+<.>.>>\n"~
                    "]<<---------<+.>.>\n]";
void main()
{
  size_t ptr, i;
  ushort[5] mem;

  auto s = countToFifty.dup;
  auto l = s.length;

  while(i < l)
  {
    size_t b = 1;
    switch(s[i])
    {
      case '#' : ptr.writeln(": ", mem);
        break;
      case '&' : mem[++ptr] += mem[ptr - 1];
        break;
      case '^' : mem[ptr] <<= 1;
        break;
      case 'v' : mem[ptr] >>= 1;
        break;
      case '\n': writeln();     break;
      case '+' : ++mem[ptr];    break;
      case '-' : --mem[ptr];    break;
      case '>' : ++ptr;         break;
      case '<' : --ptr;         break;
      case '[' : stack.push(i); break;
      case ']' :
        if(mem[ptr]) i = stack.front();
        else stack.popFront();
        break;

      case '.' :
        const chr = cast(char) mem[ptr];
        chr.writef!"%s";
        break;

      case ',' :
        auto chr = cast(ubyte) stdin.readln[0];
        mem[ptr] = chr;
        break;

      default:
    }
    ++i;
  }
  mem.writeln; /* program bitimindeki bellek ve
  2 satırlık eşdeğeri:                        */
  foreach(n; 1..51)
    n.writefln!"%02d";
}

import std.stdio;

StackLIFO!size_t stack;
struct StackLIFO(T)
{
  private T[] data;

  size_t length() {
    return data.length;
  }

  bool empty() {
    return data.length == 0;
  }

  T back() {
    return data.length ? data[0] : T.init;
  }

  void push(T data) {
    this.data ~= data;
  }

  T front() {
    return data[$ - 1];
  }

  void popFront() {
    data.length--;
  }
}

Başarılar...

July 05, 2023

On Tuesday, 4 July 2023 at 10:42:40 UTC, Salih Dincer wrote:

>

Aşağıdaki tek örnekli kod, orijinal BF'ye göre 4 ekstra komuta (#&^v) daha sahiptir:

enum countToFifty = "+++>++^[-<^>]<&>+++++"~
                    "[->++^^+[-<<+<.>.>>\n"~
                    "]<<---------<+.>.>\n]";
//..
    switch(s[i])
    {
      case '#' : ptr.writeln(": ", mem);
        break;
      case '&' : mem[++ptr] += mem[ptr - 1];
        break;
      case '^' : mem[ptr] <<= 1;
        break;
      case 'v' : mem[ptr] >>= 1;
        break;

Versiyon atlamadan, pekala eksik olan ve alışık olduğumuz yorum satırı (en azından yıldızsız olanı) komutu yakışır:

      case '/':
        if(s[++i] == '/') {
          while( s[++i].isWhite){}
          while(!s[++i].isWhite){}
        } else --i;
        break;

      case '«': writeln();     break;

Tabi iyi çalışması için \n'yi başka bir şey ile yer değiştirmek gerekiyor. Örneğin 0xab («) ile çünkü komutlar çakışıyor...

Ayrıca isWhite() işlevini boşluğu kapsamayacak şekilde değiştirmek gerekecek. Böylece aynı program şu şekilde kod içinde yorumlanır ve kodun çalışmasına engel olacak bir şey kalmaz:

enum countToFifty =
`+++>++^[-<^>]<&>+++++ // belleği [48, 48, 5 ] şeklinde kur
[-                     // onlar hanesi için 1 eksilt
  ->++^^+              // birler hanesi için 9'u kur
  [-                   // birler hanesi için 1 eksilt
    <<+<.>.>>«         // birleri arttır-yaz,onlara geç-yaz ve satırbaşı yap
  ]                    // içteki döngü sonu
  <<---------<+.>.>«   // birler hanesi 9 eksilt, onlar hanesini 1 arttır
]`;                    // BF v1.4 programı biter...

//import std.ascii : isWhite;/*
bool isWhite(dchar c) @safe pure nothrow @nogc {
  return c >= 0x09 && c <= 0x0D;
}//*/

Bu kadar :)