Fungsi papan klip: tempel


20

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 7dan 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]]
  • 1Mmengembalikan semua input ke pemanggilan fungsi terbaru. Jadi, untuk contoh dipertimbangkan, memberikan 11, 28.
  • Demikian pula, 2M, 3Mdan 4Mmengembalikan semua masukan untuk yang kedua, ketiga dan keempat fungsi panggilan terbaru. Jadi 2Mmemberi 12, 16; 3Mmemberi 4; dan 4Mmemberikan 5, 6.
  • Angka di luar input individual yang4 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 .5M286M117M168M129M6410M5

Untuk keadaan clipboard pada contoh 3:

[[3], [2, 40, 34], [7, 8, 15], []]
  • 1Mmemberi 3. 2Mmemberikan 2, 40, 34. 3Mmemberikan 7, 8, 15.
  • 4Mmemiliki perilaku yang tidak terdefinisi (untuk tujuan tantangan ini), karena hanya ada tiga panggilan fungsi.
  • 5Mmemberi 34. 6Mmemberi 40. 7Mmemberi 2. 8Mmemberi 15. 9Mmemberi 8, 10Mmemberi 7.
  • 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 Mdengan 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, ntidak bisa 4atau 11.

Aturan tambahan:

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

Bisakah kita mengambil n diindeks 0 ?
Arnauld

3
@Arnauld Saya akan mengatakan tidak, karena ini didasarkan pada perilaku aktual MATL
Luis Mendo

Jawaban:


3

Jelly , 8 byte

ḊƇUẎ⁸;⁹ị

Cobalah online!


2
Apakah Anda keberatan menambahkan penjelasan?
LordColus

@LordColus ḊƇpilih semua yang bukan lajang, Umundur dan ratakan. Untuk input [[11, 28], [12, 16], [4], []]ini didapat [16, 12, 28, 11], nilai 5Mthrough 8M. Sekarang tambahkan input asli ke daftar ini ⁸;dan indeks ke daftar yang dihasilkan oleh input lainnya ⁹ị.
Lynn

@ LordColus Ah, maaf, saya hanya menambahkan penjelasan atas permintaan (karena ninja), tapi saya tertidur. Lynn cukup banyak menjelaskannya, namun saya ingin menambahkan bahwa Utidak membalikkan hasil ḊƇ, tetapi masing-masing elemen. Hanya jika saya entah bagaimana bisa mengurangi ḊƇUẎ⁸;...
Erik the Outgolfer



3

JavaScript (Node.js) , 57 byte

a=>n=>a.map(e=>e[1]&&a.push(...[...e].reverse()))&&a[n-1]

Cobalah online!

Ini adalah fungsi anonim, kari. Jalankan dengan( function code )(clipboard)(n)

Penjelasan

a=>n=>{
    // The strategy is to append the individual clipboard inputs to the end of a,
    // after the function calls (lists). We then return a[n-1] to offset JavaScript's
    // zero indexing.
    a.map(e=>{
        e[1]&& // if this list has more than one element...
            a.push(...[...e].reverse()) // add each element to a, in reverse order.
            // reverse() modifies the original array, so we have to use [...e] to "clone" e
    })
    return a[n-1]
}

2

JavaScript (ES6), 72 byte

Mengambil input dalam sintaks currying (clipboard)(n).

a=>m=>a[m-1]||(g=r=>(r=r|a[k][1]&&a[k].pop())?--m<5?r:g(1):g(!++k))(k=0)

Cobalah online!



2

Java 8, 110 byte

Sebuah lambda (curried) mengambil status clipboard sebagai int[][]dan nomor sebagai intdan kembali intatau int[](nomor tunggal dapat dikembalikan melalui kedua jenis).

s->n->{if(--n<4)return s[n];else{int i=0,l;for(n-=4;(l=s[i].length)<=n|l<2;i++)n-=l>1?l:0;return s[i][l+~n];}}

Cobalah secara Online

Tidak disatukan

s ->
    n -> {
        if (--n < 4)
            return s[n];
        else {
            int i = 0, l;
            for (
                n -= 4;
                (l = s[i].length) <= n | l < 2;
                i++
            )
                n -= l > 1 ? l : 0;
            return s[i][l + ~n];
        }
    }

2

05AB1E , 12 byte

Díʒg<Ā}˜«s<è

Cobalah online!

Penjelasan

D              # duplicate input list
 í             # reverse each
  ʒg<Ā}        # filter, keep only elements that are longer than 1
       ˜       # flatten
        «      # append to original list
         s<    # decrement the second input
           è   # get the element in the list at that index

2

Sekam , 12 byte

