Teka-teki ini berasal dari teka-teki "Heart of the City" CodinGame SamSi.
Deskripsi
Anda memutuskan untuk berjalan-jalan di kota ubin n
* n
dan 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 kode-golf , 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>
Jawaban:
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,
x
dany
, relatif terhadap asal@
,. Ini adalah rumus Exceldi mana
m
nama sel referensi dan itu sama dengan bilangan bulat terkecil lebih besar dari atau sama dengann/2
, ceiling (n/2
), di manan
adalah nama sel referensi untuk input. Rekatkan rumus ini di sel A1, lalu seret semua rentang dengan ukurann 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:
Kemudian masukkan kode berikut di Jendela Segera
Ungolfed the code:
Penjelasan:
n = [A1]
: Tetapkan n sebagai input dan tetapkan nilai sel A1 ke n.m = Int(n / 2) + 1
: Cara kustom untuk mengembalikan output yang sama dengan fungsi plafon untuk argumenn/2
.Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")"
: Tempelkan rumus di atas ke setiap sel dalam kisaran dengan ukurann x n
mulai dari sel A1.Cells(m, m) = "@"
: Tetapkan pusat rentang dengan karakter@
.Keluaran:
Gambar di bawah ini adalah contoh output untuk input
n = 11
Saya mengatur warna font menjadi merah agar terlihat lebih menarik. Bahkan lebih baik
sumber
n x n
kali, 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.121 bytes
hanya 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.Jelly , 16 byte
Cobalah online!
Bagaimana itu bekerja
sumber
J, 24 byte
Port jawaban Dennis di Jelly .
sumber
Perl 6 , 77 atau 74 byte
Program lengkap (77 byte) :
( coba online )
Jika dapat diterima untuk mengembalikan output dari lambda sebagai daftar daftar string 1-karakter (74 byte) :
( coba online )
sumber
SILOS , 236 byte
Cobalah online!
Pelabuhan jawaban saya di C .
sumber
C,
147145135133 byte2 byte berkat Dennis.
10 byte terima kasih kepada Arnauld.
2 byte terima kasih kepada H Walters.
Ide itu!
Saran bermain golf seperti biasa.
sumber
x
) dan lakukanx=
alih - alihreturn
dalamg()
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?)m,i,j
dua kali, bukan?++j
ke++j%n
(+2 byte), danj-m
kej%n-m
(+2 byte). Kemudian Anda dapat menghapus,j%=n
(-5 byte).Javascript (ES6),
114113105 byteIni dimulai sebagai port versi C Leaky Nun dan kemudian dioptimalkan lebih lanjut. Sebagian besar optimasi khusus untuk JS.
Contoh:
sumber
Pyth, 40 byte
Saya sangat baru di Pyth, jadi ini kemungkinan bisa golf lebih lanjut.
Cobalah online
Bagaimana itu bekerja
sumber
GolfScript,
9883 byteCobalah online!
Input = 11
sumber
APL (Dyalog Classic) , 23 byte
Cobalah online!
sumber