> For the complete documentation index, see [llms.txt](https://bytistan.gitbook.io/baytistan/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bytistan.gitbook.io/baytistan/kedi-problemi/seviye-2-ascii-kediyi-hareket-ettir.md).

# Seviye 2: ASCII Kediyi Hareket Ettir

## Amaç

`settings.py` dosyasına eklediğin ASCII kediyi, terminalde yukarıdan aşağıya ve soldan sağa doğru adım adım kaydırarak bir animasyon oluştur. Her bir kaydırma işleminde ekran yenilenmeli ve kedi aşağıya doğru birer satır kayarak hareket etmeli.

### **Yapmanız Gerekenler**

1. `settings.py` dosyasındaki `ascii_art` listesini `level_two.py` dosyasına aktarın.
2. ASCII kediyi, terminalde yukarıdan aşağıya doğru hareket ettirecek bir program yazın.
3. Her kaydırışta terminali temizleyin. (Python'da terminali temizlemek için `os.system('clear')` komutunu kullanabilirsiniz; Windows'ta ise `os.system('cls')` kullanılmalı.)
4. Kediyi her bir kaydırmadan sonra ekrana yazdırın.
5. Her kaydırma işlemi arasında 0.02 saniyelik bir gecikme ekleyin (Python'da `time.sleep()` fonksiyonunu kullanarak zaman gecikmesi ekleyebilirsiniz).

### Beklenen Davranış:

<figure><img src="https://1592666604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fy0QTCliryu3DkL9lOYgq%2Fuploads%2FPezw7ZV1NzuPaUuc0dC7%2Fezgif.com-video-to-gif-converter(2).gif?alt=media&amp;token=ddb84edc-8239-4a60-aa3a-0d2753a3e2ef" alt=""><figcaption><p>1.0</p></figcaption></figure>

* ASCII kedi terminalde yukarıdan başlayarak yavaş yavaş aşağıya kaymalı.
* Ekran her defasında temizlenip kedi bir satır aşağıda gösterilmeli.
* Kedinin tamamı aşağıya indikten sonra animasyon durdurulmalı ve kedi ekranda kalmalı.

## Problemin Çözümü

{% hint style="info" %}
Çözümün benimkinden farklı olabilir, eğer aynı çıktı elde ediyorsan önemi yok.
{% endhint %}

<details>

<summary>Cevap</summary>

```python
# ...

def print_cat():
    os.system("clear")

    for row_index,row in enumerate(ascii_art):
        for column_index, cell in enumerate(row):
            
            # ascii_art listesi bulunulan satır'ın bir fazlasına kadar bölünüyor.
            d = ascii_art[:row_index + 1]
            # Oluşturulan d değişkeni sutün bulunulan sutün numarasına kadar bölünüyor.
            d[row_index] = ascii_art[row_index][:column_index]
            
            
            """Liste birleştiriliyor, satır satır olabilmesi için
            aralarına new_line ekleniyor."""
            
            new_line = "\n"
            print(new_line.join(d)) 

            # Animasyon efekti verebilmek için kısa aralıklar ekleniyor
            time.sleep(0.01)
            
            # Yazdırma işlemi bittiğinde terminal temizlenmemesi için döngü burada kırılıyor.
            if [row_index,column_index] == [len(ascii_art) - 1,len(row) - 1]: 
                continue
                
            # Bir dahaki yazdırma işlemi için ekran temizleniyor.
            os.system("clear")

# ...
```

</details>

{% hint style="info" %}
Problemin çözümüne geçmeden önce eğer kullanılan bazı fonksiyon ve yöntemlere hakim değilsen aşağıdaki kısmı okuyabilirsin.
{% endhint %}

### Yardımcı Fonksiyonlar

Birçok farklı çözüm olmak ile beraber diğer sorularda da kullanacağım bu fonksiyonlarda, bu gibi işlemlerde kodun temiz olmasını sağlamakta.

#### `enumerate` Nedir Nasıl  Çalışır?

Yaptığı işi basitçe açıklamak gerekirse, bir liste üzerinde gezinirken eğer bu fonksiyonu kullanırsak bize hem gezinilen elemanın sıra numarasını hem de kendisini veriyor. Aşağıdaki örneği incelersen daha iyi anlayabilirsin.

```bash
dogukan@train:~/Develop/Others/meow$ python3 
Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> some_list = ["tomato","patato","apple","car","plane"]
>>> for index,item in enumerate(some_list):
...     print(index,item)
... 
0 tomato
1 patato
2 apple
3 car
4 plane
```

#### `join` Nedir Nasıl Çalışır?

Elimdeki listeyi tek bir `string` üzerinde birleştirmek istediğim zaman bu arkadaşı kullanıyorum. Aşağıdaki örneği incelersen anlatmaya lüzum kalmadan anlacağını umuyorum.

```bash
dogukan@train:~/Develop/Others/meow$ python3 
Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> space = " "
>>> some_list = ["I","love","to","eat","tomato"]
>>> sentence = space.join(some_list)
>>> print(sentence)
I love to eat tomato
```

### İç İçe Döngüler

İç içe döngü, bir döngünün (örneğin `for` veya `while` döngüsü) başka bir döngü içinde yer aldığı bir yapıdır. Genellikle iki veya daha fazla boyutlu veri yapıları üzerinde işlem yapmak için kullanılır.

```bash
dogukan@train:~/Develop/Others/meow$ python3
Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> data = [
...             [0,1,0,0],
...             [0,0,0,0],
...             [0,0,0,0]
... ]
>>> for row in data:
...     for cell in row:
...             if cell == 1:
...                     print("[+] Found one")
... 
[+] Found one
```

Yukarıdaki örnek'te olduğu gibi 1 sayısını herhangi bir fonksiyon veya metot kullanmadan bulmak istiyorsan bu iki liste üzerinde de gezinmen gerek.

### Liste Kırpma

Herhangi bir listenin istediğim yerinden başlayıp istediğim yerine kadar kırpmam mümkün. Aşağıda buna ait bir kaç örnek var.

```bash
dogukan@train:~/Develop/Others/meow$ python3
Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> number_list = [number for number in range(0,100)]
>>> print(number_list[15:25])
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
>>> print(number_list[75:-1])
[75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98]
```

### Çalışma Mantığı

Şimdi konuya geçmeden gelin şu akış şemasına kısadan bakalım.

<figure><img src="https://1592666604-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fy0QTCliryu3DkL9lOYgq%2Fuploads%2Fa7lSaBU9RlYHBZcxdXgF%2FUntitled-2024-09-24-0616.png?alt=media&amp;token=e146f744-5107-4a27-b0b3-d655760ac1b8" alt=""><figcaption><p>1.0</p></figcaption></figure>

**Anlatılan şu:** Liste satırları ve sutünları üzerinde gezinip, satırların sırası üstüne yazdırılabilmesi ve yığın yapılabilmesi için listeler bölümlere ayrılıyor. Cevap üzerindeki yorum satırları gayet açıklayıcı, anladığını umuyorum.
