দুটি আয়না মধ্যে দুটি লেজার


70

আমাদের যদি দুটি সমান্তরাল আয়না নিয়ে একটি করিডোর থাকে?

|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |
|          |

এখন, আমরা এটি নিচে একটি লেজার জ্বলজ্বল করছি ...

|  \       |
|   \      |
|    \     |
|     \    |
|      \   |
|       \  |
|        \ |
|         \|
|         /|
|        / |

ওহ দেখ. এটি বাউন্স করে শেষের দিকে, সেখানে।

আমরা যদি দুটি লেজার আঁকি তবে বিপরীত দিকে যাচ্ছি?

|  \    /  |
|   \  /   |
|    \/    |
|    /\    |
|   /  \   |
|  /    \  |
| /      \ |
|/        \|
|\        /|
| \      / |

হুম, তারা সেখানে দেখা হবে বলে মনে হয় নি। এটা সুবিধাজনক। উভয় লেজার একই স্থান গ্রহণ করলে কী হবে?

|  \     / |
|   \   /  |
|    \ /   |
|     X    |
|    / \   |
|   /   \  |
|  /     \ |
| /       \|
|/        /|
|\       / |

আমার ধারণা হ'ল বেশ স্পষ্ট, হু?


এই ডায়াগ্রামগুলি হাতে আঁকানো বেশ পরিশ্রমী (আমার উপর এটি বিশ্বাস করুন)। সম্ভবত কিছু কোড আমাদের জন্য এটি করতে পারে?

  • দুটি বাউন্সিং, ছেদ করা লেজারগুলি সহ দুটি সমান্তরাল আয়না আউটপুট দেওয়ার জন্য কিছু কোড লিখুন।
  • ইনপুট (সমস্ত পূর্ণসংখ্যা):
    • করিডোর প্রস্থ
    • করিডোরের দৈর্ঘ্য
    • ডানদিকে যাবার লেজারের শুরুর অবস্থান (শূন্য-সূচকযুক্ত, প্রস্থের চেয়ে কম হওয়া আবশ্যক)
    • বাম-চলমান লেজারের শুরুর অবস্থান (শূন্য সূচকযুক্ত, প্রস্থের চেয়ে কম হওয়া আবশ্যক)
  • প্রক্রিয়া
    • যদি কোনও লেজারটি ঠিক চলতে থাকে তবে এটি নীচের লাইনের ডানদিকে একটি স্থান আঁকবে।
    • যদি কোনও লেজারটি ছেড়ে যাওয়া ছেড়ে যায়, তবে এটি নীচের লাইনের বাম দিকে একটি স্থান আঁকবে।
    • যদি কোনও লেজার এটিকে পাশের ধাপে নিতে না পারে তবে এটি দিক পরিবর্তন করবে, তবে এটির অবস্থান নয়।
    • উভয় লেজার একই সূচীতে থাকলে, সেই সূচীতে একটি বড়-বড় এক্স প্রিন্ট করুন।
  • আউটপুট
    • একাধিক লাইনের সাথে একটি স্ট্রিং
    • প্রতিটি লাইন একটি পাইপ অক্ষর (|) দিয়ে শুরু হয় এবং শেষ হয়
    • ডানদিকের লেজার একটি পিছনে স্ল্যাশ দ্বারা চিহ্নিত করা হয় (\)
    • বাম-চলমান লেজার একটি ফরোয়ার্ড স্ল্যাশ (/) দ্বারা চিহ্নিত করা হয়
    • দুটি লেজারের ছেদটি একটি বড় হাতের এক্স দ্বারা চিহ্নিত করা হয়।
  • যেকোনো ভাষা
  • আমি টিআইও দেখতে চাই লিঙ্ক
  • এটি সর্বনিম্ন সংখ্যক বাইটে ঠিক করার চেষ্টা করুন

পরীক্ষার মামলা

প্রস্থ: 6 দৈর্ঘ্য: 10 ডানদিকে যাচ্ছে: 1 বাম-যাচ্ছে: 4

| \  / |
|  \/  |
|  /\  |
| /  \ |
|/    \|
|\    /|
| \  / |
|  \/  |
|  /\  |
| /  \ |

