শ্রডিন্ডারের লেজার


24

ক্ষুদ্র গৃহপালিত প্রাণী নিয়ে পরীক্ষা-নিরীক্ষায় বিরক্ত হয়ে নোবেল পুরস্কারপ্রাপ্ত এরউইন শ্রডিনগার নিকটতম লেজারটি সন্ধান করার পরিবর্তে জিনিসগুলিতে এটি অঙ্কুর করার সিদ্ধান্ত নিয়েছেন। কারণ ... বিজ্ঞান!

বিবরণ

আপনি দুটি পয়েন্ট যে লেজার মাধ্যমে প্রেরণ করা হবে এবং একটি লেজার মরীচি মাপ দেওয়া হবে, এবং আপনি নির্ধারণ করতে হবে যেখানে লেজার মরীচি আবশ্যক চলে গেছে, পারে গমন এবং করতে পারে না চলে গেছে।

লেজার মরীচিটি অনুভূমিক, উল্লম্ব বা তির্যক হতে পারে। আকার 1 লেজারের মরীচিগুলির জন্য, তারা যথাক্রমে এটি দেখতে দেখতে:

       #  #
       #   #
#####  #    #
       #     #
       #      #

তির্যক লেজার মরীচিটিও ফ্লিপ করা যায়। আকার 2 লেজারের বীমগুলি দেখতে দেখতে:

       ###  ##
#####  ###  ###
#####  ###   ###
#####  ###    ###
       ###     ##

সাধারণভাবে, আকারের একটি লেজার মরীচি পেতে (এন), কেবল আকারের লেজার মরীচি নিন (এন -1) এবং উভয় পক্ষের আকারের (1) লেজার মরীচি যুক্ত করুন। চূড়ান্ত উদাহরণ হিসাবে, এখানে একই "বোর্ড" এ দেখানো 3 মাপের সমস্ত সম্ভাব্য লেজার বিম রয়েছে:

###.....#####.....##
####....#####....###
#####...#####...####
.#####..#####..#####
..#####.#####.#####.
...###############..
....#############...
.....###########....
####################
####################
####################
####################
####################
.....###########....
....#############...
...###############..
..#####.#####.#####.
.#####..#####..#####
#####...#####...####
####....#####....###

এই "বোর্ড" এর সর্বদা 20x20 (অক্ষরগুলিতে) মাত্রা থাকবে।

ইনপুট

আপনার প্রোগ্রামটি ইনপুট হিসাবে পাঁচটি পূর্ণসংখ্যা দেওয়া হবে। সেগুলি ক্রমে, x 1 , y 1 , x 2 , y 2 , এবং লেজার বিমের আকার am সেগুলি অবশ্যই সেভাবে নেওয়া উচিত। আপনি যদি চান তবে অর্ডারযুক্ত (x, y) জোড়গুলি অ্যারে, টিপল, তালিকা বা অন্যান্য অন্তর্নির্মিত ডেটা টাইপ হিসাবে নিতে পারেন যা দুটি মান রাখে।

ইনপুট হিসাবে প্রদত্ত দুটি পয়েন্ট উভয়ই বোর্ডের মধ্যে থাকবে এবং এগুলি পৃথক হওয়ার নিশ্চয়তা রয়েছে (অর্থাত্ দুটি পয়েন্ট কখনই এক হবে না)। লেজার রশ্মির আকার আবদ্ধ 1 ≤ size < 20। সর্বদা কমপক্ষে একটি সম্ভাব্য লেজার মরীচি থাকবে যা উভয় বিন্দুর মধ্য দিয়ে যায়।

আউটপুট

