Bangunan Terlihat

15

Teka-teki ini berasal dari teka-teki "Heart of the City" CodinGame SamSi.

Deskripsi

Anda memutuskan untuk berjalan-jalan di kota ubin n* ndan pergi ke ubin tengah. Semua bangunan itu sangat kecil, tetapi Anda memiliki visi yang super dan dapat melihat semuanya dari dekat dan jauh.

Kendala

n selalu aneh

Anda dapat melihat bangunan apa pun yang tidak terhalang langsung oleh gedung lain

Tugas

Tandai setiap bangunan yang terlihat *. Bangunan terlihat jika tidak terhalang oleh bangunan lain pada garis visi yang sama persis.

Dengan kata lain, jika @asalnya, bangunan akan terlihat jika koordinat x dan koordinat y saling terkait satu sama lain.

Contoh input dan output

Memasukkan:

7

Keluaran:

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

*adalah bangunan yang terlihat, adalah bangunan yang tidak terlihat, dan @ada di mana Anda berada.

Mencetak gol

Ingat, ini adalah , jadi jawabannya dengan byte paling sedikit menang.

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
sumber
Bisakah Anda mengklarifikasi bagaimana output dihasilkan?
Leaky Nun
Saya pikir itu akan baik untuk memiliki contoh di mana inputnya jauh lebih besar dari 5, karena output untuk 5 tidak terlalu ilustratif
Sp3000
Apakah kita selalu di pusat? Bagaimana dengan saat inputnya genap?
Leaky Nun
1
@ LeakyNun "n selalu aneh"
Sp3000
@ LeakyNun Output dapat dihasilkan seperti yang Anda inginkan, tetapi harus mengikuti spesifikasi output. Apakah saya benar dengan input / output 7x7?
Soren

Jawaban:

8

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

Petunjuk:

Excel ternyata sangat berguna untuk tantangan ini dan ada kombinasi formula Excel untuk mendapatkan pola yang tepat seperti yang ditunjukkan OP untuk input yang diberikan. Beruntung bagi saya, Excel memiliki fungsi GCD - formula bawaan untuk mengembalikan pembagi umum bilangan bulat positif terbesar jadi saya tidak harus membuatnya menggunakan algoritma Euclidean . Mengapa saya memerlukan fungsi GCD di sini? Itu karena dua angka disebut koprime, jika pembagi umum terbesarnya sama dengan 1 . Angka-angka di sini adalah koordinat posisi, xdan y, relatif terhadap asal @,. Ini adalah rumus Excel

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

di mana mnama sel referensi dan itu sama dengan bilangan bulat terkecil lebih besar dari atau sama dengan n/2, ceiling ( n/2), di mana nadalah nama sel referensi untuk input. Rekatkan rumus ini di sel A1, lalu seret semua rentang dengan ukuran n x n. Panjang rumus adalah 47 byte tetapi Anda harus mengulanginyan x n kali, jadi itu sama dengan (47 * n ^ 2) byte.

Untuk mengotomatiskan proses dan mengurangi penggunaan karakter, kita dapat menggunakan VBA karena terintegrasi dengan Excel. Hal pertama yang pertama, atur lembar kerja Excel seperti berikut ini:

masukkan deskripsi gambar di sini

Kemudian masukkan kode berikut di Jendela Segera

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

Penjelasan:

  1. n = [A1] : Tetapkan n sebagai input dan tetapkan nilai sel A1 ke n.
  2. m = Int(n / 2) + 1: Cara kustom untuk mengembalikan output yang sama dengan fungsi plafon untuk argumen n/2.
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")" : Tempelkan rumus di atas ke setiap sel dalam kisaran dengan ukuran n x n mulai dari sel A1.
  4. Cells(m, m) = "@" : Tetapkan pusat rentang dengan karakter @.

Keluaran:

Gambar di bawah ini adalah contoh output untuk input n = 11

masukkan deskripsi gambar di sini

Saya mengatur warna font menjadi merah agar terlihat lebih menarik. Bahkan lebih baik

