Berikut ini adalah kode golf sederhana, berukuran gigitan (ukuran byte?): Diberi daftar bilangan bulat positif kurang dari 10, cetak matriks blok-diagonal , di mana daftar menentukan ukuran blok, secara berurutan. Blok harus terdiri dari bilangan bulat positif kurang dari 10. Jadi jika Anda diberikan sebagai input
[5 1 1 2 3 1]
Output Anda bisa, misalnya,
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1
atau
1 2 3 4 5 0 0 0 0 0 0 0 0
6 7 8 9 1 0 0 0 0 0 0 0 0
2 3 4 5 6 0 0 0 0 0 0 0 0
7 8 9 1 2 0 0 0 0 0 0 0 0
3 4 5 6 7 0 0 0 0 0 0 0 0
0 0 0 0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0
0 0 0 0 0 0 0 3 4 0 0 0 0
0 0 0 0 0 0 0 0 0 5 6 7 0
0 0 0 0 0 0 0 0 0 8 9 1 0
0 0 0 0 0 0 0 0 0 2 3 4 0
0 0 0 0 0 0 0 0 0 0 0 0 5
atau semacam itu. Elemen-elemen dalam matriks harus dipisahkan oleh spasi (tunggal), dan baris dipisahkan oleh baris baru (tunggal). Tidak boleh ada spasi awal atau akhir pada garis apa pun. Anda mungkin atau mungkin tidak mencetak baris baru.
Anda dapat menulis fungsi atau program, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi, dalam string atau format daftar yang mudah digunakan (asalkan tidak diproses sebelumnya). Namun, hasilnya harus dicetak ke STDOUT (atau alternatif terdekat), bukan kembali dari fungsi, katakanlah.
Anda tidak boleh menggunakan fungsi bawaan yang dirancang untuk membuat matriks blok-diagonal.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.
Papan peringkat
Saya berharap bahasa berbasis array (seperti J dan APL) memiliki keunggulan di sini, tetapi saya tidak ingin hal itu membuat orang tidak mau mencoba melakukan sebaik yang mereka bisa dalam bahasa pilihan mereka. Jadi di sini adalah Cuplikan Stack untuk menghasilkan leaderboard reguler dan tinjauan pemenang berdasarkan bahasa. Jadi mengapa tidak mencoba dan mendapatkan tempat di yang terakhir?
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
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(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45550;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var 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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
[:=/~]#<\
dihitung terhadap skor Anda. Juga,=/~@#<\
untuk dua byte tambahan dicukur habis.(=/~@#<\)
hanya sebuah fungsi. Anda harus benar-benar menerapkannya pada sesuatu untuk mendapatkan ekspresi, jadi Anda perlu input eksplisit (".1!:1[1
), atau jika Anda ingin mengirimkan fungsi, fungsi itu seharusnya benar-benar mencetak nilai dan tidak hanya mengembalikannya (sepertiecho@
atau sesuatu ).=/~&I.
APL, 10
Contoh:
Penjelasan:
∆←⎕
: baca input, simpan di∆
.⍋∆
: temukan permutasi yang macam-macam∆
(ini memberikan nilai unik untuk setiap nilai dalam input)∆/
: untuk masing-masing nilai unik tersebut, ulangiN
kali, di manaN
nilai yang sesuai dalam input∘.=⍨
: buat matriks yang membandingkan setiap nilai dalam daftar itu dengan nilai-nilai lainnya.sumber
http://tryapl.org
, Anda mungkin ingin menggunakan dfn{∘.=⍨⍵/⍋⍵}
, karena situs memfilter semua penggunaan⎕
(kecuali untuk⎕IO
dan hal-hal seperti itu).{∘.=⍨⍵/⍋⍵}
tidak valid. Anda perlu{⎕←∘.=⍨⍵/⍋⍵}
, yang tidak hanya membutuhkan dua karakter tetapi masih tidak berfungsi pada TryAPL. (Dan secara umum, TryAPL terlalu terbatas untuk berguna.)⎕←
, bahkan tanpa dfn?R,
6963Kasus cobaan:
Fungsi luar melakukan sebagian besar pekerjaan di sini, maka itu hanya kasus mendapatkan output yang terlihat benar - Terima kasih kepada @Vlo atas bantuannya dengan itu
sumber
-/+
logika logis. Simpan beberapa bytefunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 byteMenggunakan percikan untuk mengambil keuntungan dari sifat pemisah ruang
print
, dengan sedikit rekursi.sumber
Ruby,
869083 byteGolf pertamaku!
Menerima array dengan bilangan bulat, mencetak hasil yang diharapkan:
Edit:
Terima kasih kepada Martin Büttner karena membantu saya mempersingkat beberapa hal!
sumber
->(l)
bisa->l
.map
lebih pendek darieach
..join(" ")
dapat disingkat menjadi*" "
.Matlab,
6054 byteIni akan menjadi bidang khusus Matlab JIKA kita bisa menggunakan fungsi builtin ...
Terima kasih @sanchises untuk memperbaiki kesalahan yang saya lewatkan.
sumber
Matlab, 53 byte
Meskipun hanya satu char yang lebih pendek dari fragmen Matlab lainnya, saya pikir kodenya cukup berbeda untuk menjamin jawaban baru:
Trik utama tentu saja di luar batas pengindeksan, tetapi ini dikombinasikan dengan menggunakan
end
sebagai variabel untuk membuatnya lebih kompak.sumber
end+1:end+v
untuk menghilangkan variabel 'counter', dan saya tidak memikirkan solusi ini.blkdiag
akan melanggar persyaratan. Sekedar referensi, saya akan meletakkan intinya di sini:blkdiag(A,ones(i))
CJam, 21
Cobalah di http://cjam.aditsu.net/
Penjelasan:
sumber
Python 3, 79
Melacak indeks paling kiri dari blok sebagai
s
dan membuatx
entri setelah itu1
, di manax
ukuran blok saat ini. Baris ini kemudian dicetakx
kali. Python 3 perlu dilakukanprint(*r)
.sumber
r
sebagai[0]*s+[1]*x+[0]*(sum(l)-s-x)
, tapi aku masih mencari cara yang lebih baik.Haskell,
118116 bytePemakaian:
f [2,1,1,3]
Keluaran:
Bagaimana itu bekerja:
sumber
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, karenan
tidak digunakan di luarlet
penjilidan.Pyth,
2321 byteRepositori GitHub untuk Pyth
Input adalah daftar bilangan bulat, seperti
[3, 1, 1, 2]
. Cobalah secara online: Pyth Compiler / ExecutorMenggunakan ide yang sangat mirip dengan kode J randomra. Bagian pertama dari kode
Ju+G*]GHQY
menghasilkann
bagian dari hal-hal serupa. Sebagai contoh input[3, 1, 1, 2]
hasilnya terlihat seperti ini:Pertama tiga elemen identik, dari satu elemen, lalu satu elemen lagi dan pada akhirnya dua elemen identik.
Bagian kedua dari kode ini membandingkan elemen-elemen produk Cartesian dan mencetaknya.
sumber
C ++, 294 byte
Kompiler yang digunakan - GCC 4.9.2
Penjelasan -:
sumber
K, 30 byte
Pada dasarnya mencuri jawaban marinus
sumber
Jawa, 163
Seorang konsumen yang menerima daftar bilangan bulat.
Versi yang mudah dibaca, dengan kode boilerplate:
Meminta menggunakan:
sumber
Python 2,
163114 byteGnibbler bermain golf ini banyak.
sumber
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Python 3, 74
sumber
and
korsleting.f([1,2,3]);print("Done")
, kesalahan akan mengakhiri program setelah mencetak matriks blok, dan itu tidak akan mencetak "Selesai".JavaScript (ES6), 103
107103 byte sebagai fungsi anonim, tidak termasuk
F=
(tetapi Anda perlu ini untuk mengujinya)Uji di Firefox / konsol FireBug
Keluaran
sumber
Oktaf,
4941 bytesumber
Pyth,
3130Program yang cukup naif, mengambil input dari stdin. Ini mungkin bisa golf lebih banyak;)
Terima kasih @ Jakube untuk menunjukkan char yang sia-sia
Coba di sini
sumber
Perl, 69
Menggunakan input standar:
sumber
-e
alih - alih dari file (lihat contoh di posting meta itu). juga, saya pikir Anda tidak perlun
bendera - menurut perldoc,a
disetn
secara implisit.perl -nl file.pl
". Aturan perlgolf asli akan menghitung tanda hubung tetapi bukan spasi jadi 3 karakter dalam hal ini.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. BTW versi saya dari Perl tidak diatur-n
dengan-a
, itu harus menjadi tambahan baru.R,
117144137133129123 byteCukup masuk akal saat ini. Harus bisa mencukur lebih banyak. Memperoleh sejumlah byte memformatnya dengan benar, tetapi menyimpan beberapa swap matriks untuk array.
Terima kasih kepada Alex untuk tip penggantian sep dengan s dan menghapus nama fungsi.
Menjatuhkan array sepenuhnya dan menggunakan serangkaian repetisi untuk membangun setiap baris.
Meskipun dipukuli oleh Miff, solusinya membuat saya sadar bahwa saya bisa menghilangkan s = '' sekaligus.
Dan ujiannya
sumber
cat()
, ubahsep=
kes=
karena tidak ada parameter lain yang dikenali untuk fungsi itu dimulai dengan "s".f=
. Ini memberi Anda objek fungsi. Jika Anda melakukannya, Anda hanya perlu menetapkan bahwa itu ditugaskan menggunakan sesuatu sepertif=
sebelum menjalankannya. Saya tidak menyadari bahwa itu sah dalam kontes seperti ini sampai saya melihat Martin Büttner melakukannya dengan Ruby.Batch - 226 Bytes
Mengambil input dari stdin (
C:\>script.bat 5 1 1 2 3 1
) dan gema output. Sayangnya saya tidak bisa mendapatkan gema terakhir di jalur yang sama, kalau tidak saya mungkin bisa memanggil seluruh baris di dalamcmd/von/c
untuk menghindari harus memungkinkan ekspansi yang tertunda jauh.Bagus dan rapi - tidak ada tapi pekerjaan kasar:
sumber
Haskell, 124
Menghasilkan output dengan menggabungkan tindakan IO melalui
mapM_
danfoldr
. Fungsi tersebutd
harus diberi daftar int.sumber
K (ngn / k) , 10 byte
Cobalah online!
-19 Berkat ngn ... menjaga kiriman saya di bawah haha
K (ngn / k) , 29 byte
Cobalah online!
edit: istirahat untuk kasus input 1-elemen, perlu bekerja
sunting1: sekarang diperbaiki. +4 byte. boo
sumber
{x=\:x:&x}
&
dalam k atauI.
dalam j) bekerja dengan vektor int, sedangkan apl⍸
hanya bekerja dengan boolean .APL (Dyalog Extended) , 5 byte
Cobalah online!
APL menang melawan J dan K dengan domain yang diperluas untuk
⍸
.Bagaimana itu bekerja
sumber
STATA, 155 byte
sumber
Jelly , 7 byte
Cobalah online!
Pendekatan yang sama dengan jawaban J.
sumber