Edifici visibili


15

Questo puzzle è derivato dal puzzle "Heart of the City" di CodinGame SamSi.

Descrizione

Decidi di fare una passeggiata in una n* ncittà a tessere e di andare alla tessera centrale. Tutti gli edifici sono infinitamente piccoli, ma hai una visione eccellente e puoi vedere tutto da vicino e lontano.

vincoli

n è sempre strano

Puoi vedere qualsiasi edificio che non sia ostruito direttamente da un altro

Compito

Segna ogni edificio visibile con *. L'edificio è visibile se non è bloccato da un altro edificio sulla stessa identica linea di visione.

In altre parole, se @è l'origine, l'edificio è visibile se la coordinata x e la coordinata y sono coordinate tra loro.

Esempio di input e output

Ingresso:

7

Produzione:

 ** **
* * * *
*******
  *@*
*******
* * * *
 ** **

*è un edificio visibile, è un edificio invisibile ed @è dove sei.

punteggio

Ricorda, questo è , quindi vince la risposta con il minor numero di byte.

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>


Puoi chiarire come viene generato l'output?
Leaky Nun,

Penso che sarà bello avere un esempio in cui l'input è molto più grande di 5, poiché l'output per 5 non è particolarmente illustrativo
Sp3000,

Siamo sempre al centro? Che dire di quando l'ingresso è pari?
Leaky Nun,

1
@LeakyNun "n is sempre dispari"
Sp3000,

@LeakyNun L'output può essere generato come desiderato, ma deve seguire le specifiche di output. Sono corretto con l'ingresso / uscita 7x7?
Soren,

Risposte:


8

Excel-VBA, (47 * n ^ 2) byte e 121 byte

Istruzione:

Excel risulta essere molto utile per questa sfida e ci sono combinazioni di formule di Excel per ottenere il modello esatto come mostrato dall'OP per un dato input. Fortunatamente per me, Excel ha una funzione GCD - una formula integrata per restituire il massimo divisore comune di numeri interi positivi, quindi non devo crearne uno usando l' algoritmo euclideo . Perché ho bisogno di una funzione GCD qui? È perché due numeri sono chiamati coprime, se il loro massimo comune divisore è uguale a 1 . I numeri qui è la coordinata della posizione, xe y, relativamente all'origine, @. Ecco la formula di Excel

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

dove mè il nome di una cella di riferimento ed è uguale al numero intero più piccolo maggiore o uguale a n/2, ceiling ( n/2), dove nè il nome di una cella di riferimento per l'input. Incolla questa formula nella cella A1, quindi trascina tutto l'intervallo con le dimensioni n x n. La lunghezza della formula è 47 byte, ma è necessario replicarla n x nvolte, quindi è uguale a (47 * n ^ 2) byte.

Per automatizzare il processo e ridurre l'uso dei caratteri, possiamo usare VBA poiché è integrato con Excel. Per prima cosa, imposta un foglio di lavoro Excel come il seguente:

inserisci qui la descrizione dell'immagine

Quindi inserire il seguente codice nella finestra immediata

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 il codice:

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

Spiegazione:

  1. n = [A1] : Imposta n come input e assegna il valore della cella A1 a n.
  2. m = Int(n / 2) + 1: Modo personalizzato per restituire lo stesso output della funzione soffitto per argomento n/2.
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")": Incolla la formula sopra in ogni cella dell'intervallo con dimensioni a n x npartire dalla cella A1.
  4. Cells(m, m) = "@" : Assegna al centro dell'intervallo un carattere @.

Produzione:

La figura seguente è l'output di esempio per l'input n = 11

inserisci qui la descrizione dell'immagine

Ho impostato il colore del carattere su rosso per renderlo più attraente. Anche meglio

inserisci qui la descrizione dell'immagine


Perché "incolli" la formula in ogni cella invece di calcolarla direttamente nella funzione VBA?
Vale

@Vale Perché sarà più lungo poiché devo usare l'istruzione loop, l'istruzione IF, WorksheetFunction e così via.
Anastasiya-Romanova 秀

ma nel conteggio dei byte hai inserito 47 * n ^ 2 ...?
Vale

@Vale Forse non hai letto questo: " La lunghezza della formula è di 47 byte ma devi replicarla n x nvolte, quindi è uguale a (47 * n ^ 2) byte " nella mia risposta. Vedi anche la discussione nella sezione commenti della risposta di ugoren . Spero che renda la cosa più chiara.
Anastasiya-Romanova 秀

@ Anastasiya-Romanova 秀 come da convenzione, il conteggio dei byte corretti per questa soluzione sarebbe 121 bytesdato che solo il programma stesso contribuisce al calcolo. Nel caso in cui si fa riferimento, l'origine deve essere copiata e incollata in ogni singola cella, mentre nella soluzione è tutto programmato.
Taylor Scott,

4

Gelatina , 16 byte

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

Provalo online!

Come funziona

: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.

Puoi aggiungere una vista ampliata e commentata del codice?
Soren,

L'ho già fatto. Manca qualcosa?
Dennis,

Non lo vedevo per qualche motivo ... ora sta bene!
Soren,


3

Perl 6 , 77 o 74 byte

Programma completo (77 byte) :

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

( provalo online )

Se è accettabile restituire l'output di un lambda come un elenco di elenchi di stringhe di 1 carattere (74 byte) :

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

( provalo online )



3

C, 147 145 135 133 byte

2 byte grazie a Dennis.

10 byte grazie ad Arnauld.

2 byte grazie a 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 esso!

I consigli sul golf sono i benvenuti come sempre.


Se definisci un'altra variabile globale (diciamo x) e fai x=invece che returnnella g()funzione, allora penso che tu possa fare {g(i,j-m);putchar(x?x*x-1?32:42:64);}e salvare 7 byte. (O 8 byte se si rimuove anche l'interruzione di linea. È davvero necessario?)
Arnauld

@Arnauld Thanks, aggiornato
Leaky Nun,

Hmm. Non è necessario dichiarare m,i,jdue volte, vero?
Arnauld,

@Arnauld Apparentemente sono un idiota.
Leaky Nun,

1
Passare ++ja ++j%n(+2 byte) e j-ma j%n-m(+2 byte). Quindi è possibile rimuovere ,j%=n(-5 byte).
H Walters,

3

Javascript (ES6), 114 113 105 byte

Questo è iniziato come un port della versione C di Leaky Nun ed è stato quindi ulteriormente ottimizzato. La maggior parte delle ottimizzazioni sono specifiche di 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)

Esempio:

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))


2

Pyth, 40 byte

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

Sono molto nuovo su Pyth, quindi è probabile che questo possa essere ulteriormente approfondito.

Provalo online

Come funziona

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

2

GolfScript, 98 83 byte

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

Provalo online!

Input = 11

 **** **** 
* * * * * *
** ** ** **
* * * * * *
***********
    *@*    
***********
* * * * * *
** ** ** **
* * * * * *
 **** **** 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.