Görünür Binalar


15

Bu bulmaca CodinGame SamSi " Şehrin kalbi" bulmaca türetilmiştir .

Açıklama

Bir n* nkiremit şehrinde yürüyüşe çıkmaya ve orta döşemeye gitmeye karar veriyorsunuz. Tüm binalar sonsuz küçüktür, ancak süper vizyonunuz vardır ve her şeyi yakından ve uzaktan görebilirsiniz.

Kısıtlamalar

n her zaman garip

Doğrudan başka bir bina tarafından engellenmeyen herhangi bir binayı görebilirsiniz.

Görev

Her binayı görünür olarak işaretleyin *. Bina, aynı görüş alanında başka bir bina tarafından engellenmediği takdirde görülebilir.

Başka bir deyişle, eğer @başlangıç ​​noktasıysa, bina x koordinatı ile y koordinatı birbirinin eşdeğeri olduğunda görülebilir.

Örnek giriş ve çıkış

Giriş:

7

Çıktı:

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

*görünür bir bina, görünmez bir bina ve @bulunduğunuz yer.

puanlama

Unutmayın, bu , bu yüzden en az bayt ile cevap kazanır.

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>


Çıktının nasıl üretildiğini açıklayabilir misiniz?
Leaky Nun

5 için çıktı özellikle açıklayıcı olmadığından, girdinin 5'ten çok daha büyük olduğu bir örneğe sahip olmanın iyi olacağını düşünüyorum
Sp3000

Hep merkezde miyiz? Giriş eşit olduğunda ne olacak?
Leaky Nun

1
@LeakyNun "n her zaman gariptir"
Sp3000

@LeakyNun Çıktı istediğiniz gibi oluşturulabilir, ancak çıktı özelliklerini izlemelidir. 7x7 giriş / çıkış ile doğru muyum?
Soren

Yanıtlar:


8

Excel-VBA, (47 * n ^ 2) bayt ve 121 bayt

Talimat:

Excel bu meydan okuma için çok kullanışlı olduğu ortaya çıkıyor ve belirli bir giriş için gösterilen OP'lerin tam desenini elde etmek için Excel formüllerinin kombinasyonu var. Neyse ki benim için Excel'in bir GCD işlevi var - pozitif tamsayıların en büyük ortak bölenini döndürmek için yerleşik bir formül, bu yüzden Öklid algoritması kullanarak bir tane oluşturmak zorunda değilim . Neden burada bir GCD işlevine ihtiyacım var? Çünkü en büyük ortak bölen 1'e eşitse iki sayıya coprime denir . Burada sayıları konumun koordinat, xve ybaşlangıç konumuna göre, @. İşte Excel formülü

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

burada mbir referans hücresinin adıdır ve bu n/2, tavana ( n/2) eşit veya daha büyük en küçük tamsayıya eşittir ; burada ngiriş için bir referans hücresinin adıdır. Bu formülü A1 hücresine yapıştırın, ardından boyutun her yerine aralık sürükleyin n x n. Formülün uzunluğu 47 bayttır, ancak n x nkez kopyalamanız gerekir , bu nedenle (47 * n ^ 2) bayta eşittir.

Süreci otomatikleştirmek ve karakter kullanımını azaltmak için VBA'yı Excel ile entegre olduğu için kullanabiliriz. İlk olarak, aşağıdaki gibi bir çalışma sayfası Excel'i ayarlayın:

resim açıklamasını buraya girin

Sonra Anında Pencereye aşağıdaki kodu koyun

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

Kodu çözdü:

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

Açıklama:

  1. n = [A1] : N'yi giriş olarak ayarlayın ve A1 hücresinin değerini n'ye atayın.
  2. m = Int(n / 2) + 1: Bağımsız değişken için tavan işleviyle aynı çıktıyı döndürmenin özel yolu n/2.
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")": Yukarıdaki formülü n x nA1 hücresinden başlayan boyut aralığındaki her hücreye yapıştırın .
  4. Cells(m, m) = "@" : Aralığın ortasını bir karakterle atayın @.

Çıktı:

Aşağıdaki şekil giriş için örnek çıktıdır n = 11

resim açıklamasını buraya girin

Daha çekici görünmesi için yazı tipi rengini kırmızıya ayarladım. Daha iyi

resim açıklamasını buraya girin


Formülü neden doğrudan VBA işlevinde hesaplamak yerine her hücreye "yapıştırıyorsunuz"?
Vale

@Vale Çünkü looping deyimi, IF deyimi, WorksheetFunction, vb kullanmak zorunda daha uzun olacaktır.
Anastasiya-Romanova 秀

ama bayt sayınıza 47 * n ^ 2 koydunuz mu?
Vale

@Vale Belki bunu okumadınız: " Formülün uzunluğu 47 bayttır, ancak n x nkez kopyalamanız gerekir , bu yüzden cevabımda (47 * n ^ 2) bayta eşittir ". Ayrıca ugoren'in cevabının yorum bölümündeki tartışmaya bakınız . Umarım her şeyi daha açık hale getirir.
Anastasiya-Romanova 秀

@ Anastasiya-Romanova con kurallara göre, bu çözüm için doğru bayt sayısı 121 bytesyalnızca programın bayt sayısına katkıda bulunması gibi olacaktır. Referans vermeniz durumunda, kaynağın her bir hücreye kopyalanması ve yapıştırılması gerekirken, çözümünüzde programlı olarak yapılır.
Taylor Scott

4

Jöle , 16 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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

Kodun genişletilmiş, yorumlanmış bir görünümünü ekleyebilir misiniz?
Soren

Zaten yaptım. Bir şey mi eksik?
Dennis

Nedense görmedim .... şimdi iyi görünüyor!
Soren


3

Perl 6 , 77 veya 74 bayt

Tam program (77 bayt) :

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

( çevrimiçi deneyin )

Çıkışı lambda'dan 1 karakterlik dizelerin (74 bayt) bir listesi olarak döndürmek kabul edilebilirse :

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

( çevrimiçi deneyin )



3

C 147 145 135 133 bayt

Dennis sayesinde 2 bayt.

Arnauld sayesinde 10 bayt.

H Walters sayesinde 2 bayt.

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

Boşver!

Golf tavsiye her zamanki gibi hoş geldiniz.


Ben başka bir global değişken (diyelim tanımlamak x) ve yapılacak x=yerine returnde g()o zaman yapabileceğiniz düşünüyorum fonksiyonu {g(i,j-m);putchar(x?x*x-1?32:42:64);}ve 7 bayt tasarruf. (Veya satır sonunu da kaldırırsanız 8 bayt. Gerçekten gerekli mi?)
Arnauld

@Arnauld Teşekkürler, güncellendi
Leaky Nun

Hmm. m,i,jİki kere beyan etmene gerek yok, değil mi?
Arnauld

@ Görünüşe göre ben bir aptalım.
Leaky Nun

1
Değişim ++jiçin ++j%n(2 byte) ve j-mkarşı j%n-m(2 bayt). Sonra kaldırabilirsiniz ,j%=n(-5 bayt).
H Walters

3

JavaScript (ES6), 114 113 105 bayt

Bu, Leaky Nun'in C versiyonunun bir limanı olarak başladı ve daha sonra optimize edildi. Çoğu optimizasyon JS'ye özeldir.

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)

Misal:

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 bayt

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

Pyth için çok yeniyim, bu yüzden daha fazla golf yapılabilir.

Çevrimiçi deneyin

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

Giriş = 11

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.