Piet adalah bahasa pemrograman yang menarik karena sejumlah alasan. Hari ini kita akan fokus pada satu alasan: perintah roll . Perintah roll awalnya dari PostScript dan merupakan cara yang ampuh untuk memanipulasi tumpukan.
Perintah roll memunculkan dua elemen teratas stack dan menggunakannya sebagai parameter. Kami akan memanggil nilai pertama yang muncul turns
dan yang kedua depth
. Beralih ke kedalaman n akan mengambil elemen paling atas dari tumpukan, menjadikannya elemen ke-n dalam tumpukan, dan memindahkan setiap elemen di atasnya ke atas satu. Jika turns
negatif ini dilakukan dalam arah yang berlawanan. Artinya, elemen ke-n dipindahkan ke atas dan elemen lainnya dipindahkan ke bawah. Ini berulang abs(turns)
kali.
Tantangan
Tulis program atau fungsi yang mengambil tumpukan dan mengembalikan tumpukan itu setelah menjalankan gulungan.
Aturan
- Input dan output mungkin dalam daftar, array, string dengan pembatas, diteruskan dalam satu elemen pada suatu waktu, atau format lain yang masuk akal. Output harus dalam format yang sama dengan input.
depth
tidak akan pernah menjadi negatif dan tidak akan pernah lebih besar dari panjang tumpukan.- Tumpukan input akan selalu mengandung setidaknya dua elemen.
- Ini adalah kode-golf sehingga jawaban terpendek dalam setiap bahasa menang. Karena itu, saya tidak akan menerima jawaban.
- Celah standar dilarang.
Uji Kasus
in: out:
2
4
1 3
2 4
3 1
4 2
5 5
6 6
in: out:
-2
3
1 2
2 3
3 1
in: out:
-42
0
1 1
2 2
3 3
4 4
5 5
Jawaban:
Haskell ,
6462 byteSunting: -2 byte: @xnor melihat sesuatu yang saya pikir salah tentang.
r
mengambil dan mengembalikan daftarInt
s.Cobalah online!
splitAt n l
membagi daftarl
pada indeksn
,mod
menghitung sisa divisi,++
daftar gabungan.sumber
(%)=splitAt
infix.JavaScript (ES6),
4947 byteSunting: Disimpan 2 byte berkat @Shaggy dengan mengambil elemen stack sebagai parameter terpisah. Penjelasan:
1
memindahkan elemen atas kedepth
elemen. Giliran2
menggerakkan dua elemen teratas, dll. Namun, Anda juga dapat mencapai ini dengan menggerakkan elemen antara belokan dan kedalaman ke depan.splice
menghapus elemen-elemen itu danconcat
menambahkannya ke elemen lainnya. (Saya bisa menggunakan pemahaman array bukan karena panjangnya sama.)slice
, parameter keduasplice
adalah jumlah elemen yang dihapus.sumber
(t%d+d)%d
sama dengant%d
?%
adalah sisa, sehingga memberikan jawaban negatif ketikat
negatif.(t,d,...a)=>
aturan yang memungkinkan input untuk dilewatkan dalam satu elemen pada satu waktu.CJam, 31 byte
Input dan output adalah array pada stack, dengan elemen terakhir mewakili bagian atas stack.
Jejak tumpukan:
sumber
Mathematica,
5850 byteSunting: Terima kasih kepada Martin Ender karena telah menyimpan 8 byte.
Penjelasan:
Fungsi murni yang mengharapkan daftar di mana bagian awal daftar mewakili bagian atas tumpukan. Kami melewati elemen daftar ke dalam fungsi murni
Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&
.x
diatur ke urutan elemen dimulai dengan argumen ketiga., lalu kita putar pertama#2
(argumen kedua) elemenx
ke kiri#
(argumen pertama) kali, laluJoin
elemen yang tersisa darix
.Itu akan menghemat
3
byte jika kita hanya melewatkan elemen stack sebagai argumen untuk fungsi secara langsung daripada berada di daftar pada awalnya, tetapi kemudian format input dan output tidak cocok.Solusi asli:
Ada sesuatu yang sangat memuaskan tentang rangkaian fungsi infiks ini. Mengganti daftar dengan elemen pertama
t
, elemen keduad
, dan elemen yang tersisax
dengan hasil memutard
elemen pertama{x}
ke waktu kirit
dan bergabung dengan elemen yang tersisa dari{x}
.sumber
±
insetad dari aturan penggantian, dan 1 byte lainnya dengan mengeksploitasiTakeDrop
sebagai berikut:±{t_,d_,x___}:=#~RotateLeft~t~Join~#2&@@{x}~TakeDrop~d
...&[1, 1, 3, 4]
dan kembali{3, 4}
atau melakukannya secara manual dengan sebuahApply
di awal:Take[x={##3},#2]~RotateLeft~#~Join~Drop[x,#2]&@@#&
(hanya untuk menjadi jelas, saran pertama saya menghilangkan@@#&
.)Ruby, 40 byte
Cobalah online!
Mengambil input sebagai daftar, mengembalikan daftar. Fakta bahwa ada built-in
rotate
yang dapat menangani rotasi positif dan negatif membuat ini sepele.sumber
Python,
141988774 byte11 byte disimpan berkat @Cole
Menerima input sebagai daftar, di mana elemen terakhir adalah bagian atas tumpukan.
Gunakan trik 0ⁿ untuk memfilter operator modulo penyesuaian-kedalaman nol dan python, untuk menentukan bagian daftar yang akan dipotong.
sumber
f(s,t,d)
?f(s,t,d)
(input adalah seluruh tumpukan).r=-t%d-d
. Juga, menggantis*0**d
dengans*(d<1)
mempertahankan jumlah byte tetapi mungkin meningkatkan keterbacaan (bukan itu tujuannya). Saya tidak tahu itu0**0==1
di Python, itu menarik.-t%d-d
sebagai nilai (seperti yang saya lakukan sebelumnya), karena ketikad
sedang0
ini akan memicu pengecualian divisi-by-nol.JavaScript ES6,
10992 byteCobalah online!
Menerima input dalam bentuk array bilangan bulat.
Juga memiliki hitungan untuk panah: P
Penjelasan:
Kode menggunakan fungsi shift untuk mengekstraksi dua elemen pertama dari daftar.
Kemudian mendapat nilai absolut dari elemen pertama, yaitu jumlah putaran.
Karena Javascript nol diindeks, indeks kedalaman perlu dikurangi 1.
Jika indeks kedalaman 0 atau 1, tidak ada yang berubah, tetapi karena penurunan, indeks 0 akan menyebabkan perubahan. Karena itu keluar dari loop jika indeks kedalaman tidak <= 0.
Fungsi splice (a, b) mengembalikan sub-array dengan panjang b dengan indeks awal a dari array dan meninggalkan array asli tanpa elemen-elemen tersebut.
Ketika digabungkan dengan sisa array asli, ini adalah satu putaran array pada indeks kedalaman.
Dengan melakukan operasi ini n kali, di mana n adalah jumlah belokan, array yang dihasilkan adalah hasil dari operator roll.
sumber
Python 2 , 48 byte
Cobalah online!
sumber
TI-Basic,
141150 byte (tidak bersaing)Edit: kasus tetap di mana kedalamannya nol (+9 byte)
TI-Basic tidak mendukung daftar panjang 0, sehingga pendekatan ini tidak akan berfungsi untuk input dua panjang.
Penjelasan:
sumber
seq(
.Batch, 163 byte
Mengambil input sebagai parameter baris perintah dan menampilkan daftar yang dipisahkan oleh spasi. Parameter antara
t
dand
diekstraksi ke dalamr
variabel sehingga mereka dapat ditambahkan kes
variabel, yang menerima semua parameter lainnya.sumber