दर्शनीय इमारतें


15

यह पहेली CodinGame SamSi की "हार्ट ऑफ़ द सिटी" पहेली से ली गई है ।

विवरण

आप एक n* nटाइल शहर में टहलने और केंद्र टाइल पर जाने का निर्णय लेते हैं। सभी इमारतें असीम रूप से छोटी हैं, लेकिन आपके पास सुपर विजन है और आप सब कुछ करीब और दूर देख सकते हैं।

प्रतिबन्ध

n हमेशा विषम है

आप किसी भी इमारत को देख सकते हैं जो सीधे दूसरे द्वारा बाधित नहीं है

कार्य

साथ दिखाई देने वाली प्रत्येक इमारत को चिह्नित करें *। इमारत दिखाई दे रही है अगर यह दृष्टि की एक ही रेखा पर किसी अन्य इमारत द्वारा अवरुद्ध नहीं है।

दूसरे शब्दों में, यदि @मूल है, तो भवन दिखाई देता है यदि x-निर्देशांक और y-निर्देशांक एक-दूसरे के सह-प्रधान हैं।

उदाहरण इनपुट और आउटपुट

इनपुट:

7

आउटपुट:

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

*एक दृश्यमान इमारत है, एक अदृश्य इमारत है, और @वह जगह है जहाँ आप हैं।

स्कोरिंग

याद रखें, यह , इसलिए कम से कम बाइट जीतता है।

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>


क्या आप स्पष्ट कर सकते हैं कि आउटपुट कैसे उत्पन्न होता है?
लीकी नून

मुझे लगता है कि यह एक उदाहरण होना अच्छा होगा जहां इनपुट 5 से बहुत बड़ा है, क्योंकि 5 के लिए आउटपुट विशेष रूप से
निराशाजनक

क्या हम हमेशा केंद्र में हैं? क्या है जब इनपुट भी है?
लीकी नून

1
@LeakyNun "n हमेशा विषम होता है"
Sp3000

@LeakyNun आउटपुट आप चाहते हैं लेकिन उत्पन्न किया जा सकता है, लेकिन यह उत्पादन विनिर्देशों का पालन किया है। क्या मैं 7x7 इनपुट / आउटपुट के साथ सही हूं?
सोरेन

जवाबों:


8

एक्सेल-वीबीए, (47 * n ^ 2) बाइट्स और 121 बाइट्स

निर्देश:

इस चुनौती के लिए एक्सेल बहुत काम आता है और किसी दिए गए इनपुट के लिए ओपी के दिखाए अनुसार सटीक पैटर्न प्राप्त करने के लिए एक्सेल फॉर्मूले का संयोजन होता है। मेरे लिए सौभाग्य से, एक्सेल में एक जीसीडी फ़ंक्शन है - सकारात्मक पूर्णांक के सबसे बड़े सामान्य विभाजक को वापस करने के लिए एक अंतर्निहित सूत्र है इसलिए मुझे यूक्लिडियन एल्गोरिथ्म का उपयोग करके एक बनाने की आवश्यकता नहीं है । मुझे यहां GCD फ़ंक्शन की आवश्यकता क्यों है? ऐसा इसलिए है क्योंकि दो संख्याओं को कोप्राइम कहा जाता है, यदि उनका सबसे बड़ा सामान्य भाजक 1 बराबर है । यहां संख्याओं की स्थिति का समन्वय है, xऔर y, मूल के सापेक्ष @,। यहाँ एक्सेल सूत्र है

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

जहां mएक संदर्भ कक्ष का नाम है और यह n/2छत, ( n/2) से अधिक या उसके बराबर सबसे छोटे पूर्णांक के बराबर है , जहां nइनपुट के लिए संदर्भ कक्ष का नाम है। इस सूत्र को सेल A1 में चिपकाएँ, फिर आकार के साथ सभी रेंज खींचें n x n। सूत्र की लंबाई 47 बाइट्स है लेकिन आपको इसे n x nबार-बार दोहराना है , इसलिए यह बाइट्स (47 * n ^ 2) के बराबर है।

प्रक्रिया को स्वचालित करने और वर्णों के उपयोग को कम करने के लिए, हम VBA का उपयोग कर सकते हैं क्योंकि यह एक्सेल के साथ एकीकृत है। पहली बात यह है कि, निम्न की तरह एक वर्कशीट एक्सेल सेट करें:

यहां छवि विवरण दर्ज करें

फिर निम्नलिखित कोड को तत्काल विंडो में रखें

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

कोड को अनफ़ाल्ट किया गया:

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

