Tantangan
Diberikan daftar bilangan bulat, kembalikan daftar bilangan bulat ini setelah berulang kali menghapus semua pasangan item sama yang berdekatan.
Perhatikan bahwa jika Anda memiliki jangka ganjil dengan angka yang sama, salah satunya akan tetap, tidak menjadi bagian dari pasangan.
Contoh:
[0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0]
Pertama, Anda harus menghapus 0, 0
, 4, 4
dan 1, 1
untuk mendapatkan:
[0, 1, 2, 2, 0]
Sekarang, Anda harus menghapus 2, 2
:
[0, 1, 0]
Dan ini adalah hasil akhir.
Uji Kasus
[] -> [] [1] -> [1] [1, 1] -> [] [1, 2] -> [1, 2] [11, 11, 11] -> [11] [1, 22, 1] -> [1, 22, 1] [-31, 46, -31, 46] -> [-31, 46, -31, 46] [1, 0, 0, 1] -> [] [5, 3, 10, 10, 5] -> [5, 3, 5] [5, 3, 3, 3, 5] -> [5, 3, 5] [0, -2, 4, 4, -2, 0] -> [] [0, 2, -14, -14, 2, 0, -1] -> [-1] [0, 0, 0, 1, 2, 4, 4, 2, 1, 1, 0] -> [0, 1, 0] [3, 5, 4, 4, 8, 26, 26, 8, 5] -> [3] [-89, 89, -87, -8, 8, 88] -> [-89, 89, -87, -8, 8, 88]
Mencetak gol
Ini kode-golf , jadi jawaban tersingkat di setiap bahasa menang!
code-golf
array-manipulation
musicman523
sumber
sumber
[14, 14, 14]
runtuh ke[14]
1,2
,11,12
, dll)-89,89,-87,-8,-88
? Solusi Japt (belum dikirim) saya dan solusi Retina Fry gagal di sana, menghasilkan--87,8
.Jawaban:
Jelly , 10 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Ẏ
bukannyaF
akan membuat Anda mendukung daftar di daftar Anda juga.œ^
bergantung pada promosi integer-to-array di sini. Karena array 1D tidak dipromosikan ke array 2D, itu tidak akan berfungsi untuk apa pun kecuali array angka.ŒgWẎ$œ^/$€ẎµÐL
... oh tunggu itu terlalu naif. : PRetina ,
1715 byteCobalah online!
Disimpan 2 byte berkat Neil dan Martin!
Mengganti setiap pasangan angka dengan tidak ada. Proses ini berulang sampai tidak ada perubahan.
sumber
-89 89 -87 -88 -88
, output mana--87
._
untuk menunjukkan negatif, seperti yang umum dalam beberapa bahasa._89 89 _87 _8 _88
, keluaran_89 89 _87 8
. Maaf: \m
untuk mengubah\b
s menjadi^
dan$
.Mathematica 29 byte
Ini berulang kali menghilangkan pasangan elemen yang berdekatan yang sama,
a_,a_
sampai tidak ada yang tersisa.sumber
Python 2 , 57 byte
Cobalah online!
Iteratif membangun daftar output dengan menambahkan elemen berikutnya, kemudian memotong akhirnya jika elemen menambahkan sama dengan yang sebelumnya. Memeriksa elemen kedua hingga terakhir
r[-2:-1]!=[x]
ternyata aneh karena daftar itu mungkin panjangnya hanya 1.sumber
Jelly , 15 byte
Cobalah online!
Penjelasan
-1 byte berkat mil, dan diperbaiki :)
sumber
ValueError: not enough values to unpack (expected 2, got 0)
untuk test case[1,2,2,1]
. Perhatikan juga bahwa output kosong berbeda[]
dan2
berbeda[2]
.Œr;ṪḂ$$€ŒṙµÐL
. Untuk menghindari kesalahan, gantiŒṙ
denganx/€F
karena decode run-length melempar kesalahan ketika diberi daftar kosong. Untuk melihat output sebagai daftar, penyambunganŒṘ
akan memperlihatkannya.ÇŒṘ
di footer untuk memanggil tautan terakhir (Ç
) dan mencetak representasi Python (ŒṘ
) . Namun kesalahan mungkin tidak dapat diterima.JavaScript (ES6),
5453 byteDisimpan 1 byte berkat @ThePirateBay
Solusi rekursif naif, mungkin dapat ditingkatkan.
sumber
i=0
dengani=-2
dani-1
dengani
total -1 byte.i+1
? (Saya mencoba ini sebelumnya dengan memindahkan++
juga dan tidak bisa mengetahuinya, meskipun saya hanya punya sekitar satu menit untuk melakukannya)Python 2 , 73 byte
Karena saya tidak memiliki reputasi yang cukup untuk berkomentar: Saya baru saja mengubah jawaban @officialaimm untuk menggunakan r! = [] Daripada len (r) untuk menyimpan byte. Solusi yang sangat pintar untuk Anda, @officialaimm!
Cobalah online!
Sekali lagi, ini sudah terlambat ... mengapa saya masih bangun?
sumber
Python,
6058 byteCobalah online!
sumber
[a[0]]
adalaha[:1]
MATL , 7 byte
Untuk beberapa kasus uji di mana hasilnya kosong, program keluar dengan kesalahan, tetapi bagaimanapun juga menghasilkan output yang benar (kosong).
Cobalah online! Atau verifikasi kasus uji dengan output yang tidak kosong .
Penjelasan
Pertimbangkan input
Setiap iterasi menghilangkan pasangan pasangan yang berurutan. Iterasi pertama mengurangi array menjadi
Dua nilai
2
yang sekarang berdekatan tidak berdekatan dalam array awal. Itu sebabnya diperlukan iterasi kedua, yang memberikan:Iterasi lebih lanjut akan membuat ini tidak berubah. Jumlah iterasi yang diperlukan dibatasi oleh ukuran input.
Hasil antara kosong menyebabkan fungsi decoding run-length (
Y"
) kesalahan dalam versi bahasa saat ini; tetapi ouput kosong sesuai kebutuhan.sumber
Kode Mesin x86 (mode terlindung 32-bit), 36 byte
Byte kode mesin di atas mendefinisikan fungsi yang mengambil array sebagai input, meruntuhkan duplikat yang berdekatan di tempat, dan kembali ke pemanggil tanpa mengembalikan hasil. Ini mengikuti
__fastcall
konvensi pemanggilan , melewati dua parameter diECX
danEDX
register, masing-masing.Parameter pertama (
ECX
) adalah penunjuk ke elemen pertama dalam array bilangan bulat 32-bit (jika array kosong, ia dapat menunjuk ke mana saja dalam memori). Parameter kedua (EDX
) adalah pointer ke integer 32-bit yang berisi panjang array.Fungsi ini akan mengubah elemen-elemen array di tempat, jika perlu, dan juga memperbarui panjang untuk menunjukkan panjang baru array yang diciutkan. Ini sedikit metode yang tidak biasa untuk mengambil input dan mengembalikan output, tetapi Anda benar-benar tidak punya pilihan lain dalam bahasa assembly. Seperti dalam C, array sebenarnya direpresentasikan dalam bahasa sebagai penunjuk ke elemen pertama dan panjang . Satu-satunya hal yang agak aneh di sini adalah mengambil panjang dengan referensi , tetapi jika kita tidak melakukan itu, tidak akan ada cara untuk mempersingkat array. Kode akan berfungsi dengan baik, tetapi hasilnya akan mengandung sampah, karena penelepon tidak akan tahu di mana harus berhenti mencetak elemen dari susunan yang diciutkan.
Mnemonik perakitan tidak dikumpulkan:
Implementasinya terinspirasi oleh jawaban C ++ 11 saya , tetapi ditulis ulang dengan cermat dalam perakitan, mengoptimalkan ukuran. Assembly adalah bahasa golf yang jauh lebih baik. :-)
Catatan: Karena kode ini menggunakan instruksi string, apakah mengasumsikan bahwa bendera arah jelas (
DF
== 0). Ini adalah asumsi yang masuk akal di sebagian besar lingkungan operasi, karena ABI biasanya mengharuskan DF jelas. Jika ini tidak dapat dijamin, makaCLD
instruksi 1-byte (0xFC
) harus dimasukkan di bagian atas kode.Ini juga, seperti yang disebutkan, mengasumsikan mode 32-bit yang dilindungi - khususnya, model memori "flat", di mana segmen tambahan (
ES
) sama dengan segmen data (DS
).sumber
Batch, 133 byte
Saya menetapkan s
.
karena Batch menjadi bingung jika hanya ada duplikat. Saya juga harus menggunakanshift/1
sehingga saya bisa menggunakan%0%s:~1%
untuk mengatur daftar argumen ke array dan loop baru.sumber
Jelly , 12 byte
Tautan monadik yang mengambil dan mengembalikan daftar angka.
Cobalah online! atau lihat a test suite
Bagaimana?
sumber
ṁLḂ$$€
setara denganḣLḂ$$€
yang setara denganṫḊ¿€3$
yang dapat Anda ganti dengan diṫḊ¿€3
sini untuk membentuk pasangan angka dua / nilad.Ḋ
akan kembali[]
sementara jika len (x) == 0Ḋ
akan kembali0
, keduanya merupakan nilai falsy. Input keḊ
tentu saja nilai saat ini, danṫ
akan memiliki nilai saat ini sebagai argumen kiri dan3
sebagai kanan. Jika len (x) == 4, maka akan sama denganṫ3ṫ3
atauṫ5
meninggalkan Anda[]
.x
dalam uraian Anda benar-benar ada nilai saat ini? Coba ini untuk ukuran.Japt , 34 byte
Secara rekursif menghapus pasangan angka yang sama sampai tidak ada.
Cobalah online! dengan
-Q
bendera untuk memformat larik keluaran.Jalankan semua test case menggunakan WIP CodePen saya.
sumber
05AB1E , 15 byte
Cobalah online!
Penjelasan
sumber
05AB1E , 13 byte
Cobalah online!
Penjelasan:
sumber
Haskell , 33 byte
Cobalah online!
sumber
Python 2 ,
74 7066 byter
bukannyalen(r)
cukup untuk memeriksa kekosongan daftar / tumpukan.[i]==r[-1:]
Python 2 , 66 byte
Cobalah online!
sumber
len(r)
hanya untuk memeriksa apakah daftar itu kosong atau tidak, Anda harus dapat menggantinya dengan adilr
, saya kira?Clojure, 100 byte
Tidak yakin apakah ini sesingkat mungkin.
sumber
Bash, 82 byte
Mungkin ada jalan keluar dari semua
cat
itu, tapi saya tidak tahu itu.sumber
Sekam , 10 byte
Cobalah online!
Penjelasan
sumber
PHP, 81 byte
berfungsi, panggil dengan referensi atau coba online .
gagal untuk input kosong; masukkan
$i&&
atau$a&&
sebelum--$i
untuk memperbaikinya.sumber
V , 10 byte
Cobalah online!
Dikompresi Regex:
:%s/\(.\+\)\n\1\n*
. Newline opsional adalah agar berfungsi juga di akhir file. Jika saya berasumsi bahwa ada baris baru setelah akhir itu akan menjadi 8 byte ... tapi itu seperti peregangansumber
dc ,
8478 byteCobalah online!
Membongkar sedikit, rusak dalam beberapa upaya kejelasan:
[0syzdsz1<Olydsx0<Alx1+lz>M]dsMxf
MakroM
me-reset penghitung utamay
ke 0, mengambil jumlah item di stack, menyimpan ini di registerz
, lalu menjalankan makroO
jika setidaknya ada dua item di stack. SetelahO
selesai, ia memuat countery
dan menyalinnya ke dalam registerx
sebelum memeriksa untuk memastikany
tidak nol (artinya tumpukan.
memiliki data). Jika ini masalahnya, ini berjalan makroA
. Akhirnya memeriksa apakah ukuran tumpukan asli lebih besar dari ukuran tumpukan saat ini dan memutarkan ulang sendiri jika demikian. Setelah selesai, ia mencetak tumpukan denganf
.[dStrdStr!=Pz1<O]sO
MakroO
sementara menyimpan dua item teratas di tumpukan ke dalam tumpukant
. Kemudian membandingkan dua item teratas dan menjalankan makroP
jika tidak sama. Akhirnya memeriksa apakah ada setidaknya dua item di stack, dan berjalan sendiri jika demikian.[LtLtS.ly1+sy]sP
MakroP
mengambil dua item dari tumpukant
, mendorong yang atas kembali ke tumpukan utama, dan mendorong yang berikut ke tumpukan.
. Itu kemudian menambah countery
.[L.ly1-dsy0<A]sA
MakroA
mengambil tumpukan.
dan mengubahnya kembali ke tumpukan utama. Itu yang terjadi, decrementing countery
sampai tidak ada yang tersisa untuk didorong.Diedit untuk penjelasan, dan untuk bermain golf 6 byte karena saya tidak perlu menyimpan ukuran tumpukan.
sumber
C ++ 11, 161 byte
Kode di atas mendefinisikan suatu fungsi,,
f
yang mengambilstd::vector<int>
referensi, memodifikasinya untuk meruntuhkan duplikat yang berdekatan sesuai dengan spesifikasi, dan kemudian kembali.Cobalah online!
Sebelum saya memeriksa jumlah byte, saya pikir ini kode yang cukup ramping. Lebih dari 150 byte, bagaimanapun, tidak begitu baik! Entah saya tidak pandai golf, atau C ++ bukan bahasa golf yang sangat baik ...
Tidak Disatukan:
sumber
std::adjacent_find
! Saya ingin tahu apakah Anda menerapkan fungsi ini sendiri apakah akan lebih pendek, karena Anda dapat menghapus#include <algorithm>
jugastd::unique
untuk melakukan apa yang saya butuhkan. Tetapi butuh banyak kode untuk melakukan semua logika, dan ketika saya kebetulan menemukanstd::adjacent_find
, itu cukup jelas bahwa itu adalah pemenang dalam hal ukuran kode.PHP, 74 byte
Fungsi c memanggil dengan referensi untuk mengurangi array. Cobalah online .
Menariknya ini bekerja di Php5.6 tetapi tidak 7.
sumber
R ,
5754 byteCobalah online!
menggunakan pengodean run-length untuk menghapus pasangan.
sumber
J , 38 byte
Cobalah online!
sumber
GNU sed , 19 + 1 = 20 byte
+1 byte untuk
-r
bendera.Cobalah online!
sumber
Pyth, 10 byte
Agak terlambat ke pesta.
Test Suite.
sumber