Escreva um programa completo ou uma função que N
receba um número inteiro positivo como entrada via STDIN / linha de comando / ARGV ou argumentos de função e imprima um nó duplo ASCII correspondente N
ao STDOUT.
O nó duplo ASCII é assim:
__ __ __ __ __ __
/ \/ \/ \/ \/ \/ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\ \/\ \/\ \/\ \/\ \/\ \/
/\ \/\ \/\ \/\ \/\ \/\ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\__/\__/\__/\__/\__/\__/
O acima é para N = 6
Aqui estão mais alguns nós duplos para outros valores de N
:
Se N = 1
, o nó duplo de saída se parecer com:
__
/ \
| /\ |
| \/ |
\ \/
/\ \
| /\ |
| \/ |
\__/
Pois N = 2
, é
__ __
/ \/ \
| /\/ /\ |
| \/ /\/ |
\ \/\ \/
/\ \/\ \
| /\/ /\ |
| \/ /\/ |
\__/\__/
Pois N = 3
, é
__ __ __
/ \/ \/ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\ \/\ \/\ \/
/\ \/\ \/\ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\__/\__/\__/
e da mesma forma, o padrão continua e qualquer valor maior de N
.
Detalhes :
- A entrada é sempre um número inteiro positivo maior que
0
.
- A nova linha à direita é opcional
- Não deve haver espaços à direita em cada linha ou espaços à direita suficientes para que o comprimento de cada linha seja
4*N + 2
.
- Nunca deve haver espaço à esquerda que não faça parte do padrão especificado.
Isso é código-golfe , então o código mais curto em bytes vence.
Cabeçalho da série
Estou convertendo isso em uma série de desafios de arte ASCII e, assim, adicionando um quadro de líderes para a série (snippet de Martin). Para garantir que suas respostas sejam exibidas, inicie todas as respostas com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N é o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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>
Série até agora
1. Nó Duplo
2. Fluxo de Cobras
3. Santuários Chineses
4. Signos do zodíaco
5. Random Diamond Tilings
Respostas:
CJam, 55 bytes
Fui nerd muito criticado por isso ... enfim, finalmente criei 55 bytes de ISO 8859-1:
ou esta alternativa :
Inicialmente, tentei fazê-lo em ASCII simples, mas o reduzi para 58 bytes :
e, novamente, uma alternativa :
Explicação:
A idéia é codificar as peças exclusivas (borda esquerda, borda direita e padrão do meio) de maneira conveniente, repetir a parte do meio conforme necessário e juntá-las. O código acabou sendo similar em muitos aspectos à resposta de Dennis; Não tentei copiá-lo, mas tentei muitas abordagens diferentes (incluindo a exploração de mais simetrias e repetições) e foi isso que funcionou melhor.
Coloquei as bordas esquerda e direita juntas assim:
O padrão do meio possui 4 colunas, mas elas são repetidas N-0,5 vezes, ou seja, uma repetição é cortada ao meio. Por conveniência, usei este padrão:
e removeu a primeira metade da primeira repetição.
Então juntei as partes e as codifiquei na forma transposta, pois é mais fácil trabalhar com elas dessa maneira. O primeiro e o terceiro programa codificam esta sequência:
(sem novas linhas), que é a transposição das arestas do meio +. O segundo e quarto programa (as "alternativas") codificam esta sequência:
novamente, sem novas linhas, e essa é a transposição das arestas + meio.
Veja como essa parte comum do código funciona:
Depois disso, a implementação difere um pouco. No primeiro e terceiro programa, temos:
No segundo e quarto programas (alternativos), temos:
fonte
1>W<
diminuir. Acontece que eu só tinha que girar a matriz antes de codificar-lo e usar2>
...CJam,
1039283696657 bytesExperimente online no intérprete CJam .
Idéia
O padrão se torna muito mais óbvio quando transpomos linhas com colunas (preenchidas à direita com espaços).
Para a entrada 3 , por exemplo, isso fornece:
As duas primeiras e as últimas duas linhas são especiais, mas as outras repetem o mesmo padrão repetidamente.
Assim, para a entrada N , tudo o que precisamos fazer é repetir
N vezes, substitua a primeira linha por
a última linha com
e, finalmente, transponha linhas com colunas.
Código
fonte
Javascript ( ES7 Rascunho ),
169163160 160158 bytesEdite: -6 usando uma sequência de modelos para eliminar algumas repetições da sequência de padrões.
Edit: -3 mudando de
slice(0,-2)
paraslice(2)
reorganizando a string padrão.Edit: -2 fazendo um loop em
b
vez dea
e reduzindo aa
string para 4 com um módulo.Comentado:
fonte
.split(0)
por('__ 0 '+(r='\\/0/\\/ 0\\/ /0 ')+r+'0\\/ /0__/\\')
.0
adiante, verá um8
.``
e${...}
exatamente fazem?${}
é avaliada como uma expressão javascript.Perl,
134129Toma um parâmetro da linha de comando:
fonte
JavaScript ( ES6 ), 165
166Elementos do nó:
Ungolfed
Golfe
fonte
0
para ele e você receberá uma aranha de 4 patas.C ++,
1530639479Parecia um desafio divertido que desviei um pouco do resumo.
Não tenho certeza de como medir bytes do tamanho do meu aplicativo, mas vou tentar descobrir e atualizar minha resposta.
Meu aplicativo pode ser menor, mas faz loops nos xey, e eu meio que gosto disso: D
fonte
Python 2,
156151147141139edit 1: editado para usar input () em vez de uma função.
edit 2: usou str.join e foi adicionado ao var c para remover alguns caracteres redundantes.
edit 3: removeu algumas seqüências desnecessárias de escape de string.
editar 4: usado ~ -n em vez de a = n-1
Foi muito divertido programar, meu primeiro código de golfe!
salve-o em um editor de texto externo como n.py para remover o último caractere de nova linha para reduzir o tamanho do arquivo em 1 byte, execute o módulo e insira seu número.
fonte
input ()
é considerado bom quando se lê STDIN.a=n-1
para economizar escrevendo*(n-1)
duas vezes, mas você faz*~-n
.Python 2,
139133129 bytesEste apenas constrói e imprime linha por linha.
Aqui está o código na forma não destruída:
Edit: eu mudei o idioma para python 2, para ser compatível com a minha resposta para o número 3 (e também economiza mais 6 bytes)
fonte
w=(3*' ||')[i] -> w=' |'[i&2]
e' '+s[1:-1]+' ' -> ' %s '%s[1:-1]
trabalho (o primeiro é uma string com dois espaços, em seguida, um tubo, mas SE agindo para cima)' ||'[i%4]
, mas isso é ainda mais curto (também com dois espaços).C, 159 bytes
Com espaço em branco e algumas outras melhorias de legibilidade:
Isto é principalmente baseado em modelo. O modelo
t
contém todas as 9 colunas possíveis da saída, o que significa que codifica 9 * 9 = 81 caracteres ou 80 sem a nova linha à direita.Como existem apenas 6 caracteres diferentes no padrão (incluindo caracteres de nova linha), empacotei pares deles em um caractere de modelo, o que significa que o modelo pode ser armazenado em 40 caracteres. Existem então 6 * 6 = 36 pares possíveis de caracteres, que são codificados como caracteres ASCII 48 a 73. A conversão de volta ao caractere original é fornecida pela pequena tabela de pesquisa
m
.O restante da lógica é principalmente repetir os
n
tempos do padrão , o que significa retroceder 4 caracteres no modelo e emitir as partes inicial e final de cada linha corretamente.fonte
PHP 5.5.3,
488, 466fonte
=
e.=
.Prolog (SWI), 285 bytes
(Com espaço em branco):
Tentei algumas maneiras de cortar as cordas, mas nenhuma parecia vencer esse método ingênuo de colunas.
fonte
JavaScript (ES6),
158154148137 bytesEditar: salvou 11 bytes graças a @ Bálint.
fonte
/(..)(.{4})/g
é de 13 bytes, o mesmo que/(..)(....)/g
...Java,
339330 bytesMinha primeira solução continha tantas palavras-chave "estáticas" que era mais curto tornar os métodos e atributos não estáticos e executar o código no construtor.
fonte
PowerShell,
228207181133 bytesLembrete - O PowerShell não espera no stdin automaticamente. Você precisa inserir algo, por exemplo
3|%{...}
fonte
SmileBASIC, 149 bytes
Cada sequência contém o padrão
AACCBBDD
que é expandido para formarAABB(CCBB)*DD
ACCBB
peça é repetida N vezes e os 2 primeiros caracteres são removidos. (Foi mais curto remover caracteres do início do que do final)fonte