Golf sederhana untuk memulai minggu! Anda diberi tiga larik: larik dasar B
, larik nilai V
dan larik indeks I
. Anda harus menghasilkan array lain di mana nilai-nilai dari V
dimasukkan ke B
dalam indeks yang ditentukan oleh I
. Berikut ini sebuah contoh:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Indeks menunjuk pada posisi berikut dalam array dasar:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Jadi, memasukkan elemen yang sesuai dari array nilai, hasilnya harus:
[0, 5, 1, 4, 7, 1, 3, 0]
Aturan
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan output hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi, atau dengan memodifikasi array yang diberikan sebagai B
parameter .
Jika kiriman Anda adalah fungsi, I
dan V
dapat dimodifikasi dengan cara apa pun, serta B
jika tidak digunakan untuk output.
Anda dapat membuat asumsi berikut tentang input:
- Semua elemen basis dan nilai array akan menjadi bilangan bulat non-negatif.
- Array nilai akan memiliki paling banyak satu elemen lebih dari array basis.
- Array nilai dan array indeks akan memiliki jumlah elemen yang sama.
- Array indeks tidak akan berisi indeks berulang, dan semua indeks akan berada dalam kisaran.
- Basis dan nilai array dapat berisi elemen berulang.
- Setiap atau semua array mungkin kosong.
- Anda tidak boleh berasumsi bahwa indeks diberikan dalam urutan tertentu.
- Anda dapat menerima input dan menghasilkan output dalam bentuk string atau daftar yang mudah, tidak ambigu. Anda juga dapat memilih untuk menerima tiga array dalam urutan yang berbeda.
- Anda dapat memilih antara pengindeksan berbasis 0 dan 1.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
Uji Kasus
Diberikan dalam format B V I => Result
pengindeksan berbasis 0. Jika Anda menggunakan pengindeksan berbasis 1, tambahkan elemen array ketiga dengan 1.
[] [] [] => []
[] [1] [0] => [1]
[1,2] [] [] => [1,2]
[1,2] [3] [0] => [3,1,2]
[1,2] [3] [1] => [1,3,2]
[1,2] [3] [2] => [1,2,3]
[0,0,0] [1,1,1,1] [0,1,2,3] => [1,0,1,0,1,0,1]
[5,1,4,1,3] [0,0,7] [5,0,3] => [0,5,1,4,7,1,3,0]
[1,2,3,4] [4,3,2,1] [4,0,3,1] => [3,1,1,2,3,2,4,4]
Beri tahu saya jika Anda menemukan casing tepi menarik lainnya, dan saya akan menambahkannya.
Papan peringkat
Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=50369;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
NULL
array kosong untuk bahasa di mana array kosong beradaNULL
?Jawaban:
Pyth, 14 byte
Demonstrasi.
Program ini mengambil input sebagai 3-tupel daftar dalam urutan Basis, Indeks, Nilai.
Penjelasan pada contoh
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Ambil input: implisit, Q adalah input.
Buat indeks, pasangan nilai:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Urutkan pasangan ke dalam urutan indeks yang meningkat:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Keluarkan nilai dari setiap pasangan:
medSCtQ
=[0, 7, 0]
Membagi daftar pangkalan di lokasi indeks:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Interleave 3 dan 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
Gabungkan menjadi satu daftar:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
sumber
ssC,cFPQamedSCtQ]
.Python 2, 54
Mengambil input sebagai
B,I,V
. Memodifikasi inputB
saat dipanggil (terima kasih kepada Martin Büttner karena mengingatkan saya bahwa ini mungkin).Penggunaan
map
untuk memanggilB.insert
setiap pasangan indeks / elemen. Untuk menghindari masalah pergeseran daftar indeks saat elemen dimasukkan, urutkan pasangan dalam urutan indeks yang menurun dengan zip / sort / unzip yang jelek. Jika bukan karena masalah pergeseran, kita bisa melakukannyamap(B.insert,*X)
.Metode lama (65):
sumber
Haskell, 62 byte
Contoh penggunaan:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.Cara kerjanya: tambahkan daftar basis dengan indeks "and-a-setengah" mulai dari
0.5
(misalnya[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
) dan menyatukannya dengan pasangan nilai indeks. Sortir dan buang indeks.Komentar : tidak tahu apakah saya curang di sini. Dari sudut pandang matematis tidak apa-apa, tetapi seorang programmer mungkin berpendapat bahwa daftar indeks
[5,0,3]
bukanlah daftarIntegers
seperti yang diminta, tetapi daftarFractionals
(tepatnya, tipenya adalah polimorfik, tetapi harus milikFractional
kelas, misalnyaFloat
atauDouble
).sumber
Ruby,
605953 byteDan versi yang tidak diserang
sumber
->a,b,c{...}
. Kemungkinaninsert
juga tidak perlu tanda kurung.CJam,
342318 bytePengajuan CJam pertama saya. Saran dipersilahkan, saya yakin ada banyak golf.
16 byte disimpan dengan bantuan @ MartinBüttner dan @Dennis.
Berfungsi mengharapkan input pada stack secara berurutan
B V I
(I adalah yang teratas).Contoh penggunaan:
Metode:
i
elemen th array dengani+0.5
sumber
q~.5fm.\2/\ee+$1f=p
dan ke 18 byte dengan menggunakan fungsi anonim:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(masih 18 byte)get array element
operator untuk1f=
. Saya akan meninggalkannya sebagai program penuh sekalipun.K,
2221 byteKami mendefinisikan fungsi 3 argumen
{…}
dengan variabel implisitx
,y
danz
mewakili daftar awal, daftar nilai dan daftar indeks, masing-masing. Operator "cut" (_
) digunakan untuk memisahkan daftar awal pada daftar yang diurutkan dari indeks yang diberikan ((z@<z)
). Kami interleave nilai (setelah mengurutkannya) dengan potongan yang dibagi dari array asli dengan membentuk daftar ((a;b)
), mengambil transposnya (+
) dan meratakan hasilnya (,//
).Contoh penggunaan:
Spasi di sekitar garis bawah diperlukan karena K memungkinkan garis bawah pada pengidentifikasi. K5 menghilangkan ambiguitas potensial ini. Jika kita dapat mengandalkan indeks yang datang dalam urutan naik dan garis bawah bukan pengidentifikasi yang valid, kita dapat menggunakan program 13 byte yang jauh lebih baik:
(mendesah.)
edit:
Mematahkan simetri, tetapi kita dapat menyimpan byte dengan menggunakan pengindeksan braket (
[…]
) alih-alih@
operator pengindeksan infiks . Biasanya ini membuat program lebih lama, tetapi dalam hal ini kami memerlukan parens untuk menyortirz
sebelum melakukan pemotongan.sumber
Pyth, 17 byte
@isaacg sudah mengalahkan solusi saya. Tapi karena dokumentasi saya sudah selesai, saya hanya akan mempostingnya.
Ini mengambil input dalam format
B, I, V
. Anda dapat mencobanya di sini: Demonstrasi atau Test SuitePenjelasan:
Saya menggunakan contoh
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
dari OP.sumber
JavaScript (ES6), 75
Fungsi dengan 3 parameter array, mengembalikan array. Anehnya, fungsi ini mengubah
i
parameternya (sebagaimana diizinkan oleh OP)Tes menjalankan cuplikan, Firefox hanya seperti biasa.
sumber
fat arrow function
itu tidak diterapkan bahkan dalam versi pengembang Chrome (AFAIK)Mathematica,
5251 byteContoh:
Penjelasan:
Menggunakan contoh di atas.
Tr@#2->#&~MapIndexed~#
=>{1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3}
Thread[#3+.5->#2]
=>{5.5 -> 0, 0.5 -> 0, 3.5 -> 7}
{0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0}
){0, 5, 1, 4, 7, 1, 3, 0}
)sumber
CJam,
3029 byteIni terlalu lama. Saya merasa ini bukan pengiriman bahasa golf: |
Cobalah online di sini
sumber
R, 75 byte
Ini menciptakan fungsi yang tidak disebutkan namanya. Untuk menyebutnya, berikan nama, mis
f=function...
. Perhatikan bahwa array harus diindeks 1 karena hanya itulah R rolls.Penjelasan + tidak dikumpulkan:
Contoh:
Saran diterima seperti biasa!
sumber
CJam, 19 byte
Ini adalah program lengkap yang membaca array B , I dan V (satu per baris, dalam urutan itu) dari STDIN.
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
CJam, 20 byte
Ini adalah fungsi anonim yang muncul B , V dan I (atas ke bawah) dari tumpukan dan meninggalkan satu array pada tumpukan sebagai balasannya.
Cobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Ruby, 48 byte
Saya pikir ini sesuai dengan aturan, tapi tolong periksa.
Fungsi yang tidak disebutkan namanya mengambil tiga array sebagai input. Menghasilkan string yang dapat diuraikan secara jelas ke dalam array angka dengan ekspresi ruby
x.split(/:+/).map(&:to_i)
.Uji kasus pada ideone .
Saya bisa menyimpan 3 byte lebih banyak, tetapi format outputnya
[1,2,[nil,5]]
terlalu ketat dengan aturan myo imo, meskipun tidak ambigu.sumber
nil
nilai interleaving sedikit meregang. Namun dalam kedua kasus ini tidak memenangkan kontes, jadi saya tidak terlalu khawatir tentang hal itu.R, 60
Sebagai fungsi tanpa nama yang mengambil b, v dan i
Perluas b dengan NAs. Mengisi celah yang diperlukan dengan v Mengembalikan vektor tanpa NAS
sumber
Jawa,
253, 226, 219,209bukan pemenang, tapi oh well.
Dengan asumsi bahwa B, V, dan saya bukan nol. v (huruf kecil v) adalah panjang dari array Nilai / Kebijakan. R adalah array yang dikembalikan. r adalah panjang array yang dikembalikan. x, y, dan saya semua ints sementara.
diperluas:
sumber
APL, 22 byte
Dalam ⎕IO ← 0 untuk mencocokkan kasus uji.
Ini adalah algoritma standar: vektor indeks dari argumen pertama ditambahkan ke indeks yang diberikan (argumen ke-3).
⍋
menghitung permutasi yang akan mengurutkan indeks dalam urutan menaik. Karena algoritme pengurutan APL stabil menurut definisi, permutasi yang dihitung menempatkan elemen katenasi argumen kedua dan pertama di tempat yang tepat.Misalnya :
sumber