pengantar
Sebuah antrian adalah jenis data abstrak di mana unsur-unsur yang ditambahkan ke depan (enqueue) dan dihapus dari belakang (dequeue). Ini juga dikenal sebagai prinsip FIFO (First In First Out) .
Paling baik ditunjukkan dengan contoh:
Tantangan
Diberikan array yang tidak kosong yang berisi bilangan bulat positif dan elemen yang menunjukkan dequeue (menghapus elemen), menampilkan daftar akhir antrian.
Katakanlah itu X
menunjukkan dequeue dalam contoh ini. Mari kita lihat daftar berikut:
[45, X, X, 37, 20, X, 97, X, 85]
Ini dapat diterjemahkan ke kode antrian-pseudo berikut:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Anda dapat melihat bahwa pada akhirnya, hasilnya adalah [85, 97]
, yang merupakan output untuk urutan ini.
Uji kasus
Perhatikan bahwa Anda dapat memilih simbol atau karakter lain apa pun X
, asalkan bukan bilangan bulat positif.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
Ini adalah kode-golf , jadi pengiriman dengan jumlah byte paling sedikit menang!
Jawaban:
Jelly , 8 byte
Menggunakan nilai falsy ( 0 atau kosongkan iterable) ke dequeue.
Cobalah online!
Bagaimana itu bekerja
sumber
Python 2,
565350 byteCobalah secara Online!
Dequeue adalah
-1
. Trik ini memungkinkan irisan pythonic yang mudah dari antrian.sumber
Mathematica, 102 byte
Jelas bukan solusi terpendek, tapi saya tidak bisa menolak karena itu agak menyimpang.
Setelah beberapa fungsi pembantu, ini mendefinisikan fungsi murni yang mengambil string sebagai input: dalam string, angka dipisahkan dengan koma (spasi putih adalah opsional); karakter dequeue adalah
"]"
; dan daftar tidak memiliki pembatas di bagian depan atau belakang. Misalnya, contoh pertama dalam OP adalah input sebagai string"45,],],37,20,],97,],85"
. Output dari fungsi adalah daftar angka.Fungsi menghitung berapa banyak dequeues
"]"
dalam string input, menambahkan banyak salinan"f["
ke bagian depan string, dan kemudian mengelilingi semuanya"r[...]"
. Dalam contoh di atas, ini menghasilkan"r[f[f[f[f[45,],],37,20,],97,],85]"
; perhatikan tanda kurung seimbang.Kemudian,
ToExpression
tafsirkan string yang dihasilkan sebagai bagian dari kode Mathematica dan jalankan. Fungsif
mudah didefinisikan untuk mempertahankan semua argumen kecuali yang pertama (dan juga mengabaikan koma tertinggal; ini diperlukan untuk menangani antrian kosong dequeueing tetap), danr
mengubah urutan angka yang dihasilkan menjadi daftar angka dalam urutan yang benar.sumber
b___,
dimaksudkan untuk berada di sana? Ini berfungsi , tetapi koma berubah merah karena itu. (juga, apa perbedaan antara garis 2 dan 3?)f[a_,b___]:=b
(tanpa koma), sedangkan baris 3 setara denganf[a_,b___,Null]:=b
. Dalam kedua kasus,b___
mengacu pada sejumlah argumen (termasuk tidak ada sama sekali). Jalur 3 lebih spesifik, jadi selalu digunakan sebelum jalur 2 jika perlu. Jadi fungsif
mengabaikan argumen pertama, dan juga mengabaikan argumen terakhirnya jika argumen ituNull
. Ini diperlukan untuk menangani antrian yang kosong. Perhatikan bahwa input tipikal akan menghasilkan ekspresi sepertir[f[f[f[5,3,],2,],],11]
, di mana setiap koma sebelumnya]
menunjukkan aNull
.Retina , 30 byte
Cobalah online!
Secara berulang menghapus angka pertama yang (tidak harus segera) diikuti oleh yang
X
bersama - sama dengan ituX
, atauX
di awal string. Kemudian membalikkan angka yang tersisa.sumber
JavaScript,
7063535043 byteTerima kasih @Neil untuk bermain golf 10 byte dengan x.map alih-alih untuk ekspresi loop dan ternary
Terima kasih @Arnauld untuk bermain golf 3 byte
Terima kasih @ETHproduk untuk bermain golf 7 byte
Cobalah online!
Dequeue dapat berupa nilai non-numerik selain true.
sumber
if
pernyataan, dan lebih pendek lagi jika Anda menggunakanmap
bukan loop, dan bahkan lebih pendek lagi jika Anda menggunakan ekspresi bukan blok. Lihat tipsnya .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
untuk menyimpan beberapa byte padareturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
bahkan lebih pendek.a?
cukup, saya kira?)Mathematica,
4645 byteTerima kasih kepada ngenisis karena telah menghemat 1 byte.
Pada dasarnya sama dengan jawaban Retina saya, menggunakan pencocokan pola. Kami berulang kali mencocokkan yang pertama
X
dan menghapusnya bersama dengan angka pertama (jika ada). Setelah selesai, kami membalik daftar.sumber
Pure Bash, 72
Input diberikan sebagai parameter baris perintah.
Cobalah online .
sumber
Haskell, 41 byte
sumber
x&(y:z)
MATL ,
1312 byteInput adalah array angka, dengan
0
untuk "dequeue".Output adalah angka yang dipisahkan oleh spasi. Hasil kosong ditampilkan sebagai tidak ada.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
sumber
Haskell,
4140 BytesFungsi
foldl(#)[]
(Termasuk dalam bytecount dengan byte pemisahan di antaranya)Cobalah online!
X adalah bilangan bulat non-positif
EDIT: -1 byte terima kasih kepada nimi
sumber
|l>[]=init l|1>0=l
Julia,
78767357 byteTerima kasih kepada Harrison Grodin untuk beberapa saran golf Julia yang bagus. Diganti jika / selain dengan ternary dan for / end dengan daftar pemahaman untuk penghematan 16 byte.
Menghapus beberapa ruang yang tidak perlu untuk penghematan 3 byte.
Sebelum angka negatif atau nol diizinkan:
Tidak Disatukan:
Saya cukup baru untuk Julia; mungkin ada cara yang lebih baik. Menggunakan
:X
untuk X, yang merupakan Simbol di Julia. Diperbarui: Sekarang 0 diizinkan, menggunakan 0 (atau angka negatif apa pun) untuk X, menyimpan dua karakter. Diperbarui lagi untuk menghapus spasi putih yang tidak saya sadari tidak diperlukan.sumber
05AB1E ,
1211 byteMenyimpan satu byte berkat Riley
Cobalah online!
Penjelasan
Dequeues dilambangkan dengan huruf apa saja .
sumber
GNU Sed, 43
Skor termasuk +2 untuk penggunaan
-r
dan-n
bendera.Cobalah online .
Penjelasan
sumber
PHP, 85 Bytes
-8 Bytes
$v
alih-alihis_int($v)
jika setiap nilai dequeue milik falsesumber
Python 3 ,
9594 byteCobalah online!
Juga 94 byte:
sumber
Perl 5 , 28 + 1 = 29 byte
28 byte kode +
-p
bendera.Cobalah online!
Ia menggunakan string (
$\
) sebagai antrian: ketika input berisi integer (/\d/?
, kami menambahkannya di awal$\
($\=$_.$\
), dan sebaliknya, kami menghapus yang terakhir dengans/.*\n$//
. Pada akhirnya,$\
dicetak secara implisit berkat-p
flag (dan yang tidak cocok}{
).Pendekatan lain:
33 byte , menggunakan array sebagai antrian (itu cara paling alami untuk melakukannya di Perl saya pikir, tapi bukan yang terpendek):
Cobalah online!
52 byte , menggunakan regex dan
reverse
(kebetulan hal yang persis sama dengan jawaban Retina Martin Ender - terima kasih kepada siapa saya menyimpan 2 byte di atasnya). Membalik daftar membutuhkan banyak karakter, karena untuk mempertahankan bilangan bulat, saya harus mengubah string ke array untuk membalikkannya, lalu kembali ke string untuk mencetaknya. (say for
Alih-alih$_=join$",
dapat menyimpan 2 byte, tetapi membutuhkan-E
atau-M5.010
dan itu tidak menarik).Cobalah online!
sumber
Python 3, 107 byte
Dequeuer dapat berupa nilai non-numerik.
Cobalah online
sumber
Batch, 160 byte
Ini lebih sulit daripada yang seharusnya.
Ini berarti bahwa saya a) perlu memiliki penanda end-of-queue, yang tidak dapat dihapus, dan b) harus memanipulasi antrian kembali ke depan, sehingga item baru dimasukkan tepat sebelum penanda akhir, sehingga barang lama dapat dihapus dari depan, yang kemudian berarti I c) harus membalikkan antrian sebelum mencetaknya.
sumber
PHP, 70 byte
sumber
C #, 115 byte +33 byte untuk digunakan
Metode anonim yang mengembalikan daftar bilangan bulat setelah melakukan operasi en-queuing dan dequeuing. Bilangan bulat negatif digunakan untuk menghapus elemen dari antrian.
Program lengkap dengan metode ungolfed dan test case
sumber
Scala, 97 byte
Sebagai input,
f
ambil daftar dengan0
elemen "dequeue". Ia menggunakan ekor-rekursi dengan parameter kedua (b
), bertindak sebagai akumulator. Awalnya,b
adalah kosongSeq
(Nil
).Penjelasan:
Catatan:
b dropRight 1
digunakan sebagai penggantib.tail
untuk menghindari pengecualian:tail of empty list
.Kasus uji:
f
juga dapat bekerja dengan jenis lain (String
,char
, ..., bahkan daftar heterogen jenis orang!):sumber
REXX, 115 byte
Mengambil string yang dipisahkan spasi, mencetak string yang dipisahkan spasi
sumber
C ++,
122119 byte0 menunjukkan suatu dequeue.
Cobalah online!
sumber
Swift 3, 70 byte
Dengan asumsi kita memiliki array seperti Ints
let x = [1, 2,-1,3,-1,4]
Perhatikan bahwa
[].prefix(0)
ini adalah cara licik untuk mendapatkan ArraySlice kosongsumber