Tantangan ini terkait dengan beberapa fitur bahasa MATL, sebagai bagian dari acara Bahasa Bulan Mei 2018 . Tantangan terkait : Papan klip fungsi: tempel .
pengantar
MATL memiliki beberapa papan klip , tempat Anda dapat menyimpan nilai (salin) untuk diambil nanti (tempel). Beberapa clipboard otomatis , yang berarti bahwa penyalinan secara otomatis dipicu oleh peristiwa tertentu. Tantangan ini berfokus pada salah satu clipbard otomatis, yang disebut clipboard fungsi-input , atau hanya clipboard fungsi .
Clipboard ini menyimpan input ke empat panggilan terbaru ke fungsi pengambilan input yang normal. Fungsi normal adalah jenis fungsi yang paling umum di MATL. Pengambilan input berarti bahwa fungsi tersebut mengambil setidaknya satu input (fungsi yang tidak mengambil input apa pun tidak dipertimbangkan oleh clipboard fungsi).
Ini paling baik dijelaskan dengan contoh-contoh berikut, yang menggunakan dua fungsi normal:
+
, yang mengeluarkan dua angka dari tumpukan dan mendorong jumlahnya.U
, yang muncul satu angka dan mendorong kuadratnya.
Contoh 1 :
3 2 + 6 + 12 4 U + +
menghasilkan hasilnya 39
. Kode ditafsirkan sebagai berikut:
- Jumlah literal seperti
3
atau12
didorong ke tumpukan - Fungsi seperti
+
pop input mereka dan mendorong output mereka ke stack.
Panggilan fungsi, dalam urutan kronologis, adalah:
3 2 +
memberi5
5 6 +
memberi11
4 U
memberi16
12 16 +
28
11 28 +
memberi39
.
Papan klip dapat dilihat sebagai daftar empat daftar. Setiap daftar bagian dalam berisi input untuk panggilan fungsi, dengan sebagian besar panggilan terakhir terlebih dahulu . Dalam setiap daftar dalam, input berada dalam urutan aslinya .
Jadi setelah menjalankan kode, isi clipboardnya adalah (dalam notasi Python):
[[11, 28], [12, 16], [4], [5, 6]]
Contoh 2 :
10 20 U 30 +
meninggalkan angka 10
dan 430
di tumpukan. Tumpukan ditampilkan dari bawah ke atas di akhir program.
Panggilan fungsi adalah
20 U
memberi400
400 30 +
memberi430
Karena hanya ada dua panggilan fungsi, beberapa daftar bagian dalam menentukan clipboard akan kosong . Perhatikan juga bagaimana 10
tidak digunakan sebagai input ke fungsi apa pun.
Dengan demikian, konten clipboard setelah menjalankan kode adalah:
[[400, 30], [20], [], []]
Contoh 3 (tidak valid):
10 20 + +
dianggap tidak valid, karena input ke yang kedua +
tidak ada (dalam MATL ini secara implisit akan memicu input pengguna).
Tantangan
Input : string S dengan angka literal, +
dan U
, dipisahkan oleh spasi.
Output : isi fungsi clipboard setelah mengevaluasi string S .
Klarifikasi:
- Anda dapat menggunakan dua simbol yang konsisten untuk mewakili fungsi-fungsi itu, selain digit. Selain itu, Anda dapat menggunakan simbol apa pun yang konsisten sebagai pemisah, alih-alih ruang.
- Hanya dua fungsi yang ditunjukkan yang akan dipertimbangkan.
- String input akan mengandung setidaknya satu angka literal dan setidaknya satu fungsi.
- Semua angka akan bilangan bulat positif, mungkin dengan lebih dari satu digit.
- Ada kemungkinan beberapa literal angka tidak digunakan oleh fungsi apa pun, seperti pada contoh 2.
- Input dijamin kode yang valid, tanpa memerlukan nomor tambahan. Jadi string seperti pada contoh 3 tidak akan pernah terjadi.
- Mengejar daftar batin kosong di output dapat dihilangkan. Jadi hasilnya dalam contoh 2 bisa
[[400, 30], [20]]
- Format output yang masuk akal dan tidak ambigu dapat diterima. Sebagai contoh, string dengan koma sebagai pemisah dalam dan titik koma sebagai pemisah luar:
400,30;20;;
.
Aturan tambahan:
Input dan output dapat diambil dengan cara apa pun yang wajar .
Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang .
Kode terpendek dalam byte menang.
Uji kasus
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
[[28, 11], [16, 12], [4], [6, 5]]
keluaran yang valid untuk contoh pertama?M
?M
. Saya akan melakukannya dalam tantangan "tempel"Jawaban:
05AB1E , 20 byte
Cobalah online!
-4 Terima kasih kepada Emigna (dan juga -8 terima kasih karena dia memperbarui saya tentang aturan).
a
b
sumber
Bash , 43 byte
Cobalah online!
Ini mencetak clipboard dalam format berikut, perhatikan penggunaan \ x0F sebagai pemisah.
Gagasan utamanya adalah meneruskannya ke dc, bahasa berbasis stack, sehingga item-item stack yang diperlukan akan dicetak.
Masukan disalurkan ke sed di mana setiap
+
diganti denganrdnFPrp+
, yang di dc mencetak angka kedua pada tumpukan diikuti oleh \ x0F dan kemudian angka teratas sebelum melakukan penambahan. sed juga menggantikan setiapU
denganp2^
, mencetak elemen tumpukan atas dan persegi itu.Hasil sed dievaluasi sebagai kode dc, mencetak seluruh clipboard.
Karena garis berada dalam urutan terbalik,
tac
(mundurcat
) digunakan untuk memperbaikinya.Dan akhirnya, sed mengambil 4 baris pertama dari tac.
sumber
Python 2 , 126 byte
Cobalah online!
sumber
Haskell ,
113109 byteBaris pertama mendefinisikan fungsi anonim yang mengambil string, misalnya
"3 2 + 6 + 12 4 U + +"
, dan mengembalikan daftar daftar int:[[11,28],[12,16],[4],[5,6]]
. Cobalah online!sumber
Bersih , 140 byte
Cobalah online!
Dalam gaya Clean klasik, ini adalah solusi Haskell kecuali sekitar 50% lebih lama.
sumber
JavaScript (ES6), 107 byte
Mengambil input sebagai daftar yang terdiri dari bilangan bulat,
'+'
dan'U'
. Mengembalikan daftar lain yang terdiri dari integer, array 2 integer dan'_'
untuk slot kosong.Cobalah online!
Berkomentar
sumber
Pergilah,
305303295 byteTurun 8 byte berkat @ovs
Cobalah online!
sumber
Oktaf , 206 byte
Cobalah online!
Andai saja Oktaf memiliki
pop
sintaksis.m
adalah papan klip memori,t
tumpukan.sumber
m
dant
membalikkannya, menambahkan elemen ke depan daripada pada akhirnya?Python 3 ,
218204 byte-14 byte berkat ovs
Cobalah online!
sumber
Merah ,
335330 byteCobalah online!
Lebih mudah dibaca:
sumber
R ,
205182 byteCobalah online!
M
adalah papan klip memori,P
adalah program, danS
merupakan tumpukan.Secara teknis
S
diinisialisasi sebagai vektor yang mengandung nol tunggal tetapi karena kita tidak pernah mendapatkan input yang tidak valid, itu menyelamatkan saya byte dariS={}
.sumber
C (gcc) , 264 byte
Saya menggunakan rekursi sehingga saya bisa menggunakan fungsi stack sebagai tumpukan data: daftar input berjalan dan operasi dilakukan: hasilnya ditampilkan dalam urutan terbalik, dengan dorongan tumpukan tidak ditampilkan.
Tumpukan diimplementasikan sebagai daftar tertaut. Begini cara kerjanya:
Saya awalnya menggunakan struktur untuk node, tetapi saya beralih ke bare pointer untuk menghemat ruang. Fitur yang menarik dari daftar tertaut ini adalah bahwa ia membersihkan dirinya sendiri ketika rekursi selesai.
Cobalah online!
sumber