Gunakan tumpukan ketiga
Jika Anda telah membaca judulnya, Anda mungkin sedikit bingung. Tentunya hanya ada dua tumpukan di Brain-Flak? Namun saya meyakinkan Anda bahwa itu ada dan itu adalah salah satu yang paling kuat jika bukan alat yang paling kuat dalam menulis dan golf Brain-Flak.
Apa itu "Tumpukan Ketiga"?
Setiap program Brain-Flak menggunakan tumpukan ketiga dengan satu atau lain cara, tetapi sebagian besar penggunaannya berlangsung di belakang layar dan seringkali berguna untuk mengabaikan fakta bahwa itu ada. Setiap tanda kurung dalam program menambah atau menghapus satu item dari tumpukan. Tiga dari kawat gigi terbuka ([<
semua menambahkan item ke stack sementara tiga konjugat mereka )]>
semua menghapus item dari stack. Nilai item pada stack adalah nilai dari cakupan program saat ini dan menggunakan nilads akan mengubah nilai ini dengan cara tertentu. Kurung tutup )
memiliki fungsi unik untuk memindahkan elemen dari Tumpukan Ketiga ke tumpukan saat ini; dorongan.
Semoga ini menjadi jelas bagi Anda. Tumpukan Ketiga adalah semacam tumpukan yang mengingat nilai kembali kode yang telah dieksekusi. Mari kita telusuri contoh program sederhana untuk melacak dua tumpukan normal dan tumpukan ketiga.
Contoh
Kami akan berjalan melalui program berikut. Program ini mendorong -3, 1, -2
ke stack.
(([()()()])(()))
Kami mulai dengan tiga kawat gigi terbuka, yang semuanya mendorong nol ke tumpukan ketiga.
Tumpukan kami sekarang terlihat seperti ini, Tumpukan Ketiga adalah yang di sebelah kanan dan tumpukan aktif memiliki ^
di bawahnya:
0
0
0 0 0
^
(([()()()])(()))
^
Sekarang kami memiliki tiga ()
nilad. Ini tidak melakukan apa pun pada dua tumpukan normal, namun mereka masing-masing menambahkan satu ke atas tumpukan ketiga membuat tumpukan kita terlihat seperti:
3
0
0 0 0
^
(([()()()])(()))
^
Sekarang kita menjumpai ]
seperti yang dinyatakan sebelum kurung tutup menghapus item dari Third Stack, tetapi ]
memiliki fungsi mengurangkan elemen yang dihapusnya dari atas tumpukan. Dengan demikian tumpukan baru kita akan terlihat seperti:
-3
0 0 0
^
(([()()()])(()))
^
Ini masuk akal; [...]
tidak negasi jadi ]
harus mengurangi ke bawah.
Sekarang kita harus menjalankan )
. Seperti yang Anda ingat )
adalah tempat di program di mana barang-barang didorong ke tumpukan sehingga kami akan memindahkan bagian atas tumpukan ketiga ke tumpukan saat ini, di samping itu kami akan menambahkan elemen -3
ke berikutnya di tumpukan ketiga.
-3 0 -3
^
(([()()()])(()))
^
Sekali lagi kami menemukan salah satu dari tiga kawat gigi terbuka kami sehingga kami akan menambahkan elemen lain ke tumpukan ketiga kami.
0
-3 0 -3
^
(([()()()])(()))
^
Seperti yang kami katakan sebelumnya ()
akan menambah bagian atas tumpukan ketiga kami dengan satu.
1
-3 0 -3
^
(([()()()])(()))
^
Dan )
akan memindahkan bagian atas Stack Ketiga ke tumpukan aktif dan tambahkan ke bawah
1
-3 0 -2
^
(([()()()])(()))
^
Yang terakhir )
memindahkan Tumpukan Ketiga ke tumpukan aktif dan karena tidak ada elemen yang tersisa di Tumpukan Ketiga untuk ditambahkan, tidak melakukan hal lain.
-2
1
-3 0
^
(([()()()])(()))
^
Program selesai sehingga kami mengakhiri dan mengeluarkan.
Contoh ini dimaksudkan untuk memberi Anda perasaan tentang apa Stack Ketiga itu dan apa yang dilakukannya. Itu tidak termasuk semua operasi, tetapi mudah-mudahan Anda dapat mengetahui apa yang masing-masing lakukan sendiri. Jika Anda masih berjuang, saya telah memasukkan "cheatsheet" di bagian bawah jawaban ini untuk membantu Anda.
Oke, lalu bagaimana?
Ok, sekarang Anda mengerti tumpukan ketiga, tapi "Jadi apa"? Anda sudah menggunakannya bahkan jika Anda tidak menyebutnya "Third Stack", bagaimana cara berpikir dalam Third Stack membantu Anda bermain golf?
Mari kita lihat suatu masalah. Anda ingin mengambil Segitiga angka . Ini adalah jumlah semua angka yang kurang dari n.
Salah satu pendekatan mungkin untuk membuat akumulator di offstack dan menambahkannya saat Anda menghitung mundur. Ini menciptakan kode yang terlihat seperti ini:
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
Cobalah secara Online!
Kode ini cukup kompak dan orang mungkin berpikir itu tidak bisa jauh lebih kecil. Namun jika kita mendekatinya dari sudut pandang tumpukan ketiga, menjadi jelas bahwa ini sangat tidak efisien. Alih-alih menempatkan akumulator kami di offstack, kita dapat meletakkannya di tumpukan ketiga dengan (
dan mengambilnya di akhir yang kita gunakan )
. Kami akan sekali lagi mengulang-ulang semua angka, tetapi kali ini kami tidak perlu melakukan banyak hal untuk meningkatkan Stack Ketiga kami, program melakukannya untuk kami. Ini terlihat seperti:
({()({}[()])}{})
Cobalah secara Online
Kode ini kurang dari setengah ukuran dari versi golf yang kami buat sebelumnya. Bahkan pencarian komputer telah membuktikan bahwa program ini adalah program sesingkat mungkin yang dapat melakukan tugas ini. Program ini dapat dijelaskan dengan menggunakan pendekatan "jumlah semua berjalan", tetapi saya pikir itu jauh lebih intuitif dan jelas ketika dijelaskan menggunakan pendekatan Third Stack.
Kapan saya menggunakan tumpukan ketiga?
Idealnya setiap kali Anda mulai mengerjakan masalah baru di Brain-Flak, Anda harus berpikir sendiri bagaimana saya melakukan ini dengan tumpukan ketiga. Namun sebagai aturan umum setiap kali Anda harus melacak beberapa jenis akumulator atau memiliki total berjalan itu adalah ide yang baik untuk mencoba meletakkan itu di tumpukan ketiga Anda, bukan dua tumpukan nyata.
Waktu lain yang mungkin merupakan ide bagus untuk mempertimbangkan menggunakan tumpukan ketiga adalah ketika Anda tidak memiliki ruang untuk menyimpan nilai pada dua tumpukan lainnya. Ini bisa sangat berguna ketika Anda melakukan manipulasi pada dua tumpukan yang ada dan Anda ingin menyimpan nilai untuk digunakan nanti tanpa harus melacak di mana tumpukan itu.
Keterbatasan tumpukan ketiga
Third Stack sangat kuat dalam banyak hal tetapi ia datang dengan keterbatasan dan kekurangannya sendiri.
Pertama, tinggi tumpukan maksimum untuk Tumpukan Ketiga pada titik tertentu ditentukan pada waktu kompilasi. Ini berarti bahwa jika Anda ingin menggunakan sejumlah ruang pada tumpukan Anda harus mengalokasikan ruang itu ketika Anda menulis program.
Kedua Stack Ketiga bukan Akses Acak. Ini berarti Anda tidak dapat melakukan operasi apa pun pada nilai apa pun selain nilai tertinggi. Selain itu, Anda tidak dapat memindahkan nilai di tumpukan (katakan, tukar dua elemen pertama).
Kesimpulan
Tumpukan Ketiga adalah alat yang ampuh dan saya akan menganggapnya penting bagi setiap pengguna Brain-Flak. Dibutuhkan beberapa waktu untuk membiasakan diri dan membutuhkan perubahan dalam cara Anda berpikir tentang pemrograman di Brain-Flak, tetapi ketika digunakan dengan benar itu membuat semua perbedaan antara yang layak dan luar biasa ketika datang ke golf.
Contekan
Berikut adalah daftar operasi dan bagaimana mereka mempengaruhi Tumpukan Ketiga
Operation | Action
====================================================
(,[,< | Put a zero on top of the Third Stack
----------------------------------------------------
) | Add the top of the Third Stack to the
| second element and move it to the
| active stack
----------------------------------------------------
] | Subtract the top of the Third Stack
| from the second element and pop it
----------------------------------------------------
> | Pop the top of the Third Stack
----------------------------------------------------
() | Add one to the top of the Third Stack
----------------------------------------------------
{} | Pop the top of the active stack and
| add it to the top of the Third Stack
----------------------------------------------------
[] | Add the stack height to the Third
| Stack
----------------------------------------------------
<>,{,} | Nothing