Tantangan ini terkait dengan beberapa fitur bahasa MATL, sebagai bagian dari acara Bahasa Bulan Mei 2018 . Tantangan terkait: Papan klip fungsi: salin .
pengantar
Papan klip fungsi MATL menyimpan ("salinan") input ke empat panggilan terakhir 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. Konten clipboard yang disimpan dapat didorong ke tumpukan ("ditempelkan").
Tantangan ini akan mengambil konten clipboard sebagai input. Diasumsikan bahwa semua fungsi yang menghasilkan keadaan clipboard mengambil satu atau lebih bilangan bulat positif sebagai input. Jadi status clipboard dapat diwakili oleh daftar daftar angka. (Untuk informasi lebih lanjut tentang bagaimana clipboard sebenarnya diisi lihat tantangan terkait; tetapi itu tidak diperlukan untuk yang sekarang).
Menafsirkan konten clipboard
Contoh 1
Daftar dalam pertama mengacu pada pemanggilan fungsi yang terbaru , dan seterusnya, Demikianlah status clipboard
[[11, 28], [12, 16], [4], [5, 6]]
menunjukkan bahwa yang terakhir fungsi panggilan mengambil dua input, yaitu 11
, 28
; panggilan kedua lalu mengambil input 12
, 16
; dll. (Keadaan papan klip ini diproduksi oleh kode pada contoh pertama dari tantangan terkait).
Contoh 2
Jika tidak ada cukup panggilan fungsi , beberapa daftar bagian dalam di clipboard akan kosong:
[[7, 5], [], [], []]
(Ini diproduksi oleh program yang hanya menambah 7
dan 5
).
Contoh 3
Panggilan fungsi dapat memiliki sejumlah input , tetapi selalu setidaknya 1
(fungsi tanpa input tidak mengubah status clipboard). Jadi berikut ini juga mungkin.
[[3], [2, 40, 34], [7, 8, 15], []]
Mengakses konten clipboard
Isi dari clipboard fungsi didorong ke stack menggunakan fungsi MATL M
(yang, omong-omong, bukan fungsi normal, tetapi fungsi clipboard). Fungsi ini mengambil bilangan bulat positif sebagai input, dan mendorong beberapa konten clipboard ke stack, sebagai berikut. Dengan mengacu pada status clipboard pada contoh 1:
[[11, 28], [12, 16], [4], [5, 6]]
1M
mengembalikan semua input ke pemanggilan fungsi terbaru. Jadi, untuk contoh dipertimbangkan, memberikan11
,28
.- Demikian pula,
2M
,3M
dan4M
mengembalikan semua masukan untuk yang kedua, ketiga dan keempat fungsi panggilan terbaru. Jadi2M
memberi12
,16
;3M
memberi4
; dan4M
memberikan5
,6
. - Angka di luar input individual yang
4
dipilih untuk memfungsikan panggilan yang mengambil lebih dari satu input. Jadi mengembalikan terakhir masukan ke terbaru panggilan tersebut. Dalam kasus kami ini memberi . mengembalikan input individu sebelumnya , yaitu . mengembalikan input terakhir dari panggilan kedua-terakhir, yaitu ,, dan memberi . Sekarang, berikan . Perhatikan bagaimana input dilewati karena itu adalah satu - satunya input dalam panggilan fungsinya. Terakhir, memberi .5M
28
6M
11
7M
16
8M
12
9M
6
4
10M
5
Untuk keadaan clipboard pada contoh 3:
[[3], [2, 40, 34], [7, 8, 15], []]
1M
memberi3
.2M
memberikan2
,40
,34
.3M
memberikan7
,8
,15
.4M
memiliki perilaku yang tidak terdefinisi (untuk tujuan tantangan ini), karena hanya ada tiga panggilan fungsi.5M
memberi34
.6M
memberi40
.7M
memberi2
.8M
memberi15
.9M
memberi8
,10M
memberi7
.11M
,,12M
... juga memiliki perilaku yang tidak terdefinisi .
Tantangan
Masukan :
- status clipboard, sebagai daftar daftar, atau format wajar lainnya;
- bilangan bulat positif n .
Output : hasil dari fungsi panggilan M
dengan n sebagai input. Output akan berupa satu atau beberapa angka dengan pemisah yang tidak ambigu, atau dalam format apa pun yang masuk akal seperti daftar atau larik.
Klarifikasi:
- Keadaan clipboard terdiri dari empat daftar angka. Beberapa daftar trailing mungkin kosong, seperti dalam contoh 2 dan 3. Jika disukai, Anda dapat memasukkan clipboard tanpa daftar trailing kosong tersebut. Jadi contoh 3 akan menjadi
[[3], [2, 40, 34], [7, 8, 15]]
. - Semua angka di clipboard akan menjadi bilangan bulat positif, mungkin dengan lebih dari satu digit.
- Angka n dijamin valid. Jadi misalnya 3 di atas,
n
tidak bisa4
atau11
.
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
Clipboard state
Number
Output(s)
[[11, 28], [12, 16], [4], []]
2
12, 16
[[11, 28], [12, 16], [4], []]
5
28
[[7, 144], [12], [4, 8], [3, 4, 6]]
1
7, 144
[[7, 144], [12], [4, 8], [3, 4, 6]]
10
4
[[30], [40], [50, 60], [70, 80, 90]]
2
40
[[30], [40], [50, 60], [80, 90]]
7
90
[[15], [30], [2, 3, 5], [4, 5, 10]]
3
2, 3, 5
[[15], [30], [2, 3, 5], [4, 5, 10]]
7
2
sumber
Jawaban:
Jelly , 8 byte
Cobalah online!
sumber
ḊƇ
pilih semua yang bukan lajang,U
mundur danẎ
ratakan. Untuk input[[11, 28], [12, 16], [4], []]
ini didapat[16, 12, 28, 11]
, nilai5M
through8M
. Sekarang tambahkan input asli ke daftar ini⁸;
dan indeks ke daftar yang dihasilkan oleh input lainnya⁹ị
.U
tidak membalikkan hasilḊƇ
, tetapi masing-masing elemen. Hanya jika saya entah bagaimana bisa mengurangiḊƇUẎ⁸;
...Haskell ,
56 5147 byte-5-9 byte terima kasih kepada Laikoni (kecocokan pola untuk memastikan panjang> 1 dan menggunakando
-notation atas daftar pemahaman)!Cobalah online!
Pointfree,
5855 byte-3 byte berkat Laikoni (bergerak
([]:)
dan menggantiid
)!Atau kita bisa menggunakan versi pointfree ini
(!!).(([]:)<>map pure.(>>=reverse).filter((1<).length))
.sumber
APL (Dyalog Unicode) , 17 byte
Cobalah online!
sumber
JavaScript (Node.js) , 57 byte
Cobalah online!
Ini adalah fungsi anonim, kari. Jalankan dengan
( function code )(clipboard)(n)
Penjelasan
sumber
JavaScript (ES6), 72 byte
Mengambil input dalam sintaks currying
(clipboard)(n)
.Cobalah online!
sumber
Python 2 ,
6056 byteterima kasih kepada Jonathan Allan untuk -4 byte.
Cobalah online!
sumber
Java 8, 110 byte
Sebuah lambda (curried) mengambil status clipboard sebagai
int[][]
dan nomor sebagaiint
dan kembaliint
atauint[]
(nomor tunggal dapat dikembalikan melalui kedua jenis).Cobalah secara Online
Tidak disatukan
sumber
05AB1E , 12 byte
Cobalah online!
Penjelasan
sumber
Sekam , 12 byte
Cobalah online!
Penjelasan
Cukup banyak jawaban langsung dari jawaban Haskell:
sumber
R , 58 byte
Cobalah online!
Dibawa
M
sebagailist
vektorc()
; jadi mengganti[[
denganlist(
,[
denganc(
dan]
dengan)
harus mengubah kasus uji menjadi kasus uji R.Untuk input
n<=4
dengan "perilaku tidak terdefinisi", mengembalikanNULL
dan untuk input tidak valid lainnya, melempar kesalahan "subskrip di luar batas".sumber
[n]
daripada[[n]]
.Stax ,
121413 byteJalankan dan debug itu
Penjelasan:
Stax, 12 byte
Dibongkar:
Ini adalah blok, jadi saya bisa menyingkirkannya
]|u
, tapi saya tidak tahu apakah ini valid karena mengemas blok.sumber
J ,
3322 byte-11 byte (1/3 lebih pendek) berkat solusi FrownyFrog!
Cobalah online!
Solusi awal saya:
J , 33 byte
Tidak senang - saya cukup yakin bisa bermain golf lebih jauh.
Penjelasan:
Fungsi diadik, dengan mengambil status clipboard sebagai argumen yang kuat, argumen kiri adalah
n
<:@[
kurangi 1 dari argumen kiri{
memilihi
elemen th (dihitung di atas) dari daftar di sebelah kanannya(...)
seluruh daftar#
salinan]
dari daftar status clipboard(1<#)
sublists dengan panjang lebih besar dari 1|.&.>
putar setiap sublist yang disalin<"0@;
meruntuhkan dan kotak - menempatkan setiap nomor ke dalam kotak terpisah,
tambahkan daftar baru ke daftar status clipboard@]
membuat seluruh kata kerja dalam (...) monadikCobalah online!
sumber
0;
yang paling saya sukai . Terima kasih!V + coreutils ,
53 45 43 4240 byte-9 byte berkat DJMcMayhem (menggunakan
VGÇ /d
lebih:,$g/^[^ ]*$/d
,D@"dd
lebih"aDÀdd
dan!!
lebih:.!
)!Usaha pertama saya di V (tips selamat datang!), Kode di bawah ini menggunakan karakter dilingkari (mis.
ⓞ
Untuk\xf
) untuk keterbacaan:Cobalah online!
Hexdump
Penjelasan
Baris pertama berisi n dan baris di bawah ini berisi entri clipboard, setiap entri dipisahkan oleh spasi jika ada beberapa input:
sumber
Merah , 91 byte
Cobalah online!
sumber
C (gcc) , 176 byte
Cobalah online!
Mengambil array sebagai daftar 4 pasangan pointer mulai / akhir, lalu n.
Deskripsi:
sumber