Ceci est une pomme de terre:
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
Plus généralement, une pomme de terre de taille N est définie comme la forme suivante:
Si N est pair, ce sont 2 @
symboles centrés , suivis de 4 @
symboles centrés , suivis de 6 @
symboles centrés , jusqu'à N @
symboles centrés ; puis, N @
symboles centrés , suivis de N-2 @
symboles centrés , jusqu'à 2.
Si N est impair, une pomme de terre de taille N est générée de la même manière que décrite ci-dessus, mais nous commençons par 1 @
symbole, plutôt que 2 .
Une pomme de terre est pelée en commençant dans le coin supérieur droit et en supprimant un @
signe à chaque étape, dans le sens antihoraire. Par exemple, éplucher une pomme de terre de taille 3 ressemble à ceci:
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Défi
Écrivez un programme qui, étant donné une entrée entière, affiche toutes les étapes de pelage d'une pomme de terre de cette taille.
Les espaces de fin / les nouvelles lignes sont autorisés.
Notation
C'est du golf de code ; le code le plus court en octets gagne.
Exemples de cas de test
N = 2
@@
@@
@
@@
@@
@
N = 7
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@@
@@
@@@@
@@@@@@
@@@@@@
@@@@
@
@@
@@@@
@@@@@@
@@@@@@
@@@
@
@@
@@@@
@@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@@@
@@@
@
@@
@@@
@@@@@
@@@@@
@@@
@
@
@@@
@@@@@
@@@@@
@@@
@
@@@
@@@@@
@@@@@
@@@
@
@@
@@@@@
@@@@@
@@@
@
@@
@@@@
@@@@@
@@@
@
@@
@@@@
@@@@
@@@
@
@@
@@@@
@@@@
@@
@
@@
@@@@
@@@@
@@
@@
@@@@
@@@@
@
@@
@@@@
@@@
@
@@
@@@
@@@
@
@
@@@
@@@
@
@@@
@@@
@
@@
@@@
@
@@
@@
@
@@
@@
@@
@
@
@
@
Catalogue
Basé sur Est-ce que ce nombre est un nombre premier?
<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>
Réponses:
Perl, 129 octets
128 octets de code +
-n
indicateur.Vous aurez besoin de
-nE
drapeaux pour l'exécuter:Explications: (je les détaillerai plus quand j'aurai un moment)
La première partie
$p=($r=$"x$n++."@"x$_.$/).$p.$r,$_-=2while$_>0;
,, génère la pomme de terre initiale: elle part de la ligne médiane de la pomme de terre, et ajoute deux lignes à chaque itération: une avant la chaîne précédente, une après. Notez qu'il$"
s'agit d'un espace, et puisqu'il$n
n'est pas initialisé, il commence à 0 et$/
est une nouvelle ligne.Notez beaucoup de choses à dire sur le
say$_=$p;
qui imprime la pomme de terre initiale tout en la stockant$_
(ce qui sera plus tard plus facile à manipuler).Enfin,
say y/A/ /r while s/(^| )A(.*\n? *)@/$1 $2A/m||s/@( *\n?.*)A/A$1 /||s/@/A/
épluche la pomme de terre. La dernière position où a@
été supprimé contient unA
(c'est arbitraire, ça pourrait être n'importe quel symbole). Ainsi, chaque itération consiste à trouver leA
, à le remplacer par un espace, et en attendant à remplacer le suivant@
par unA
. Cela se fait grâce à deux regex:s/(^| )A(.*\n? *)@/$1 $2A/m
lorsque leA
est sur le côté gauche de la pomme de terre (A(.*\n? *)@
permet d'aller à droite ou en bas), ets/@( *\n?.*)A/A$1 /
lorsque leA
est sur le côté droit (@( *\n?.*)A
permet de monter ou de gauche).s/@/A/
remplace le premier@
par unA
(c'est l'initialisation). Puisque nous avons toujours unA
dans la chaîne, nous devons le remplacer par un espace lors de l'impression, c'est ce quiy/A/ /r
fait.Juste pour les yeux , la version animée est plutôt sympa: (pour fonctionner dans un terminal, c'est à peu près le même code mais avec
clear
etsleep
)la source
Befunge,
319254 octetsLa motivation de cet algorithme était d'essayer d'éviter autant que possible les branchements, car un seul chemin d'exécution est généralement plus facile à jouer au golf. Le code est donc composé de seulement deux boucles: la boucle externe itérant sur les images du processus de pelage et la boucle interne rendant la pomme de terre pour chaque image.
La boucle de rendu est essentiellement juste la sortie d'une séquence de caractères, le caractère pour chaque itération étant déterminé par une formule assez compliquée qui prend le numéro de trame du processus de décorticage et l'index de la séquence de sortie et renvoie soit un
@
, un espace ou un nouvelle ligne, au besoin.Essayez-le en ligne!
la source
Python 3.5.1, 520 octets
Explication
Idée de base: alterner entre itérer sur chaque ligne et supprimer le caractère le plus à gauche et itérer sur chaque ligne en supprimant le caractère le plus à droite tant qu'il reste encore
@
.Dans l'ensemble, c'est une triste tentative de procédure simple.
la source