एक प्रतिबिंबित कमरे को रोशन करें


13

लक्ष्य

इस प्रतियोगिता में, आपको एक मोमबत्ती के साथ एक यादृच्छिक कमरा दिया जाता है। लक्ष्य सबसे छोटा कार्यक्रम (यह गोल्फ है) लिखना है जो यह निर्धारित करता है कि कमरे के किन हिस्सों को मोमबत्ती से रोशन किया जाता है, अंधेरे स्थानों को बदलकर @। कार्यक्रम को STDIN से एक कमरा लेना चाहिए, जिसमें आउटपुट से STDOUT छपा होता है।

उदाहरण इनपुट / कक्ष

+------+
|  C   |
|      +--+
|  \      |
+---------+

मोमबत्ती एक साथ प्रस्तुत किया जाता है C, और दीवारों / दर्पण के साथ प्रतिनिधित्व कर रहे हैं |, -, /, या \। दीवारें खुद दर्पण हैं। कमरे के कोनों को एक के साथ दर्शाया गया है +

कमरों में कभी विकर्ण दीवारें नहीं होंगी, और प्रकाश कभी भी कमरे से बाहर नहीं निकल पाएगा।

इसके अलावा, एक लाइन पर पहला चरित्र हमेशा कमरे से दीवार का हिस्सा होने वाला है। प्रत्येक पंक्ति पर पूर्ण अंतिम वर्ण कमरे की विपरीत दीवार होने वाली है। इन दोनों के बीच कोई भी चरित्र कमरे के बाहर नहीं होने वाला है।

प्रकाश और परावर्तन

मोमबत्ती आठ बुनियादी दिशाओं में प्रकाश के आठ (लेजर-जैसे) बीम का उत्सर्जन करती है: एन, एस, ई, डब्ल्यू, एनई, एसई, एसडब्ल्यू, और एनडब्ल्यू। नीचे वर्णित दर्पणों की प्रकाश किरणों की ये किरणें नीचे हैं:

Old Direction of Travel | Mirror | New Direction
N S E W NE SE SW NW       /        E W N S -- -- -- --
N S E W NE SE SW NW       \        W E S N -- -- -- --
N S E W NE SE SW NW       |        - - - - NW SW NE SW
N S E W NE SE SW NW       -        - - - - SE NE SW NE

A -प्रकाश को अवशोषित करने का प्रतिनिधित्व करता है। प्रकाश हमेशा C या + के द्वारा अवशोषित होता है। यह ध्यान रखना महत्वपूर्ण है कि रोशनी दर्पण से दूर तभी प्रतिबिंबित होती है जब वह दर्पण के समान स्थान पर कब्जा कर रही हो। इन नियमों को समझना बहुत आसान है जब आप प्रतिबिंब को कागज पर निकालते हैं।

उदाहरण आउटपुट

आउटपुट के रूप में, प्रोग्राम को प्रबुद्ध कमरे की एक छवि को प्रिंट करना चाहिए, जिसमें काले धब्बे के रूप में लिखा गया है @, हल्के धब्बे खाली छोड़ दिए गए हैं, और दर्पण अप्रभावित हैं। उपरोक्त उदाहरण के लिए, आउटपुट होगा:

+------+
|  C   |
|@   @ +--+
| @\      |
+---------+

इसका मतलब है कि, यदि आप प्रकाश के बीमों को बाहर निकालते हैं, तो वे कभी भी चिह्नित स्थानों तक नहीं पहुंचेंगे @

और ज्यादा उदाहरण

Input:
+-----+
|     |
|     |
|  C  |
|     |
|     |
+-----+
Output:
+-----+
| @ @ |
|@   @|
|  C  |
|@   @|
| @ @ |
+-----+

Input:
+-----+
|  \  |
|/ C \+-+
|       |
|  \ - ++
+------+
Output:
+-----+
|  \ @|
|/ C \+-+
|      @|
| @\ -@++
+------+

आपके उदाहरण में, नीचे-बाएँ कोने को @भी नहीं होना चाहिए ?
पीटर टेलर

1
@Peter टेलर: द SW बीम उस स्थान पर हिट करता है।
Briguy37

3
स्टैक ओवरफ्लो पर बहुत अच्छी तरह से प्राप्त लेज़र चुनौती के लिए कुछ समानताएं प्राप्त करता है । पर्याप्त तरीकों के साथ प्रयोग की जाने वाली विधियों को बनाने के लिए पर्याप्त समानता के साथ कुछ काफी विचार की आवश्यकता होती है कि उन्हें कैसे लागू किया जा सकता है।
dmckee --- पूर्व-मध्यस्थ ने बिल्ली का बच्चा

अधिक सत्यापन मामलों का उपयोग कर सकता है।
dmckee --- पूर्व-मध्यस्थ ने

@ डमकी मैंने दो और उदाहरण जोड़े।
PhiNotPi

जवाबों:


2

पायथन, 292 वर्ण

