Tugas
Tulis program atau fungsi yang inputnya adalah daftar / larik X bilangan bulat, dan yang keluarannya adalah daftar himpunan bilangan bulat Y , sedemikian rupa sehingga untuk setiap elemen e dalam setiap set Y [ i ], X [ e ] = i , dan sehingga jumlah elemen dalam set di Y sama dengan jumlah elemen dalam X .
(Ini pada dasarnya operasi yang sama dengan membalik hashtable / kamus, kecuali diterapkan pada array sebagai gantinya.)
Contohnya
Contoh-contoh ini mengasumsikan pengindeksan berbasis 1, tetapi Anda dapat menggunakan pengindeksan berbasis 0 jika Anda mau.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Klarifikasi
- Anda dapat mewakili satu set sebagai daftar, jika diinginkan. Jika Anda melakukannya, urutan elemen-elemennya tidak masalah, tetapi Anda mungkin tidak mengulangi elemen-elemen itu.
- Anda dapat menggunakan format I / O yang tidak ambigu; misalnya, Anda dapat memisahkan elemen dari himpunan dengan spasi, dan himpunan itu sendiri dengan baris baru.
- Y harus panjang, dan setidaknya cukup lama untuk memiliki semua elemen X sebagai indeks array. Namun, mungkin lebih lama dari elemen maksimal X (elemen tambahan akan menjadi set kosong).
- Elemen X semua akan menjadi indeks array yang valid, yaitu bilangan bulat non-negatif jika Anda menggunakan pengindeksan berbasis 0, atau bilangan bulat positif jika Anda menggunakan pengindeksan berbasis 1.
Kondisi kemenangan
Sebagai tantangan kode-golf , lebih pendek lebih baik.
[5,5,6,6]
dan[6,6,5,5]
dapat identik?[5,5,6,6]
dan[6,6,5,5]
tidak dapat memiliki output yang identik, tetapi output untuk[5,5,6,6]
bisa juga bisa, mis[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
output yang valid untuk[5,5,6,6]
?Jawaban:
MATL , 8 byte
Input adalah vektor kolom, dengan
;
sebagai pemisah (misalnya[2;2;2]
). Output adalah representasi string dari array sel vektor baris (misalnya{[]; [1 2 3]}
). Vektor baris elemen tunggal sama dengan angka (jadi{1; 2; 3}
akan menjadi output bukan{[1]; [2]; [3]}
).Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Sebagian besar pekerjaan dilakukan oleh fungsi orde tinggi Matlab
accumarray
, yang mengelompokkan elemen dalam input kedua sesuai dengan nilai yang cocok di yang pertama, dan menerapkan fungsi yang ditentukan untuk setiap grup. Fungsi dalam kasus ini adalah@(x){sort(x).'}
, yang menampilkan elemen yang diurutkan dalam setiap grup dan menyebabkan hasil untuk semua grup dikemas dalam array sel.sumber
Python, 69 byte
Menggunakan pengindeksan berbasis 0.
sumber
Jelly ,
75 byteCobalah online!
Bagaimana itu bekerja
sumber
Jelly , 8 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Mathematica, 36 byte
Penjelasan
Untuk masing-masing
n
dalam{1, 2, ..., Max@#}
, di manaMax@#
bilangan bulat terbesar dalam daftar input, menghitungPosition
s di manan
muncul dalam daftar input#
. KarenaPosition[{6,6,5,5},5]
(misalnya) kembali{{3},{4}}
, kami kemudianApply
Join
ke semua elemen di tingkat{1}
hasil.sumber
Haskell , 45 byte
s
mengambil daftar bilangan bulat dan mengembalikan daftar daftar. 1-diindeks untuk menjaga agar input test case tidak dimodifikasi (walaupun output mendapatkan beberapa daftar kosong tambahan).Cobalah online!
Ini adalah daftar pemahaman bersarang cukup mudah. Satu-satunya perubahan kecil adalah mengambil keuntungan dari opsi untuk membuat daftar yang lebih panjang dengan menggunakan
sum
alih-alihmaximum
.sumber
PHP, 55 byte
Diindeks 0.
sumber
R,
684947 byteAnehnya, jauh lebih mudah daripada solusi yang lebih lama. Mengambil vektor
x
dari STDIN, membuat vektor dari1
hinggamax(x)
, secara implisit menghasilkan daftar panjangmax(x)
, dan memeriksa indeks mana yangx
sesuai dengan yang ada dalam daftar baru. Secara implisit mencetak output.Versi yang lebih lama:
Pendekatan yang sedikit berbeda dengan jawaban R lainnya. Membawa vektor ke STDIN, membuat daftar dengan panjang yang sama dengan nilai maksimum dalam input. Lewati input dan tambahkan indeks ke tempat yang tepat.
Menggunakan pengindeksan berbasis 1.
sumber
Python 2 ,
918685 byteSaya pemrograman pada ponsel saya, tetapi saya sangat menyukai tantangan ini. Saya pasti bisa bermain golf lebih jauh.
Cobalah online!
sumber
Jelly , 9 byte
1-diindeks, set kosong diwakili
0
, set satu item diwakili sebagaiN
set beberapa item diwakili[M,N,...]
Cobalah online!
Bagaimana?
sumber
JavaScript (ES6),
6462 byteDisimpan 2 byte berkat @SteveBennett
Mengambil input yang diindeks 0. Mengembalikan daftar set yang dipisahkan koma.
Uji kasus
Tampilkan cuplikan kode
Versi alternatif, 53 byte
Jika output yang disederhanakan seperti
'||||3,2|1,0'
dapat diterima, kita bisa melakukan:sumber
`{${o.join`},{`}}`
ES2015 legal."{" + o.join("},{") + "}"
, jika itu membuatnya lebih jelas.join`
ini setara denganjoin('
. Tidak tahu Anda bisa melakukan itu.array.join` `
. Sangat membingungkan di sini karena Anda menyematkannya ke dalam string template, dan bahkan lebih membingungkan, string yang bergabung adalah},{
, yang secara kebetulan tampak seperti bagian dari string template ... dan tetap saja aneh dan jelek pula. :)Bash , 109 byte
Sayang sekali tidak ada built-in untuk nilai max array.
Cobalah online!
sumber
Mathematica 62 byte
Saya akan menjalankannya untuk Anda
Cobalah online (cukup tempel kode dengan ctrl-v dan tekan shift + enter)
jangan lupa untuk menempelkan daftar input di akhir seperti pada contoh di atas
sumber
AppendTo
. Juga,{j,1,Length[#1]}
bisa saja{j,Length@#}
, atau bahkan lebih pendek{j,Tr[1^#]}
,.Tr[1^#]
adalah trik yang cukup umum untuk menghemat byte dari penggunaanLength
.Perl 6 ,
36 3229 byteCobalah
Cobalah
Cobalah
Diperluas:
Mengembalikan indeks berbasis nol, untuk mendapatkan 1 menggunakan lintas operator (
X
) dikombinasikan dengan+
op . (33 byte)Untuk mendapatkannya kembali Set s cukup tambahkan
set
di sana (total 37 byte)sumber
R,
8072 byte1-diindeks, diambil
X
dari stdin. Mengembalikan daftar vektor indeks, denganNULL
sebagai set kosong.Cobalah online!
versi lama:
Cobalah online!
sumber
Y=list();
bekerja dengan baikfew
byte dalam jawaban saya :) codegolf.stackexchange.com/a/120024/5953005AB1E , 10 byte
Cobalah online!
sumber
Röda , 51 byte
Ini adalah port dari jawaban Python oleh Uriel .
Versi lain (88 byte):
Cobalah online!
Keduanya 1-diindeks.
sumber
PowerShell, 81 byte
Cobalah online!
1-diindeks.
sumber
GNU Make ,
214213208204 byteI / O: input array melalui argumen, output ke stdout, satu per baris, dipisahkan oleh spasi.
Penjelasan
Urutan indeks dalam set dibalik karena
P
panggilan itu sendiri secara rekursif sebelum memperbaruiA$2
(panggilan dieksekusi dalam evaluasi sisi kanan).sumber
make
ada cara untuk melakukan aritmatika itu sendiri? Memanggil ke dalam program eksternal untuk melakukannya rasanya seperti curang, karena Anda mungkin bisa memasukkan lebih banyak algoritma ke dalam program-program itu dan berakhir dengan program yang lebih pendek.bc
dangrep
. Saya juga bisa menggunakantest
dan$?
.dc
memiliki sintaks terser, tetapi terus terang semua ini merasakan hal yang sama.Gangguan Umum, 91 byte
Pengindeksan berbasis 1, mengembalikan set sebagai daftar.
Cobalah online!
sumber
k , 13 byte
Ini diindeks 0.
Cobalah online!
sumber