Tulis program lengkap atau fungsi yang mengambil bilangan bulat positif N
sebagai input melalui STDIN / baris perintah / ARGV atau argumen fungsi dan mencetak simpul ganda ASCII yang sesuai dengan N
ke STDOUT.
Simpul ganda ASCII terlihat seperti ini:
__ __ __ __ __ __
/ \/ \/ \/ \/ \/ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\ \/\ \/\ \/\ \/\ \/\ \/
/\ \/\ \/\ \/\ \/\ \/\ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\__/\__/\__/\__/\__/\__/
Di atas adalah untuk N = 6
Berikut adalah beberapa simpul ganda untuk nilai lain dari N
:
Jika N = 1
, simpul ganda keluaran terlihat seperti:
__
/ \
| /\ |
| \/ |
\ \/
/\ \
| /\ |
| \/ |
\__/
Untuk N = 2
itu
__ __
/ \/ \
| /\/ /\ |
| \/ /\/ |
\ \/\ \/
/\ \/\ \
| /\/ /\ |
| \/ /\/ |
\__/\__/
Untuk N = 3
itu
__ __ __
/ \/ \/ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\ \/\ \/\ \/
/\ \/\ \/\ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\__/\__/\__/
dan demikian pula, pola berlanjut dan nilai yang lebih besar dari N
.
Detail :
- Input selalu bilangan bulat positif lebih besar dari
0
.
- Mengejar baris baru adalah opsional
- Seharusnya tidak ada spasi tambahan di setiap baris, atau spasi tambahan yang cukup sehingga panjang setiap baris
4*N + 2
.
- Seharusnya tidak pernah ada ruang utama yang bukan bagian dari pola yang ditentukan.
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Papan Peringkat Seri
Saya mengubah ini menjadi serangkaian tantangan seni ASCII dan dengan demikian menambahkan papan pemimpin untuk seri (cuplikan oleh Martin). Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N adalah ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
/* Configuration */
var QUESTION_IDs = [50484, 50521, 50625, 51123, 51222]; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!.FjwQBrX2KXuFkv6p2lChi_RjzM19";
/* App */
var answers = [], page = 1, currentQ = -1;
function answersUrl(index) {
return "http://api.stackexchange.com/2.2/questions/" + QUESTION_IDs.join(";") + "/answers?page=" + index + "&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 (data) {
answers.push.apply(answers, data.items);
if (data.has_more) getAnswers();
else process();
}
});
}
getAnswers();
var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>((?!>).)*<\/s>|((?!>).)+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^\n,]+)(?=,)/;//
function shouldHaveHeading(a) {
var pass = false;
var lines = a.body_markdown.split("\n");
try {
pass |= /^#/.test(a.body_markdown);
pass |= ["-", "="]
.indexOf(lines[1][0]) > -1;
pass &= LANGUAGE_REG.test(a.body_markdown);
} catch (ex) {}
return pass;
}
function shouldHaveScore(a) {
var pass = false;
try {
pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
} catch (ex) {}
if (!pass) console.log(a);
return pass;
}
function getAuthorName(a) {
return a.owner.display_name;
}
function getAuthorId(a) {
return a.owner.user_id;
}
function process() {
answers = answers.filter(shouldHaveScore)
.filter(shouldHaveHeading);
answers.sort(function (a, b) {
var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
return aB - bB
});
var users = {};
answers.forEach(function (a) {
var headline = a.body_markdown.split("\n")[0];
var question = QUESTION_IDs.indexOf(a.question_id);
var size = parseInt((headline.match(SIZE_REG)||[0])[0]);
var language = headline.match(LANGUAGE_REG)[1];
var user = getAuthorName(a);
var userId = getAuthorId(a);
if (!users[userId]) users[userId] = {name: user, nAnswer: 0, answers: []};
if (!users[userId].answers[question]) {
users[userId].answers[question] = {size: Infinity};
users[userId].nAnswer++;
}
if (users[userId].answers[question].size > size) {
users[userId].answers[question] = {size: size, link: a.share_link}
}
});
var sortedUsers = [];
for (var userId in users)
if (users.hasOwnProperty(userId)) {
var user = users[userId];
user.score = 0;
user.completedAll = true;
for (var i = 0; i < QUESTION_IDs.length; ++i) {
if (user.answers[i])
user.score += user.answers[i].size;
else
user.completedAll = false;
}
sortedUsers.push(user);
}
sortedUsers.sort(function (a, b) {
if (a.nAnswer > b.nAnswer) return -1;
if (b.nAnswer > a.nAnswer) return 1;
return a.score - b.score;
});
var place = 1;
for (var i = 0; i < sortedUsers.length; ++i) {
var user = sortedUsers[i];
var row = '<tr><td>'+ place++ +'.</td><td>'+user.name+'</td>';
for (var j = 0; j < QUESTION_IDs.length; ++j) {
var answer = user.answers[j];
if (answer)
row += '<td><a href="'+answer.link+'">'+answer.size+'</a></td>';
else
row += '<td class="missing"></td>';
}
row += '<td></td>';
if (user.completedAll)
row += '<td class="total">'+user.score+'</td>';
else
row += '<td class="total missing">'+user.score+'</td>';
row += '</tr>';
$("#users").append(row);
}
}
body { text-align: left !important}
#leaderboard {
width: 500px;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
td.total {
font-weight: bold;
text-align: right;
}
td.missing {
background: #bbbbbb;
}
<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="leaderboard">
<h2>Leaderboard</h2>
<p>
Missing scores are shown as grey cells. A grey total indicates that the user has not participated in all challenges and is not eligible for the overall victory yet.
</p>
<table class="_user-list">
<thead>
<tr><td></td><td>User</td>
<td><a href="https://codegolf.stackexchange.com/q/50484/31414">#1</a></td>
<td><a href="https://codegolf.stackexchange.com/q/50521/31414">#2</a></td>
<td><a href="https://codegolf.stackexchange.com/q/50625/31414">#3</a></td>
<td><a href="https://codegolf.stackexchange.com/q/51123/31414">#4</a></td>
<td><a href="https://codegolf.stackexchange.com/q/51222/31414">#5</a></td>
<td></td><td>Total</td>
</tr>
</thead>
<tbody id="users">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><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>
Seri sejauh ini
1. Simpul Ganda
2. Aliran Ular
3. Kuil Cina
4. Tanda Zodiak
5. Memiringkan Berlian Secara Acak
Jawaban:
CJam, 55 byte
Saya mendapatkan kutu buku yang cukup buruk dengan ini ... lagi pula, saya akhirnya menghasilkan 55 byte ISO 8859-1:
atau alternatif ini :
Awalnya saya mencoba melakukannya di ASCII biasa, tetapi hanya turun menjadi 58 byte :
dan sekali lagi, sebuah alternatif :
Penjelasan:
Idenya adalah untuk menyandikan bagian-bagian unik (tepi kiri, tepi kanan dan pola tengah) dengan cara yang nyaman, ulangi bagian tengah sesuai kebutuhan, dan satukan. Kode akhirnya menjadi serupa dalam banyak hal dengan jawaban Dennis; Saya tidak mencoba menyalinnya, tetapi saya mencoba banyak pendekatan berbeda (termasuk mengeksploitasi lebih banyak simetri dan pengulangan) dan inilah yang paling berhasil.
Saya menempatkan tepi kiri dan kanan bersamaan seperti ini:
Pola tengah memiliki 4 kolom, tetapi mereka diulang N-0,5 kali, yaitu satu pengulangan dipotong setengah. Untuk kenyamanan, saya menggunakan pola ini:
dan menghapus paruh pertama dari pengulangan pertama.
Jadi saya bergabung dengan bagian-bagian itu dan menyandikannya dalam bentuk transparan, karena lebih mudah untuk bekerja dengan mereka seperti itu. Program pertama dan ketiga menyandikan string ini:
(tanpa baris baru), yang merupakan transposisi dari tepi + tengah. Program kedua dan keempat ("alternatif") menyandikan string ini:
lagi, tanpa baris baru, dan ini adalah transposisi tepi + tengah.
Inilah cara kerja bagian umum kode ini:
Setelah ini, implementasinya sedikit berbeda. Dalam program pertama dan ketiga kami memiliki:
Dalam program (alternatif) kedua dan keempat, kami memiliki:
sumber
1>W<
lebih pendek. Ternyata saya hanya perlu memutar array sebelum menyandikannya dan menggunakan2>
...CJam,
1039283696657 byteCobalah online di juru bahasa CJam .
Ide
Polanya menjadi jauh lebih jelas setelah kita memindahkan baris dengan kolom (empuk ke kanan dengan spasi).
Untuk input 3 , misalnya, ini memberi:
Dua baris pertama dan dua terakhir adalah khusus, tetapi yang lain mengulangi pola yang sama berulang kali.
Jadi, untuk input N , yang harus kita lakukan adalah mengulang
N kali, ganti baris pertama dengan
baris terakhir dengan
dan, akhirnya, transpos baris dengan kolom.
Kode
sumber
Javascript ( ES7 Draft ),
169163160158 byteEdit: -6 dengan menggunakan string template untuk menghilangkan beberapa pengulangan dari string pola.
Edit: -3 dengan beralih dari
slice(0,-2)
keslice(2)
dengan mengatur ulang string pola.Sunting: -2 dengan mengulangi
b
alih-aliha
dan mengurangia
string menjadi 4 dengan modulo.Berkomentar:
sumber
.split(0)
dengan('__ 0 '+(r='\\/0/\\/ 0\\/ /0 ')+r+'0\\/ /0__/\\')
.0
, Anda akan melihat8
.``
dan apa yang${...}
sebenarnya dilakukan?${}
dievaluasi sebagai ekspresi javascript.Perl,
134129Mengambil parameter baris perintah:
sumber
JavaScript ( ES6 ), 165
166Elemen simpul:
Tidak disatukan
Golf
sumber
0
dan Anda akan mendapatkan laba-laba berkaki 4.C ++,
1530639479Ini tampak seperti tantangan yang menyenangkan, saya sedikit menyimpang dari brief.
Saya tidak yakin bagaimana mengukur byte dari ukuran aplikasi saya, tetapi saya akan mencoba mencari tahu dan memperbarui jawaban saya.
Aplikasi saya bisa lebih kecil tetapi loop di kedua x dan y, dan saya agak suka itu: D
sumber
Python 2,
156151147141139sunting 1: diedit untuk menggunakan input () alih-alih suatu fungsi.
sunting 2: menggunakan str.join dan ditambahkan ke var c untuk menghapus beberapa karakter yang berlebihan.
sunting 3: menghapus beberapa urutan pelarian string yang tidak perlu.
sunting 4: digunakan ~ -n alih-alih a = n-1
Ini program yang menyenangkan, golf kode pertama saya!
simpan di editor teks eksternal sebagai n.py untuk menghapus karakter baris baru terakhir untuk mengurangi ukuran file sebesar 1 byte, jalankan modul, dan masukkan nomor Anda.
sumber
input ()
dianggap oke ketika membaca dari STDIN.a=n-1
untuk menghemat menulis*(n-1)
dua kali, tetapi Anda melakukannya*~-n
.Python 2,
139133129 byteYang ini hanya membangun dan mencetak baris demi baris.
Berikut kode dalam bentuk ungolfed:
Sunting: Saya mengubah bahasa menjadi python 2, agar kompatibel dengan jawaban saya untuk # 3 (dan juga menghemat 6 byte lebih banyak)
sumber
w=(3*' ||')[i] -> w=' |'[i&2]
dan' '+s[1:-1]+' ' -> ' %s '%s[1:-1]
bekerja (yang pertama adalah string dengan dua spasi kemudian pipa, tapi SE bertindak)' ||'[i%4]
, tetapi ini bahkan lebih pendek (juga dengan dua spasi).C, 159 byte
Dengan spasi putih, dan beberapa peningkatan keterbacaan lainnya:
Ini terutama berbasis template. Template
t
berisi semua 9 kolom yang mungkin dari output, yang berarti bahwa itu mengkodekan 9 * 9 = 81 karakter, atau 80 tanpa baris baru.Karena hanya ada 6 karakter yang berbeda dalam pola (termasuk karakter baris baru), saya mengemas pasangan mereka menjadi satu karakter templat, yang berarti bahwa templat dapat disimpan dalam 40 karakter. Kemudian ada 6 * 6 = 36 pasangan karakter yang memungkinkan, yang dikodekan sebagai karakter ASCII 48 hingga 73. Terjemahan kembali ke karakter asli diberikan oleh tabel pencarian kecil
m
.Logika lainnya adalah untuk mengulangi pola
n
kali, yang berarti melompat kembali 4 karakter dalam template, sambil memancarkan bagian awal dan akhir dari setiap baris dengan benar.sumber
PHP 5.5.3,
488, 466sumber
=
dan.=
yang.Prolog (SWI), 285 byte
(Dengan spasi putih):
Saya mencoba beberapa cara untuk memotong string, tetapi tampaknya tidak ada yang mengalahkan metode kolom naif ini.
sumber
JavaScript (ES6),
158154148137 byteSunting: Disimpan 11 byte berkat @ Bálint.
sumber
/(..)(.{4})/g
adalah 13 byte, sama dengan/(..)(....)/g
...Java,
339330 byteSolusi pertama saya memiliki begitu banyak kata kunci "statis" di dalamnya sehingga lebih pendek untuk membuat metode dan atribut non-statis dan menjalankan kode dalam konstruktor.
sumber
PowerShell,
228207181133 bytePengingat - PowerShell tidak menunggu stdin secara otomatis. Anda harus menyalurkan sesuatu, misalnya
3|%{...}
sumber
SmileBASIC, 149 byte
Setiap string berisi pola
AACCBBDD
yang diperluas untuk membentukAABB(CCBB)*DD
BagianCCBB
diulang N kali, kemudian 2 karakter pertama dihapus. (Itu lebih pendek untuk menghapus karakter dari awal daripada dari akhir)sumber