स्पष्टीकरण:

  1. n = [A1] : इनपुट के रूप में n सेट करें और सेल A1 से n के मान असाइन करें।
  2. m = Int(n / 2) + 1: तर्क के लिए छत समारोह के रूप में एक ही आउटपुट वापस करने के लिए कस्टम तरीका n/2
  3. Range("A1", Cells(n, n)) = "=IF(GCD(ABS(COLUMN()-" & m & "),ABS(" & m & "-ROW()))=1,""*"" ,"""")": n x nसेल A1 से आकार के साथ रेंज में हर सेल के ऊपर सूत्र चिपकाएँ ।
  4. Cells(m, m) = "@" : एक चरित्र के साथ रेंज के केंद्र को असाइन करें @

आउटपुट:

नीचे चित्र इनपुट के लिए उदाहरण आउटपुट है n = 11

यहां छवि विवरण दर्ज करें

मैंने फ़ॉन्ट रंग को लाल करने के लिए सेट किया है ताकि यह अधिक आकर्षक लग सके। और भी बेहतर

यहां छवि विवरण दर्ज करें


आप VBA फ़ंक्शन में सीधे गणना करने के बजाय प्रत्येक कक्ष में सूत्र को "पेस्ट" क्यों करते हैं?
वैले

@Vale क्योंकि यह लंबा हो जाएगा क्योंकि मुझे लूपिंग स्टेटमेंट, IF स्टेटमेंट, वर्कशीटफ़ंक्शन और इतने पर उपयोग करना होगा।
अनास्तासिया-रोमानोवा

लेकिन अपनी बाइट गिनती में आप 47 * n ^ 2 डालते हैं ...?
Vale

@Vale आपने शायद यह नहीं पढ़ा है: " सूत्र की लंबाई 47 बाइट्स है लेकिन आपको इसे n x nबार-बार दोहराना होगा , इसलिए यह मेरे जवाब में (47 * n ^ 2) बाइट्स के बराबर है "। बदसूरत जवाब के टिप्पणी अनुभाग में चर्चा भी देखें । मुझे उम्मीद है कि इससे बात साफ हो जाएगी।
अनस्तासिया-रोमानोवा

@ अनास्तासिया-रोमानोवा as सम्मेलन के अनुसार, इस समाधान के लिए सही बाइट की गिनती 121 bytesकेवल उस कार्यक्रम के रूप में होगी जो स्वयं बायटेकाउंट में योगदान देता है। आपके द्वारा संदर्भित मामले में, स्रोत को प्रत्येक व्यक्तिगत कोशिकाओं में कॉपी और पेस्ट किया जाना चाहिए, जबकि आपके समाधान में यह सब प्रोग्रामेटिक रूप से किया जाता है।
टेलर स्कॉट

4

जेली , 16 बाइट्स

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

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

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

क्या आप कोड का एक विस्तारित, टिप्पणी किया गया दृश्य जोड़ सकते हैं?
सोरेन

मैंने पहले से ही कर लिया। क्या यह कुछ याद आ रहा है?
डेनिस

मैं इसे किसी कारण से नहीं देख रहा था .... यह अब अच्छा लग रहा है!
सोरेन


3

पर्ल 6 , 77 या 74 बाइट्स

पूरा कार्यक्रम (77 बाइट्स) :

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

( इसे ऑनलाइन आज़माएं )

यदि यह 1-चरित्र स्ट्रिंग्स (74 बाइट्स) की सूची की सूची के रूप में लैम्बडा से आउटपुट वापस करने के लिए स्वीकार्य है :

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

( इसे ऑनलाइन आज़माएं )


3

एसआईओएस , 236 बाइट्स

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

इसे ऑनलाइन आज़माएं!

सी में मेरे जवाब का पोर्ट ।


15 के लिए आउटपुट दिलचस्प है
रोहन झुनझुनवाला

3

सी, 147 145 135 133 बाइट्स

2 बाइट्स डेनिस के लिए धन्यवाद।

अरनौलद को 10 बाइट्स धन्यवाद।

2 बाइट्स एच वाल्टर्स के लिए धन्यवाद।

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 यह!

गोल्फ सलाह हमेशा की तरह स्वागत है।


मैं आपको एक और वैश्विक चर (जैसे कि परिभाषित x) और कर x=के बजाय returnमें g()समारोह है, तो मुझे लगता है कि आप कर सकते हैं {g(i,j-m);putchar(x?x*x-1?32:42:64);}और 7 बाइट्स बचाने। (या 8 बाइट्स यदि आप भी लाइन ब्रेक को हटा दें तो क्या यह वास्तव में आवश्यक है?)
अरनुलड

@ अरनल्ड थैंक्स, अपडेटेड
लीक

हम्म। आपको m,i,jदो बार घोषणा करने की आवश्यकता नहीं है , क्या आप?
अरनौलद

@ अर्नुलद स्पष्ट रूप से मैं एक बेवकूफ हूँ।
लीक

1
बदलें ++jकरने के लिए ++j%n(+2 बाइट्स), और j-mकरने के लिए j%n-m(+2 बाइट्स)। तब आप निकाल सकते हैं ,j%=n(-5 बाइट्स)।
एच वाल्टर्स

3

जावास्क्रिप्ट (ईएस 6), 114 113 105 बाइट्स

यह लीकी नून के सी संस्करण के बंदरगाह के रूप में शुरू हुआ और फिर इसे और अनुकूलित किया गया। अधिकांश अनुकूलन जेएस के लिए विशिष्ट हैं।

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)

उदाहरण:

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

अजगर, 40 बाइट्स

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

मैं पाइथ के लिए बहुत नया हूं, इसलिए यह संभवत: आगे गोल्फ हो सकता है।

इसे ऑनलाइन आज़माएं

यह काम किस प्रकार करता है

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.