var QUESTION_ID=59192,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/61321/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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>
Jawaban:
J, 5 byte
Cobalah online di J.js .
Bagaimana itu bekerja
/\
adalah kata keterangan (fungsi yang mengambil argumen kiri) yang secara kumulatif berkurang dengan argumennya.Jadi
+/\
adalah jumlah kata kerja kumulatif .^:
adalah konjungsi kekuatan ;(f ^: n) y
berlakuf
totaln
kali untuky
.Kereta kata kerja-konjungsi
+/\^:
membentuk kata keterangan yang berulang+/\
sebanyak yang ditentukan dalam argumen (kiri).x (+/\^:) y
akan diuraikan sebagai(x (+/\^:)) y
, yang setara dengan mengeksekusi(+/\^:x) y
.Terima kasih kepada @Zgarb atas bantuannya dengan penjelasannya.
sumber
Mathematica, 19 byte
Nah, jika built-in tidak apa-apa ...
Menentukan fungsi dengan tanda tangan yang sama dengan contoh dalam tantangan. Saya cukup yakin, berkat nama panjang
Accumulate
bahwa ini akan mudah dikalahkan oleh bahasa golf dan keluarga APL. :)Untuk menguraikan komentar LegionMammal978 bagi mereka yang tidak Mathematica:
##
mewakili urutan parameter fungsi (yang seperti daftar yang secara otomatis "splat" di mana pun ia dimasukkan, jika Anda lebih terbiasa dengan istilah itu dari bahasa pilihan Anda). The~
adalah sintaksis gula untuk fungsi infix doa, jadi jika kita memanggil fungsi dengan parameterlist
dann
dan memperluas segala sesuatu, kita mendapatkan:Yang terjadi justru urutan argumen yang diharapkan oleh
Nest
.sumber
SlotSequence
...Haskell,
2623 byteIni mendefinisikan fungsi anonim, dipanggil sebagai berikut:
Terima kasih kepada @nimi karena telah menghemat 3 byte.
Penjelasan
sumber
(!!).iterate(scanl1(+))
.APL,
98 byteIni mendefinisikan fungsi diad yang menerima iterasi dan daftar sebagai argumen kiri dan kanan.
Terima kasih kepada @NBZ untuk bermain golf 1 byte!
Cobalah online di TryAPL .
Bagaimana itu bekerja
⍺
dan⍵
argumen kiri dan kanan untuk fungsi.+\
kumulatif dikurangi dengan jumlah.⍣⍺
mengulangi waktu operator sebelumnya⍺
.⊢⍵
menerapkan fungsi identitas⍵
.Ini adalah cara yang lebih pendek dari parsing kode sebagai
(+\⍣⍺)⍵
bukan+\⍣(⍺⍵)
.Dalam hubungannya, kami menerapkan
+\
total⍺
kali untuk⍵
sumber
+\⍣⎕⊢⎕
bisa diterima? (⎕
seperti Pythoninput()
).⎕
setelahnya.Matlab, 41 byte
Cukup mudah. Saya masih berpikir itu cukup menjengkelkan karena tidak memiliki cara untuk membuat fungsi anonim yang didefinisikan secara terpisah, atau jangkar dalam rekursi.
Tidak Disatukan:
sumber
JavaScript (ES6) 38
Mengejutkan menggunakan .map secara rekursif
sumber
K,
73 byteSangat mirip dengan solusi J.
+\
tepat melakukan jumlah parsial, dan ketika/
diberikan dengan kata kerja monadik dan argumen integer kiri itu mengulangi beberapa kali, seperti loop "for". Sisanya hanya membungkusnya dengan rapi agar sesuai dengan urutan argumen.Diuji dalam Kona dan oK .
Edit:
Jika saya diizinkan untuk membalikkan argumen, seperti yang ditentukan @ kirbyfan64sos, saya dapat membuang fungsi pembungkus seluruhnya:
Dipanggil seperti:
Ini berfungsi baik di k2.8 dan k5. Ini tidak berfungsi di OK karena penerjemah itu belum mendukung adverbia curried (alias "diproyeksikan"), dan itu tampaknya tidak bekerja dengan baik di Kona karena alasan yang kurang jelas.
sunting : Sampai beberapa hari yang lalu,
+\/
formulasi juga berfungsi di oK.sumber
3 +\/ -3 4 7 -1 15
berfungsi dengan baik di Kona, tetapi Anda tidak dapat menetapkannya ke suatu fungsi. Aneh ...3+\/-3 4 7 -1 15
sama seperti+\/[3;-3 4 7 -1 15]
- membuat saya bertanya-tanya apakah mereka menangani yang pertama sebagai kasus sintaksis khusus.Pyth, 9 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan
sumber
Julia, 29 byte
Ini benar-benar tidak perlu banyak penjelasan. Ini adalah fungsi rekursif, jika
y==0
kemudian hanya keluaran x. Jika tidak, kurangi y, lakukan cumsum, dan rekursi. Mungkin bukan solusi Julia yang paling golf, saya masih mengusahakannya.sumber
Labirin , 73 byte
Sudah lama sejak saya menjawab sesuatu di Labyrinth, dan ini sepertinya bisa dilakukan. :)
Format input adalah daftar datar dengan jumlah iterasi pertama (dan kemudian daftar untuk menerapkan jumlah parsial). Pembatas tidak masalah semua, selama tidak ada karakter setelah integer terakhir, sehingga Anda dapat menggunakan sesuatu yang dapat dibaca seperti:
Output dipisahkan oleh baris baru:
sumber
R, 75 byte
Ini panjang tapi berbeda ... menghitung urutan yang diinginkan secara langsung daripada jumlah kumulatif:
Memperhatikan bahwa koefisien syarat xi untuk kumsum ^ n (x) adalah diagonal segitiga Pascal. yaitu
edit: untuk membuat fungsi
sumber
Python 2, 67
Ini menggunakan penjumlahan yang sama dengan Anthony Roitman , dan rekursi yang sama dengan Morgan Thrapp .
Saya mengembangkan solusi ini sebelum saya melihat solusi mereka, dan kemudian sepertinya lebih mudah untuk mempostingnya sebagai jawaban daripada komentar untuk salah satu atau keduanya.
sumber
Python,
113938976 byteIni berfungsi untuk kedua kasus uji. Terima kasih kepada Status, Morgan Thrapp, dan Ruth Franklin yang telah membantu saya mengubah program menjadi 93, 89, dan 76 byte.
sumber
k=[sum(l[:j+1])for j in range(len(l))]
,. Kemudian dengan;k=l
menempelkan pada ujung itu Anda bisa mendorong semua ini ke satu baris denganfor i
loop.k=[sum(l[:j+1])for j in range(len(l))];l=k
ke baris yang sama dengan for loop untuk menyimpan 2 byte dan menghapus spasi di antara argumen f untuk menyimpan byte lainnya.i
, Anda dapat menggantinyafor i in range(n)
denganfor i in[0]*n
(karena yang Anda pedulikan hanyalah panjangnya, bukan elemen dari daftar). Dan saya pikir Anda bisa melakukannya tanpa menggunakan daftar tambahank
, hanya memodifikasi argumenl
.Gol> <> 0.3.10 , 22 byte
Bilangan bulat pertama dianggap sebagai nomor iterasi dan sisanya merupakan daftar. Daftar akhir dikeluarkan baris-baru yang dikeluarkan.
Bahasanya masih sangat muda dan tidak stabil, tetapi karena saya cukup mengatur operator ini saya pikir itu akan baik-baik saja.
Penjelasan
Untuk melihat mengapa ini berhasil, mari kita coba contoh kecil
[5 2 1]
:sumber
Python, 52 byte
Fungsi rekursif yang berulang pada daftar
l
dan jumlah iterasin
. Mari kita jabarkan.Pertama, mari kita pertimbangkan fungsi rekursif
g
yang mengulangi jumlah parsial sekali saja.Untuk daftar kosong
l
, ini mengembalikanl
dirinya sendiri, daftar kosong. Jika tidak, entri terakhir dari jumlah parsiall
adalah jumlah keseluruhanl
, yang ditambahkan ke hasil rekursif untuk semua kecuali elemen terakhirl
.Sekarang, mari kita lihat fungsi
f
yang berlakug
untukn
iterasi.Ketika
n
adalah0
, ini mengembalikan daftarl
berubah, dan sebaliknya, berlakug
sekali, kemudian memanggilf
rekursif dengan satu lebih sedikit iterasi yang tersisa.Sekarang, mari kita lihat kembali kode yang sebenarnya, yang menggabungkan dua rekursi menjadi satu fungsi. Idenya adalah untuk memperlakukan
g(l)
sebagai kasus khususf(l,1)
.Kami mengambil
f(g(l),n-1)
dari definisi sebelumnya, diperluasg(l)
menjadig(l[:-1])+[sum(l)]
, dan kemudian digantig(_)
denganf(_,1)
untuk membatasi panggilan rekursiff
.Untuk kasus dasar, kami ingin kembali
l
kapanpunn==0
ataul==[]
. Kami menggabungkan ini dengan mencatat bahwa salah satun*l
dari daftar tersebut menjadi daftar kosong, yaitu Falsy. Jadi, kami berulang setiap kalin*l
tidak kosong, dan mengembalikanl
sebaliknya.Meskipun ada dua panggilan rekursif
f
, ini tidak menyebabkan ledakan eksponensial definisi rekursif dari angka-angka Fibonacci, tetapi tetap kuadratik.sumber
C ++ (61 + 17 = 78 byte)
Kasus cobaan:
Ini membutuhkan sedikit kebebasan dengan spesifikasi: ia menggunakan larik C-style, melewati pointer ke awal dan akhir larik. Secara internal, seperti yang Anda lihat, itu hanya pembungkus yang sangat tipis
std::partial_sum
di dalam perpustakaan standar. Alih-alih benar-benar mengembalikan nilai yang dihasilkan, itu hanya mengubah array yang diteruskan.Jika kita tidak keberatan mendorong definisi hal-hal ke batas (dan, bisa dibilang, sedikit di luar) kita dapat mendefinisikan "fungsi" dalam ekspresi lambda:
Ini mengurangi definisi fungsi (-seperti objek) untuk bagian ini:
... untuk 40 byte (+17 untuk
#include
).sumber
CJam, 13 byte
Uji di sini.
sumber
Haskell,
5247 byteKode 'usaha' golf pertama, dan saya sangat pemula di Haskell, jadi komentar dengan senang hati disambut! Tidak jelas dalam pertanyaan mengenai format panggilan fungsi yang diperlukan, atau apakah itu diambil oleh argumen ke program, jadi saya menggunakan tanda seru sebagai pengidentifikasi fungsi untuk menghemat beberapa ruang.
Penggunaan (GHCi):
sumber
0!a=a
i!a=...
.sum(take j a)
, Anda dapat menghindari parens dengan melakukansum$take j a
, menggunakan prioritas tinggi$
.$
akan diutamakan daripada sintaks (dan mencoba untuk mengevaluasi sisa baris seperti yang ada). Tentu saja, itu bahkan tidak masuk akal.R, 41 byte
sumber
C #, 52 + 85 =
148137 bytedan
Ini menggunakan praktik yang tidak lazim (
v=>t+=v
), tetapi ini adalah PPCG. Perhatikan juga batasan kedalaman tumpukan.sumber
Python 3, 73
Mungkin bisa bermain golf sedikit lebih jauh.
Versi ini menggunakan numpy, yang terasa sedikit seperti curang, tetapi ini dia:
Python 3 (dengan numpy), 72
sumber
C ++ 14,
10210394 + 17 (termasuk) = 111 byteTidak disatukan, dengan test case
Bergantung pada urutan evaluasi. Tidak yakin apakah itu UB atau tidak, tetapi berfungsiIni bergantung pada kompiler, jadi saya mengubahnya.sumber
j
dari 0 hingga n, hitungn
mundur menjadi 0. Memberikan 97 byte menurut hitungan saya.Oktaf, 24 byte
sumber
Burlesque, 10 byte
itu tidak terlalu efisien secara umum tetapi itu berhasil.
sumber
C ++ 14, 67 byte
Sebagai lambda tanpa nama memodifikasi inputnya, diperlukan
c
sebagai wadah akses-acak sepertivector<int>
.sumber
05AB1E , 4 byte (Mungkin tidak bersaing)
Cobalah online!
sumber
Jelly , 3 byte
Cobalah online!
Ini adalah metode saya ( Mr Xcoder ).
Jelly , 3 byte
Cobalah online!
Ini adalah solusi caird coinheringaahing .
Metode # 1
Metode # 2
sumber
Aksioma
21347 byteungolf dan beberapa contoh
sumber