Definisi masalah
Cetak Power Set dari set yang diberikan. Sebagai contoh:
[1, 2, 3] => [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
Setiap elemen harus dicetak pada baris terpisah, jadi contoh di atas akan dicetak sebagai:
[]
[1]
[2]
...
[1, 2, 3]
Kode contoh (dalam D, contoh python di sini ):
import std.stdio;
string[][] powerset(string[] set) {
if (set.length == 1) {
return [set, []];
}
string[][] ret;
foreach (item; powerset(set[1 .. $])) {
ret ~= set[0]~item;
ret ~= item;
}
return ret;
}
void main(string[] argv) {
foreach (set; powerset(argv[1 .. $]))
writeln(set);
}
Memasukkan
Elemen akan diteruskan sebagai argumen. Misalnya, contoh yang diberikan di atas akan diteruskan ke program yang disebut powerset
:
powerset 1 2 3
Argumen akan menjadi alfanumerik.
Aturan
- Tidak ada perpustakaan selain io
- Output tidak harus dipesan
- Powerset tidak harus disimpan, hanya dicetak
- Elemen-elemen dalam himpunan harus dibatasi (misalnya
1,2,3
,[1,2,3]
dan['1','2','3']
dapat diterima, tetapi123
tidak- Pembatas trailing baik-baik saja (mis.
1,2,3, == 1,2,3
)
- Pembatas trailing baik-baik saja (mis.
- Terbaik ditentukan berdasarkan jumlah byte
Solusi terbaik akan diputuskan tidak kurang dari 10 hari setelah pengiriman pertama.
lambda L:reduce(lambda r,x:r+[s+[x]for s in r],L,[[]])
.Jawaban:
Mathematica 16
Kode
Subsets
adalah asli dari Mathematica.Kode (tanpa kolom) dapat diverifikasi di WolframAlpha . (Saya harus menggunakan kurung bukan
@
; mereka berarti hal yang sama.Pemakaian
Metode ini (55 karakter) menggunakan pendekatan yang disarankan oleh @ w0lf.
Kerusakan
Hasilkan tupel, terdiri dari
0
dan1
panjangnyaLength[s]
Lipat gandakan daftar asli (vektor) dengan masing-masing tuple:
Hapus
0
's.%
adalah singkatan untuk "output sebelumnya".% /. {0:> Urutan []}
Tampilkan dalam kolom:
sumber
s
dan meletakkan input di akhir baris?Subsets/*Column
membuat fungsi anonim yang mengambil daftar dan mengembalikan tampilan dalam kolom.C,
118115Meskipun dapat menyimpan kira-kira 20 karakter dengan format yang lebih sederhana, tetap saja tidak akan menang dalam ketentuan kode golf.
Pengujian:
sumber
main(a,s)char**s;{...}
),f|=x&1<<i&&printf
lebih pendek dari?:
.x+=2
(dan kemana perginyas[0]
). Trik yang sangat bagus.GolfScript,
2218 karakterUpaya lain dalam GolfScript dengan algoritma yang sama sekali berbeda. Format input sama dengan jawaban w0lf. ( tes online )
sumber
GolfScript (43 karakter)
Ini mungkin terlihat cukup panjang, tetapi ini adalah solusi pertama untuk mengikuti spesifikasi: input berasal dari argumen baris perintah, dan output dibatasi oleh baris baru.
Misalnya
sumber
awk (82)
anggap disimpan dalam file powerset.awk, penggunaan
ps jika awk Anda tidak memiliki dan () berfungsi, ganti dengan
int(i/(2^j))%2
tetapi tambahkan dua ke hitungan.sumber
(2^j)
->2^j
menghemat 2 byte; yang.awk
berkas juga bekerja tanpa Trailing\n
, sehingga Anda bisa mencukur habis byte lain.JavaScript, 98
Sayangnya, sebagian besar dihabiskan untuk format output.
Memasukkan
Mengambil array JavaScript. (mis. [1,2,3])
Keluaran
sumber
Python (
7470 karakter)untuk input sebagai
1,2,3
atau[1,2,3]
, output adalah:sumber
[a[0]]
=a[:1]
1,2,3
a[:1]
tidak berfungsi. tuple + daftar tidak diizinkan. Ada solusi yang lebih baiki,*a=a
i,*a=a
Python 3? Ini tidak berfungsi pada 2.7.1 saya.Python
7067 byteInput diambil dengan cara yang sama seperti untuk solusi ugoren . Sampel I / O:
sumber
def p(a,*v)
dan kemudianp(a[i:],n,*v)
. Output menjadi lebih jelek, tapi tetap OK.J, 19 karakter
Tinju ascii dalam output disebut
boxing
dan menyediakan koleksi heterogen (untuk panjang array yang berbeda di sini).sumber
Naskah Golf 48
Program ini menggunakan representasi biner angka dari 0 hingga panjang (input) untuk menghasilkan item powerset.
Memasukkan
Format masukan adalah Golfscript Format array (contoh:
[1 2 3]
)Keluaran
Outputnya adalah kumpulan array yang dipisahkan oleh baris baru, mewakili set daya. Contoh:
Tes online
Program ini dapat diuji secara online di sini .
sumber
Haskell (96)
Jika mengimpor
Control.Monad
tidak diizinkan, ini menjadi 100 karakter:sumber
Mathematica 53
sumber
APL (26)
Membaca input dari keyboard karena tidak ada
argv
padanannya.Pemakaian:
Penjelasan:
T←⎕
: baca input, simpan diT
M←⍴T
: panjang tokoT
diM
(M/2)⊤⍳2*M
: Menghasilkan pola bit untuk1
upto2^M
menggunakanM
bit.↓⍉
: pisahkan matriks sehingga masing-masing pola bit terpisah(/∘T)¨
: untuk setiap pola bit, pilih sub-item dariT
.↑⍕¨
: untuk output, dapatkan representasi string dari setiap elemen (sehingga akan mengisi menggunakan kosong dan bukan nol), dan format sebagai matriks (sehingga setiap elemen berada di barisnya sendiri).sumber
Scala, 81
sumber
JavaScript ( ES6 ) 76
Disalin sebagian dari yang ini: /codegolf//a/51502/21348
Menggunakan bitmap, jadi terbatas tidak lebih dari 32 elemen.
Jalankan cuplikan di Firefox untuk menguji.
sumber
C # 164
Man ini sulit di C #!
sumber
Python 2, 64 byte
Menggunakan input yang dipisahkan koma:
Pyth, 4 byte (menggunakan builtin) atau 14 byte (tanpa)
Seperti dicatat oleh @Jakube dalam komentar, Pyth terlalu baru untuk pertanyaan ini. Masih ada solusi menggunakan operator powerset bawaan Pyth:
Dan ini satu tanpa itu:
Anda dapat mencoba kedua solusi di sini dan di sini . Berikut penjelasan dari solusi kedua:
sumber
brainfuck, 94 byte
Diformat:
Mengharapkan input formulir
9,10,11
tanpa baris baru, dan menampilkan subset dalam format yang sama, kadang-kadang dengan tanda koma. Baris pertama yang dicetak akan selalu kosong, menandakan set kosong.Cobalah online.
Ide dasarnya adalah menempatkan sedikit di sebelah setiap elemen, lalu berulang kali menambah nomor biner saat mencetak subset yang sesuai sebelum setiap kenaikan. (Sedikit mengindikasikan apakah suatu elemen berada dalam subset.) Bit sentinel di sebelah kiri array digunakan untuk mengakhiri program. Versi ini sebenarnya menciptakan jumlah eksponensial sentinel untuk menghemat beberapa byte; solusi 99 byte yang lebih efisien yang hanya menggunakan satu sentinel dapat ditemukan dalam riwayat revisi.
Setiap bit dikodekan sebagai satu ditambah nilainya; yaitu, dapat berupa
1
atau2
. Rekaman diletakkan dengan bit sebelum setiap elemen dan sel nol tunggal antara elemen yang berdekatan. Koma disertakan pada kaset untuk elemen non-final, jadi kita dapat dengan mudah mencetak elemen tanpa melakukan pekerjaan ekstra untuk menangani pembatas.sumber
APL (Dyalog Classic) , 13 byte
Cobalah online!
Keluaran:
Ada garis kosong di akhir untuk mewakili set kosong.
Penjelasan:
⎕
input yang dievaluasi⎕,¨⊂⊂⍬
tambahkan daftar angka kosong setelah setiap elemen∘.,
Produk Cartesian/
pengurangan (foldr)⊃
mengungkapkan (perlu setelah pengurangan APL)Pada titik ini hasilnya adalah larik n-dimensi 2-oleh -...- oleh-2, di mana n adalah panjang input.
,
ratakan menjadi vektor⍪
ubah vektor menjadi matriks 2 n -by-1 tegak , sehingga setiap subset berada pada garis yang terpisahsumber
Haskell ,
8078 byteCobalah online!
sumber
Jelly , 6 byte
Cobalah online!
ŒṘ€Y
adalah pemformatan string.sumber
Python,
9387 karakterPython memudahkan pemformatan, karena input / output yang diperlukan cocok dengan format aslinya.
Hanya mendukung item yang literal Python (mis
1,2,'hello'
. Tidak1,2,hello
).Membaca input standar, bukan parameter.
sumber
print f(input())
lebih pendeklist
memang dapat dihapus (jika juga replacinf[[]]
dengan[()]
.print'\n'.join(f(input()))
menghemat dua karakterf()
mengandung tupel, bukan string.Ruby, 39
sumber
Haskell 89 karakter
Mendapatkan parameter panjang: /
sumber
map(x:)(p y)++p y
dan dua karakter lagi di atas itu dengan[(x:),id]<*>p y
. Rupanya<*>
ada di Prelude sekarang. (filterM
tidak).R, 63
Di sini,
v
merupakan vektor.Penggunaan :
sumber
K, 14 byte
Hasilkan semua vektor 0/1 selama input, kumpulkan indeks 1s dan gunakan untuk memilih elemen dari vektor input. Dalam praktek:
Ini agak liberal dengan persyaratan output, tapi saya pikir itu legal. Bagian yang paling dipertanyakan adalah bahwa set kosong akan diwakili dalam bentuk tipe dependen;
!0
adalah bagaimana K menunjukkan vektor numerik kosong:Penjelasan
The
(#x)#2
membangun vektor2
selama input:Ketika monadik
!
diterapkan ke vektor, itu adalah "odometer":Kemudian kita menggunakan "di mana" (
&
) pada setiap'
vektor ( ) untuk mengumpulkan indeksnya. Usus besar diperlukan untuk memisahkan antara bentuk monadik dan diad dari&
:Jika kita hanya menginginkan vektor kombinasi, kita akan selesai, tetapi kita perlu menggunakan ini sebagai indeks ke dalam set asli. Untungnya, operator pengindeksan K
@
dapat menerima struktur indeks yang kompleks dan akan menghasilkan hasil dengan bentuk yang sama:Elegan, bukan?
sumber
{x@&:'+!(#x)#2}
. Tidak terkait: ekuivalen lebih pendek dari(#x)#2
adalah2|~x
.Mathematica, 51
Lebih curang:
Gunakan dengan
@{1,2,3}
.sumber
JavaScript (ES6), 68 byte
Demo
Tampilkan cuplikan kode
sumber
alert
?Brachylog , 4 byte
Cobalah online!
sumber
Kombinasi metode Ruby Array (dari 1.9) [50 karakter]
sumber