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
Chas Brown
sumber
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)
Grimmy
sumber
1

Jelly , 12 byte

ŒPżṚ$ṢNÞƭ€ƑƇ

Cobalah online!

Erik the Outgolfer
sumber
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()

Arnauld
sumber
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!

nimi
sumber
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.

Joel
sumber
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
0

Brachylog , 17 byte

;Ṣzpᵐz{ℕˢ}ᵐ≤₁ʰ≥₁ᵗ

Cobalah online!

Mungkin ada ruang yang cukup untuk bermain golf ini.

String yang tidak terkait
sumber
2
Anda telah menjawab tantangan ini sebelumnya di sini , di mana Anda melakukannya dalam 16 byte. ;)
Kevin Cruijssen
Saya tidak bisa menghilangkan perasaan bahwa ada sesuatu yang serupa yang telah saya lakukan, tetapi untuk beberapa alasan, pikiran saya memutuskan untuk melakukan ini sebagai gantinya
Unrelated String
0

Python 2 , 147 byte

def f(a):
 for i in range(2**len(a)):
	x=[];y=[]
	for c in a:[x,y][i&1]+=[c];i/=2
	if x==sorted(x)and y[::-1]==sorted(y[::-1]):return x,y
 return 0

Cobalah online!

Chas Brown
sumber