Urutan persimpangan


11

Melintasi urutan

Diberikan daftar bilangan bulat positif A, sebut itu urutan yang meningkat jika setiap elemen lebih besar atau sama dengan yang sebelumnya; dan menyebutnya urutan menurun jika setiap elemen kurang dari atau sama dengan yang sebelumnya.

Beberapa peningkatan urutan:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

Beberapa urutan menurun:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

Sebuah urutan persimpangan adalah daftar yang dapat didekomposisi menjadi dua subsequences menguraikan, salah satu urutan meningkat dan yang lain urutan menurun.

Misalnya, daftar:

[3,5,2,4,1]

adalah urutan persimpangan, karena dapat diuraikan menjadi:

[3,    4  ]
[  5,2,  1]

di mana [3,4]kenaikan urutan dan [5,2,1]penurunan urutan. Kami akan menyebut pasangan (meningkat, menurun) selanjutnya sebagai dekomposisi dari urutan persimpangan.

Daftar:

[4,5,2,1,3]

bukan urutan persimpangan; tidak ada cara untuk menguraikannya menjadi proses yang meningkat dan menurun.

Tugas Anda adalah menulis sebuah program / fungsi sebagai masukan daftar bilangan bulat positif; dan jika itu adalah urutan persimpangan, kembalikan kedua daftar dalam salah satu dekomposisi; atau nilai "falsey" yang konsisten jika daftar tersebut bukan urutan penyilangan.

Ini adalah ; program / fungsi terpendek dalam setiap bahasa adalah pemenangnya.

Aturan:

  • Input fleksibel.
  • Celah yang biasa dilarang.
  • Jika ada beberapa cara yang valid untuk mendekomposisi input, Anda dapat mengeluarkan satu atau semuanya.
  • Pemformatan output untuk dekomposisi fleksibel; tetapi harus jelas tentang perbedaan antara dua berikutnya.
  • Anda dapat menggunakan nilai output yang konsisten untuk menunjukkan bahwa input bukanlah urutan persimpangan; asalkan tidak ambigu dibandingkan dengan output untuk setiap urutan persimpangan. Anda harus menentukan nilai falsey dalam jawaban Anda.

Kasus uji:

Menggunakan Falseuntuk menunjukkan urutan non-persimpangan:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
Kemungkinan duplikat . Hanya dua perbedaan yang saya lihat adalah bahwa tantangan lain harus dijalankan dalam waktu polinomial dalam panjang input, dan memungkinkan untuk nilai yang jujur ​​alih-alih dua urutan (mengembalikan urutan itu sendiri akan menerima bonus 20%). Masih terdengar seperti penipuan bagi saya, tapi saya tidak akan memalu.
Kevin Cruijssen

Pembatasan waktu @KevinCruijssen mungkin cukup dengan sendirinya untuk tidak menjadikan ini sebagai penipuan.
Nick Kennedy

1
@NickKennedy Mungkin ya, itulah sebabnya saya menahan diri untuk tidak memalu. :)
Kevin Cruijssen

2
Kasus uji yang disarankan: [3, 5, 2, 4, 4, 1, 1]. Kasing uji saat ini membiarkan Anda lolos dengan >=/ <, padahal seharusnya >=/ <=.
Grimmy

1
@Arnauld: Ya, itu bisa berupa nilai apa saja ("falsey" hanya untuk mengatakan: itu salah bahwa inputnya adalah urutan persimpangan).
Chas Brown

Jawaban:


1

05AB1E , 15 14 13 byte

2.Œ.ΔćRšεü@}W

Cobalah secara online atau validasi semua kasus uji .

Penjelasan:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

JavaScript (ES6),  110 105  104 byte

[[decreasing], [increasing]]1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

Cobalah online!

Bagaimana?

n02L.L.

b[0]b[1]sayan

1saya=1-1saya=0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

bsome()


1

Haskell, 84 byte

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

Mengembalikan daftar semua (decreasing,increasing)pasangan yang valid atau daftar kosong jika tidak ada pasangan seperti itu.

Cobalah online!


1

Python 3 , 109 107 byte

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

Cobalah online!

Fungsi ini mencetak semua kemungkinan dekomposisi ke output standar. Jika tidak ada dekomposisi yang mungkin, tidak ada yang dicetak.

Terima kasih kepada @Sriotchilism O'Zaic untuk saran perbaikan.


Selamat datang di situs ini. Saya sarankan melakukan s<i[-1]daripada i[-1]>s dan mirip dengan d[-1]<s , keduanya menghemat satu byte.
Ad Hoc Garf Hunter

Terima kasih untuk sarannya. Saya sudah memperbarui jawabannya. Apakah ada template copy-pastable di sini untuk menerbitkan jawaban?
Joel

Saya tidak yakin apa yang Anda maksud? TIO memiliki templat yang tampaknya sudah Anda gunakan.
Ad Hoc Garf Hunter

Saya hanya membuat tautan di TIO dan menambahkan tautan ke posting saya. Saya tidak menggunakan template apa pun di sana. Dimana itu?
Joel

1
@ Joel - Di bagian atas halaman TIO ada ikon yang terlihat seperti beberapa rantai penghubung. Klik itu, dan kemudian Anda mendapatkan halaman opsi. Salah satunya adalah 'Code Golf Submission'. Itu akan dimasukkan ke dalam buffer salinan Anda hal-hal yang diformat yang Anda inginkan! Selamat datang juga, dan solusi yang bagus!
Chas Brown


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.