> <> , 51 + 3 = 54 47 byte
:&v
?!\1-:&:&*}}r:
~\
!~>1+::n&:&%:a84*@@?$~o?
Cobalah online!
Input diharapkan di atas tumpukan saat program mulai menggunakan -vbendera. Output terdiri dari angka-angka yang tidak sejajar yang dipisahkan oleh spasi tunggal, dan setiap baris dipisahkan oleh satu baris baru. Contoh output untuk N=5:
1 2 3 4 5
11 12 13 14 15
21 22 23 24 25
16 17 18 19 20
6 7 8 9 10
... diikuti oleh satu baris baru. Program berakhir dengan kesalahan ( something smells fishy...), tetapi itu ada di STDERR dan bukan STDOUT.
Penjelasan:
Baris pertama hanya menyimpan salinan Ndalam register.
Baris kedua membangun offset untuk setiap baris output dengan mengurangi 1 dari N, mengalikannya dengan N, memutarnya ke bagian bawah tumpukan dan kemudian membalikkan seluruh tumpukan. Ketika jumlah di atas tumpukan mencapai 0, tumpukan akan terlihat seperti ini (contoh menggunakan N=5):
5 15 20 10 0 0
Baris ketiga membuang duplikat 0dari atas tumpukan.
Baris keempat menambah bagian atas tumpukan dan mengeluarkan salinannya. Ini kemudian diambil mod N, dan ini digunakan untuk memutuskan apakah spasi atau baris baru harus dicetak, dan jika bagian atas tumpukan harus dibuang - jika nomor terakhir yang dicetak x, maka x mod N == 0menunjukkan bahwa akhir dari baris keluaran telah tercapai. . Eksekusi berakhir ketika 1+dieksekusi di tumpukan kosong, melempar kesalahan terminasi.
Versi sebelumnya
Ini secara eksplisit memeriksa tumpukan kosong untuk mengakhiri eksekusi, dan saya juga memasukkan 3 byte untuk -vpenggunaan flag.
:&v
?!\1-:&:&*}}r:
~\
!;>1+::n&:&%:a84*@@?$~o?!~l?
Cobalah online!