Esta es una papa:
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
Más generalmente, una papa de tamaño N se define como la siguiente forma:
Si N es par, son 2 @
símbolos centrados , seguidos de 4 @
símbolos centrados , seguidos de 6 @
símbolos centrados , hasta N @
símbolos centrados ; luego, @
símbolos centrados en N , seguidos por símbolos centrados en N-2 @
, hasta 2.
Si N es impar, se genera una papa N de tamaño de la misma manera que se describe anteriormente, pero comenzamos con 1 @
símbolo, en lugar de 2 .
Una papa se pela comenzando en la esquina superior derecha y quitando un @
signo en cada paso, en sentido contrario a las agujas del reloj. Por ejemplo, pelar una papa tamaño 3 se ve así:
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Desafío
Escriba un programa que, dada una entrada entera, muestre todos los pasos para pelar una papa de ese tamaño.
Se permiten espacios en blanco al final / líneas nuevas.
Puntuación
Este es el código de golf ; gana el código más corto en bytes.
Ejemplos de casos de prueba
N = 2
@@
@@
@
@@
@@
@
N = 7
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@@@
@@@
@
@@
@@@
@@@@@
@@@@@
@@@
@
@
@@@
@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@
@
@@
@@@@
@@@@
@@@
@
@@
@@@@
@@@@
@@
@
@@
@@@@
@@@@
@@
@@
@@@@
@@@@
@
@@
@@@@
@@@
@
@@
@@@
@@@
@
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Catalogar
Basado en ¿Es este número un primo?
<style>body { text-align: left !important} #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; }</style><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="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><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><script>var QUESTION_ID = 101224; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 12012; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang.toLowerCase(), user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Respuestas:
Perl, 129 bytes
128 bytes de código +
-n
bandera.Necesitarás
-nE
banderas para ejecutarlo:Explicaciones: (los detallaré más cuando tenga un momento)
La primera parte,
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;
genera la papa inicial: comienza desde la línea media de la papa y agrega dos líneas en cada iteración: una antes de la cadena anterior, otra después. Tenga en cuenta que$"
es un espacio, y como$n
no está inicializado, comienza en 0 y$/
es una nueva línea.Tenga en cuenta mucho que decir sobre el
say$_=$p;
que imprime la patata inicial mientras la almacena$_
(que luego será más fácil de manipular).Finalmente,
say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/
pela la papa. La última posición donde@
se eliminó un contiene unA
(es arbitrario, podría ser cualquier símbolo). Por lo tanto, cada iteración consiste en encontrar elA
, reemplazarlo con un espacio y, mientras tanto, reemplazar el siguiente@
con unA
. Eso se hace gracias a dos expresiones regulares:s/(^| )A(.*\n? *)@/$1 $2A/m
cuandoA
está en el lado izquierdo de la papa (A(.*\n? *)@
permite ir hacia la derecha o hacia abajo), ys/@( *\n?.*)A/A$1 /
cuandoA
está en el lado derecho (@( *\n?.*)A
permite subir o hacia la izquierda).s/@/A/
reemplaza el primero@
con aA
(esa es la inicialización). Como siempre tenemos unA
en la cadena, debemos reemplazarlo con un espacio al imprimirlo, eso es lo quey/A/ /r
hace.Solo para los ojos , la versión animada se ve bastante bien: (para ejecutarse en una terminal, es aproximadamente el mismo código pero con
clear
ysleep
)fuente
Befunge,
319254bytesLa motivación para este algoritmo fue tratar de evitar la ramificación tanto como sea posible, ya que una sola ruta de ejecución es generalmente más fácil de jugar al golf. Por lo tanto, el código se compone de solo dos bucles: el bucle externo que itera sobre los fotogramas del proceso de pelado y el bucle interno que representa la patata para cada fotograma.
El bucle de representación esencialmente solo genera una secuencia de caracteres, el carácter para cada iteración está determinado por una fórmula bastante complicada que toma el número de fotograma del proceso de pelado y el índice de la secuencia de salida y devuelve un
@
, un espacio o un nueva línea, según se requiera.Pruébalo en línea!
fuente
Python 3.5.1, 520 bytes
Explicación
Idea básica: alternar entre iterar hacia abajo en cada línea y eliminar el carácter más a la izquierda e iterar hacia arriba cada línea eliminando el carácter más a la derecha mientras todavía
@
s.En general, un intento triste de un procedimiento sencillo.
fuente