Anda harus menulis program atau fungsi yang mengurutkan daftar bersarang. Berikut adalah aturan untuk menyortir daftar bersarang:
Mari kita ambil daftar ini sebagai contoh:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Setiap elemen dalam daftar ini memiliki "prioritas". Elemen dihitung sebagai angka atau sublist. Pertama, dapatkan prioritas setiap elemen pada kedalaman yang sama. Jika suatu elemen hanyalah angka, prioritasnya sama dengan angka itu sendiri. Jika suatu elemen adalah sublist, prioritasnya adalah jumlah dari semua angka di dalamnya, tidak termasuk sub-sub daftar.
Jadi, prioritas semua elemen kedalaman 1 adalah:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Urutkan setiap elemen berdasarkan prioritas. Jika ada dasi, Anda harus menjaga urutan yang sama dengan daftar aslinya.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Ulangi untuk setiap sublist. Demikian pada sublist ini
(2, 1, (3, 4))
Prioritas kami terlihat seperti:
2 1 ( 7 )
(2, 1, (3, 4))
Jadi disortir, sepertinya:
(1, 2, (3, 4))
(3, 4)
sudah diurutkan, jadi kita sudah selesai. Ulangi untuk (5, 2)
yang menghasilkan (2, 5)
dan kita selesai! Daftar terakhir kami adalah:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Aturan:
Sangat meragukan, tetapi untuk berjaga-jaga jika Mathematica memiliki sesuatu untuk ini, tidak ada daftar sortir bawaan yang diizinkan. Fungsi menyortir biasa yang diperbolehkan.
I / O dapat dalam format apa pun yang masuk akal.
Setiap sublist akan berisi setidaknya satu nomor atau daftar. Juga, sublists dapat disarangkan beberapa level. Sebagai contoh, di
(1, 2, (((3))))
dalam(((3)))
memiliki prioritas 0, karena hanya memiliki sublists di dalamnya.Daftar yang tidak valid (tanda kurung yang tidak cocok, non-angka, tipe braket yang salah, angka negatif, dll.) Menghasilkan perilaku yang tidak terdefinisi.
Tes I / O:
(1, 2, 3) ---> (1, 2, 3)
(1, 2, 6, 3, 9, 8) ---> (1, 2, 3, 6, 8, 9)
(4, 3, (2), (1)) ---> ((1), (2), 3, 4)
(4, 3, (2), ((1))) ---> (((1)), (2), 3, 4)
(5, (1, 2, (9, 8))) ---> ((1, 2, (8, 9)), 5)
(3, (1, 2), (2, 1)) ---> (3, (1, 2), (1, 2))
(3, (1, 2, (99)), (2, 1, (34))) ---> (3, (1, 2, (99)), (1, 2, (34)))
(7, 2, (1, (9, 12)), (4, 3, 2, (1, 2))) ---> ((1, (9, 12)), 2, 7, (2, 3, (1, 2), 4))
Jawaban terpendek dalam byte menang.
sumber
Jawaban:
Jelly, 13 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
Membandingkan (
<
) angka dengan dirinya sendiri menghasilkan 0 (falsy), tetapi membandingkan daftar yang tidak kosong dengan dirinya sendiri menghasilkan daftar 0 (benar), sehingga<
dapat digunakan untuk membedakan angka dari daftar.sumber
Python 2,
114101787362 byteSaya tahu ada cara yang lebih baik untuk menyaring daftar.
Mengurutkan daftar python (dan sublistinya) di tempat.
https://eval.in/540457 terima kasih @tac karena memberi tahu saya bahwa solusi di tempat dapat diterima, dan @xnor + @feersum untuk optimasi lebih lanjut!
sumber
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
dari itu, 5. Kemudian di kondisional, kita mengurutkan daftar yang kita iterasi (!), Jadi ketika kita ambil z berikutnya adalah JUGA 5, mengarah ke jumlah 10. Kami kemudian mengurutkan daftar luar dengan tombol-tombol ini dan mendapatkan [6, [1, 5]], yang tidak benar sebagai "Jika ada dasi, Anda harus menjaga urutan yang sama dengan daftar asli. " Yang menarik adalah kita memanggilsort
kedua daftar dua kali, jadi ini hanya terjadi pada kunci yang sama: jika sublist kurang maka akan mengurutkan kembali.None
outputt.sort(key=k)
, tapi saya tidak melihatnya.False
adalah 0 untuk keperluan+
dan dengan ekstensisum
,. Tidak dapat memikirkan bagaimana cara menghemat byte.list.sort
kembaliNone
, tidakFalse
.Lua, 172 byte
Fungsi
s
mengurutkan tabel Lua (struktur data yang berfungsi sebagai daftar di antara hal-hal lain di Lua) di tempat sesuai dengan aturan.sumber
type(a)
mengembalikan stringMathematica, 50 byte
Metode rekursif sederhana yang digunakan
SortBy
. Abaikan pesannya.sumber
Haskell,
160151135 byteMasalah pertama adalah daftar bersarang. Haskell mensyaratkan bahwa semua elemen daftar memiliki tipe yang sama; khususnya, bilangan bulat dan daftar bilangan bulat tidak bertipe sama. Dengan kata lain, daftar bersarang variabel bukanlah daftar, itu adalah pohon mawar!
Jadi pertama-tama, kita harus mendefinisikan tipe data untuk pohon mawar:
(Strictly,
deriving Show
hanya diperlukan jika Anda ingin melihat hasil. Tapi itu masalah teknis.) Dengan definisi ini di tempat, kita dapat menulis daftar seperti(1, 2, (3, 4))
sebagaiyang jauh lebih mudah dibaca. Tapi apa pun; itu adalah terjemahan mekanis yang sepele. Awali setiap angka dengan
N
dan setiap subtree denganT
.Sekarang kita perlu menghitung prioritas. Ini akan mudah jika prioritas subtree adalah jumlah sederhana semua elemen yang dikandungnya. Itu akan menjadi loop rekursif sepele. Tetapi karena tidak, kita perlu mendefinisikan dua fungsi: satu yang berulang, dan yang lain tidak.
Jika kita menjumlahkan semua subelemen, maka
q
tidak perlu ada, menyimpan sejumlah besar karakter. Baiklah!Edit: Sebenarnya, beberapa komentator menunjukkan bahwa Anda dapat menghindari
q
menggunakan pemahaman daftar:[ x | N x <- t]
. Panggilan bagus, kawan!(Pada kenyataannya,
p
tidak perlu ada juga; kita dapat membuat kompiler menghasilkan otomatis sebuahOrd
contoh untuk kita dalam beberapa karakter, dan implementasi default ini akan cocok dengan spek.)Akhirnya, kita perlu rekursif atas semua sub-pohon dan mengurutkannya:
Yaitu,
f
mengurutkan pohon dengan secara rekursif menerapkan sendiri ke semua elemen (map f
), dan kemudian memanggilsortBy
fungsi untuk mengurutkan tingkat atas. Baris pertama mengatakan bahwa menyortir angka tidak melakukan apa-apa, dan perlu untuk mengakhiri rekursi.sumber
sortBy (\ x y -> compare (p x) (p y))
hanyasortOn p
. Gunakan versi infiks dari peta dip
:sum$q<$>t
.sortOn
didefinisikan? Saya selalu ingin tahu ...p(T t)=sum[x|N x<-t]
dandata T=N Int|T[T]deriving Show
. :)$
disum$[x|N x<-t]
. Jadi, 135-5-1 = 129. :)CLISP, 380 byte
Panggil fungsi q dengan daftar.
Saya seorang pemula, tolong jangan bunuh saya ^^
sumber
Pyth, 15 byte
Suite uji
Fungsi rekursif, yang berfungsi sebagai berikut:
sumber
Java, 219 byte
Dengan jeda baris:
Ada banyak casting yang benar-benar menghitung jumlah byte. : P
Nilai integer dimasukkan ke dalam Comparator, dan daftar bersarang diurutkan terlebih dahulu sebelum jumlah hanya nilai integer yang diberikan kepada Comparator. Nilai-nilai ini adalah bagaimana Pembanding menentukan posisi mereka di dalam daftar ketika diurutkan.
Coba di sini .
sumber
int f(List l){l.sort(Comparator.comparing(o->o instanceof Integer?(int)o:f((List)o)));return l.stream().mapToInt(o->o instanceof Integer?(int)o:0).sum();}
Object
menjadiint
seperti itu, dan tantangannya tampaknya mengharuskan daftar adalah output.JavaScript (ES6), 86 byte
Semua itu memeriksa array :-(
sumber
map.map.map.map.map.map.map.map.map