:-:_
Cobalah online! Dalam catatan kaki saya sudah memasukkan semua solusi 4-byte lainnya. (Stack Cats mengabaikan semuanya setelah linefeed pertama.)
Coba yang sebaliknya!
Penjelasan
The -n
bergantian bendera pada output numerik (dan masukan, tapi kami tidak punya), dan -m
bendera biasanya hanya kenyamanan golf yang memungkinkan Anda menghindari bagian berlebihan dari kode sumber. Ini karena setiap program Stack Cats perlu memiliki simetri cermin. Dengan -m
bendera, Anda hanya memberikannya setengah pertama (ditambah karakter sentral). Jadi program sebenarnya di sini adalah:
:-:_:-:
Seperti yang Anda lihat di tautan TIO pertama, ada satu ton solusi 4-byte, tetapi saya memilih yang ini karena kesederhanaannya. Stack Cats adalah berbasis tumpukan, dan program ini hanya menggunakan tumpukan awal. Karena kami tidak memiliki input apa pun, input ini berisi satu -1
(penanda EOF) di atas sumur nol tanpa batas. Tiga perintah dalam program memiliki arti berikut:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
Jadi di sini adalah bagaimana program memodifikasi tumpukan (status dan perintah terhuyung-huyung untuk menunjukkan bagaimana setiap perintah mengubah tumpukan dari satu negara ke yang berikutnya):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
Ternyata, satu-satunya perintah yang benar-benar melakukan apa pun di sini adalah _
yang mengubah penanda EOF kita menjadi a 1
. Output pada akhir program adalah implisit, dan penanda EOF adalah opsional, jadi ini hanya mencetak1
kita dapatkan.
Sekarang jika kita membalikkan kode sumber, karena mirroring implisit, program yang sebenarnya menjadi:
_:-:-:_
Ini melakukan sesuatu yang sangat berbeda:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
Kali ini bagian bawah tumpukan adalah masih -1
jadi itu bertindak sebagai penanda EOF dan hanya-1
di atas itu akan dicetak.
...
Sekarang dengan semua yang dikatakan, karena Stack Cats memiliki hubungan yang unik dengan kode pembalikan, saya merasa menggunakan -m
sedikit curang. Biasanya hanya dimaksudkan untuk menyimpan byte dengan menghilangkan bagian kode sumber yang berlebihan, tetapi di sini sebenarnya membuat tantangannya jauh lebih mudah dan bahkan program lengkapnya lebih pendek. Ini karena membalikkan program penuh hanya akan mengubah program jika berisi <>[]
, yang juga berarti bahwa program tersebut akhirnya menggunakan banyak tumpukan (Stack Cats sebenarnya memiliki rekaman tumpukan, di mana semua kecuali yang awal hanya diisi dengan nol untuk memulai). Selanjutnya, membalikkannya kemudian hanya menukar pasangan <>
dan []
, yang masih membuat eksekusi simetris. Satu-satunya cara untuk memecahkan simetri itu adalah dengan menggunakannyaI
yang tidak -]
atau-[
atau tidak tergantung pada tanda bagian atas tumpukan. Begitu...
*|]I*:*I[|*
Cobalah online! Footer lagi mencakup semua alternatif lain pada jumlah byte yang sama. Beberapa output 1 / -1 dan beberapa output 2 / -2 seperti yang ditunjukkan setelah setiap program. Saya memilih yang ini untuk menjelaskan secara acak sebagai salah satu yang menghasilkan 2.
Coba yang sebaliknya!
Penjelasan
Seperti yang saya katakan, ini sedikit lebih lama. Bahkan jika kita memang menggunakan-m
notasi untuk ini, itu akan berbobot 6 byte daripada 4 di atas.
Perintah yang digunakan saat ini:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
Program pertama hanya menggunakan dua tumpukan. Itu agak berantakan untuk dilakukan dalam seni ASCII, tetapi saya akan mencoba yang terbaik. Kurung kotak menunjukkan di mana tumpukan kepala kaset aktif, dan saya akan menempatkan perintah di antara setiap pasangan negara tumpukan.
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
Sekarang -1
bertindak sebagai penanda EOF dan2
dicetak.
Program lainnya sama sampai [
. Ini masih hampir sama sampai kedua I
. Kami secara teknis akan berada di tumpukan yang berbeda, tetapi tanpa nilai pada mereka, mereka semua tidak bisa dibedakan. Tetapi kemudian perbedaan antara I[
dan I]
akhirnya penting:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
Dan kali ini, kami tidak memiliki penanda EOF, tetapi program masih menampilkan -2
.
-
(0x45 = 0b00101101) bekerja di Jelly --
menghasilkan -1 karena mendefinisikan literal -1, sementaraṆ
(0xB4 = 0b10110100) menghasilkan 1 karena ia melakukan logika tidak dari input implisit nol. (Tentu sajaṆ
berfungsi juga: p)