Dieses Puzzle ist von CodinGame SamSis "Heart of the City" -Puzzle abgeleitet .
Beschreibung
Sie beschließen, einen Spaziergang in einer n
* n
Kachelstadt zu machen und zur mittleren Kachel zu gehen. Alle Gebäude sind unendlich klein, aber Sie haben eine tolle Sicht und können alles aus der Nähe und in der Ferne sehen.
Einschränkungen
n
ist immer komisch
Sie können jedes Gebäude sehen, das nicht direkt von einem anderen behindert wird
Aufgabe
Markiere jedes sichtbare Gebäude mit *
. Das Gebäude ist sichtbar, wenn es nicht von einem anderen Gebäude in genau derselben Blickrichtung blockiert wird.
Mit anderen Worten, wenn @
es sich um den Ursprung handelt, ist das Gebäude sichtbar, wenn die x-Koordinate und die y-Koordinate gleich sind.
Beispiel für Ein- und Ausgabe
Eingang:
7
Ausgabe:
** **
* * * *
*******
*@*
*******
* * * *
** **
*
ist ein sichtbares Gebäude,
ist ein unsichtbares Gebäude und
@
ist dort, wo Sie sind.
Wertung
Denken Sie daran, das ist Code-Golf , also gewinnt die Antwort mit den wenigsten Bytes.
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>
Antworten:
Excel-VBA, (47 * n ^ 2) Bytes und 121 Bytes
Anweisung:
Excel erweist sich als sehr praktisch für diese Herausforderung und es gibt eine Kombination von Excel-Formeln, um das exakte Muster zu erhalten, das für eine bestimmte Eingabe als OP angezeigt wird. Glücklicherweise hat Excel eine GCD-Funktion - eine integrierte Formel, die den größten gemeinsamen Teiler positiver Ganzzahlen zurückgibt, sodass ich keinen mit dem Euklidischen Algorithmus erstellen muss . Warum brauche ich hier eine GCD-Funktion? Das liegt daran, dass zwei Zahlen als Koprime bezeichnet werden, wenn ihr größter gemeinsamer Teiler gleich 1 ist . Die Zahlen hier sind die Koordinaten der Position
x
undy
relativ zum Ursprung@
. Hier ist die Excel-FormelDabei
m
ist der Name einer Referenzzelle und die kleinste Ganzzahl gleich oder größer alsn/2
ceiling (n/2
). Dabein
ist der Name einer Referenzzelle für die Eingabe. Fügen Sie diese Formel in Zelle A1 ein und ziehen Sie sie mit der Größe über den gesamten Bereichn x n
. Die Länge der Formel beträgt 47 Bytes, aber Sie müssen sien x n
mal replizieren , sodass sie (47 * n ^ 2) Bytes entspricht.Um den Prozess zu automatisieren und die Verwendung von Zeichen zu reduzieren, können wir VBA verwenden, da es in Excel integriert ist. Legen Sie als erstes ein Excel-Arbeitsblatt wie folgt fest:
Fügen Sie dann den folgenden Code in das Direktfenster ein
Ungolfed den Code:
Erläuterung:
n = [A1]
: Setzen Sie n als Eingabe und weisen Sie n den Wert der Zelle A1 zu.m = Int(n / 2) + 1
: Benutzerdefinierte Methode, um dieselbe Ausgabe wie die Deckenfunktion für das Argument zurückzugebenn/2
.Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")"
: Fügen Sie die obige Formel in jede Zelle des Bereichs ein, deren Größen x n
bei Zelle A1 beginnt.Cells(m, m) = "@"
: Weisen Sie der Mitte des Bereichs ein Zeichen zu@
.Ausgabe:
Abbildung unten zeigt die Beispielausgabe für die Eingabe
n = 11
Ich habe die Schriftfarbe auf Rot gesetzt, damit sie attraktiver aussieht. Noch besser
quelle
n x n
mal replizieren , damit sie gleich (47 * n ^ 2) Bytes ist " in meiner Antwort. Siehe auch die Diskussion im Kommentarbereich der Antwort von ugoren . Ich hoffe es macht die Sache klarer.121 bytes
Gemäß Konvention wäre die richtige Byteanzahl für diese Lösung, da nur das Programm selbst zur Byteanzahl beiträgt. In dem Fall, auf den Sie verwiesen haben, muss die Quelle kopiert und in jede einzelne Zelle eingefügt werden, während dies in Ihrer Lösung alles programmgesteuert erfolgt.Gelee , 16 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
J, 24 Bytes
Ein Hafen von Dennis 'Antwort in Jelly .
quelle
Perl 6 , 77 oder 74 Bytes
Volles Programm (77 Bytes) :
( online ausprobieren )
Wenn es akzeptabel ist, die Ausgabe eines Lambdas als Liste von Listen mit 1-Zeichen-Zeichenfolgen (74 Byte) zurückzugeben :
( online ausprobieren )
quelle
SILOS , 236 Bytes
Probieren Sie es online!
Port of meine Antwort in C .
quelle
C
147145135133 Bytes2 Bytes dank Dennis.
10 Bytes danke an Arnauld.
2 Bytes dank H Walters.
Ideone es!
Golftipps wie immer willkommen.
quelle
x
) undx=
anstattreturn
in derg()
Funktion machst, dann kannst du meiner Meinung nach{g(i,j-m);putchar(x?x*x-1?32:42:64);}
7 Bytes machen und sparen. (Oder 8 Bytes, wenn Sie auch den Zeilenumbruch entfernen. Ist es wirklich erforderlich?)m,i,j
zweimal anmelden , oder?++j
zu++j%n
(+2 Byte) undj-m
zuj%n-m
(+2 Byte). Dann können Sie entfernen,j%=n
(-5 Bytes).Javascript (ES6),
114113105 BytesDies begann als Portierung von Leaky Nuns C-Version und wurde dann weiter optimiert. Die meisten Optimierungen sind spezifisch für JS.
Beispiel:
quelle
Pyth, 40 Bytes
Ich bin sehr neu in Pyth, so dass dies wahrscheinlich weiter golfen werden kann.
Probieren Sie es online aus
Wie es funktioniert
quelle
GolfScript,
9883 BytesProbieren Sie es online!
Eingabe = 11
quelle
APL (Dyalog Classic) , 23 Byte
Probieren Sie es online!
quelle