একটি রোগুয়েলিকে আলোকিত করুন


14

একটি বোর্ড দেওয়া, সংক্ষিপ্ততম প্রোগ্রাম লিখুন বা প্রদর্শন করতে বা প্লেয়ারের দৃষ্টিতে কোন অক্ষরগুলি ফিরিয়ে দিতে ফাংশন লিখুন। দৃষ্টি বাধা দেয় এমন কোনও অক্ষরকে অতিক্রম না করে যদি তার এবং প্লেয়ারের মধ্যে একটি লাইন আঁকানো সম্ভব হয় তবে একটি চরিত্র দৃশ্যমান হয়।

ইনপুট:

  • @প্লেয়ার অবস্থান প্রতিনিধিত্ব করে। ইনপুটটিতে কেবল এর মধ্যে একটি থাকবে।
  • রেজেক্সের সাথে মেলে এমন কোনও চরিত্র [#A-Z]দৃষ্টিকে অবরুদ্ধ করে ।
  • কোনও চরিত্রের সাথে মেলে [ a-z]যা দর্শনের অনুমতি দেয়।
  • কোনও অবৈধ অক্ষর থাকবে না
  • আপনি একটি আয়তক্ষেত্রাকার ইনপুট গ্যারান্টিযুক্ত হয়

লাইনগুলি নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:

  • ভেক্টরকে একটি পরিধি এবং দিক হতে সংজ্ঞায়িত করুন
  • দিকটি হ'ল এন, এনই, ই, এসই, এস, এসডাব্লু, ডাব্লু, এনডাব্লু
  • বিশালতা হল সেই দিকটি ধরে কতগুলি অক্ষর গণনা করা যায়
  • প্রাথমিক ভেক্টরকে d 1 বলা হোক ; দ্বিতীয় ভেক্টরকে ড 2 বলা হয়
  • ডি 1 বা ডি 2 এর মধ্যে একটির অবশ্যই একটি দৈর্ঘ্য থাকতে হবে 1; অন্যটির যা কিছু পরিমাণ থাকতে পারে
  • ডি 1 এর দিক অবশ্যই ডি 2 এর দিকের সাথে সংলগ্ন হতে হবে (যেমন: এন এবং এনই)

একটি লাইনটি ডি 1 , তারপরে ডি 2 , ডি 1 , ডি 2 ... প্রয়োগ করে চিহ্নিত পথের সমস্ত অক্ষর হিসাবে সংজ্ঞায়িত করা হয়েছে ....

নমুনা রেখা ( .গুলি দ্বারা দেওয়া ):
d 1 = (প্রস্থ: 4, দিক: ই)
d 2 = (প্রস্থ: 1, দিক NE)

               .....
          .....
     .....
@.... 

আউটপুট:

  • প্রতিটি দৃশ্যমান অক্ষর সঠিক অবস্থানে থাকে, .স্থানের বিকল্প হয়।
  • প্রতিটি অ-দৃশ্যমান অক্ষরের জন্য স্থান।

নমুনা ইনপুট:

@         
    K     
 J        

    L   




         o

সংশ্লিষ্ট আউটপুট:

@.........
....K.....
.J.....   
..........
.. .L.....
..  . ....
... .. ...
...  .. ..
...   .  .
....  ..  

নমুনা ইনপুট:

 B###M#  by 
 #Q   # Zmpq
 # # aaa    
@  m #      
# ##P#      
# ####      
# ####      
#M ###      
######      

সংশ্লিষ্ট আউটপুট:

.B  #M      
.# ..   Z pq
.#.#.aaa..  
@..m.#      
#.##P#      
 .#         
 .#         
 M.         
  #         

নমুনা ইনপুট:

  w                 

     O  l   gg  rT  
   QQL      Ag  #b  
   qqqqq         XqQ
 x     V# f@aa      
   Y        aaa     
   uU  E  l TaKK    
  e  dd  FF d opi   
   e       d        

সংশ্লিষ্ট আউটপুট:

   ..........  .....
    ......... ..... 
     O..l...gg..rT  
...QQL......Ag..#b..
...qqqqq.........XqQ
        #.f@aa......
   Y........aaa.....
...uU..E..l.TaKK....
      d..FF.d.op    
     .... .d. ...   

3
ঠিক আছে ... বাদুড়, সব ধরণের ছত্রাক, ছাঁচ এবং সাপ এমনকি রথগুলিও দৃষ্টিভঙ্গিটিকে অবরুদ্ধ করে, তবে জায়ান্ট মিমিক্স, পাহাড়ী অর্কেস, মাষ্টোডনস, সমস্ত প্রকারের প্রাণী এমনকি আগুনের ভেরিটিসগুলিও তাই না?
জন ডিভোরাক

পছন্দ করেছেন সংক্ষিপ্ত দৈত্য বনাম টাল দানবগুলির মতো সাজান; যা আপনি দেখতে সক্ষম হবে। তাই হ্যাঁ.
জাস্টিন

1
আমি কোয়ান্টাম মেকানিক্স সম্পর্কে জানি না, তবে ব্যাট এবং জিনোম ম্যামি একটি সহজ চুক্তি হতে পারে। যদিও নকল জিনিসগুলিকে আরও জটিল করে তুলতে পারে। এছাড়াও, এই তিনটি পিঁপড়া মজাদার হতে পারে এবং উত্তর-পূর্বের বিভিন্ন ধরণের দানবগুলির বৃহত গোষ্ঠী ইতিমধ্যে আপনার সম্পর্কে জানতে পারে। হ্যাঁ ... এটা খুব খারাপ লাগবে। # 3 হিসাবে - আমার টেলিযোগাযোগের স্ক্রোলটি কোথায়? উফ, এটি ছিল বর্ম ধ্বংস।
জন ডিভোরাক

3
কেবল একটি কৌতূহলী পর্যবেক্ষণ, তবে আমি যদি আপনার "লাইন" সংজ্ঞাটি সঠিকভাবে বুঝতে পারি তবে মনে হচ্ছে এমন কিছু স্কোয়ার রয়েছে যা কোনও বাধা ছাড়াই দৃশ্যমান হবে না । উদাহরণস্বরূপ, যদি প্লেয়ারটি (0, 0) এ থাকে তবে স্কোয়ারটি (5, 12) কোনও লাইনে পৌঁছানো যায় না। এটি যে কোনও দুটি পয়েন্টের মধ্যে একটি রেখা আঁকার জন্য ব্রেনহ্যামের লাইন অ্যালগরিদমের কিছু প্রমিত বাস্তবায়ন নির্দিষ্ট করে, এবং এটির সাথে খেলোয়াড়ের মধ্যবর্তী রেখা যদি কোনও বাধা ছেদ করে তবে কোনও বর্গক্ষেত্রকে অস্পষ্ট হিসাবে সংজ্ঞায়িত করে এটি আরও বোধগম্য হতে পারে।
ইলমারি করোনেন

1
নিবন্ধন করুন আমি ঠিক এটি পছন্দ করি। :-)।
জাস্টিন

