Terinspirasi oleh pertanyaan ini :
Buat fungsi (atau program lengkap) yang menerima daftar angka dan output daftar disusun ulang, sehingga nomor genap diindeks muncul terlebih dahulu, dan nomor diindeks ganjil mengikuti. Nilai angka-angka itu sendiri tidak mempengaruhi pemesanan - hanya indeks mereka yang melakukannya. Semua indeks berbasis nol.
Sebagai contoh:
Memasukkan: [0, 1, 2, 3, 4]
Keluaran: [0, 2, 4, 1, 3]
Contoh lain:
Memasukkan: [110, 22, 3330, 4444, 55555, 6]
Keluaran: [110, 3330, 55555, 22, 4444, 6]
Gunakan sebagian besar representasi alami untuk daftar yang dimiliki bahasa Anda. Tidak ada batasan kompleksitas (mis. Mengalokasikan daftar sementara tidak masalah - tidak perlu melakukannya di tempat).
PS Ini harus bekerja untuk daftar kosong (input kosong => output kosong).
sumber
Jawaban:
Japt , 1 byte
Cobalah online!
sumber
Python, 23 byte
Cobalah online
sumber
lambda
? Mengapa tidakmu
ataunu
? : Plambda
denganλ
dan mengurangi jumlah byte sebanyak 5! : PPyth, 5
Cobalah online , atau jalankan Test Suite
Penjelasan
sumber
CJam, 7 byte
Menekan blok (hal terdekat ke fungsi yang tidak disebutkan namanya) yang mengubah elemen tumpukan atas sesuai kebutuhan.
Uji di sini.
Penjelasan
Penjelasan mengasumsikan bahwa bagian atas tumpukan adalah array
[0 1 2 3 4]
. Nilai aktual tidak memengaruhi perhitungan.sumber
Labyrinth ,
2825242322 byteIni sangat menyenangkan! :) Itu adalah program Labirin yang paling padat yang saya tulis sejauh ini. Saya memiliki begitu banyak versi pada 20 dan 21 byte yang hampir berfungsi sehingga saya masih meragukan ini optimal ...
Ini mengambil input sebagai daftar bilangan bulat positif (dengan pembatas arbitrer), dan mencetak hasilnya ke STDOUT sebagai bilangan bulat yang dibatasi linefeed.
Perburuan untuk 20/21 byte: Saya telah memeriksa semua program formulir
di mana
X
ada karakter yang masuk akal dengan kekerasan, tetapi tidak menemukan solusi yang valid Tentu saja itu tidak berarti bahwa solusi yang lebih pendek tidak ada, tetapi itu tidak mungkin untuk memaksa program 20-byte tanpa jumlah asumsi yang layak pada strukturnya.Penjelasan
(Penjelasannya agak ketinggalan jaman, tapi saya masih tidak yakin solusinya optimal, jadi saya akan menunggu dengan memperbarui ini.)
Jadi, biasanya program Labirin seharusnya terlihat seperti labirin. Sementara penunjuk instruksi berada di koridor, itu akan mengikuti koridor itu. Ketika IP mencapai segala jenis persimpangan, arah ditentukan berdasarkan nilai teratas tumpukan utama Labyrinth (Labyrinth memiliki dua tumpukan, dengan jumlah nol yang tak terbatas di bagian bawah). Itu biasanya berarti bahwa setiap loop non-sepele akan cukup mahal, karena jika Anda memiliki sel-sel non-dinding di semua tempat semuanya adalah persimpangan, dan dalam kebanyakan kasus bagian atas tumpukan tidak akan memiliki nilai yang tepat untuk IP untuk mengambil jalan yang Anda inginkan. Jadi apa yang Anda lakukan adalah memperbesar loop sehingga mereka memiliki keseluruhan di tengah dengan hanya satu titik masuk dan keluar yang ditentukan masing-masing.
Tapi kali ini aku benar-benar beruntung dan semuanya cocok satu sama lain, sehingga aku bisa meremasnya menjadi satu rumpun besar. :)
Aliran kendali dimulai dari
_
Selatan yang sedang berjalan. The_
mendorong nol ke stack utama. Itu mungkin tampak seperti no-op, tetapi ini meningkatkan kedalaman stack (non-implisit)1
yang akan kita butuhkan nanti.?
membaca bilangan bulat dari STDIN. Jika tidak ada lagi bilangan bulat untuk dibaca, ini mendorong nol. Dalam hal ini, IP terus bergerak ke Selatan dan segera@
menghentikan program (karena daftar input kosong). Kalau tidak, IP berubah menjadi Timur.Kami sekarang memasuki lingkaran yang sangat ketat dengan dua titik keluar:
!
mencetak bilangan bulat kembali ke STDOUT, hanya menyisakan nol pada tumpukan. IP terus bergerak ke Timur, dan?
membaca bilangan bulat berikutnya. Jika itu bukan nol, kita ambil kanan dan bergerak ke Selatan.?
membaca yang lain (indeks genap berikutnya). Sekali lagi, jika itu bukan nol, kita ambil kanan dan bergerak Barat.Kemudian
\
mencetak umpan baris tanpa mengubah tumpukan, jadi kami ambil kanan lagi, bergerak ke Utara.!
mencetak bilangan bulat bahkan indeks berikutnya. Karena sekarang ada setidaknya satu integer indeks ganjil (positif) pada stack, kami terus berbelok ke kanan dan loop berulang.Begitu salah satu dari mereka
?
mencapai akhir daftar, mereka menekan nol dan bergerak langsung ke yang sesuai;
, yang membuang nol itu.Dalam hal hanya ada satu elemen dalam daftar, kita sudah selesai (karena kita sudah mencetaknya segera), sehingga IP akan terus bergerak ke Timur hingga ke
@
, lagi-lagi mengakhiri program (mencetak trailing linefeed di jalan).Kalau tidak, kita perlu mencetak bilangan bulat indeks ganjil juga. Dalam hal ini dua jalur (dari dua titik keluar dari loop pertama) bergabung di tengah
"
, berbelok ke Timur dalam kedua kasus._
mendorong nol untuk menghindari mengambil kiri ke dalam@
, dan;
membuang nol itu. Sekarang kita masuk ke loop baru:IP memasuki ini di sel kiri bawah, bergerak ke utara, berputar di sekitar searah jarum jam. The
}
menggeser atas tumpukan utama ke tumpukan tambahan. Meskipun masih ada elemen di stack, IP terus melakukan tugasnya. Setelah semuanya telah bergeser ke tumpukan bantu (dan terbalik dalam proses), IP terus bergerak ke Timur sebagai gantinya, memasuki loop terakhir:\
mencetak linefeed lagi,{
memindahkan item dari tumpukan tambahan kembali ke utama. Jika itu masih merupakan item dari daftar, itu akan menjadi positif, dan IP berbelok ke Selatan, di mana item tersebut dicetak!
. Kemudian#
dorong kedalaman tumpukan (dan sekarang inilah awal_
yang penting, karena ini#
memastikan kedalaman tumpukan positif), sehingga IP masih berbelok ke kanan, melewati\
dan{
lagi.Setelah kami mencetak semuanya,
{
menarik nol dari bagian bawah tumpukan tambahan, IP melanjutkan ke Timur, dan@
menghentikan program.sumber
MATLAB, 24
mirip dengan yang python.
Terima kasih @LuisMendo karena telah menghemat 2 byte!
sumber
@(x)x([1:2:end 2:2:end])
Haskell , 37 byte
Cobalah online!
The
foldr
rekursif membangun daftar bahkan dan daftar aneh. Menambahkan elemen ke daftar diperbarui dengan menambahkannya ke daftar ganjil dan menyebutnya daftar genap baru, dan memanggil daftar genap sebelumnya daftar ganjil baru. Kemudian, pasangan[l,r]
didekati untukl++r
.Terima kasih kepada Ørjan Johansen karena menyimpan 5 byte menggunakan daftar dua elemen sebagai ganti tuple.
42 byte:
Tambahkan indeks ke daftar
l
dan filter baik yang genap atau yang ganjil.Namun format lain, untuk 44. Fungsi ini
g
mengambil setiap elemen bahkan diindeks. Indeks ganjil didapat dengan menjatuhkan elemen terlebih dahulu, lalu menerapkannyag
. Kalaul
dijamin non-kosong, kita bisa aman melakukannyatail
untuk 41sumber
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
denganf
menjadi fungsi utama.concat
bukannya tupel danuncurry(++)
.PowerShell v3 +,
75674947 byteCobalah online!
Diharapkan input melalui splatting, seperti yang ditunjukkan pada tautan TIO.
Membuat matriks
$l
sebagai array array, lalu menyalurkan input$args
ke dalam sebuah loop|%{}
. Setiap kali melalui loop, kita menambahkan elemen ke salah satu dari dua array anak$l
dengan membalik$f
variabel menggunakan logika Boolean. Pertama kali melalui,$f
adalah$null
, yang!
mana$true
, atau1
saat pengindeksan ke dalam array. Ini berarti elemen pertama dimasukkan ke dalam array kedua$l
, jadi itu sebabnya$l[1]
mendapat output pertama.Props to TessellatingHeckler untuk bantuan golf dan variasi ini.
-2 byte berkat mazzy.
Peringatan
Secara ketat seperti pertanyaan yang ditulis, ini secara teknis tidak valid, karena PowerShell tidak memiliki konsep "daftar" sebagai objek pseudo-abadi, hanya array atau tabel hash (alias kamus). Jadi, saya memperlakukan baris pertanyaan " Gunakan representasi paling alami untuk daftar yang bahasa Anda miliki " sebagai bertanya tentang array, karena itulah PowerShell terdekat. Selain itu, output adalah satu elemen per baris, karena itulah cara PowerShell default untuk menulis sebuah array. Ini berarti input dari
(0,1,2,3,4)
output akan0\r\n2\r\n4\r\n1\r\n3\r\n
.sumber
$args
+ splatting bukan$input
dan,@()*2
bukan@(),@()
F #,
797756Berdasarkan salah satu jawaban Haskell
Kami pertama-tama mengindeks daftar, kemudian mempartisi dengan kriteria: item pertama (indeks) dan anded dengan 1 sama dengan 0.
Itu memberi kita sepasang daftar pasangan; daftar pertama akan berisi semua acara indeks dan yang lainnya peluang diindeks.
Dari situ kita rangkai kembali dua daftar dengan append operator dan akhirnya buang indeksnya.
Sunting: tidak terjawab jelas tidak perlu memberi nama arg "xs" (kebiasaan) sehingga dapat direduksi menjadi nama 1 huruf
Saya juga memiliki 76 byte potensial yang pada dasarnya sama tetapi didefinisikan sebagai komposisi fungsi. Masalahnya adalah itu tidak dikompilasi sebagai nilai tetapi secara efektif akan bekerja dengan argumen daftar yang diberikan begitu tidak yakin apakah itu ok atau tidak:
Catatan: List.indexed hanya tersedia dari F # 4.0 meskipun belum didokumentasikan dalam MSDN
sumber
fun
, bukan?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Dengan asumsi|>
dalam F # kira-kira sama dengan operator umpan ke kanan==>
di Perl 6. Saya juga hanya menebak apa yangfst>>(&&&)1>>(=)0
dilakukanJavaScript (ES6), 52 byte
Itu juga melakukannya dalam satu pass
Tampilkan cuplikan kode
sumber
F=
dari awal; Anda dapat menyimpan byte dengan menggunakan ini:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 byte
sumber
J, 8 byte
Ini adalah kata kerja monadik (satu argumen), digunakan sebagai berikut:
Penjelasan
sumber
/:0:`1:\
yang juga 8 byte.Jelly , 4 byte
Cobalah online!
Berdasarkan jawaban CJam dari Martin
sumber
Mathematica, 40 byte
{}[[2;;;;2]]
akan melempar kesalahan.sumber
Burlesque, 12 Bytes
Penggunaan seperti pada:
Penjelasan:
Meskipun setelah pembaruan baru dirilis, Anda dapat melakukan ini dengan built-in Unmerge baru (yang melakukan kebalikan dari gabungan
**
built-in):sumber
Perl,
3533 byte31 byte + 2 byte untuk
-ap
. Membaca string yang dibatasi ruang dari STDIN:Ketika input kosong, mencetak satu ruang, yang saya anggap setara dengan daftar kosong. Jika tidak, dapat diperbaiki dengan biaya 4 byte dengan:
(membutuhkan Perl 5.10+, mencetak baris tambahan)
atau dengan biaya 5 byte dengan:
(tanpa spasi spasi tambahan)
Bagaimana itu bekerja
Solusi ini menggunakan
-a
flag, yang membagi input pada spasi putih dan menempatkan hasilnya dalam@F
array.Keajaiban nyata terjadi di
push
:The
$|
variabel biasanya digunakan untuk memaksa output pembilasan, tetapi memiliki properti lain yang menarik: ketika dikurangi berulang kali, matikan nilainya antara 0 dan 1.Mengambil keuntungan dari fakta bahwa tidak ada batasan pada pengidentifikasi yang ditentukan melalui dereferencing simbolik , kami secara bergantian mendorong elemen array ke array
@0
dan@1
, sehingga@0
berakhir dengan semua elemen bahkan diindeks dan@1
dengan peluang. Kemudian kita cukup menggabungkan array yang dirangkai untuk mendapatkan hasil.sumber
C, 70
Tidak ada yang istimewa, hanya fungsi pemetaan indeks.
Kurang golf
sumber
Pyth, 8 byte
Relatif sederhana
sumber
Vitsy, 22 Bytes
Vitsy benar - benar tidak dibuat untuk melakukan ini ...
sumber
Perl 6 , 25 byte
Ini adalah lambda terpendek yang bisa kutemukan.
sumber
Minkolang 0,12 , 15 byte
Coba di sini.
Penjelasan
sumber
R, 49 byte
Sebut saja sebagai q (bla). Atau, jika x sudah berisi daftar untuk disusun ulang, maka
hanya 35 byte.
sumber
F #, 64
Terinspirasi oleh jawaban Sehnsucht (tetapi tidak cukup perwakilan untuk berkomentar).
Memetakan setiap nilai ke tuple di mana entri kedua adalah modulo dari indeks daftar, mengurutkan berdasarkan modulo, lalu memetakan kembali ke nilai aslinya.
sumber
Prolog, 103 byte
Contoh
sumber
bash dan GNU coreutils, 68 byte
Kami berasumsi bahwa daftar ini dipisahkan oleh baris baru dan diteruskan dengan input standar.
Sayangnya ini akan mengabaikan input di luar indeks 1999, sehingga tidak cukup memenuhi spesifikasi.
Itu juga clobbers file sementara hardcoded ('x'), yang bisa bermasalah jika dijalankan secara paralel, dan itu tidak menghapusnya setelah itu. Maaf soal itu!
sumber
PHP,
7869 bytePHP dapat melakukan chunk dan slice, tetapi bukan array interleave; yang membuat ini agak tebal:
Panggil dengan referensi atau coba online .
pendekatan pertama (program untuk 78 byte):
mencetak koma terkemuka; masukkan
[!$i]
sebelum yang pertama$argv
untuk menghapusnya.Dua solusi 78 byte lainnya (cetak koma depan dan belakang):
Jalankan dengan
php -nr '<code>' <arguments>
atau coba onlinesumber
Japt , 3 byte
Cobalah
Cobalah
sumber
Clojure / ClojureScript, 52 byte
Ditulis dalam REPL ClojureScript, juga harus Clojure valid.
sumber
K, 10 byte
Berdasarkan jawaban Pyth 5-byte.
sumber
Hassium , 191 Bytes
Yang ini cukup panjang :(
Bunyinya array dari args, jadi jalankan ini dengan
hassium file.has 0 1 2 3 4
Jalankan dan lihat diperluas dengan test case di sini
sumber