আপনার প্রোগ্রামটি অবশ্যই নিম্নলিখিত অক্ষরগুলির একটি 20x20 গ্রিড আউটপুট করবে:

  • # যদি দুটি সম্ভাব্য লেজার মরীচি যে দুটি পয়েন্টের মধ্য দিয়ে যায় এটিও এই বিন্দুর মধ্য দিয়ে যায়।
  • . যদি কোনও লেজার মরীচি না থাকে যা দুটি পয়েন্ট এবং এই বিন্দুর মধ্য দিয়ে যায়।
  • ? সম্ভাব্য লেজার বিমগুলির কিছু যদি তবে সমস্ত না হয় তবে এই বিন্দুটি দিয়ে যায়।
  • Xযদি এটি দুটি মূল ইনপুট পয়েন্টগুলির মধ্যে একটি হয় (এটি ওভাররাইড করে #)।

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

7, 7, 11, 3, 1

..............#.....
.............#......
............#.......
...........X........
..........#.........
.........#..........
........#...........
.......X............
......#.............
.....#..............
....#...............
...#................
..#.................
.#..................
#...................
....................
....................
....................
....................
....................

18, 18, 1, 1, 2

#??.................
?X??................
??#??...............
.??#??..............
..??#??.............
...??#??............
....??#??...........
.....??#??..........
......??#??.........
.......??#??........
........??#??.......
.........??#??......
..........??#??.....
...........??#??....
............??#??...
.............??#??..
..............??#??.
...............??#??
................??X?
.................??#

10, 10, 11, 10, 3

?????..????????..???
??????.????????.????
????????????????????
????????????????????
.???????????????????
..??????????????????
????????????????????
????????????????????
????????????????????
????????????????????
??????????XX????????
????????????????????
????????????????????
????????????????????
????????????????????
..??????????????????
.???????????????????
????????????????????
????????????????????
??????.????????.????

3, 3, 8, 10, 4

??????????..........
??????????..........
??????????..........
???X??????..........
???##?????..........
???###????..........
????###????.........
.????###????........
..????###????.......
..?????##?????......
..??????X??????.....
..??????????????....
..???????????????...
..????????????????..
..?????????????????.
..??????????????????
..??????????????????
..????????.?????????
..????????..????????
..????????...???????

উল্লম্ব স্থান সংরক্ষণের জন্য স্ট্যাক স্নিপেটের ভিতরে অবস্থিত নিম্নলিখিত রুবি স্ক্রিপ্ট দিয়ে পরীক্ষার কেসগুলি তৈরি করা হয়েছিল।

বিধি

  • আপনার প্রোগ্রামটি অবশ্যই পরীক্ষার প্রতিটি ক্ষেত্রে 30 সেকেন্ডের নীচে (একটি যুক্তিসঙ্গত মেশিনে) সমাধান করতে সক্ষম হতে হবে। এটি তাত্পর্যপূর্ণ পরীক্ষা করার মতো, কারণ আমার পরীক্ষার রুবি প্রোগ্রামটি পরীক্ষার সমস্ত ঘটনা কাছাকাছি-ততক্ষণে সমাধান করেছে solved

  • এটি , তাই সংক্ষিপ্ততম সমাধানটি জয়লাভ করে।


2
এখানে ব্যবহৃত পরিভাষা আমাকে প্রাথমিকভাবে ছড়িয়ে দিয়েছে। আমার বিশ্বাস লেজারটি সাধারণত এমন একটি ডিভাইসকে বোঝায় যা লেজার বিম তৈরি করে । আপনি এখানে যা উপস্থাপন করছেন তা সত্যই রশ্মিগুলি সঠিক? এটি আসল লেজারের উপস্থাপনা বলে মনে করা হচ্ছে না, যা মরীচি তৈরির ডিভাইস হবে?
রেটো কোরাাদি

2
শেষ পরীক্ষার কেসটি ভুল দেখাচ্ছে। একটি আকার 4 লেজারের দৈর্ঘ্য 9 পিক্সেল হওয়া উচিত। উল্লম্ব ট্র্যাকটি কমপক্ষে সেই প্রশস্ত হওয়া উচিত তবে আসলে সংকীর্ণ।
স্তর নদী সেন্ট

1
@ স্টেভেভারিল আকার 4 পিক্সেল প্রশস্ত। পিক্সেল প্রস্থ হয় 2 * size - 1। আকার 1 এর 1 পিক্সেল, আকার 2 3 পিক্সেল, আকার 3 5 পিক্সেল (উপরে উদাহরণ দেখুন), আকার 4 7 পিক্সেল।
রেটো কোরাাদি

2
আমি দেখছি না যে শ্রডঞ্জার কীভাবে এই চ্যালেঞ্জের সাথে সম্পর্কিত।
ব্যবহারকারী 12205

1
@ জোনাসড্রেনাল অ্যাগেইন, সময়সীমাটি বেশিরভাগ ক্ষেত্রে কেবল একটি স্যানিটি চেক এবং প্রায় প্রতিটি জমা দেওয়ার চেয়ে কম সময়ের মধ্যে শেষ হবে বলে আশা করা হচ্ছে।
ডোরকনবব

উত্তর:


5

সি, 291 280 277 265 বাইট

x,y,A,C,B,D,a,c,b,d,w,s,t;T(i){return abs(i)<2*w-1;}U(j,k){s+=T(j-k)*T(j)*T(k);t*=T(j-k)*j*k<1;}main(){for(scanf("%i%i%i%i%i",&a,&b,&c,&d,&w);y<20;y+=!x)s=0,t=1,U(A=a-x,C=c-x),U(B=b-y,D=d-y),U(A-B,C-D),U(A+B,C+D),putchar((x=++x%21)?".?#x"[!!s+t+(!A*!B+!C*!D)]:10);}

ব্যবহার করে সংকলন / চালানো যায়:

জিসিসি লেজার.-কোনও লেজার && এর প্রতিধ্বনি "10 10 11 10 3" | ./laser

নীচে, সাদা স্থান এবং ব্যাখ্যামূলক মন্তব্য সহ একই কোড:

// Integers...
x,y,A,C,B,D,a,c,b,d,w,s,t;

// Is true if i is in range (of something)
T(i){return abs(i)<2*w-1;}

// Tests if lasers (horizontal, vertical, diagonal, etc) can/must exist at this point
// T(j-k) == 0 iff the laser of this direction can exist
// s += 1 iff this laser direction can pass through this point
// t *= 1 iff this laser direction must pass through this point
U(j,k){
    s+=T(j-k)*T(j)*T(k);
    t*=T(j-k)*j*k<1;
}

main(){ 
    // Read input; p0=(a,b), p1=(c,d)
    for(scanf("%i%i%i%i%i",&a,&b,&c,&d,&w); y<20; y+=!x)

        // A, B, C and D represent delta-x and delta-y for each points
        // e.g.: if we're processing (2,3), and p0=(4,5), A=4-2, B=5-3
        // s != 0 iff (x,y) can have some laser through it
        // t == 1 iff all lasers pass through (x,y)
        // (!A*!B+!C*!D) == 1 iff (x,y) is either p0 or p1  
        s=0,t=1,U(A=a-x,C=c-x),U(B=b-y,D=d-y),U(A-B,C-D),U(A+B,C+D),
        putchar((x=++x%21)?".?#x"[!!s+t+(!A*!B+!C*!D)]:10);
}

1
U(int j,int k)-> U(j,k); '\n'-> 10
ব্যবহারকারী 12205


ভাল দিক. আমি যদি উঁচুতে পারতাম!
আন্দ্রে হার্ড

4

সি, 302 বাইট

b[400],x,y,s,t,w,d,e,g,k;f(u,v){d=u*x+v*y;e=u*s+v*t;if(e<d)k=e,e=d,d=k;for(k=0;k<400&d+w>e;++k)g=k%20*u+k/20*v,b[k]|=g>e-w&g<d+w|(g<d|g>e)*2;}main(){scanf("%d%d%d%d%d",&x,&y,&s,&t,&w);w=2*w-1;f(1,0);f(0,1);f(1,1);f(1,-1);b[y*20+x]=4;b[t*20+s]=4;for(k=0;k<400;)putchar(".#.?X"[b[k]]),++k%20?0:puts("");}

স্ট্যান্ডিন থেকে ইনপুট নেওয়া হয়, সংজ্ঞায়িত ক্রমে 5 নম্বর পড়ে।

চূড়ান্ত আকার হ্রাস পদক্ষেপ আগে:

#include <stdio.h>
#include <stdlib.h>

int b[400], x, y, s, t, w, d, e, g, k;

void f(int u, int v) {
  d = u * x + v * y;
  e = u * s + v * t;
  if (e < d) k = e, e = d, d = k;
  if (d + w > e) {
    for (k = 0; k < 400; ++k) {
      g = u * (k % 20) + v * (k / 20);
      if (g > e - w && g < d + w) b[k] |= 1;
      if (g < d || g > e) b[k] |= 2;
    }
  }
}

int main() {
  scanf("%d%d%d%d%d", &x, &y, &s, &t, &w);
  w = 2 * w - 1;
  f(1, 0); f(0, 1); f(1, 1); f(1, -1);
  b[y * 20 + x] = 4;
  b[t * 20 + s] = 4;
  for (k = 0; k < 400; ) {
     putchar(".#.?X"[b[k]]);
     ++k % 20 ? 0 : puts("");
  }
}

মূল পদক্ষেপগুলির কিছু ব্যাখ্যা:

  • অ্যারে bরাজ্য / ফলাফল ধারণ করে। বিট 0 সমস্ত পিক্সেলের জন্য সেট করা হবে যা মরীচি দ্বারা পৌঁছানো যায়। বিট 1 সমস্ত পিক্সেলের জন্য সেট করা হবে যা সমস্ত বিম দ্বারা আচ্ছাদিত নয়
  • ফাংশনটি fসমস্ত 4 টি দিক (উল্লম্ব, অনুভূমিক, উভয় কর্ণ) জন্য ডাকা হয়। এর যুক্তিগুলি দিকের সাধারণ ভেক্টর নির্দিষ্ট করে।
  • কার্য f:
    • দিকের সাথে আপেক্ষিক উভয় ইনপুট পয়েন্টের দূরত্ব গণনা করা হয় ( dএবং e) সাধারণ ভেক্টরের সাথে বিন্দুর বিন্দু হিসাবে।
    • দূরত্বগুলি প্রয়োজনে অদলবদল করা হয় যাতে এটি dসর্বদা কম বা সমান হয় e
    • যদি এর মধ্যে পার্থক্য dএবং eমরীচি প্রস্থ চেয়ে বড়, কোন রশ্মি এই দিক সম্ভব।
    • অন্যথায়, সমস্ত পিক্সেল উপর লুপ। যদি কোনও মরীচি দ্বারা পিক্সেলটি পৌঁছতে পারে তবে বিট 0 সেট করুন, এবং বিট 1 যদি এটি সমস্ত বিম দ্বারা আচ্ছাদিত না হয়।
  • 4 মান সহ দুটি ইনপুট পয়েন্ট চিহ্নিত করুন যেহেতু আমরা রাজ্যটি ট্র্যাক করতে 0 এবং 1 বিট ব্যবহার করেছি, যার ফলশ্রুতি 0 থেকে 3 এর ফলস্বরূপ, এটি সবচেয়ে ক্ষুদ্রতম অব্যবহৃত মান।
  • পিক্সেলের উপরে লুপ bকরুন এবং প্রিন্ট করার সময় 0 থেকে 4 পরিসরের মানগুলিকে তাদের সংশ্লিষ্ট চরিত্রে রূপান্তর করুন।

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