Tòa nhà có thể nhìn thấy


15

Câu đố này có nguồn gốc từ CodinGame của SamSi "Heart of the City" câu đố.

Sự miêu tả

Bạn quyết định đi dạo trong một nn thành phố * gạch và đi đến trung tâm gạch. Tất cả các tòa nhà đều vô cùng nhỏ, nhưng bạn có tầm nhìn siêu việt và có thể nhìn thấy mọi thứ ở gần và xa.

Những ràng buộc

n luôn luôn là số lẻ

Bạn có thể thấy bất kỳ tòa nhà nào không bị cản trở trực tiếp bởi một tòa nhà khác

Bài tập

Đánh dấu mỗi tòa nhà có thể nhìn thấy bằng * . Tòa nhà có thể nhìn thấy nếu nó không bị chặn bởi một tòa nhà khác trên cùng một tầm nhìn.

Nói cách khác, nếu @ là điểm gốc, tòa nhà có thể nhìn thấy được nếu tọa độ x và tọa độ y là đồng nguyên tố với nhau.

Ví dụ đầu vào và đầu ra

Đầu vào:

7

Đầu ra:

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

*là một tòa nhà hữu hình, là một tòa nhà vô hình, và @ là nơi bạn đang ở.

Chấm điểm

Hãy nhớ rằng, đây là , vì vậy câu trả lời có ít byte nhất sẽ thắng.

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>


Bạn có thể làm rõ về cách đầu ra được tạo ra?
Nữ tu rò rỉ

Tôi nghĩ sẽ tốt hơn nếu có một ví dụ trong đó đầu vào lớn hơn 5, vì đầu ra cho 5 không đặc biệt minh họa
Sp3000

Có phải chúng ta luôn ở trung tâm? Còn khi đầu vào chẵn thì sao?
Nữ tu bị rò rỉ

1
@LeakyNun "n luôn là số lẻ"
Sp3000

@LeakyNun Đầu ra có thể được tạo theo cách bạn muốn, nhưng nó phải tuân theo các thông số kỹ thuật đầu ra. Tôi có đúng với đầu vào / đầu ra 7x7 không?
Soren

Câu trả lời:


8

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

Chỉ dẫn:

Excel hóa ra rất tiện lợi cho thử thách này và có sự kết hợp các công thức Excel để có được mẫu chính xác như OP hiển thị cho một đầu vào nhất định. May mắn cho tôi, Excel có hàm GCD - một công thức tích hợp để trả về ước số chung lớn nhất của các số nguyên dương nên tôi không phải tạo một thuật toán bằng thuật toán Euclide . Tại sao tôi cần một chức năng GCD ở đây? Đó là bởi vì hai số được gọi là số nguyên tố, nếu ước số chung lớn nhất của chúng bằng 1 . Các số ở đây là tọa độ của vị trí, xy, liên quan đến nguồn gốc , @. Đây là công thức Excel

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

trong đó mtên của một ô tham chiếu và nó bằng số nguyên nhỏ nhất lớn hơn hoặc bằng n/2, trần ( n/2), trong đó nlà tên của một ô tham chiếu cho đầu vào. Dán công thức này vào ô A1, sau đó kéo toàn bộ phạm vi với kích thước n x n. Độ dài của công thức là 47 byte nhưng bạn phải sao chép lại n x nlần đó , do đó, nó bằng (47 * n ^ 2) byte.

Để tự động hóa quy trình và giảm việc sử dụng các ký tự, chúng ta có thể sử dụng VBA vì nó được tích hợp với Excel. Điều đầu tiên, đặt một bảng tính Excel như sau:

nhập mô tả hình ảnh ở đây

Sau đó đặt đoạn mã sau vào Cửa sổ ngay lập tức

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

Mã hóa:

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

Giải trình:

  1. n = [A1] : Đặt n làm đầu vào và gán giá trị của ô A1 cho n.
  2. m = Int(n / 2) + 1: Cách tùy chỉnh để trả về cùng một đầu ra như hàm trần cho đối số n/2.
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")" : Dán công thức trên cho mọi ô trong phạm vi có kích thước n x n bắt đầu từ ô A1.
  4. Cells(m, m) = "@" : Gán trung tâm của phạm vi với một ký tự @.