!S+(m;ṁ↔f(¬ε

Cobalah online!

Penjelasan

Cukup banyak jawaban langsung dari jawaban Haskell:

!S+(m;ṁ↔f(¬ε  -- example inputs: [[1],[2,3],[4],[5,6,7],[]] 7
 S+           -- concatenate itself with itself modified by
        f(    -- | filter
           ε  -- | | length 1
          ¬   -- | | not
              -- | : [[2,3],[5,6,7],[]]
      ṁ       -- | map and flatten
       ↔      -- | | reverse
              -- | : [3,2,7,6,5]
              -- | map
              -- | | pure
              -- | : [[3],[2],[7],[6],[5]]
              -- : [[1],[2,3],[4],[5,6,7],[],[3],[2],[7],[6],[5]]
!             -- index into it: [2]

2

R , 58 byte

function(M,n)c(M,unlist(lapply(M[lengths(M)>1],rev)))[[n]]

Cobalah online!

Dibawa Msebagai listvektor c(); jadi mengganti [[dengan list(, [dengan c(dan ]dengan )harus mengubah kasus uji menjadi kasus uji R.

Untuk input n<=4dengan "perilaku tidak terdefinisi", mengembalikan NULLdan untuk input tidak valid lainnya, melempar kesalahan "subskrip di luar batas".

function(M,n)
                                        [[n]]	# take the nth element of
c(M,                                   )	# M concatenated with:
    unlist(                           )		# the individual elements of
           lapply(               ,rev)		# in-place reversals of
                  M[lengths(M)>1]		# elements of M with length > 1

Mungkin bisa lolos menggunakan [n]daripada [[n]].
JAD

2

Stax , 12 14 13 byte

àJ├∙ε╝F▀ÿi☻Ia

Jalankan dan debug itu

Penjelasan:

vsc{%vfr$r+@]|u Full program, unpacked, implicit input
vs              Decrement the number and get the list
  c{  f         Copy and filter:
    %v            Length not equal to 1?
       r$r      Reverse, flatten, and reverse again
          +     Concat orig array and and modified array
           @]|u Index, wrap into array, uneval

Stax, 12 byte

Å{b≈\☼╣Δ@░ ‼

Dibongkar:

{vsc{%vfr$r+@}

Ini adalah blok, jadi saya bisa menyingkirkannya ]|u, tapi saya tidak tahu apakah ini valid karena mengemas blok.


2

J , 33 22 byte

-11 byte (1/3 lebih pendek) berkat solusi FrownyFrog!

{0;],|.&.>;/@;@#~1<#&>

Cobalah online!

Solusi awal saya:

J , 33 byte

<:@[{(,[:<"0@;[:|.&.>(1<#)&>#])@]

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

{memilih ielemen 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 (...) monadik

Cobalah online!


@FrownyFrog 0;yang paling saya sukai . Terima kasih!
Galen Ivanov

Itu sepenuhnya solusi Anda, hanya
main golf

2

V + coreutils , 53 45 43 42 40 byte

-9 byte berkat DJMcMayhem (menggunakan VGÇ /dlebih :,$g/^[^ ]*$/d, D@"ddlebih "aDÀdddan !!lebih :.!)!

Usaha pertama saya di V (tips selamat datang!), Kode di bawah ini menggunakan karakter dilingkari (mis. Untuk \xf) untuk keterbacaan:

jäGⓞVGÇ /d
ⓞò!!tr \  \\n|tac
jòHD@"ddjdG

Cobalah online!

Hexdump

00000000: 6ae4 470f 5647 c720 2f64 0a0f f221 2174  j.G.VG. /d...!!t
00000010: 7220 5c20 205c 5c6e 7c74 6163 0a6a f248  r \  \\n|tac.j.H
00000020: 4440 2264 646a 6447                      D@"ddjdG

Penjelasan

Baris pertama berisi n dan baris di bawah ini berisi entri clipboard, setiap entri dipisahkan oleh spasi jika ada beberapa input:

j                        " move to the beginning of the clipboard entries
 äG                      " duplicate the clipboard
   ⓞ                    " <C-o> move cursor to the beginning of the 2nd copy
     VG                  " select everything from cursor to the end of buffer and ..
       Ç /d              " .. delete every line that doesn't contain a space

ⓞ                       " <C-o> move cursor to the beginning of the 2nd copy (now without single arguments)
  ò                   ò  " do the following until the end of buffer
   !!                    "   on the current line execute the shell command
     tr \  \\n           "   replace spaces with newlines
              |tac⮠     "   and reverse the lines
                    j    "   move to next line

H                        " go to the beginning of buffer (where n is)
 D                       " delete n (stores it in register ")
  @"                     " that many times ..
    dd                   " .. remove the line
      j                  " move cursor to next line
       dG                " delete everything from here to the end of buffer


1

C (gcc) , 176 byte

#define p printf("%d ",
int*_,i;f(x,n)int**x;{if(n<5){for(_=x[2*n-2];_-x[2*n-1];++_)p*_);}else{n-=4;for(i=0;i<8;i+=2)if(n&&x[i]+1-x[i+1])for(_=x[i+1];_-x[i]&&n;--_,--n);p*_);}}

Cobalah online!

Mengambil array sebagai daftar 4 pasangan pointer mulai / akhir, lalu n.

Deskripsi:

#define p printf("%d ",  // This gives us the short-hand for printing
int*_,                   // This defines _ as a pointer to int
i;                       // This defines i as an integer
f(x,n)int**x;{           // This defines f as a function taking int **x and int n
                         // NOTE: x is {start, end, start, end, start, end, start, end}
if (n<5) {               // This is for the 1-4 case
  for(_=x[2*n-2];        // Loop _ from the 'end pointer' 
  _-x[2*n-1];++_)        // Until the 'start pointer'
  p*_);                  // Using the short-hand, print *_
}else{                   // This is for the 5+ case
  n-=4;                  // Cut n to improve indexing
  for(i=0;i<8;i+=2)      // Loop over each 'start pointer index'
    for(_=x[i+1];        // Loop _ from the 'end pointer'
        _-x[i]&&n;       // Until the 'start pointer' or n becomes 0
        --_,--n);        // Decreasing n each time
  p*_);}}                // _ now points to the 'correct' index, so print it
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.