import sys
R=''
for x in sys.stdin:R+='%-97s\n'%x[:-1].replace(' ','@')
M={'/':'-98/d','\\':'98/d'}
for d in(-98,-1,1,98,99,97,-97,-99):
 if d>98:M={'|':'d^2','-':'-d^2'}
 p=R.find('C')
 while 1:
  p+=d
  if R[p]in' @':R=R[:p]+' '+R[p+1:]
  elif R[p]in M:d=eval(M[R[p]])
  else:break
print R,

कमरे में पढ़ता है, इसे आयताकार बनाता है, फिर सभी दिशाओं में मोमबत्ती से चलता है। M में सक्रिय दर्पण वर्ण और उनका प्रभाव ( /\कार्डिनल दिशाओं के |-लिए, दूसरों के लिए) है

97 वर्णों तक के कमरे को संभाल सकता है।


2

c - 504

K & R डिफ़ॉल्ट फ़ंक्शन कॉलिंग शब्दार्थ पर निर्भर करता है। किरणों को उछालने के साथ बेला सामान को छोड़कर बहुत सीधे आगे के कार्यान्वयन।

#define N M[x+y*97]
#define Y abs(y)
#define O M[c]==
#define E else break;
int j[]={-98,-97,-96,-1,1,96,97,98},c,x,y,p,s,M[9409];main(){for(;
(c=getchar())!=-1;){if(c==10)x=0,++y;else{if(c==67)p=x+y*97;if(c==32)
c=64;N=c;++x;}}for(x=0;x<8;++x){y=j[x];c=p;do{c+=y;if(O'@')M[c]=32;s=y/Y;
if(O 92)if(y%2){y=s*(98-Y);}E if(O'/')if(y%2){y=s*-(98-Y);}E if(O'|')
if(~y%2){y=s*(97+(97-Y));}E if(O'-')if(~y%2){y=s*-(97+(97-Y));}E}while
(!(O'+')&&!(O'C'));}for(y=0;x=0,N!=0;++y){for(;N!=0;++x)putchar(N);
putchar(10);}}

Ungolfed

//#include <stdio.h>
int j[]={ -98, -97, -96, /* Increments to move around the array */
           -1,       1,
           96,  97,  98},
  c, x, y, p, s, /* take advantage of static initialization to zero */
  M[9409]; /* treat as 97*97 */

main(){
  /* read the map */
  while((c=getchar())!=-1/*Assume the deffinition of EOF*/){
    /* putchar(c);  */
    if (c=='\n')
      x=0,++y;
    else {
      if (c=='C') p=x+y*97; /* set start position */
      if (c==' ') c='@'; /* The room starts dark */
      M[x+y*97]=c; ++x;
    }
  }
  /* printf("Start position is %d (%d, %d)\n",p,p%97,p/97); */
  /* Now loop through all the direction clearing '@' cells as we
   * encounter them 
   */
  for(x=0;x<8;++x){
    y=j[x];c=p; /* y the increment, c the position */
    /* printf("\tposition %d (%d, %d) '%c'\n",c,c%97,c/97,M[c]); */
    /* printf("\tdirection = %d (%d, %d)\n",y,-(abs(y)-97),(y+98)/97-1); */
    do {
      c+=y;
      /* printf("\t\tposition %d (%d, %d) '%c'\n",c,c%97,c/97,M[c]); */
      /* We ought to do bounds checking here, but we rely on  *
       * the guarantee that the room will be bounded instead. */
      if(M[c]=='@') M[c]=' ';
      /* The reflections are handles
       *   + Stop or not stop based on the even/oddness of the increment
       *   + New direction is a little fiddly, look for yourself
       */
      s=y/abs(y); /* sign of y (need for some reflections) */
      if (M[c]=='\\') if (y%2){ y=s* (98-abs(y));     }else break; 
      if (M[c]=='/')  if (y%2){ y=s*-(98-abs(y));     }else break; 
      if (M[c]=='|')  if (~y%2){y=s* (97+(97-abs(y)));}else break; 
      if (M[c]=='-')  if (~y%2){y=s*-(97+(97-abs(y)));}else break;  
      /* printf("\t\t\tdirection = %d (%d, %d)\n",y,97-abs(y),(y+98)/97-1); */
    } while (!(M[c]=='+')&&!(M[c]=='C'));
    /* printf("\t...hit a %c. Done\n",M[c]); */
  }
  /* print the result */
  for(y=0;x=0,M[x+y*97]!=0;++y){
    for(;M[x+y*97]!=0;++x)
      putchar(M[x+y*97]);
    putchar('\n');
  }
}

मान्यकरण

$ gcc -g -o candle candle_golfed.c
$ for f in candle_room*; do (./candle < $f) ; done
+------+
|  C   |
|@   @ +--+
| @\      |
+---------+
+------+
|  C   |
|@   @ +--+
|  /@ @ @ |
+---------+
+------+
| @/   |
|@   @ +--+
|  C      |
+---------+
+------+
|  \@ @|
|@   @ +--+
|  C      |
+---------+
+-----+
| @ @ |
|@   @|
|  C  |
|@   @|
| @ @ |
+-----+
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.