(Terinspirasi oleh konsep awal tantangan fraktal garis PhiNotPi .)
Anda diberi lebar W > 1
, tinggi, H > 1
dan string yang terdiri dari 2(W+H-2)
karakter ASCII yang dapat dicetak. Tugasnya adalah untuk mencetak tali ini melilit persegi panjang dengan lebar dan tinggi yang diberikan, mulai dari sudut kiri atas, dalam arti searah jarum jam. Bagian dalam persegi panjang diisi dengan spasi. Kasus-kasus pengujian diharapkan membuat ini sangat jelas.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi, dan mencetak hasilnya ke STDOUT (atau alternatif terdekat) atau mengembalikannya sebagai string.
Tidak boleh ada spasi awal atau akhir (selain dari yang mungkin ada dalam string input). Anda secara opsional dapat menampilkan satu baris baru.
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang.
Uji Kasus
Setiap test case "String" W H
diikuti oleh output yang diharapkan.
"Hello, World! "
5 4
Hello
,
!
dlroW
"+--+|||+--+|||"
4 5
+--+
| |
| |
| |
+--+
">v<^"
2 2
>v
^<
"rock beats scissors beats paper beats "
11 10
rock beats
s
s c
t i
a s
e s
b o
r
r s
epap staeb
Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~ O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
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 bisa 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=47710;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>
Jawaban:
CJam, 27 byte
Saya tidak benar-benar CJam, tapi saya pikir ini mengalahkan Martin. Perbedaan utama adalah bahwa kami mendorong baris baru sebelum membaca input dan segera mencetak baris pertama, meniadakan kebutuhan untuk menyimpan ketinggian.
Mengambil input dalam urutan
Cobalah online.
sumber
Python 2, 95 byte
Mencetak baris pertama, lalu dua garis vertikal, lalu baris terakhir.
Pasti ada sesuatu yang lebih pendek daripada menulis
print
tiga kali, tetapi semua yang saya coba sejauh ini dengan menyimpan ke variabel dan'\n'.join
telah lebih lama.sumber
eval
pada input dan kurung pernyataan cetak.eval
memperhitungkan! Tanda kurung seharusnya tidak terlalu menjadi masalah karenaprint
dalam Python 2 membutuhkan ruang setelahnya. Pergi dariprint blah
kep(blah)
masih menyimpan 3 karakter.CJam,
3130 byteAtas desakan Pengoptimal, inilah usaha saya sendiri. Saya bukan penggemar memenangkan tantangan saya sendiri, jadi saya menghitung keluarga APL (atau seseorang yang lebih baik di CJam) untuk mengalahkan ini. ;)
Mengambil input dalam urutan yang sama seperti yang diberikan dalam pertanyaan:
Uji di sini.
Satu byte disimpan berkat Pengoptimal.
Penjelasan
Awalnya, saya punya ide yang bagus untuk memulai dengan persegi panjang spasi dan kemudian benar-benar melilitkan tali di sekitarnya sambil memutar seluruh grid empat kali. Namun, saya sepertinya tidak bisa menggunakannya jika ada lebar atau tinggi atau keduanya
2
. Jadi saya mencoba pendekatan naif (print top, loop over sides, print bottom), dan ternyata ternyata sangat pendek.sumber
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
menghemat 1 char.Pyth,
474645403736 byteIni adalah pendekatan yang jelas diimplementasikan di Pyth. Ini mencetak baris pertama dengan mengindeks
0:width
dan kemudian tengah, lalu akhir.Terima kasih kepada @Jakube untuk tip dengan menggunakan
z
danQ
untuk dua input dan menggunakanp
.Mengambil input dari stdin sebagai string dan sebagai tuple dimensi, baris baru dipisahkan:
dan menulis ke stdout.
Coba di sini .
sumber
z
untuk membaca string menghemat cukup banyak karakter. Jugat_N
hal yang sama-_N1
.++
menggunakanp
dan beralihzt_N
dengan*d-k2
.J, 61 byte
Metode:
Mulai dari
(height-2)*(width-2)
blok ruang, kami mengambil jumlah karakter yang diperlukan dari akhir string dan menambahkannya ke blok saat ini. Kami ulangi ini 4 kali. Total 5 negara diilustrasikan dengan'Hello, World! ' 5 4
contoh (spasi diganti denganX
s untuk keterbacaan):Kode:
Definisi fungsi eksplisit. Fungsi dua-operan mengambil string sebagai argumen kiri dan daftar dua bilangan bulat sebagai argumen benar.
Contoh penggunaan:
Cobalah online di sini.
sumber
Pyth,
3837Awalnya saya punya solusi yang berbeda, tetapi pada dasarnya solusi golf jawaban Maltysen. Jadi saya memutuskan untuk sedikit berbeda.
Cobalah online .
sumber
_>z_ttH
setara dengan<_zttH
.JavaScript (ES6), 110
115Berfungsi dengan 3 parameter, mengembalikan string
Chrome versi 119 : tidak ada format pendek untuk fungsi, tidak ada parameter default. Tidak ada alasan untuk menggunakan
for(of)
bahkan jika itu didukungES5 versi 126 : no for (of), no string.repeat
Tidak disatukan
Uji di Firefox / konsol FireBug
Keluaran
sumber
Python 2, 97 byte
Mengambil pendekatan langsung.
sumber
Haskell,
164156 bytesFungsi
p
tidak mencetak output, tetapi mengembalikannya sebagai string, misalnyap 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Untuk penggunaan layar yang lebih baikputStr
:Cara kerjanya: Saya membuat blok
w
xh
spasi dan mengganti baris pertama dengan awal string input. Lalu saya memutar blok berlawanan arah jarum jam dan mengulangi mengganti baris pertama tiga kali.Untuk mencegah pemotongan karakter pertama lagi setelah giliran # 4, saya menambahkannya ke string input sebelum memulai.
Sunting: menemukan cara yang lebih baik untuk menyelesaikan masalah cut-off-first-character-after-turn-# 4.
sumber
Catatan tambahan, 62 byte
Ini tentu saja menggunakan token biner, tetapi ini setara dengan:
Berikut ini adalah hexdump dari file (
xxd round.ps
):Jalankan sebagai:
Outputnya sangat kecil (karena tidak menskalakan font sama sekali), jadi Anda perlu memperbesar sedikit untuk melihatnya.
Ini mengambil keuntungan dari
xyshow
operator untuk menulis string menggunakan spasi karakter khusus. Dalam hal ini, saya menggunakan spasi vertikal negatif untuk menulis, kemudian ruang horizontal negatif untuk menulis mundur, kemudian ruang vertikal positif untuk menulis ke atas. Karena itu, saya tidak perlu menggunakan manipulasi string apa pun.sumber
> <>,
8280 + 3 = 83 byteHalaman Esolang untuk> <> (Ikan)
Ini ternyata lebih pendek dari yang saya harapkan. Ia menggunakan pendekatan langsung untuk mencetak baris pertama, lalu kolom-kolom yang diisi dengan spasi pusat, lalu baris terakhir.
Masukkan string melalui STDIN dan tinggi dan lebar melalui baris perintah dengan
-v
bendera, seperti:Penjelasan
sumber
Bash + coreutils, 124
Skrip shell untuk memulai:
Masukan input sebagai argumen baris perintah:
sumber
JavaScript,
161160158 byteMetode yang saya hasilkan ternyata terlalu lama, tapi oh well, sudah praktik. (Juga, aku harus mengejanya
r+o[u]+'\n':d
.)Untuk input yang tidak masuk akal outputnya tidak terdefinisi (secara harfiah, dan beberapa kali), tetapi berfungsi untuk semua kasus uji.
sumber
slice
lebih pendek daripadasubstr
, itu tidak persis sama tetapi dalam kasus ini Anda dapat menggunakannyaGroovy, 140
panggilan:
keluaran:
sumber
K,
5554 byteMenggunakan pendekatan yang sama dengan implementasi J randomra; Mulailah dengan blok ruang dan tambahkan dari ujung tali ke tepi sambil berputar empat kali:
Dan beberapa contoh:
Memecahnya sedikit untuk dibaca,
Hasilkan blok NxM:
Putar 90 derajat dengan menggunakan transpose (
+
) dan mundur-masing-masing (|:'
):Jadi jika kita memiliki blok spasi
t
dan strings
, kita dapat menambahkan sepotong ekors
ket
:Kami menggunakan formulir
4 {[x] ... }/( ... )
untuk berulang kali menerapkan fungsi ke tuple yang terdiri dari string dan matriks yang kami bangun. Setiap kali kita melakukan langkah rotate-and-concatenate ini, kita juga memotong string.edit:
Gagasan lain adalah mencoba memisahkan string input ke dalam fragmen yang kita inginkan pada setiap rotasi, yang menyederhanakan bagian utama program. Sayangnya ini berhasil menjadi sedikit lebih lama pada 56 byte:
Jika ada cara yang lebih baik untuk menghitung titik-titik perpecahan itu saya terbuka untuk saran.
edit2:
Mengatur ulang sedikit memungkinkan saya menghapus sepasang tanda kurung. 54 byte!
sumber
K,
8068 byteDipersingkat dari 80 berkat @JohnE.
Asli:
Aku bahkan tidak tahu bagaimana ini bekerja.
Contoh penggunaan:
Ada beberapa kemungkinan optimasi, tapi saya terus membuat Kona segfault ...
sumber
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 karakter menurut hitungan saya.R, 178
Ini adalah fungsi yang tidak disebutkan namanya
s, w, h
sebagai parameter. Saya berharap ada cara yang lebih baik untuk memisahkan tali.Tidak disatukan
Uji coba
sumber
T-SQL, 307
Meskipun masih sangat panjang, ini ternyata sedikit lebih mudah (dan lebih pendek) daripada yang saya pikirkan dalam sebuah query. Diimplementasikan sebagai fungsi bernilai tabel inline untuk T-SQL.
Ini berulang melalui string @ h kali. Rekursi pertama klip karakter @W dari string. Rekursi tengah mengambil yang terakhir dan yang pertama dari string yang tersisa dengan tali di antaranya. Rekursi terakhir membalikkan apa yang tersisa. Ada beberapa karakter yang hilang berurusan dengan cara SQL Server memperlakukan spasi tambahan di VARCHARS.
Uji Coba
sumber
Pyth, 33 byte
Demonstrasi.
sumber
MATLAB, 101
sumber
C ++, 398 byte
Kompiler yang digunakan - GCC 4.9.2 dengan
-std=c++14
flagUji di sini.
Penjelasan
sumber
char[][]
saja?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
sedikit lebih pendek darichar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195byteSaya yakin ini bisa sangat ditingkatkan. Saya seorang noob. >, <
sumber
Java 11, 180 byte
Cobalah secara online (CATATAN:
String.repeat(int)
diemulasikanrepeat(String,int)
untuk byte-count yang sama, karena Java 11 belum menggunakan TIO.)Penjelasan:
sumber
Arang , 4 byte
Cobalah online (verbose) atau coba online (murni) .
Penjelasan:
Pada dasarnya sebuah builtin untuk tantangan ini. Ambil dua input integer pertama sebagai lebar dan tinggi, dan cetak kotak dengan string input ketiga sebagai pembatas:
sumber