masukkan deskripsi gambar di sini

Anastasiya-Romanova 秀
sumber
Mengapa Anda "menempelkan" rumus di setiap sel alih-alih menghitungnya langsung di fungsi VBA?
Vale
@Vale Karena akan lebih panjang karena saya harus menggunakan pernyataan perulangan, pernyataan IF, WorksheetFunction, dan sebagainya.
Anastasiya-Romanova 秀
tetapi dalam hitungan byte Anda, Anda menempatkan 47 * n ^ 2 ...?
Vale
@Vale Anda mungkin belum membaca ini: " Panjang rumus adalah 47 byte tetapi Anda harus mengulanginya n x nkali, jadi itu sama dengan (47 * n ^ 2) byte " dalam jawaban saya. Lihat juga diskusi di bagian komentar dari jawaban ugoren . Saya harap itu membuat hal itu menjadi lebih jelas.
Anastasiya-Romanova 秀
@ Anastasiya-Romanova 秀 sesuai konvensi, jumlah byte yang tepat untuk solusi ini adalah 121 byteshanya program yang berkontribusi pada bytecount. Dalam kasus yang Anda rujuk, sumber harus disalin dan ditempelkan ke setiap sel individu, sedangkan dalam solusi Anda itu semua dilakukan secara terprogram.
Taylor Scott
4

Jelly , 16 byte

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

Cobalah online!

Bagaimana itu bekerja

: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
sumber
Bisakah Anda menambahkan tampilan kode yang diperluas dan dikomentari?
Soren
Saya sudah melakukan. Apakah ada yang hilang?
Dennis
Saya tidak melihatnya karena suatu alasan .... terlihat bagus sekarang!
Soren
3

Perl 6 , 77 atau 74 byte

Program lengkap (77 byte) :

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

( coba online )

Jika dapat diterima untuk mengembalikan output dari lambda sebagai daftar daftar string 1-karakter (74 byte) :

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

( coba online )

seseorang
sumber
3

SILOS , 236 byte

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

Cobalah online!

Pelabuhan jawaban saya di C .

Biarawati Bocor
sumber
output untuk 15 menarik
Rohan Jhunjhunwala
3

C, 147 145 135 133 byte

2 byte berkat Dennis.

10 byte terima kasih kepada Arnauld.

2 byte terima kasih kepada 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);}

Ide itu!

Saran bermain golf seperti biasa.

Biarawati Bocor
sumber
Saya Anda mendefinisikan variabel global lain (katakanlah x) dan lakukan x=alih - alih returndalam g()fungsi, maka saya pikir Anda bisa melakukan {g(i,j-m);putchar(x?x*x-1?32:42:64);}dan menyimpan 7 byte. (Atau 8 byte jika Anda juga menghapus jeda baris. Apakah ini benar-benar diperlukan?)
Arnauld
@Arnauld Terima kasih, diperbarui
Leaky Nun
Hmm. Anda tidak perlu mendeklarasikan m,i,jdua kali, bukan?
Arnauld
@Arnauld Rupanya saya idiot.
Leaky Nun
1
Ubah ++jke ++j%n(+2 byte), dan j-mke j%n-m(+2 byte). Kemudian Anda dapat menghapus ,j%=n(-5 byte).
H Walters
3

Javascript (ES6), 114 113 105 byte

Ini dimulai sebagai port versi C Leaky Nun dan kemudian dioptimalkan lebih lanjut. Sebagian besar optimasi khusus untuk 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)

Contoh:

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

Pyth, 40 byte

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

Saya sangat baru di Pyth, jadi ini kemungkinan bisa golf lebih lanjut.

Cobalah online

Bagaimana itu bekerja

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

GolfScript, 98 83 byte

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

Cobalah online!

Input = 11

 **** **** 
* * * * * *
** ** ** **
* * * * * *
***********
    *@*    
***********
* * * * * *
** ** ** **
* * * * * *
 **** **** 
FedeWar
sumber