Sichtbare Gebäude

15

Dieses Puzzle ist von CodinGame SamSis "Heart of the City" -Puzzle abgeleitet .

Beschreibung

Sie beschließen, einen Spaziergang in einer n* nKachelstadt 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 , 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>

Soren
quelle
Können Sie erläutern, wie die Ausgabe generiert wird?
Undichte Nonne
Ich denke, es wird gut sein, ein Beispiel zu haben, in dem die Eingabe viel größer als 5 ist, da die Ausgabe für 5 nicht besonders illustrativ ist
Sp3000
Sind wir immer im Zentrum? Was ist, wenn die Eingabe gerade ist?
Undichte Nonne
1
@LeakyNun "n ist immer ungerade"
Sp3000
@LeakyNun Die Ausgabe kann nach Belieben generiert werden, muss jedoch den Ausgabespezifikationen entsprechen. Bin ich mit dem 7x7 Input / Output richtig?
Soren

Antworten:

8

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 xund yrelativ zum Ursprung @. Hier ist die Excel-Formel

=IF(GCD(ABS(COLUMN()-m),ABS(m-ROW()))=1,"*","")

Dabei mist der Name einer Referenzzelle und die kleinste Ganzzahl gleich oder größer als n/2ceiling ( n/2). Dabei nist 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 Bereich n x n. Die Länge der Formel beträgt 47 Bytes, aber Sie müssen sie n x nmal 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:

Bildbeschreibung hier eingeben

Fügen Sie dann den folgenden Code in das Direktfenster ein

