Thread overview
SONY-2: Single Index 2D Array
Feb 05, 2022
Salih Dincer
Apr 26, 2022
Salih Dincer
Apr 27, 2022
Ali Çehreli
February 05, 2022

Serimizin 2. kodu aşağıda ve kısmen hazır...

Muhtemelen çözümü de 5 dakka 😀

Hatta işaretçi (pointer) kullanarak tek satırlık kod ile de mümkün ama o yasak! Amacımız ise (meydan okuma kısmı geliyor) en az kodla tek indeks kullanarak 2B diziye erişeceğiz. Sanırım ben 2-3 satır ekleyerek çözmüştüm.

Düzenli ve kolay olması için verimizi şu şekilde bir yapı içine aldım ve iki de hazır üye işlev yerleştirdim:

struct StaticData
{ // single index

  char[t_SizeOf][6] array = [
    "87654321".dup,
    "ZYXWVUTS".dup,
    "GNALD IH".dup,
    "GnAlD iH".dup,
    "gnalD iH".dup,
    "gnald ih".dup
  ];

  char getData(size_t i)
  {
    size_t y, x;
    return array[y][x];
  }

  size_t length()
  {
    return array.length * array[0].length;
  }
}

Bunların hepsi çözüm için bir şablon ve kolaylık. Hatta aşağıda klasik iç içe döngü ile erişimi de gösterdim. Yani amacımız, altındaki 2. bölüm gibi tek döngü ve indeks ile dizinin tüm elemanlarına erişmek istiyoruz. Hepsi bu!

enum t_SizeOf = 8;
import std.stdio;

void main()
{
  // Classic (Nested Loops) Implement:
  with(new StaticData)
  {
    for(size_t y = array.length; y!=0; --y)
    {
      for(size_t x = t_SizeOf; x!=0; --x)
      {
        array[y-1][x-1].write;
      }
      writeln;
    }
    // Single Index Implement:
    size_t i = length - 1;
    do {
      getData(i).writeln(",", i);
    } while(i--);
  }
}/* ÇIKTISI: (Klasik kısmın!)
  * hi dlang
  * Hi Dlang
  * Hi DlAnG
  * HI DLANG
  * STUVWXYZ
  * 12345678
  */

Kolay gelsin...

April 26, 2022

On Saturday, 5 February 2022 at 13:42:11 UTC, Salih Dincer wrote:

>

Serimizin 2. kodu aşağıda ve kısmen hazır...

Muhtemelen çözümü de 5 dakka 😀

Hatta işaretçi (pointer) kullanarak tek satırlık kod ile de mümkün ama o yasak! Amacımız ise (meydan okuma kısmı geliyor) en az kodla tek indeks kullanarak 2B diziye erişeceğiz. Sanırım ben 2-3 satır ekleyerek çözmüştüm.

Sadece denk geldim; geçmişte Vektörler konusunu işledim mi diye araştırırken "0 cevap" başlıkları dikkatimi çekti! 😀

Meğer 3 satırdan fazla çözmüşüm:

char getData(size_t i)
{
    auto len = array[0].length; // T.sizeof;
    size_t y, x = i % len;// = i & (len - 1);
    y = i / len;
    return array[y][x];
}

En zeki (yani tembel) programcılar için hazır çevrimiçi deneme bağlantısı:

https://run.dlang.io/is/cNKcS4

Dip Not: Keşke bu meydan okumaya birden fazla cevap gelseydi. Bu da bana kapak olsun çünkü boşuna uğraştığımın resmini görüyorum. 😞

Hoşça kalın...

April 27, 2022
On 4/26/22 13:12, Salih Dincer wrote:

> char getData(size_t i)
> {
>      auto len = array[0].length; // T.sizeof;
>      size_t y, x = i % len;// = i & (len - 1);
>      y = i / len;
>      return array[y][x];
> }

Mantıklı. :)

Normalde bunun tersi kullanılıyor: Dizi tek parçada ayrılıyor ve sonra iki indeksten tek indeks hesaplanıyor: `elemanlar[satır * satırUzunluğu + sütun]`. Yararları:

- Tek defa bellek ayırılabiliyor

- Öyle olunca erişilen elemanların mikroişlemcinin arabelleğinde bulunma olasılıkları artıyor

- Eski mikroişlemcilerde bölme işlemi çarpma ve toplamadan daha yavaş olduğundan bu yöntem daha hızlı olabiliyormuş  (Yenilerde ise durum o kadar kötü değilmiş ama bölme işleminin tuttuğu zaman, yine de işlemde kullanılan değerlere bağlı olarak daha yavaş olabiliyormuş)

Bölme durumunda bildiğim bir konu: Neyse ki yukarıdaki '/' ve '%' işlemleri ayrı ayrı işletilmiyor. Modern derleyiciler, `i % len` ve `i / len` işlemlerinin sonuçlarını tek bölme ile buldurabiliyorlar.

Ali