Katakanlah saya memiliki daftar seperti [3, 0, 4, 2, 1]
, dan saya menggunakan pilihan untuk mengurutkannya, saya dapat memvisualisasikannya seperti ini:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Tantangan ini adalah tentang memvisualisasikan penyortiran seperti ini.
Memasukkan
Input Anda akan menjadi daftar bilangan bulat positif, dalam format apa pun yang Anda suka.
Tugas
Kiriman Anda harus mengurutkan daftar input dengan hanya menukar dua elemen sekaligus, dan pada setiap swap, kiriman harus menampilkan daftar, dan karakter di bawah setiap elemen yang ditukar. Jika angka yang ditukar memiliki lebih dari satu digit, karakter dapat berada di bawahnya. Pada akhirnya, pengiriman harus menampilkan daftar yang diurutkan.
Aturan lainnya
- Penyortiran harus menggunakan swap yang lebih sedikit daripada n 4 , di mana n adalah panjang daftar.
- Penyortiran tidak harus bersifat deterministik.
- Karakter di bawah swapped dapat berupa karakter apa saja kecuali spasi.
n^4
? Anda sedikit bermurah hati di sini.0
(tolong perbaiki contoh saja agar tidak membatalkan jawaban yang tidak dapat menangani 0)Jawaban:
Perl, 62 byte
Termasuk +3 untuk
-p
Berikan input sebagai satu baris angka di STDIN:
Berulang kali bertukar inversi pertama. Kompleksitas swap adalah
O(n^2)
, kompleksitas waktuO(n^3)
. Menggunakan nomor yang ditukar sebagai tanda:visisort.pl
:Program ini juga mendukung nilai negatif dan angka floating point
Jika Anda bersikeras pada karakter yang menghubungkan kode menjadi 66 byte:
Tapi sekarang itu tidak mendukung angka negatif dan 0 lagi (tetapi program ini hanya harus mendukung bilangan bulat positif. Dalam
0
contoh ini adalah kesalahan)sumber
The characters under the swapped can be any char except space.
Anda tidak boleh memiliki spasi di antara angka di garis tanda_
bawah angka pertama yang berarti bahwa semua karakter di antara sebenarnya akan spasi). Jadi saya mendukung interpretasi saya (kecuali OP tentu saja tidak setuju). Buit hanya untuk membuatmu senang, aku juga menambahkan versi tanpa spasi :-)JavaScript (ES6), 158 byte
Semacam gelembung. Output sampel:
sumber
-
bawah,
dan kemudian dua|
s akan selalu berada di bawah angka yang berdekatan.PHP, 248 Bytes
Bubblesort menang membosankan
PHP, 266 Bytes dengan cara array_slice dan min
hasil modifikasi
I X
bukan*~~*
282 Bytes
Bagaimana itu bekerja
Mencari minimum dalam sebuah array dan mengambil ini di posisi pertama Cari minimum tanpa posisi pertama .... dan seterusnya Jika nilainya dua kali lipat nilai pertama akan swap
Contoh Keluaran
sumber
echo$t."\n";
, Anda dapat menggunakanecho"$t\n";
dan menyimpan byte.Haskell,
165164162 byteIni memvisualisasikan jenis seleksi. Contoh penggunaan:
Bagaimana itu bekerja:
s % c
adalah fungsi pembantu yang membuatlength (show s) - 2
salinan karakterc
. Ini digunakan untuk spasi sebelum keduanya|
, satu kali denganc == ' '
dan satu kali denganc == '-'
.Fungsi utama
#
mengambil daftarp
yang merupakan bagian yang diurutkan dari daftar danx
yang merupakan bagian yang belum diurutkan. Pencocokan pola(h,t:s)<-span(/=minimum x)x
membagi daftarx
pada elemen minimum dan mengikath
ke bagian sebelum minimum,t
ke minimum itu sendiri dans
ke bagian setelah minimum. Sisanya memformat dua baris: 1) daftar pada keadaan saat ini (p++x
) dan 2)|----|
bagian diikuti oleh panggilan rekursif#
dengant
ditambahkan kep
dan kepalah
dimasukkan di antara ekorh
dans
.PS: berfungsi juga dengan angka negativ dan / atau floating point:
Edit: @BlackCap menyimpan 2 byte. Terima kasih!
sumber
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 byte
Ia bekerja dengan desimal dan angka negatif juga.
Contoh:
sumber
JavaScript (ES6), 147
155Menggunakan n * n membandingkan, tetapi (saya percaya) jumlah minimum swap. Dan posisi swap lebih bervariasi dibandingkan dengan jenis bubble yang membosankan.
Kurang golf dan mudah-mudahan lebih bisa dimengerti
Uji
sumber
Java 7,
256 241282 BytesTerima kasih kepada @Geobits dan @Axelh untuk menghemat 15 byte
Tidak disatukan
keluaran
sumber
out
, Anda harus meletakkan sesuatuPrintStream out=System.out;
di suatu tempat dalam kode Anda.out
, Anda harus menggunakan ternary alih-alihif/else
jika Anda akan mencetak pada kedua cabang. Sesuatu sepertiout.print(a>b?a:b);
bukannyaif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
atau bahkan lebih baik dengan ternaryout.print((j==i|j==m?a[j]:" ")+" ");
dan kemudian Anda dapat menghapus {} dari loop PS: Saya menggunakan impor statis untuk contoh keluar, jika itu ok;)System.
di depanout
s), dan itu hilang2
dan3
pada dua swap-baris terakhir.for(j=0;j<=m&i!=l-1;j++)
Jelly , 36 byte
Cobalah online!
Penjelasan
Contoh yang ditunjukkan dalam tautan TIO adalah yang paling sulit untuk program ini; yang
;0
dekat awal diperlukan untuk memastikan bahwa loop berakhir hanya pada titik di mana input menjadi diurutkan. Ini biasanya tidak perlu (karena akan berakhir setelah satu iterasi lagi), tetapi jika swap terakhir adalah dari dua elemen pertama (seperti yang terlihat di sini), iterasi satu-lebih tidak akan terjadi dan membuat tidak mungkin untuk menyelesaikan daftar secara konsisten. Karena itu, kita perlu memastikan bahwa kita tidak menukar apa pun pada iterasi loop terakhir.sumber