Ce puzzle est dérivé du puzzle "Cœur de la ville" de CodinGame SamSi.
La description
Vous décidez de vous promener dans une ville de tuiles n
* n
et allez à la tuile centrale. Tous les bâtiments sont infiniment petits, mais vous avez une super vision et vous pouvez tout voir de près et de loin.
Contraintes
n
est toujours bizarre
Vous pouvez voir n'importe quel bâtiment qui n'est pas directement obstrué par un autre
Tâche
Marquez chaque bâtiment visible avec *
. Le bâtiment est visible s'il n'est pas bloqué par un autre bâtiment sur la même ligne de vision.
En d'autres termes, si @
est l'origine, le bâtiment est visible si la coordonnée x et la coordonnée y sont co-amorcées l'une avec l'autre.
Exemple d'entrée et de sortie
Contribution:
7
Production:
** **
* * * *
*******
*@*
*******
* * * *
** **
*
est un bâtiment visible,
est un bâtiment invisible, et
@
c'est là que vous êtes.
Notation
Rappelez-vous, c'est le code-golf , donc la réponse avec le moins d'octets l'emporte.
var QUESTION_ID=91394,OVERRIDE_USER=59057;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}*{font-family:"Helvetica",sans-serif}
<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="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><div id="language-list"> <h2>Winners 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><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>
Réponses:
Excel-VBA, (47 * n ^ 2) octets et 121 octets
Instruction:
Excel s'avère être très pratique pour ce défi et il existe une combinaison de formules Excel pour obtenir le modèle exact comme les OP affichés pour une entrée donnée. Heureusement pour moi, Excel a une fonction GCD - une formule intégrée pour renvoyer le plus grand diviseur commun d'entiers positifs, donc je n'ai pas à en créer un en utilisant l' algorithme euclidien . Pourquoi ai-je besoin d'une fonction GCD ici? C'est parce que deux nombres sont appelés coprime, si leur plus grand diviseur commun est égal à 1 . Les nombres ici sont les coordonnées de la position
x
ety
, par rapport à l'origine@
,. Voici la formule Exceloù
m
est le nom d'une cellule de référence et est égal au plus petit entier supérieur ou égal àn/2
, plafond (n/2
), oùn
est le nom d'une cellule de référence pour l'entrée. Collez cette formule dans la cellule A1, puis faites glisser toute la plage avec la taillen x n
. La longueur de la formule est de 47 octets mais vous devez la répliquern x n
fois, elle est donc égale à (47 * n ^ 2) octets.Pour automatiser le processus et réduire l'utilisation de caractères, nous pouvons utiliser VBA car il est intégré à Excel. Tout d'abord, définissez une feuille de calcul Excel comme suit:
Mettez ensuite le code suivant dans la fenêtre Exécution
Déverrouillé le code:
Explication:
n = [A1]
: Définissez n comme entrée et affectez la valeur de la cellule A1 à n.m = Int(n / 2) + 1
: Façon personnalisée de renvoyer la même sortie que la fonction de plafond pour l'argumentn/2
.Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")"
: Collez la formule ci-dessus dans chaque cellule de la plage dont la taillen x n
commence à la cellule A1.Cells(m, m) = "@"
: Attribuez le centre de la plage à un caractère@
.Production:
La figure ci-dessous est l'exemple de sortie pour l'entrée
n = 11
J'ai défini la couleur de la police sur rouge pour la rendre plus attrayante. Encore mieux
la source
n x n
fois, donc elle est égale à (47 * n ^ 2) octets " dans ma réponse. Voir également la discussion dans la section commentaire de la réponse d'Ugoren . J'espère que cela rend la chose plus claire.121 bytes
que seul le programme lui-même contribue au nombre d'octets. Dans le cas que vous avez référencé, la source doit être copiée et collée dans chaque cellule individuelle, alors que dans votre solution, tout se fait par programmation.Gelée , 16 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
J, 24 octets
Un port de la réponse de Dennis dans Jelly .
la source
Perl 6 , 77 ou 74 octets
Programme complet (77 octets) :
( essayez-le en ligne )
S'il est acceptable de renvoyer la sortie d'un lambda sous forme de liste de listes de chaînes à 1 caractère (74 octets) :
( essayez-le en ligne )
la source
SILOS , 236 octets
Essayez-le en ligne!
Port de ma réponse en C .
la source
C,
147145135133 133 octets2 octets grâce à Dennis.
10 octets grâce à Arnauld.
2 octets grâce à H Walters.
Ideone it!
Les conseils de golf sont les bienvenus comme toujours.
la source
x
) et faitesx=
au lieu dereturn
dans lag()
fonction, alors je pense que vous pouvez faire{g(i,j-m);putchar(x?x*x-1?32:42:64);}
et économiser 7 octets. (Ou 8 octets si vous supprimez également le saut de ligne. Est-ce vraiment nécessaire?)m,i,j
deux fois, n'est-ce pas ?++j
à++j%n
(+2 octets) etj-m
àj%n-m
(+2 octets). Ensuite, vous pouvez supprimer,j%=n
(-5 octets).Javascript (ES6),
114113105 octetsCela a commencé comme un portage de la version C de Leaky Nun et a ensuite été optimisé. La plupart des optimisations sont spécifiques à JS.
Exemple:
la source
Pyth, 40 octets
Je suis très nouveau sur Pyth, donc cela peut probablement être approfondi.
Essayez-le en ligne
Comment ça fonctionne
la source
GolfScript,
9883 octetsEssayez-le en ligne!
Entrée = 11
la source
APL (Dyalog Classic) , 23 octets
Essayez-le en ligne!
la source