Đầu ra:

Hình dưới đây là đầu ra ví dụ cho đầu vào n = 11

nhập mô tả hình ảnh ở đây

Tôi đặt màu chữ thành màu đỏ để trông hấp dẫn hơn. Thậm chí còn tốt hơn

nhập mô tả hình ảnh ở đây


Tại sao bạn "dán" công thức vào mọi ô thay vì tính toán trực tiếp trong hàm VBA?
Vale

@Vale Bởi vì nó sẽ dài hơn vì tôi phải sử dụng câu lệnh lặp, câu lệnh IF, WorksheetFunction, v.v.
Anastasiya-Romanova

nhưng trong số byte của bạn, bạn đặt 47 * n ^ 2 ...?
Vale

@Vale Có lẽ bạn chưa đọc điều này: " Độ dài của công thức là 47 byte nhưng bạn phải sao chép lại n x nlần đó , vì vậy nó bằng (47 * n ^ 2) byte " trong câu trả lời của tôi. Xem thêm các cuộc thảo luận trong phần bình luận của câu trả lời của ugoren . Tôi hy vọng nó làm cho mọi thứ rõ ràng hơn.
Anastasiya-Romanova

@ Anastasiya-Romanova theo quy ước, số byte chính xác cho giải pháp này sẽ 121 byteschỉ vì chính chương trình đó đóng góp cho bytecount. Trong trường hợp bạn đã tham chiếu, nguồn phải được sao chép và dán vào từng ô riêng lẻ, trong khi đó, trong giải pháp của bạn, tất cả đều được thực hiện theo chương trình.
Taylor Scott

4

Thạch , 16 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Bạn có thể thêm một cái nhìn mở rộng, nhận xét về mã?
Soren

Tôi đã làm rồi. Có thiếu thứ gì không?
Dennis

Tôi đã không nhìn thấy nó vì một số lý do .... nó trông thật tuyệt!
Soren


3

Perl 6 , 77 hoặc 74 byte

Chương trình đầy đủ (77 byte) :

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

( thử trực tuyến )

Nếu có thể trả về đầu ra từ lambda dưới dạng danh sách các chuỗi 1 ký tự (74 byte) :

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

( thử trực tuyến )



3

C, 147 145 135 133 byte

2 byte nhờ Dennis.

10 byte nhờ Arnauld.

2 byte nhờ 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);}

Nghĩa là nó!

Tư vấn chơi golf luôn được chào đón.


Tôi xác định một biến toàn cục khác (nói x) và làm x=thay vì returntrong g()hàm, sau đó tôi nghĩ bạn có thể làm {g(i,j-m);putchar(x?x*x-1?32:42:64);}và lưu 7 byte. (Hoặc 8 byte nếu bạn cũng loại bỏ ngắt dòng. Có thực sự cần thiết không?)
Arnauld

@Arnauld Cảm ơn, đã cập nhật
Leaky Nun

Hừm. Bạn không cần phải khai báo m,i,jhai lần, phải không?
Arnauld

@Arnauld Rõ ràng tôi là một thằng ngốc.
Nữ tu bị rò rỉ

1
Thay đổi ++jthành ++j%n(+2 byte) và j-mthành j%n-m(+2 byte). Sau đó, bạn có thể loại bỏ ,j%=n(-5 byte).
H Walters

3

Javascript (ES6), 114 113 105 byte

Điều này bắt đầu như là một cổng của phiên bản C của Leaky Nun và sau đó được tối ưu hóa hơn nữa. Hầu hết các tối ưu hóa là cụ thể cho 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)

Thí dụ:

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

Bình thường, 40 byte

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

Tôi rất mới với Pyth, vì vậy điều này có thể sẽ được đánh gôn hơn nữa.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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}*

Hãy thử trực tuyến!

Đầu vào = 11

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.