Edificios visibles

15

Este rompecabezas se deriva del rompecabezas "Corazón de la ciudad" de CodinGame SamSi.

Descripción

Decides dar un paseo por una ciudad n* de nbaldosas e ir al centro de baldosas. Todos los edificios son infinitamente pequeños, pero tienes una excelente visión y puedes ver todo de cerca y de lejos.

Restricciones

n siempre es extraño

Puedes ver cualquier edificio que no esté directamente obstruido por otro

Tarea

Marque cada edificio visible con *. El edificio es visible si no está bloqueado por otro edificio en la misma línea de visión.

En otras palabras, si @es el origen, el edificio es visible si la coordenada xy la coordenada y son primos entre sí.

Ejemplo de entrada y salida

Entrada:

7

Salida:

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

*es un edificio visible, es un edificio invisible y @es donde estás.

Puntuación

Recuerde, este es el , por lo que gana la respuesta con la menor cantidad de 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
fuente
¿Puedes aclarar cómo se genera la salida?
Leaky Nun
Creo que sería bueno tener un ejemplo en el que la entrada sea mucho mayor que 5, ya que la salida para 5 no es particularmente ilustrativa
Sp3000,
¿Estamos siempre en el centro? ¿Qué pasa cuando la entrada es par?
Leaky Nun
1
@LeakyNun "n siempre es extraño"
Sp3000
@LeakyNun La salida se puede generar como desee, pero tiene que seguir las especificaciones de salida. ¿Estoy correcto con la entrada / salida 7x7?
Soren

Respuestas:

8

Excel-VBA, (47 * n ^ 2) bytes y 121 bytes

Instrucción:

Excel resulta muy útil para este desafío y hay una combinación de fórmulas de Excel para obtener el patrón exacto como los OP que se muestran para una entrada determinada. Afortunadamente para mí, Excel tiene una función GCD: una fórmula incorporada para devolver el máximo divisor común de enteros positivos, por lo que no tengo que crear uno con el algoritmo euclidiano . ¿Por qué necesito una función GCD aquí? Es porque dos números se llaman coprimos, si su máximo común divisor es igual a 1 . Los números aquí son las coordenadas de la posición xy y, en relación con el origen @,. Aquí está la fórmula de Excel

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

donde mes el nombre de una celda de referencia y es igual al entero más pequeño mayor o igual que n/2, ceiling ( n/2), donde nes el nombre de una celda de referencia para la entrada. Pegue esta fórmula en la celda A1, luego arrastre todo el rango con el tamaño n x n. La longitud de la fórmula es de 47 bytes, pero debe replicarla n x nveces, por lo que es igual a (47 * n ^ 2) bytes.

Para automatizar el proceso y reducir el uso de caracteres, podemos usar VBA ya que está integrado con Excel. Lo primero es lo primero, configure una hoja de cálculo Excel como la siguiente:

ingrese la descripción de la imagen aquí

Luego ponga el siguiente código en la ventana Inmediato

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 el código:

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

Explicación:

  1. n = [A1] : Establezca n como entrada y asigne el valor de la celda A1 a n.
  2. m = Int(n / 2) + 1: Forma personalizada de devolver la misma salida que la función de techo para el argumento n/2.
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")" : Pegue la fórmula anterior en cada celda del rango con tamaño n x n comience desde la celda A1.
  4. Cells(m, m) = "@" : Asigna el centro del rango con un personaje @.

Salida:

La figura a continuación es la salida de ejemplo para la entrada n = 11

ingrese la descripción de la imagen aquí

Establezco el color de fuente en rojo para que se vea más atractivo. Aun mejor

ingrese la descripción de la imagen aquí

Anastasiya-Romanova 秀
fuente
¿Por qué "pega" la fórmula en cada celda en lugar de calcularla directamente en la función VBA?
Vale
@Vale Porque será más largo ya que tengo que usar la instrucción de bucle, la instrucción IF, WorksheetFunction, etc.
Anastasiya-Romanova 秀
pero en tu cuenta de bytes pones 47 * n ^ 2 ...?
Vale
@Vale Quizás no haya leído esto: " La longitud de la fórmula es de 47 bytes, pero debe replicarlan x n varias veces, por lo que es igual a (47 * n ^ 2) bytes " en mi respuesta. Vea también la discusión en la sección de comentarios de la respuesta de ugoren . Espero que aclare las cosas.
Anastasiya-Romanova 秀
@ Anastasiya-Romanova 秀 según la convención, el recuento de bytes correcto para esta solución sería 121 bytesya que solo el programa mismo contribuye al recuento de bytes. En el caso al que hizo referencia, la fuente debe copiarse y pegarse en cada celda individual, mientras que en su solución todo se hace mediante programación.
Taylor Scott
4

Jalea , 16 bytes

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

Pruébalo en línea!

Cómo funciona

: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
fuente
¿Puedes agregar una vista ampliada y comentada del código?
Soren
Ya lo hice. ¿Le falta algo?
Dennis
No lo estaba viendo por alguna razón ... ¡se ve bien ahora!
Soren
3

Perl 6 , 77 o 74 bytes

Programa completo (77 bytes) :

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

( pruébalo en línea )

Si es aceptable devolver el resultado de un lambda como una lista de listas de cadenas de 1 carácter (74 bytes) :

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

( pruébalo en línea )

smls
fuente
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

Pruébalo en línea!

Puerto de mi respuesta en C .

Monja permeable
fuente
la salida para 15 es interesante
Rohan Jhunjhunwala
3

C, 147 145 135 133 bytes

2 bytes gracias a Dennis.

10 bytes gracias a Arnauld.

2 bytes gracias 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 it!

Consejos de golf bienvenidos como siempre.

Monja permeable
fuente
Si define otra variable global (digamos x) y hace en x=lugar de returnen la g()función, creo que puede hacer {g(i,j-m);putchar(x?x*x-1?32:42:64);}y guardar 7 bytes. (O 8 bytes si también elimina el salto de línea. ¿Es realmente necesario?)
Arnauld
@Arnauld Gracias, actualizado
Leaky Nun
Hmm No necesitas declarar m,i,jdos veces, ¿verdad?
Arnauld
@Arnauld Aparentemente soy un idiota.
Leaky Nun
1
Cambie ++ja ++j%n(+2 bytes) y j-ma j%n-m(+2 bytes). Luego puede eliminar ,j%=n(-5 bytes).
H Walters
3

Javascript (ES6), 114 113 105 bytes

Esto comenzó como un puerto de la versión C de Leaky Nun y luego se optimizó aún más. La mayoría de las optimizaciones son específicas de 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)

Ejemplo:

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
fuente
2

Pyth, 40 bytes

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

Soy muy nuevo en Pyth, por lo que es probable que esto pueda jugarse más.

Pruébalo en línea

Cómo funciona

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
fuente
2

GolfScript, 98 83 bytes

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

Pruébalo en línea!

Entrada = 11

 **** **** 
* * * * * *
** ** ** **
* * * * * *
***********
    *@*    
***********
* * * * * *
** ** ** **
* * * * * *
 **** **** 
FedeWar
fuente