Sebuah tas , juga disebut multiset, adalah koleksi unordered. Anda bisa menyebutnya set yang memungkinkan duplikat, atau daftar (atau array) yang tidak dipesan / diindeks. Dalam tantangan ini, Anda diminta untuk mengimplementasikan operasi tas: penambahan, perbedaan, perkalian, pembagian, penghitungan dan uji kesetaraan.
Operasi
Operasi yang ditentukan mungkin tidak konvensional.
- Selain itu menggabungkan dua tas menjadi satu, menghemat jumlah total setiap nilai
[1,2,2,3] + [1,2,4] = [1,1,2,2,2,3,4]
- perbedaan menghapus dari tas setiap elemen dari tas lain, atau tidak melakukan apa pun jika tidak ada elemen tersebut
[1,2,2,4] - [1,2] = [2,4]
[1,2,3] - [2,4] = [1,3]
- multiplikasi mengalikan setiap elemen dalam tas.
[1,2,3,3,4] * 3 = [1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3] = [1,1,3,3]
- pembagian adalah hal yang tidak biasa: setiap n elemen yang sama dimasukkan ke dalam n tas yang sama, elemen yang tidak dapat membentuk n-grup tetap berada di dalam tas. Kembalikan salah satu dari n tas baru.
[1,1,2,2,2] / 2 = [1,2]
[1,2,2,3,3,3] / 3 = [3]
- menghitung menghitung berapa banyak tas pembagi dapat diproduksi dari tas dividen
[1,1,2,2,2,2,3,3,3] c [1,2,3] = 2
- pemeriksaan kesetaraan memeriksa apakah dua kantung memiliki angka yang sama dari setiap elemen
[1,2,2,3] == [3,2,1,2] = truthy
[1,2,3] == [1,2,2,3] = falsy
(dapat juga digunakan=
untuk ini)
Jika Anda menggunakan simbol Anda sendiri untuk operator, silakan tentukan.
Format
Tas akan ditampilkan sebagai daftar formulir [1,1,2,3,4]
. Anda dapat menggunakan braket lain selain yang persegi, atau bahkan menggunakan tanda kutip, atau tidak sama sekali. Elemen-elemen akan menjadi bilangan bulat (secara matematis, tidak harus int
) untuk tujuan pertanyaan ini. Tas tidak harus disortir.
The format masukan akan dua tas atau tas dan integer, dengan operator. Anda dapat menentukan format Anda sendiri asalkan memuat tiga format ini.
The format output harus menjadi tas tunggal format yang sama.
Aturan
- Anda tidak boleh menggunakan fungsi, operasi, atau perpustakaan bawaan (termasuk perpustakaan standar) yang sudah menerapkan ini; tidak apa-apa untuk menggunakan daftar concatenation dan multiplikasi karena mereka adalah operasi daftar definisi, bukan operasi tas (yang pada dasarnya melakukan hal yang sama)
- celah standar berlaku
- jawaban terpendek menang
Uji kasus
[1,2,2,3] + [1,2,4]
[1,1,2,2,2,3,4]
[1,2,2,4] - [1,2]
[2,4]
[1,2,3] - [2,4]
[1,3]
[1,2,3,3,4] * 3
[1,1,1,2,2,2,3,3,3,3,3,3,4,4,4]
2 * [1,3]
[1,1,3,3]
[1,1,2,2,2] / 2
[1,2]
[1,2,2,3,3,3] / 3
[3]
[1,1,2,2,2,2,3,3,3] c [1,2,3]
2
[3,2,1,2] == [1,2,2,3]
truthy
[1,2,3] == [1,2,2,3]
falsy
sumber
Jawaban:
05AB1E,
9287838277 byteBerpisah dengan operasi
Penjelasan
Tambahan
Masukkan satu tas ke tas lain dan ratakan ke satu tas.
Perkalian
Pastikan angkanya ada di bagian atas tumpukan. Panggil ini X.
Gandakan tas X kali dan gabung ke satu tas.
Menghitung
Untuk setiap elemen dalam tas pembagi, hitung jumlah kejadian dalam tas dividen.
Hitungan minimum adalah jumlah tas yang bisa kita buat.
Persamaan
Sortir kedua tas dan periksa apakah keduanya sama.
Divisi
Hitung berapa kali setiap elemen unik terjadi di tas.
Jika itu terjadi setidaknya sebanyak pembagi. Simpan salinan (nr_of_copies_total // divisor) di dalam tas.
Perbedaan
Untuk setiap elemen dalam subtrahend, urutkan ke bagian depan minuend.
Jika subtrahend saat ini jika sama dengan elemen pertama dalam minuend, hapus dari minuend.
sumber
APL (155)
Ini mendefinisikan
∆
'tas' operator , yang mendefinisikan operasi tas untuk fungsi yang diberikan. Yaitu+∆
akan menjadi tambahan. Kemudian membaca baris dari keyboard dan mengevaluasinya sebagai ekspresi APL.Fungsinya adalah:
+∆
, tambahan-∆
, pengurangan×∆
, penggandaan÷∆
, pembagian⊂∆
, menghitung≡∆
, ekuivalensi (meskipun karena bermain golf fungsi apa pun yang tidak dikenali akan melakukan ekivalensi)Penjelasan:
∆←{
...}
: tentukan operator∆
:O←⍺⍺
: menyimpan fungsi yang diberikan dalamO
(⎕CR
tidak akan bekerja⍺⍺
secara langsung)O←⎕CR'O'
: dapatkan representasi string dari fungsi itu'+'=O
...:
: sebagai tambahan,⍺,⍵
: gabungkan kedua daftar bersamaR[⍋R←
...]
: dan urutkan hasilnya'-'=O:
: untuk pengurangan,⍺{
...}⍵
: jalankan fungsi rekursif berikut:⍵≡⍬:⍺
: jika subtrahend kosong, kembalikan minuend⍺/⍨(⍳⍴⍺)≢⍺⍳⊃⍵∇1↓⍵
: jika tidak, hapus elemen pertama dari subtrahend dari kedua subtrahend dan minuend dan coba lagi(⍬=⍴⍵)∧K←'×'=O:
untuk perkalian, dan jika argumen yang tepat bukan tas:⍵/⍺
: mereplikasi setiap elemen dalam argumen kiri dengan argumen kananK:
: ... dan jika argumen yang benar adalah tas:⍺/⍵
: mereplikasi setiap elemen dalam argumen kanan dengan argumen kiri (ini adalah agar multiplikasi komutatif)'÷'=O:
: untuk divisi,⍵≤⍺∘.+⍺
: lihat elemen mana di ⍺ yang muncul setidaknya ⍵ kali,⍺/⍨
: pilih yang dari ⍺,∪
: dan hapus semua duplikat dari daftar itu'⊂'=O:
: untuk menghitung,⍵{
...}⍺
: jalankan fungsi rekursif berikut:(∪⍺)≢∪⍵:0
: jika satu daftar berisi elemen yang lain tidak, hasilnya adalah 01+⍺∇⍵-∆⍺
: jika tidak, kurangi dividen dari pembagi, coba lagi, dan tambahkan hasilnya.⋄
: jika tidak ada yang di atas, lakukan tes kesetaraan:⍺[⍋⍺]≡⍵[⍋⍵]
: urutkan kedua daftar dan lihat apakah keduanya sama⎕
: membaca ekspresi dari keyboard, mengevaluasinya, dan mengeluarkan hasilnya.Kasus uji:
sumber
[2,2,2,2,2,2]/3
seharusnya memberi[2,2]
, tetapi milik Anda tampaknya memberi[2]
.∆
, pengguna akan dibuang ke REPL asli APL, di mana∆
sekarang valid. Saya pikir Anda dapat menyimpan beberapa byte dengan memindahkan pengurangan sampai akhir karena itu adalah satu-satunya yang membutuhkan dua baris. Alih-alih⎕CR
, gunakan*
untuk melambangkan hitungan, dan lakukanO←⍺⍺2
, lalu2=O:
untuk plus,1=O
untuk mult,0=O:
untuk equiv,7<O:
untuk menghitung, dan0<O:
untuk div (dengan tersirat0>O:
untuk subtr).JavaScript (ES6), 260 byte
Membawa 3 parameter. Parameter pertama adalah array, yang kedua adalah operator, yang ketiga tergantung pada operator. Tas diminta untuk menyimpan bilangan bulat non-negatif.
Tidak Terkumpul:
sumber
Oktaf,
253244226 byteFungsi ini harus ada dalam file. Untuk menulis fungsi di jendela perintah, Anda harus menggunakan
endfunction
atauend
.Terima kasih kepada Luis Mendo karena telah menghemat 18 byte.
Operasi adalah:
Contoh penggunaan:
Tidak Terkumpul:
sumber
Mathematica,
387347300284 byteDegolfed sedikit (alias versi lama), tidak memiliki dukungan penuh untuk tes kesetaraan (mengembalikan nilai-nilai kebenaran, tetapi dibiarkan tidak dievaluasi untuk tas yang tidak cocok).
Menerapkan tipe data yang diperlukan dengan kepala
b
.Pertama
b
didefinisikan sebagaiOrderless
. Setiap objek yang diteruskan ke kernel dengan headb
akan melakukan autosort argumennya. Jadi, bahkan jikab[3,2,1]
diketik, evaluator tidak akan pernah melihat selainb[1,2,3]
.Penambahan sepele didefinisikan sebagai bergabung dengan elemen.
Aturan khusus untuk perbedaan dua kantong didefinisikan (dijelaskan di bawah). Versi sebelumnya memiliki simbol bantu untuk ekspresi bentuk
-bag
.Kemudian perkalian (selama
n
bilangan bulat positif) secara rekursif didefinisikan sebagain*b[...] = b[...] + (n-1)*b[...]
yang pada akhirnya akan berkurang menjadi jumlah sederhana.Aturan khusus untuk
b[...] - b[...]
menghitung jumlah elemen berbeda dalam jumlah kantung dan mengurangi kantung yang akan dikurangkan dua kali dari hasil itu. Lebih mudah dijelaskan:Di atas adalah daftar
Keys->Values
.KeyValueMap
denganTable
membuat daftar setiapKey
Value
kali. (Ada juga diMax[...,0]
sana untuk tidak mencoba membuat tabel panjang negatif). Ini muncul sebagai:yang diratakan dan kepala
List
diganti denganb
.Pembagian dengan bilangan bulat agak mirip dalam fungsi yang digunakan, itu hanya pembagian lantai elemen dihitung oleh bilangan bulat.
Pembagian dengan menetapkan atau menghitung Saya telah berubah sejak implementasi awal. Sekarang secara rekursif dilakukan sebagai berikut. Katakanlah, kita membagi tas
b1
denganb2
(yang dalam kode golf adalahc
dana
masing - masing. Jika(b1-b2) + b2 == b1
, kemudian tambahkan 1 dan tambahkan ke hasil pembagian(b1-b2)/b2
. Jika tidak, kembalikan 0 dan keluar dari rekursi.Jika tas cocok, built-in
==
memberiTrue
. Baris terakhir memaksa aFalse
jika tidak.Kasus uji:
sumber
Q - 219 karakter
a
untuk tambahan,s
untuk perbedaan (pengurangan),m
untuk perkalian,d
untuk pembagian,c
untuk penghitungan,e
untuk kesetaraan.Algoritma penjumlahan adalah yang jelas, hanya bergabung dengan tas.
Indeks fungsi pengurangan dalam kantong input (direpresentasikan sebagai sebuah array) dengan seluruh rentang indeks, kecuali untuk
n
indeks pertama dari setiap kelas ekivalensi yang dibentuk oleh kesetaraan untuk setiap elemen diy
, di manan
jumlah salinan perwakilan itu diy
. Menangani kemungkinan duplikaty
menjadikannya monster fungsi yang nyata.Fungsi multiplikasi mengambil
x
nilai dari masing-masingy
, dalam hal iniy
adalah nilai tunggal, bukan array, itu hanya mereplikasi mereka.Fungsi pembagian menghasilkan nilai yang jumlah dalam array lebih besar dari
y
, dan kemudian menghapus duplikat.Fungsi penghitungan menghitung jumlah setiap elemen di
y
, dan kemudian mengembalikan minimum.Dua tas sama jika representasi array yang diurutkan sama.
sumber
Ruby, jawaban definisi kelas,
323291 byteSebagian besar hanya ingin membuat
Bag
kelas yang sebenarnya karena fleksibilitas Ruby dengan kelas. Dalam hal ini, ia diturunkan dariArray
karena lebih pendek daripada harus menginisialisasi array internal dan berurusan dengan hal-hal lain.Saya mungkin akan melakukan jawaban golf yang lebih serius yang menggunakan fungsi untuk menangani operasi besok. Saya sangat lelah dan saya terlalu bersenang-senang dengan ini
walaupun saya harus bertengkar dengan definisi kelas numerik untuk dapatMEMUJI FUNGSI KERJA UNTUK MEMBUATNYA, SAYA TIDAK PERLU MESS UP NUMERICS DEFINISI KELASNumber * Bag
bekerja dengan baik.Cobalah online! (Whitespace tidak masalah di Ruby, jadi kodenya sedikit tidak diubah di sana.)
sumber
Ruby, 201 byte
Seperti yang dijanjikan dalam jawaban saya yang lain, inilah yang menggunakan fungsi alih-alih membangun kelas baru. Saya sangat dekat dengan melanggar tanda 200 byte ... Cobalah online
Ini menggunakan opcode yang sama dengan @Neil dalam jawaban JavaScript-nya, dan urutan argumen yang sama (lhs, opcode, rhs)
Kode:
sumber
C ++,
555551 byte(jeda baris ditambahkan untuk dibaca - hanya baris baru pertama yang diperlukan dan dihitung)
Penjelasan
Kami menerapkan tas kami sebagai peta (nilai, jumlah). Operasi dasar dapat diimplementasikan dengan memanipulasi penghitungan; divisi pengurangan dan bilangan bulat juga harus menghapus elemen apa pun yang hitungannya mencapai nol, sehingga
std::map::operator==
akan berfungsi sebagai tes kesetaraan.Kode yang diperluas berikut adalah versi generik dari yang di atas, apalagi golf: kami menggunakan terpisah
s()
untuk memeras nilai hitungan nol, dan kami menerapkanconst
operasi dalam hal penugasan operator dengan cara C ++ idiomatik. Kami juga menggunakans()
untuk membuat perkalian dengan0
kembali tas yang benar-benar kosong (diuji dengan menambahkan(B{1}*0 != B{})
kemain()
); aslinya gagal dalam tes ini, dan tidak jelas apakah ini merupakan persyaratan.Tes
sumber
Python 2.7 - 447B (filesize)
Ini adalah percobaan pertama saya di Codegolf, saya harap ini memuaskan. Saya membutuhkan 2 jam. (Tapi saya masih pemula di Python)
Sunting: Terima kasih kepada "Kevin Lau - not Kenny" karena menunjukkan ini:
Sunting: Selain itu saya menghemat ruang dengan mengganti fungsi dengan lambdas dan baris baru dan lekukan dengan lebih banyak titik koma.
Kode:
memeriksa:
Keluaran:
Saya mungkin mencobanya lain kali dengan menetapkan sebagai dasar waktu. Sunting: Mungkin saya akan mencoba dengan fungsi saja.
sumber
self
- sesuatu sepertiS
akan dilakukan juga. Trik lain adalah bahwasorted
fungsi bawaan melakukan apa yang Anda inginkan dari fungsi baru Andas
, sehingga Anda dapat melupakan definisi fungsi (mengingat Anda hanya menggunakannya sekali). Anda tidak pernah perlu__radd__
karena Anda tidak pernah menambahkan tas dengan tas, meskipun Anda masih membutuhkannya__rmul__
. Akhirnya, Anda hanya perlu satu spasi indentasi alih-alih empat, yang memangkas jumlah byte Anda sedikit