মিররড রুম আলোকিত করুন


13

লক্ষ্য

এই প্রতিযোগিতায়, আপনাকে ভিতরে ভিতরে একটি মোমবাতিযুক্ত একটি এলোমেলো রুম দেওয়া হবে। লক্ষ্যটি হ'ল সংক্ষিপ্ততম প্রোগ্রামটি লিখুন (এটি গল্ফ) যা ঘরের কোন অংশটি মোমবাতি দ্বারা আলোকিত হয় তা নির্ধারণ করে, অন্ধকার দাগগুলি প্রতিস্থাপন করে @। প্রোগ্রামটি STDIN থেকে আউটপুটটি STDOUT এ মুদ্রিত হওয়া উচিত।

উদাহরণ ইনপুট / রুম

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

মোমবাতি একটি সঙ্গে প্রতিনিধিত্ব করা হয় C, এবং দেয়াল / আয়না সঙ্গে প্রতিনিধিত্ব করা হয় |, -, /, অথবা \। দেয়ালগুলি নিজেরাই আয়না। ঘরের কোণগুলি একটি দ্বারা প্রতিনিধিত্ব করা হয় +

রুমগুলিতে কখনও তির্যক দেয়াল থাকবে না এবং আলো কখনও ঘর থেকে বেরিয়ে যেতে সক্ষম হবে না।

এছাড়াও, একটি লাইনের প্রথম চরিত্রটি সর্বদা ঘরের বাইরে দেয়ালের অংশ হতে চলেছে। প্রতিটি লাইনের নিখুঁত শেষ চরিত্রটি ঘরের বিপরীত প্রাচীর হতে চলেছে। এই দুজনের মধ্যে কোনও চরিত্রই ঘরের বাইরে থাকবে না।

হালকা এবং প্রতিবিম্ব

মোমবাতিটি আটটি মূল দিকটিতে আটটি (লেজারের মতো) আলোর বীম বের করে: এন, এস, ই, ডাব্লু, এনই, এসই, এসডাব্লু এবং এনডাব্লু W আলোর এই রশ্মিগুলি নিচে বর্ণিত হিসাবে আয়নাগুলি বন্ধ করে দেয়:

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

-আলোককে শোষিত করার প্রতিনিধিত্ব করে। আলো সর্বদা সি বা + এর দ্বারা শোষিত হয়। এটি লক্ষণীয় গুরুত্বপূর্ণ যে লাইটগুলি যখন আয়নার মতো একই স্থানটি দখল করে তখনই একটি আয়না থেকে প্রতিফলিত হয়। আপনি যখন কাগজে প্রতিবিম্ব আঁকেন তখন এই নিয়মগুলি বোঝা অনেক সহজ।

উদাহরণ আউটপুট

আউটপুট হিসাবে, প্রোগ্রামটি আলোকিত কক্ষের একটি চিত্র মুদ্রণ করা উচিত, গা dark় দাগগুলি একটি হিসাবে লেখা হয় @, হালকা দাগ ফাঁকা থাকে এবং আয়নাগুলি প্রভাবিত না হয়। উপরের উদাহরণের জন্য, আউটপুটটি হবে:

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

এর অর্থ হ'ল, যদি আপনি আলোর মরীচি আঁকেন তবে এগুলি কখনই চিহ্নিত স্থানগুলিতে পৌঁছাবে না @

আরও উদাহরণ

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

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

আপনার উদাহরণে নীচের বাম কোণটি @খুব বেশি হওয়া উচিত নয় ?
পিটার টেলর

1
@ পিটার টেইলর: এসডাব্লু মরীচিটি সেই জায়গাটিতে।
ব্রিগ্যুই 37

3
স্ট্যাক ওভারফ্লোতে খুব ভালভাবে প্রাপ্ত লেজার চ্যালেঞ্জের সাথে কিছু সাদৃশ্য রয়েছে । সেগুলিকে কীভাবে প্রয়োগ করা যেতে পারে সে সম্পর্কে কিছুটা চিন্তাভাবনা করার জন্য যথেষ্ট পরিমাণে পার্থক্য সহ এতে ব্যবহৃত পদ্ধতিগুলিকে আকর্ষণীয় করে তুলতে যথেষ্ট মিল রয়েছে।
dmckee --- প্রাক্তন মডারেটর বিড়ালছানা

আরও বৈধতা মামলা ব্যবহার করতে পারে।
dmckee --- প্রাক্তন-মডারেটর বিড়ালছানা

@ ডিএমকেকে আমি আরও দুটি উদাহরণ যুক্ত করেছি।
PhiNotPi

উত্তর:


2

পাইথন, ২৯২ টি চর

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,

ঘরে পড়ে, এটি আয়তক্ষেত্রাকার করে তোলে, তারপরে মোমবাতিটি থেকে সমস্ত দিকে চলে। এমতে সক্রিয় মিরর অক্ষর এবং তাদের প্রভাব রয়েছে ( /\কার্ডিনাল দিকনির্দেশের |-জন্য, অন্যদের জন্য)

97 অক্ষর পর্যন্ত প্রশস্ত কক্ষগুলি পরিচালনা করতে পারে।


2

সি - 504

কে অ্যান্ড আর ডিফল্ট ফাংশন কলিং শব্দার্থে নির্ভর করে। রশ্মির বাউন্স সহ ফিডাল স্টাফ বাদে খুব সোজা ফরোয়ার্ড বাস্তবায়ন।

#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  |
|@   @|
| @ @ |
+-----+
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.