প্রস্থ: 6 দৈর্ঘ্য: 10 ডান-যাচ্ছে: 0 বাম-যাচ্ছে: 1

|\/    |
|/\    |
|\ \   |
| \ \  |
|  \ \ |
|   \ \|
|    \/|
|    /\|
|   / /|
|  / / |

প্রস্থ: 4 দৈর্ঘ্য: 10 ডানদিকে যাচ্ছে: 2 বাম-যাচ্ছে: 0

|/ \ |
|\  \|
| \ /|
|  X |
| / \|
|/  /|
|\ / |
| X  |
|/ \ |
|\  \|

প্রস্থ: 20 দৈর্ঘ্য: 5 ডান-যাচ্ছে: 5 বাম-যাচ্ছে: 15

|     \         /    |
|      \       /     |
|       \     /      |
|        \   /       |
|         \ /        |

প্রস্থ: 5 দৈর্ঘ্য: 6 ডানদিকে যাচ্ছে: 2 বাম-যাচ্ছেন: 2

|  X  |
| / \ |
|/   \|
|\   /|
| \ / |
|  X  |

প্রস্থ: 1 দৈর্ঘ্য: 2 ডানদিকে যাচ্ছে: 0 বাম-যাচ্ছে: 0

|X|
|X|

6
প্রস্তাবিত প্রান্তের কেস: প্রস্থ: 1, দৈর্ঘ্য: যাই হোক না কেন, ডান: 0, বাম: 0
আরনাউল্ড

2
@ আরনাউল্ড | এক্স | ;)
এজেফারাডে

উত্তর:


12

স্ট্যাক্স , 40 বাইট

