Escriba un programa completo o una función que tome un entero positivo N
como entrada a través de STDIN / línea de comando / ARGV o argumentos de función e imprima un nudo doble ASCII correspondiente N
a STDOUT.
El nudo doble ASCII se ve así:
__ __ __ __ __ __
/ \/ \/ \/ \/ \/ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\ \/\ \/\ \/\ \/\ \/\ \/
/\ \/\ \/\ \/\ \/\ \/\ \
| /\/ /\/ /\/ /\/ /\/ /\ |
| \/ /\/ /\/ /\/ /\/ /\/ |
\__/\__/\__/\__/\__/\__/
Lo anterior es para N = 6
Aquí hay algunos nudos dobles más para otros valores de N
:
Si N = 1
, el nudo doble de salida se ve así:
__
/ \
| /\ |
| \/ |
\ \/
/\ \
| /\ |
| \/ |
\__/
Para N = 2
su
__ __
/ \/ \
| /\/ /\ |
| \/ /\/ |
\ \/\ \/
/\ \/\ \
| /\/ /\ |
| \/ /\/ |
\__/\__/
Para N = 3
su
__ __ __
/ \/ \/ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\ \/\ \/\ \/
/\ \/\ \/\ \
| /\/ /\/ /\ |
| \/ /\/ /\/ |
\__/\__/\__/
y de manera similar, el patrón continúa y cualquier valor mayor de N
.
Detalles :
- La entrada siempre es un entero positivo mayor que
0
.
- La nueva línea final es opcional
- No debe haber espacios finales en cada línea, o suficientes espacios finales de manera que la longitud de cada fila sea
4*N + 2
.
- Nunca debería haber ningún espacio inicial que no sea parte del patrón especificado.
Este es el código de golf , por lo que gana el código más corto en bytes.
Tabla de clasificación de la serie
Estoy convirtiendo esto en una serie de desafíos de arte ASCII y, por lo tanto, agrego una tabla de líderes para la serie (fragmento de Martin). Para asegurarse de que sus respuestas aparezcan, comience cada respuesta con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
donde N es el tamaño de su envío. Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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>
Serie hasta ahora
1. Doble nudo
2. Serpientes de flujo
3. Santuarios chinos
4. Signos del zodiaco
5. Revestimientos aleatorios de diamantes
Respuestas:
CJam, 55 bytes
Me sorprendió bastante el nerd por esto ... de todos modos, finalmente obtuve 55 bytes de ISO 8859-1:
o esta alternativa :
Inicialmente intenté hacerlo en ASCII simple, pero solo lo reduje a 58 bytes :
y nuevamente, una alternativa :
Explicación:
La idea es codificar las partes únicas (borde izquierdo, borde derecho y patrón del medio) de una manera conveniente, repetir la parte del medio según sea necesario y juntarlas. El código terminó siendo similar en muchos aspectos a la respuesta de Dennis; No intenté copiarlo, pero probé muchos enfoques diferentes (incluida la explotación de más simetrías y repeticiones) y esto es lo que funcionó mejor.
Puse los bordes izquierdo y derecho juntos de esta manera:
El patrón del medio tiene 4 columnas, pero se repiten N-0.5 veces, es decir, una repetición se reduce a la mitad. Por conveniencia, utilicé este patrón:
y eliminó la primera mitad de la primera repetición.
Así que uní las partes y las codifiqué en forma transpuesta, ya que es más fácil trabajar con ellas de esa manera. El primer y tercer programa codifican esta cadena:
(sin líneas nuevas), que es la transposición de los bordes + medios. El segundo y cuarto programa (las "alternativas") codifican esta cadena:
de nuevo, sin nuevas líneas, y esta es la transposición de bordes + centro.
Así es como funciona esta parte común del código:
Después de esto, la implementación difiere ligeramente. En el primer y tercer programa tenemos:
En el segundo y cuarto programas (alternativos), tenemos:
fuente
1>W<
más corto. Resulta que solo tuve que rotar la matriz antes de codificarla y usar2>
...CJam,
1039283696657 bytesPruébelo en línea en el intérprete de CJam .
Idea
El patrón se vuelve mucho más obvio una vez que transponemos filas con columnas (rellenadas a la derecha con espacios).
Para la entrada 3 , por ejemplo, esto da:
Las primeras dos y las últimas dos filas son especiales, pero las otras repiten el mismo patrón una y otra vez.
Por lo tanto, para la entrada N , todo lo que tenemos que hacer es repetir
N veces, reemplace la primera fila con
la última fila con
y, finalmente, transponer filas con columnas.
Código
fuente
Javascript ( ES7 Draft ),
169163160158 bytesEditar: -6 usando una cadena de plantilla para eliminar algunas repeticiones de la cadena de patrón.
Editar: -3 cambiando de
slice(0,-2)
aslice(2)
reorganizando la cadena de patrón.Editar: -2 al recorrer en
b
lugar dea
y reducir laa
cadena a 4 con un módulo.Comentado:
fuente
.split(0)
con('__ 0 '+(r='\\/0/\\/ 0\\/ /0 ')+r+'0\\/ /0__/\\')
.0
, verá un8
.``
y${...}
exactamente?${}
se evalúa como una expresión javascript.Perl,
134129Toma un parámetro de línea de comando:
fuente
JavaScript ( ES6 ),
165166Elementos del nudo:
Sin golf
Golfed
fuente
0
y obtendrás una araña de 4 patas.C ++,
1530639479Esto parecía un desafío divertido que me desvió un poco del informe.
No estoy seguro de cómo medir los bytes del tamaño de mi aplicación, pero intentaré averiguarlo y actualizar mi respuesta.
Mi aplicación podría ser más pequeña pero se repite tanto en x como en y, y me gusta un poco así: D
fuente
Python 2,
156151147141139editar 1: editado para usar input () en lugar de una función.
edit 2: usó str.join y se agregó a var c para eliminar algunos caracteres redundantes.
edición 3: eliminó algunas secuencias de escape de cadena innecesarias.
edit 4: utilizado ~ -n en lugar de a = n-1
Fue muy divertido programarlo, ¡mi primer código de golf!
guárdelo en un editor de texto externo como n.py para eliminar el último carácter de nueva línea para reducir el tamaño del archivo en 1 byte, ejecute el módulo e ingrese su número.
fuente
input ()
lo general, se considera correcto cuando se lee desde STDIN.a=n-1
para ahorrar al escribir*(n-1)
dos veces, pero lo haces*~-n
.Python 2,
139133129 bytesEste solo construye e imprime línea por línea.
Aquí está el código en forma no golfizada:
Editar: cambié el idioma a python 2, para que sea compatible con mi respuesta para el n. ° 3 (y también ahorra 6 bytes más)
fuente
w=(3*' ||')[i] -> w=' |'[i&2]
y' '+s[1:-1]+' ' -> ' %s '%s[1:-1]
trabajo (el primero es una cadena con dos espacios, luego una tubería, pero SE está actuando)' ||'[i%4]
, pero esto es aún más corto (también con dos espacios).C, 159 bytes
Con espacios en blanco y algunas otras mejoras de legibilidad:
Esto se basa principalmente en plantillas. La plantilla
t
contiene las 9 columnas posibles de la salida, lo que significa que codifica 9 * 9 = 81 caracteres, u 80 sin la nueva línea final.Como solo hay 6 caracteres diferentes en el patrón (incluidos los caracteres de nueva línea), empaqueté pares de ellos en un carácter de plantilla, lo que significa que la plantilla se puede almacenar en 40 caracteres. Hay entonces 6 * 6 = 36 posibles pares de caracteres, que se codifican como caracteres ASCII 48 a 73. La traducción de vuelta al carácter original viene dada por la pequeña tabla de búsqueda
m
.El resto de la lógica consiste principalmente en repetir los
n
tiempos del patrón , lo que significa retroceder 4 caracteres en la plantilla, mientras se emiten correctamente las partes inicial y final de cada fila.fuente
PHP 5.5.3,
488, 466fuente
=
y.=
unos.Prólogo (SWI), 285 bytes
(Con espacios en blanco):
Intenté algunas formas de cortar las cuerdas, pero ninguna parecía superar este ingenuo método de columnas.
fuente
JavaScript (ES6),
158154148137 bytesEditar: Guardado 11 bytes gracias a @ Bálint.
fuente
/(..)(.{4})/g
tiene 13 bytes, lo mismo que/(..)(....)/g
...Java,
339330 bytesMi primera solución tenía tantas palabras clave "estáticas" que era más corto hacer que los métodos y atributos no fueran estáticos y ejecutar el código en el constructor.
fuente
PowerShell,
228207181133 bytesRecordatorio: PowerShell no espera la entrada estándar automáticamente. Tienes que canalizar algo, p. Ej.
3|%{...}
fuente
SmileBASIC, 149 bytes
Cada cadena contiene el patrón
AACCBBDD
que se expande para formarAABB(CCBB)*DD
LaCCBB
parte se repite N veces, luego se eliminan los primeros 2 caracteres. (Fue más corto eliminar caracteres desde el principio que desde el final)fuente