n=[A1]:m=Int(n/2)+1:Range("A1",Cells(n,n))="=IF(GCD(ABS(COLUMN()-"&m &"),ABS("&m &"-ROW()))=1,""*"","""")":Cells(m,m)="@"

Ungolfed den Code:

Sub A()
    n = [A1]
    m = Int(n / 2) + 1
    Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")"
    Cells(m, m) = "@"
End Sub

Erläuterung:

  1. n = [A1] : Setzen Sie n als Eingabe und weisen Sie n den Wert der Zelle A1 zu.
  2. m = Int(n / 2) + 1: Benutzerdefinierte Methode, um dieselbe Ausgabe wie die Deckenfunktion für das Argument zurückzugeben n/2.
  3. 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öße n x nbei Zelle A1 beginnt.
  4. Cells(m, m) = "@" : Weisen Sie der Mitte des Bereichs ein Zeichen zu @.

Ausgabe:

Abbildung unten zeigt die Beispielausgabe für die Eingabe n = 11

Bildbeschreibung hier eingeben

Ich habe die Schriftfarbe auf Rot gesetzt, damit sie attraktiver aussieht. Noch besser

Bildbeschreibung hier eingeben

Anastasiya-Romanova 秀
quelle
Warum "fügen" Sie die Formel in jede Zelle ein, anstatt sie direkt in der VBA-Funktion zu berechnen?
Vale
@Vale Weil es länger dauern wird, da ich Schleifenanweisungen, IF-Anweisungen, WorksheetFunction usw. verwenden muss.
Anastasiya-Romanova 秀
aber in deine Byteanzahl steckst du 47 * n ^ 2 ...?
Vale
@Vale Sie haben das vielleicht nicht gelesen: " Die Länge der Formel beträgt 47 Bytes, aber Sie müssen sie n x nmal 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.
Anastasiya-Romanova 秀
@ Anastasiya-Romanova 秀121 bytesGemäß 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.
Taylor Scott
4

Gelee , 16 Bytes

:2ạḶgþ`«2ị“* @”Y

Probieren Sie es online!

Wie es funktioniert

:2ạḶgþ`«2ị“* @”Y  Main link. Argument: 2n + 1

:2                Perform integer division by 2, yielding n.
   Ḷ              Yield [0, ..., 2n].
 ạ                Take the absolute difference of the result to both sides.
                  This yields A := [n, ... 0, ... n].
      `           Call the quicklink to the left with left and right argument A.
     þ              Table; call the link to the left for all x in A and all y in A.
    g                 Yield the GCD of x and y.
       «2         Truncate the GCD at 2, leaving 0 for the origin, 1 for coprime
                  coordinates, and 2 otherwise.
         ị“* @”   Index into that string, mapping [1, 2, 0] to ['*', ' ', '@'].
               Y  Join, separating by linefeeds.
Dennis
quelle
Können Sie eine erweiterte, kommentierte Ansicht des Codes hinzufügen?
Soren
Ich habe es bereits getan. Fehlt etwas?
Dennis
Ich habe es aus irgendeinem Grund nicht gesehen ... es sieht jetzt gut aus!
Soren
3

Perl 6 , 77 oder 74 Bytes

Volles Programm (77 Bytes) :

my \h=Int(get/2);say |map {$_|$^j??2>$j gcd$_??'*'!!' '!!'@'},-h..h for -h..h

( online ausprobieren )

Wenn es akzeptabel ist, die Ausgabe eines Lambdas als Liste von Listen mit 1-Zeichen-Zeichenfolgen (74 Byte) zurückzugeben :

{my \h=$_ div 2;map {map {$^i|$_??2>$i gcd$_??'*'!!' '!!'@'},-h..h},-h..h}

( online ausprobieren )

smls
quelle
3

SILOS , 236 Bytes

GOTO s
funcg
if q p
r=p
return
lblp
t=p
t%q
p=q
q=t
GOSUB g
return
lbls
readIO
m=i
m/2
a=i
lbla
a-1
a-m
b=i
lblb
b-1
b-m
p=a
p|
q=b
q|
GOSUB g
r-1
A=r
A|
r/A
r*-1
r+1
p=r
r*r
r*6
p*4
r+p
r+32
printChar r
b+m
if b b
printLine 
a+m
if a a

Probieren Sie es online!

Port of meine Antwort in C .

Undichte Nonne
quelle
Die Ausgabe für 15 ist interessant
Rohan Jhunjhunwala
3

C 147 145 135 133 Bytes

2 Bytes dank Dennis.

10 Bytes danke an Arnauld.

2 Bytes dank H Walters.

r,m,i,j;g(a,b){r=b?g(b,a%b):a;}main(n){scanf("%d",&n);for(m=n/2,i=-m;i<=m;putchar(r?r*r-1?32:42:64),i+=++j%n<1&&puts(""))g(i,j%n-m);}

Ideone es!

Golftipps wie immer willkommen.

Undichte Nonne
quelle
Wenn du eine andere globale Variable definierst (say x) und x=anstatt returnin der g()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?)
Arnauld
@ Arnauld Dank, aktualisiert
Leaky Nun
Hmm. Sie müssen sich nicht m,i,jzweimal anmelden , oder?
Arnauld
@Arnauld Anscheinend bin ich ein Idiot.
Undichte Nonne
1
Wechseln Sie ++jzu ++j%n(+2 Byte) und j-mzu j%n-m(+2 Byte). Dann können Sie entfernen ,j%=n(-5 Bytes).
H Walters
3

Javascript (ES6), 114 113 105 Bytes

Dies begann als Portierung von Leaky Nuns C-Version und wurde dann weiter optimiert. Die meisten Optimierungen sind spezifisch für JS.

n=>(r=j=>i<n?('*@*'[1+(g=(i,j)=>j?g(j,i%j):i)(i-m,j-m)]||' ')+(++j<n?'':(i++,`
`))+r(j%n):'')(i=0,m=n>>1)

Beispiel:

let f =
n=>(r=j=>i<n?('*@*'[1+(g=(i,j)=>j?g(j,i%j):i)(i-m,j-m)]||' ')+(++j<n?'':(i++,`
`))+r(j%n):'')(i=0,m=n>>1)

console.log(f(7))

Arnauld
quelle
2

Pyth, 40 Bytes

L@"@* "hS[b2)jsMcQyM.aMiM*.**2[r_/Q2h/Q2

Ich bin sehr neu in Pyth, so dass dies wahrscheinlich weiter golfen werden kann.

Probieren Sie es online aus

Wie es funktioniert

L@"@* "hS[b2)jsMcQyM.aMiM*.**2[r_/Q2h/Q2   

L@"@* "hS[b2)                              Lambda y. Input: b
L                                          Declare lambda
         [b2)                              List [b, 2]
        S                                  Sort ascending
       h                                   Head. Yield first element a, clamping to max 2
  "@* "                                    String literal "@* "
 @                                         Index into string with a, yielding string[a]

             jsMcQyM.aMiM*.**2[r_/Q2h/Q2   Program. Input: Q
                                _/Q2 /Q2   -Q//2 and Q//2
                                    h      Head. Q//2+1
                               r           Range [-Q//2, Q//2+1]
                              [            List
                            *2             Duplicate
                          .*               Splat. Unpack
                         *                 Cartesian product. Yield all coordinate pairs
                       iM                  Map GCD over above
                    .aM                    Map absolute value over above
                  yM                       Map y over above, yielding required characters
                cQ                         Chunk. Split above into Q pieces
              sM                           Map concatenate over above
             j                             Join on newlines
                                           Implicitly print
TheBikingViking
quelle
2

GolfScript, 98 83 Bytes

~:l.2/~):o:i;{o{.abs i abs.!!{{.@\%.}do}*;1={'*'}{' '}if\.i|!{\;'@'\}*)}l*;i):i;n}*

Probieren Sie es online!

Eingabe = 11

 **** **** 
* * * * * *
** ** ** **
* * * * * *
***********
    *@*    
***********
* * * * * *
** ** ** **
* * * * * *
 **** **** 
FedeWar
quelle