àù@○⌡┼PY¼îαφu^·A☺°É⌠■╟¡Åt^◘v(µ╩Ñ♣t{╓○xß╦

এটি চালান এবং এটি ডিবাগ করুন

এটি অনলাইন চেষ্টা করুন!

খুব নিশ্চিত যে এটি আরও গল্ফ করা যেতে পারে।

ইনপুট আকারে দেওয়া হয় width [right-going left-going] length (@ ইঞ্জিনিয়ারটোস্টের মন্তব্য অনুসারে)।

এএসসিআইআই সমতুল্য:

xHXdmzx);hi+x%Y92&;Hi-x%cy=41*47+&2ME:R\{|+m'||S

1
ইনপুট ফর্ম্যাটটি এ হিসাবে নোট করতে পারেwidth [right-going left-going] length
ইঞ্জিনিয়ার টোস্ট

18

জাভাস্ক্রিপ্ট (ES6), 149 বাইট

বাক্য গঠন সিনট্যাক্সে ইনপুট নেয় (w)(h)([a,b])

w=>h=>g=(p,d=[1,-1],s=Array(w).fill` `)=>h--?`|${p=p.map((x,i)=>~(k=d[i],s[x]='/X\\'[x-p[i^1]?k+1:1],x+=k)&&x<w?x:x+(d[i]=-k)),s.join``}|
`+g(p,d):''

এটি অনলাইন চেষ্টা করুন!

মন্তব্য

w => h =>                  // w = width, h = height
  g = (                    // g = recursive function taking:
    p,                     //   p[] = array holding the point coordinates
    d = [1, -1],           //   d[] = directions
    s = Array(w).fill` `   //   s = array of w spaces (we can't use a string because it's
  ) =>                     //       immutable in JS)
    h-- ?                  // if we haven't reached the last row yet:
      `|${                 //   append the left pipe
      p = p.map((x, i) =>  //   for each x at position i in p[]:
        ~(k = d[i],        //     k = direction for this point
          s[x] = '/X\\'[   //     insert either '/', 'X' or '\' at position x in s
            x - p[i ^ 1] ? //     if p[0] != p[1]:
              k + 1        //       use the direction
            :              //     else:
              1            //       force 'X'
          ], x += k        //     add k to x
        ) &&               //     if the result is not equal to -1
        x < w ?            //     and is less than w:
          x                //       use the current value of x
        :                  //     else:
          x + (d[i] = -k)  //       change the direction and restore the initial value of x
      ),                   //   end of map()
      s.join``}|\n` +      //   join and append s; append the right bar and a linefeed
      g(p, d)              //   followed by the result of a recursive call
    :                      // else:
      ''                   //   stop recursion

11

পাইথন 2 , 119 বাইট

w,l,a,b=input()
exec"print'|%s|'%''.join(' \/X'[sum(i==k%(2*w)for k in[a,~b]+[~a,b]*2)]for i in range(w));a+=1;b-=1;"*l

এটি অনলাইন চেষ্টা করুন!


আপনি কি গল্ফ \\/করতে পারবেন না \/? যদিও ব্যাকস্ল্যাশ দু'বার ব্যাখ্যা করা হয়েছে, তবুও এটি স্ল্যাশ থেকে বাঁচবে না।
জোনাথন ফ্র্যাচ

@ জোনাথানফ্রেচ আপনি ঠিক বলেছেন, আমি ভেবেছিলাম স্ট্রিং-ইন-স্ট্রিংয়ে থাকা ব্যর্থ হবে, তবে বাস্তবে এটি কোনও সময়ই রক্ষা পায় না।
xnor

ওহ জীজ, আমার সমাধানটি বেদনাদায়কভাবে এই ধারণার কাছাকাছি পৌঁছেছে - মডুলো 2 ডাব্লু কাজ করা পিছনে ফিরে আসার ক্ষেত্রে অনেক অর্থ দেয়। খুব চালাক!
লিন

9

9

পাইথন 2 , 187 181 179 177 174 172 171 বাইট

def f(w,l,a,b,A=1,B=-1):
 while l:l-=1;print'|%s|'%''.join(' \X/'[[0,A,B,2][(i==a)+2*(i==b)]]for i in range(w));a,A=[a,a+A,-A,A][-1<a+A<w::2];b,B=[b,b+B,-B,B][-1<b+B<w::2]

এটি অনলাইন চেষ্টা করুন!


রিকার্সিভ:

পাইথন 2 , 172 বাইট

def f(w,l,a,b,A=1,B=-1):
 if not-1<a<w:A=-A;a+=A
 if not-1<b<w:B=-B;b+=B
 if l:print'|%s|'%''.join(' \X/'[[0,A,B,2][(i==a)+2*(i==b)]]for i in range(w));f(w,l-1,a+A,b+B,A,B)

এটি অনলাইন চেষ্টা করুন!


পুনরাবৃত্তি, বিকল্প মুদ্রণ:

পাইথন 2 , 172 বাইট

def f(w,l,a,b,A=1,B=-1):
 if not-1<a<w:A=-A;a+=A
 if not-1<b<w:B=-B;b+=B
 if l:L=[' ']*w;L[a]=' \/'[A];L[b]=[' \/'[B],'X'][a==b];print'|%s|'%''.join(L);f(w,l-1,a+A,b+B,A,B)

এটি অনলাইন চেষ্টা করুন!


কোড গল্ফ চ্যালেঞ্জগুলির প্রথম উত্তরগুলির গতিতে আমি আবারও অবাক হয়েছি। সুন্দর! :)
এজেফারাডে

8

সি (ঝনঝন) , 240 236 208 বাইট

#define g(a,b) b?a++,a==x&&(a=x-1,b=0):a--,a==-1&&(a=0,b=1)
i,m,n,o,p,t[]={47,92};f(x,y,r,l){for(m=1,n=0;y--;puts("|"),g(r,m),g(l,n))for(printf("|"),i=0;i<x;o=i==r,p=i++==l,putchar(o*p?88:o?t[m]:p?t[n]:32));}

এটি অনলাইন চেষ্টা করুন!

চ () নিম্নলিখিত হিসাবে পরামিতি নেয়:

x= প্রস্থ,
y= দৈর্ঘ্য,
r= প্রাথমিকভাবে ডান-চলমান লাইন শুরু করার অবস্থান
l= প্রাথমিকভাবে বাম-চলমান-লাইন শুরুর অবস্থান

-4 বাইট. কৃতিত্ব কেভিন ক্রুইজসেন। ধন্যবাদ


1
আপনি গলফ পরিবর্তন করে 3 বাইট পারেন whileএকটি থেকে forমুছে ফেলার জন্য {}আধা কোলন ও অন্যতম। এবং আরও 1 টি বাইট এ পরিবর্তন c&&dকরে c&dএটি অনলাইনে 236 বাইট ব্যবহার করে দেখুন
কেভিন ক্রুইজসেন

দেখে মনে হচ্ছে আপনি দুটি অতিরিক্ত ইনপুট নিচ্ছেন, এটি আফিক অনুমোদিত নয়।
ওব্লান্স

1
আপনার চ্যালেঞ্জের সাধারণীকরণ সমাধান করার কথা নয়, তবে উল্লিখিত চ্যালেঞ্জটিই সমাধান করুন। অতিরিক্ত ইনপুট সম্পর্কিত, আমি কিছুটা মেটা খনন করে পেয়েছি এবং এটি পেয়েছি: কোডগলফ.মেটা.স্ট্যাকেক্সেক্সঞ্জ / a / 12696 / 79343 আমি ভাবছি এটি অবশ্যই অন্য কোথাও লেখা উচিত, তবে এটি এটিএম খুঁজে পাচ্ছি না। এটি অবশ্য আদর্শ।
ওব্লান্স

1
আপনার জি ম্যাক্রোতে, আপনি একটি == - 1 কে <0 এ পরিবর্তন করে 2 বাইট গল্ফ করতে পারেন।
ওয়েলস

1
প্রকৃতপক্ষে ম্যাক্রোতে আরও কিছু পেয়েছিল, a ++, a এবং a - একটি গল্ফ 2 বাইট করে প্রতিটি ++ এ এবং
পারে


5

কাঠকয়লা , 56 50 বাইট

↷PIθM⊕η→IθF²«J⊕⎇ιεζ⁰FIθ«✳§⟦↘↙⟧ι∨⁼KKψX¿⁼KK|«¿ι→←≦¬ι

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। সম্পাদনা করুন: পিভোটিংয়ের উপর নির্ভরতা হ্রাস করে 6 টি বাইট সংরক্ষণ করা হয়েছে। ব্যাখ্যা:

↷PIθM⊕η→Iθ

পক্ষগুলি মুদ্রণ করুন।

F²«

দুটি লেজারের উপর লুপ করুন।

J⊕⎇ιεζ⁰

লেজারের শুরুতে সরান।

FIθ«

উচ্চতা উপর লুপ।

✳§⟦↘↙⟧ι∨⁼KKψX

বর্গটি খালি না হলে একটি \বা /উপযুক্ত দিকে আঁকুন , সেক্ষেত্রে কোনটি আঁকুন X

¿⁼KK|«

আমরা কি কোন দিকে আঘাত করেছি?

¿ι→←≦¬ι

যদি তাই হয় তবে পাশাপাশি এক ধাপ নিন এবং ভ্রমণের দিকটি উল্টান।


"10 2 4 2" যখন ইনপুট হয় তখন এটি সীমা
ছাড়িয়ে যায়

1
@ মার্তিজজনভিজার্স আচ্ছা হ্যাঁ, আপনার প্রস্থ যদি 2 হয় তবে আপনার অবস্থানগুলি কেবল 0 বা 1 হতে পারে ...
নীল


3

পিএইচপি, 177 169 166 বাইট

[,$w,$h,$a,$b]=$argv;for($e=-$d=1;$h--;$s[$a+=$d]^L?:$a+=$d=-$d,$s[$b+=$e]^L?:$b+=$e=-$e){$s=str_pad("",$w)."|";$s[$b]="X\/"[$e];$s[$a]="X\/"[$a-$b?$d:0];echo"|$s
";}

নেতিবাচক স্ট্রিং সূচকগুলির জন্য পিএইচপি 7.1 প্রয়োজন , পিএইচপি 5.5 বা তারপরে ইনডেক্সিং স্ট্রিং লিটারেলগুলির জন্য।
জন্য পিএইচপি <7.1 , অপসারণ ^L, প্রতিস্থাপন "X\/"সঙ্গে "/X\\", :0সঙ্গে +1:1, [$e]সঙ্গে [$e+1], অপসারণ ."|"এবং সন্নিবেশ |সম্পর্কে newline আগে। (+3 বাইটস)
জন্য পিএইচপি <5.5 , প্রতিস্থাপন "/X\\"সঙ্গে $pএবং সন্নিবেশ $p="/X\\";শুরুতে। (+২ বাইট)

কমান্ড লাইন আর্গুমেন্ট থেকে ইনপুট নেয়। তাদের সাথে চালান -nrবা অনলাইনে চেষ্টা করুন


দুর্ভাগ্যজনক যে অনলাইনphpfunitions.com ভাগ করে নেওয়ার লিঙ্কে সঠিক পিএইচপি সংস্করণটি সংরক্ষণ করে না ...
Arnauld

3

পাইথন 3 , 162 বাইট

from numpy import*
def f(w,h,u,v):
 v=w+w-v-1;T=eye(w);M=vstack([T,2*T[::-1]]*2*h)
 for r in M[u:u+h,:]+M[v:v+h,:]:print('|%s|'%''.join(' \/X'[int(i)]for i in r))

এটি অনলাইন চেষ্টা করুন!


আমি আপনার পরীক্ষার স্যুটে ফর্ম্যাট করতে পছন্দ করি, আউটপুটটির বিরুদ্ধে নির্ভরযোগ্যভাবে ইনপুটগুলি দেখানো হয় ... চমৎকার একটি;)
এজেফারাডে

3

রুবি , 117 বাইট

->w,h,a{a[1]-=w;(1..h).map{s=' '*w;a.map!{|x|d=x<0?-1:1;s[x]='X\\/'[s[x][/ /]?d:0];x+=d;x==w ?-1:x<-w ?0:x};?|+s+?|}}

এটি অনলাইন চেষ্টা করুন!

বেনামে ল্যাম্বদা প্রস্থ w, উচ্চতা hএবং শুরুর পয়েন্টগুলির একটি অ্যারে হিসাবে ইনপুট নিচ্ছে a


আপনি দিনকে 2 প্রারম্ভিক পয়েন্ট নয়, কেবল একটি প্রসারণযোগ্য অ্যারে করে আমার দিনকে তৈরি করেছেন।
এজেফারাডে

2

পাওয়ারশেল , 243 233 222 205 বাইট

param($w,$h,$a,$b)$l,$r,$s=1,-1,' \/'
1..$h|%{$p,$p[$b],$p[$a]=[char[]](' '*$w),$s[$r],($s[$l],"x")[!($a-$b)]
if($a+$l-in($z=0..($w-1))){$a+=$l}else{$l*=-1}if($b+$r-in$z){$b+=$r}else{$r*=-1}"|$(-join$p)|"}

এটি অনলাইন চেষ্টা করুন!

Oooof। এই লজিক ব্লকগুলি বড় এবং নোংরা এবং বেশিরভাগ নকল। পরবর্তী পদক্ষেপটি তাদের পুনর্লিখন করা হবে যাতে তাদের অন্য বিবৃতিটির প্রয়োজন হয় না।


1

পাইথন 2, 165 164 বাইট

w,h,x,y=input()
a,b,s=1,-1,' \/'
exec"""l=[' ']*w
l[x],l[y]=s[a],s[b]if x-y else'X'
if-1<x+a<w:x+=a
else:a=-a
if-1<y+b<w:y+=b
else:b=-b
print'|%s|'%''.join(l)
"""*h

জোনাথন ফ্রেচের কাছে একটি বাইট ধন্যবাদ সংরক্ষণ করা।
এটি অনলাইন চেষ্টা করুন!


1
\\/সমতূল্য \/
জোনাথন ফ্র্যাচ



1

কোটলিন , 322 311 302 বাইট

11 বাইটের জন্য স্ট্রিংয়ে আমি কীভাবে লেজারের দিকটি রেখেছি তা পরিবর্তিত হয়েছে। 9 বাইটের জন্য অ্যাসাইনমেন্ট সরিয়ে নিয়েছে।

{w:Int,h:Int,r:Int,l:Int->{var a=""
var f=r
var d=1>0
var s=l
var t=!d
for(o in 1..h){a+="|"
for(c in 0..w-1)a+=when{c==f&&c==s->"X"
c==f&&d||c==s&&t->"\\"
c==f||c==s->"/"
else->" "}
a+="|\n"
if(d){if(++f==w){--f
d=!d}}else if(--f<0){f=0
d=!d}
if(t){if(++s==w){--s
t=!t}}else if(--s<0){s=0
t=!t}}
a}()}

এটি অনলাইন চেষ্টা করুন!

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