উত্তর:


5

গল্ফস্ক্রিপ্ট, 171 টি অক্ষর

.n?):L)[n*.]*1/:I'@'?{\+[{1$+}*]..{I=26,{65+}%"#
"+\?)}??)<}+{[L~.).)1L)L.(-1L~]>2<`{[.[~\]]{1/~2$*+L*.-1%}%\;~}+L,%~}8,%%{|}*`{1$?)I@=.n=@|\.' '={;'.'}*' 'if}+I,,%''*n%n*

ইনপুট অবশ্যই STDIN এ সরবরাহ করা উচিত।

উপরে বর্ণিত উদাহরণগুলির ফলাফল আউটপুট কিছুটা আলাদা। আমি প্রতিক্রিয়াগুলি হাত দ্বারা যাচাই করেছিলাম এবং সেগুলি সঠিক বলে মনে করি।

উদাহরণ 1:

@.........
....K.....
.J.....   
..........
.. .L.....
..  . ....
... .. ...
...  .. ..
...   .  .
....  ..  

উদাহরণ 2:

.B  #M      
.# ..   Z pq
.#.#.aaa..  
@..m.#      
#.##P#      
 .#         
 .#         
 M.         
  #         

উদাহরণ 3:

   ..........  .....
    ......... ..... 
     O..l...gg..rT  
...QQL......Ag..#b..
...qqqqq.........XqQ
        #.f@aa......
   Y........aaa.....
...uU..E..l.TaKK....
      d..FF.d.op    
     .... .d. ...   

এটি একক লাইন ইনপুট (যা বৈধ আয়তক্ষেত্র ...) এর জন্য কাজ করছে বলে মনে হচ্ছে না
জাস্টিন

@ কুইনকুনক্স কোডটি ধরে নিয়েছে যে আপনি একটি নতুন লাইন দিয়ে আপনার ইনপুট চূড়ান্ত করেছেন। বিকল্পভাবে n+কোড প্রিপেন্ড করুন।
হাওয়ার্ড

4

রুবি - 510 অক্ষর

বেশ একটি বিশাল; তবে এটি কোনও গল্ফের আমার প্রথম চেষ্টা।

m=$<.read;w,s,o,p=m.index(?\n)+1,m.size,m.dup.gsub(/[^@\n]/,' '),m.index(?@);d=[-w,1-w,1,w+1,w,w-1,-1,-1-w];0.upto(7){|i|x=d[i];[i-1,i+1].each{|j|y=d[j%8];[1,nil].each{|l|t=0;catch(:a){loop{c,f,r=p,1,nil;catch(:b){loop{(l||r)&&(1.upto(t){|u|c+=x;n=!(0...s).include?(c)||m[c]==?\n;n&&throw(f ?:a: :b);o[c]=m[c]==" "??.: m[c];a=m[c]=~/[#A-Z]/;a&&throw(f ?:a: :b)};f=nil);r=1;c+=y;n=!(0...s).include?(c)||m[c]==?\n;n&&throw(f ?:a: :b);o[c]=m[c]==" "??.: m[c];a=m[c]=~/[#A-Z]/;a&&throw(f ?:a: :b)}};t+=1}}}}};$><<o

ইনপুটটি ফাইল হিসাবে যুক্তি হিসাবে নির্দিষ্ট করা হয়; আমি অনুমান করি যে ইনপুট ফাইলটি অক্ষরের একটি আয়তক্ষেত্রাকার ব্লক (সুতরাং, পিছনের স্থানগুলি অন্তর্ভুক্ত) এবং ট্রেলিং নিউলাইন থাকতে হবে।

এই সংস্করণটি catch-throwগভীর লুপগুলি প্রস্থান করার জন্য বিস্তৃত ব্যবহার করে ; আমি পরিবর্তে সীমা-চেক করা লুপগুলির সাথে বিষয়গুলি উন্নত করতে পারি।

অপ্রকাশিত কোড:

# Read the map in
map = $<.read

# Determine its width and size
width = map.index("\n")+1
size = map.size

# Create a blank copy of the map to fill in with visible stuff
output = map.dup.gsub /[^@\n]/,' '

# Locate the player
player = map.index('@')

dirs = [
  -width,   # N
  1-width,  # NE
  1,        # E
  width+1,  # SE
  width,    # S
  width-1,  # SW
  -1,       # W
  -1-width  # NW
]

0.upto(7) do |i1|
  d1 = dirs[i1]
  [i1-1, i1+1].each do |i2|
    d2 = dirs[i2%8]

    # Stepping by 0,1,2... in d1, work along the line.
    # Write the cell value into the duplicate map, then break if it's
    # a "solid" character.
    #
    # Extensive use of catch-throw lets us exit deep loops.

    # For convenience of notation, instead of having either d1 or d2
    # be magnitude 1, and always doing d1,d2,d1... - I have d2 always
    # being magnitude 1, and doing either d1,d2,d1 or d2,d1,d2...

    # Loop twice - first with d1,d2,d1... second with d2,d1,d2...
    [true,false].each do |long_first|
      step = 0

      catch(:all_done) do
        # This loop increments step each iteration, being the magnitude of d1
        loop do
          cell = player
          first = true  # True until we've done the first d1
          later = false # True once we've done the first d2

          catch(:done) do
            # This loop repeatedly applies d1 and d2
            loop do
              if long_first || later  # Don't apply d1 first if starting with d2
                1.upto(step) do |dd1|
                  cell += d1 # Move one cell in d1
                  invalid = !(0...size).include?(cell) || map[cell]=="\n" # Out of range
                  throw :all_done if first && invalid # No point trying a longer step if the
                                                      # first application of d1 is out of range
                  throw :done if invalid # No point continuing with this step length

                  output[cell]=map[cell] == " " ? '.' : map[cell] # Transfer visble character
                  wall = map[cell]=~/[#A-Z]/  # Hit a wall?
                  throw :all_done if first && wall # Drop out as before
                  throw :done if wall
                end
                first = false
              end
              later=true

              # Now repeat above for the single d2 step
              cell += d2
              invalid = !(0...size).include?(cell) || map[cell]=="\n"
              throw :all_done if first && invalid
              throw :done if invalid
              output[cell]=map[cell] == " " ? '.' : map[cell]
              wall = map[cell]=~/[#A-Z]/
              throw :all_done if first && wall
              throw :done if wall
            end
          end
          step += 1
        end
      end
    end
  end
end

puts output

সম্পাদন করা

ইলমারি করোনেন প্রশ্নের মন্তব্যে নোট করেছেন যে প্রদত্ত দৃষ্টিভঙ্গি অ্যালগরিদম সমস্ত বর্গ দেখতে পাবে না, এমনকি যখন কোনও বাধা নেই। এটির একটি প্রদর্শন এখানে প্লেয়ার থেকে দূরে (40,40) দূরে।

@.......................................
........................................
........................................
........................................
........................................
............ ...........................
..............  ........................
............ ...   ..... ...............
.............. ...    .....  ...........
...............  ...     .....   .......
.................  ...      .....    ...
..................   ...       .....
..... . ............   ...        .....
.....................    ...         ...
...... . ..............    ...
...... .. ..............     ...
....... . ................     ...
....... .. ............. ..      ...
.......  .  .................      ...
........ .. ............... ..       ...
........  .  ............... ...       .
........  ..  ................ ..
.........  .  ................. ...
.........  ..  .................  ..
....... .   .   . ................ ...
..........  ..  ...................  ..
..........   .   ...................  ..
........ .   ..   . ..................
........ ..   .   .. ..................
...........   ..   .....................
......... .    .    . ..................
......... ..   ..   .. .................
......... ..    .    .. ................
.......... .    ..    . ................
.......... ..    .    .. ...............
.......... ..    ..    .. ..............
..........  .     .     .  .............
........... ..    ..    .. .............
........... ..     .     .. ............
...........  .     ..     .  ...........

হুম। এটি পরীক্ষায় ব্যর্থ হয় deb. ডিবাগিংয়ের প্রয়োজন।
চৌলেট ২

তুমি কি নিশ্চিত? আমি একটি ভুল করতে পারি ...
জাস্টিন

খুব নিশ্চিত - আমি প্রাচীরের পিছনে ভি দেখতে পাচ্ছি! আমি মনে করি আমি আগের লাইনের পরে নতুন লাইনটি সনাক্ত করছি না।
চৌলেট ২

অবশ্যই তা দেখতে পাওয়া উচিত নয় ...
জাস্টিন

আহ, এটি আমার ইনপুট নিয়ে সমস্যা ছিল; আমি পরে একটি অতিরিক্ত জায়গা ছিল XqQ। তাই বলা হয়, 3 জন্য আপনার দেওয়া উত্তর এ সব testcase মেলে না - এটা অন্তত উপরের একটি অতিরিক্ত লাইন আছে, এবং মধ্যে শুধুমাত্র একটি স্থান Oএবং l
চৌলেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.