প্রাকৃতিক পাই # 2 - নদী


12

লক্ষ্য

হ্যাশগুলির একটি ট্রেনের সাথে একটি স্ট্রিং দেওয়া হয়েছে, এর মোট দৈর্ঘ্য গণনা করুন এবং শুরু থেকে শেষের দূরত্বে বিভাজন করুন।

ব্যাজ

আমরা কি অনুকরণ করছি? এই কাগজ অনুসারে , কোনও নদীর দৈর্ঘ্যের সূচনা এবং শেষের মধ্যবর্তী দূরত্বের অনুপাত প্রায় পাই! (এটি বোধগম্যভাবে অস্বীকার করা হয়েছে, তবে আমি ডেটা খুঁজে পেতে পারি এবং এই চ্যালেঞ্জের জন্য আমরা ধরে নিব এটি সত্য)।

আমরা কীভাবে এটি অনুকরণ করছি?

  • সাদা স্থান এবং হ্যাশগুলির একটি স্ট্রিং ইনপুট নিন
  • প্রতিটি হ্যাশ এর সংলগ্ন আরও দুটি জন থাকবে
    • প্রথম এবং শেষ হ্যাশ ব্যতীত যার কেবলমাত্র 1 থাকবে
  • প্রতিটি চরিত্র জাল পয়েন্টে থাকে (x, y)
  • x এর লাইনে চরিত্রের সূচক
    • যেমন cমধ্যে 4 র্থ অক্ষর0123c567
  • y চরিত্রের লাইন নম্বর
    • যেমন c3 য় লাইনে:
      0line
      1line
      2line
      3c...
  • সংলগ্ন হ্যাশগুলির মধ্যে দূরত্বগুলি যোগ করুন, এটিকে কল করুন S
  • প্রথম এবং শেষ হ্যাশগুলির মধ্যে দূরত্ব নিন, কল করুন D
  • প্রত্যাবর্তন S/D

এখানে চিত্র বর্ণনা লিখুন

সবিস্তার বিবরণী

  • ইনপুট
    • নমনীয়, মানক কোনও উপায়ে ইনপুট নিন (যেমন ফাংশন প্যারামিটার, এসটিডিআইএন) এবং কোনও মানক বিন্যাসে (যেমন স্ট্রিং, বাইনারি)
  • আউটপুট
    • নমনীয়, মানক কোনও উপায়ে আউটপুট দিন (যেমন রিটার্ন, প্রিন্ট)
    • সাদা স্থান, অনুসরণ এবং শীর্ষস্থানীয় সাদা স্থান গ্রহণযোগ্য
    • যথার্থতা, দয়া করে সঠিকতার জন্য কমপক্ষে 4 দশমিক স্থান সরবরাহ করুন (যেমন 3.1416)
  • স্কোরিং
    • সবচেয়ে কম কোড জয়!

পরীক্ষার কেস

এগুলি আমার নদীর প্রায় অনুমান। আমার অনুমানগুলি দরিদ্র বা এটি আমার নদীর জনসংখ্যার দুর্বল নমুনা। এছাড়াও, আমি এই গণনাগুলি হাতে হাতে করেছিলাম; আমি গণনা মিস করতে পারে।

হলুদ নদী

        ### ####           
       #   #    #          
       #       #          #
       #       #         # 
       #       #        #  
      #         #      #   
##   #          # #####    
  ##  #          #         
    ##                     
1.6519

নীল নদী

         #     
         #     
          #    
           #   
           #   
          #    
         #     
        #      
        #  #   
        # # #  
         #  #  
            #  
          ##   
         #     
         #     
        #      
        #      
       #       
       #       
       #       
       #       
   #  #        
  # ##         
  #            
  #            
   #           
    #          
     #         
     #         
      #        
     #         
    #          
     #         
      #        
1.5498

মিসিসিপি নদী

 ###            
#   #           
     #          
     #          
    #           
   #            
  #             
  #             
  #             
   #            
    #           
     #          
      #         
       #        
        #       
        #       
        #       
         #      
          #     
           #    
          #     
       ###      
      #         
       #        
      #         
     #          
    #           
    #           
    #           
    #           
     #          
      ##        
        #       
        #       
         ##     
           ##   
             ## 
               #
              # 
             #  
            #   
           #    
          #     
         #      
        #       
        #       
        #       
        #       
        #       
       #        
      #         
     #          
      #         
       #        
        ####    
            #   
             #  
1.5257

টি এল; ডিআর

এই চ্যালেঞ্জগুলি হল অ্যালগরিদমের অনুকরণ যা কেবলমাত্র প্রকৃতি এবং আপনার মস্তিষ্কের (এবং সম্ভবত কিছু পুনরায় ব্যবহারযোগ্য সংস্থানসমূহ) আনুমানিক পাইয়ের প্রয়োজন require জম্বি অ্যাপোক্যালাইপসের সময় আপনার যদি সত্যই পাই দরকার হয় তবে এই পদ্ধতিগুলি বারুদ নষ্ট করবেন না ! আছে নয়টি চ্যালেঞ্জ মোট।


3
এগুলিকে নিজেরাই হ্যাশ বলা হয়। "হ্যাশট্যাগ" হ'ল একটি ইনলাইন ট্যাগের জন্য কেবলমাত্র শব্দটি#<tag>
ফ্লিপট্যাক

1
আমি ধরে নিয়েছি পাইথাগোরিয়ান উপপাদ ব্যবহার করে দূরত্বটি গণনা করা উচিত। এটা কি সঠিক?
লুভজো

এছাড়াও, আমরা কি ইনপুটটিকে লাইনের তালিকা হিসাবে নিতে পারি?
লুভজো

@ লভজো ^^ এটি হতে পারে, এটি ইউক্লিডিয়ান জ্যামিতি তাই আপনি গণনা করতে চান তবে এটি ঠিক আছে। ^ হ্যাঁ, ইনপুটটি নমনীয়।
ননলাইনফ্রুট

1
ধন্যবাদ তারপরে সম্ভবত এটিই হবে যে ASCII সংস্করণগুলি যথেষ্ট পাপযুক্ত নয় :)
লুইস মেন্ডো

উত্তর:


6

এমএটিএল , 48 44 42 37 33 বাইট

বেশ কয়েকটি বাইট দুটি রেকভলিউশনকে একটিতে ভেঙে দেওয়ার জন্য rahnema1 এর ধারণার (অক্টাভা উত্তর) ধন্যবাদ বাঁচিয়েছে

t5BQ4B&vX^Z+*ssGt3Y6Z+1=*&fdwdYy/

এটি ;সারি বিভাজক হিসাবে বাইনারি ম্যাট্রিক্স হিসাবে ইনপুট নেয় ।1হ্যাশ এবং 0স্থান অনুরূপ ।

এটি অনলাইন চেষ্টা করুন! অথবা সমস্ত পরীক্ষার কেস যাচাই করুন

এখানে একটি ফর্ম্যাট রূপান্তরকারী যা 2D চর অ্যারে হিসাবে ইনপুট নেয় (আবার ;বিভাজক হিসাবে) এবং সংশ্লিষ্ট বাইনারি ম্যাট্রিকগুলির স্ট্রিং উপস্থাপনা তৈরি করে।

ব্যাখ্যা

এই মজা ছিল! কোড ব্যবহার তিন দুই 2D-convolutions, প্রতিটি একটি ভিন্ন উদ্দেশ্যে:

  1. উল্লম্ব এবং অনুভূমিক প্রতিবেশীদের সনাক্ত করতে, যা এর দূরত্ব অবদান রাখে 1, প্রয়োজনীয় মাস্ক হবে

    0 1 0
    1 0 1
    0 1 0
    

    তবে আমরা চাই প্রতি প্রতিবেশী প্রতি জোড়া একবারই সনাক্ত করা উচিত। সুতরাং আমরা অর্ধেকটি মুখোশ নিই (এবং জিরোগুলির শেষ সারিটি সরানো যেতে পারে):

    0 1 0
    1 0 0
    

    একইভাবে, তির্যক প্রতিবেশীদের সনাক্ত করতে, যা দূরত্ব অবদান রাখে sqrt(2), মাস্কটি হবে

    1 0 1
    0 0 0
    1 0 1
    

    তবে উপরের মত একই যুক্তি দ্বারা এটি হয়ে যায়

    1 0 1
    0 0 0
    

    যদি এই মুখোশটি দ্বারা গুণিত হয় sqrt(2)এবং প্রথমটিতে যুক্ত হয় তবে দুটি কনভলিউশন একটি সংমিশ্রণ দ্বারা সংযুক্ত মুখোশ দ্বারা প্রতিস্থাপন করা যেতে পারে

    sqrt(2) 1  sqrt(2)
    1       0        0
    
  2. সংজ্ঞা অনুসারে শুরু এবং শেষের পয়েন্টগুলি কেবলমাত্র এক প্রতিবেশীর সাথে পয়েন্ট। তাদের সনাক্ত করতে আমরা এর সাথে সমঝোতা করি

    1 1 1
    1 0 1
    1 1 1
    

    এবং দেখুন কোন পয়েন্ট 1ফলাফল হিসাবে দেয়।

আইটেম 1 এর সম্মিলিত মুখোশ তৈরি করতে এটির বর্গক্ষেত্র তৈরি করা আরও কম এবং তারপরে বর্গমূলটি নেওয়া। আইটেম 2 এর মুখোশ একটি পূর্বনির্ধারিত আক্ষরিক।

t     % Take input matrix implicitly. Duplicate
5B    % 5 in binary: [1 0 1]
Q     % Add 1; [2 1 2]
4B    % 4 in binary: [1 0 0]
&v    % Concatenate vertically
X^    % Square root of each entry
Z+    % 2D convolution, maintaining size
*     % Multiply, to only keep results corresponding to 1 in the input
ss    % Sum of all matrix entries. This gives total distance
Gt    % Push input again. Duplicate
3Y6   % Predefined literal. This gives third mask
Z+    % 2D convolution, maintaining size
1=    % Values different than 1 are set to 0
*     % Multiply, to only keep results corresponding to 1 in the input
&f    % Push array of row indices and array of column indices of nonzeros
d     % Difference. This is the horizontal difference between start and end
wd    % Swap, difference. This is the vertical difference between start and end 
Yy    % Hypothenuse. This gives total distance in straight line
/     % Divide. Display implicitly

2
কিছু লোক বলতেন, সেই প্রত্যয়ই সাফল্যের মূল চাবিকাঠি !
flawr

4

অক্টাভা, 99 বাইট

@(a)sum((c=conv2(a,[s=[q=2^.5 1 q];1 0 1;s],'same').*a)(:))/2/{[x y]=find(c<2&c>0),pdist([x y])}{2}

এমএটিএল উত্তর হিসাবে প্রায় একই পদ্ধতি কিন্তু এখানে কনভোলিউশনের কার্নেলটি

1.41 ,  1  , 1.41
1    ,  0  , 1 
1.41 ,  1  , 1.41

এটি sqrt(2) =1.41তির্যক প্রতিবেশীদের 1 জন্য এবং সরাসরি প্রতিবেশীদের জন্য তাই যখন আমরা নদীর উপরের ফলাফলের মানগুলি যোগ করি তখন আমরা আসল দূরত্বের দ্বিগুণ লাভ করি।
অবারিত সংস্করণ :

a=logical([...
0 0 0 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 
0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 
1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 0 0 
0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 
0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ]);
sq = sqrt(2);
kernel = [...
    sq ,  1  , sq
    1  ,  0  , 1 
    sq ,  1  , sq];
%2D convolution
c=conv2(a,kernel,'same').*a;
#river length
river_length = sum(c (:))/2;
#find start and end points
[x y]=find(c<2&c>0);
# distance between start and end points
dis = pdist([x y]);
result = river_length/ dis 

এটি অষ্টাভে অনলাইন এ (পেস্ট করুন) চেষ্টা করুন


প্রথম দুটি সমঝোতা একের মধ্যে ফেলে দেওয়ার আপনার ধারণা আমাকে কয়েকটা বাইট সংরক্ষণ করেছিল :)
লুইস মেন্ডো

{[x y]=find(c<2&c>0),pdist([x y])}{2}এত চালাক !!!
flawr

একটি ভাল খবর হ'ল আমাদের ম্যাটল্যাবের কোনও বিধিনিষেধ নেই!
rahnema1

2
@ ফ্লোর রাজি। এটি অষ্টাভে গল্ফিং টিপস যেতে হবে !
লুইস মেন্ডো

@ লুইস মেন্ডো টিপসগুলিতে অন্তর্ভুক্ত কিছু এন্ট্রি
rahnema1

2

জাভাস্ক্রিপ্ট (ES6), 178

আয়তক্ষেত্রাকার আকারে নতুন লাইনের সাথে একটি স্ট্রিং হিসাবে ইনপুট দিন : প্রতিটি লাইন একই দৈর্ঘ্যে স্পেস সহ প্যাড করে (উদাহরণ হিসাবে)

r=>r.replace(/#/g,(c,i)=>([d=r.search`
`,-d,++d,-d,++d,-d,1,-1].map((d,j)=>r[i+d]==c&&(--n,s+=j&2?1:Math.SQRT2),n=1),n||(v=w,w=i)),w=s=0)&&s/2/Math.hypot(v%--d-w%d,~(v/d)-~(w/d))

কম গল্ফড

r=>(
  r.replace(/#/g, // exec the following for each '#' in the string
    (c,i) => // c: current char (=#), i: current position
    ( // check in 8 directions
      // note: d starts as the offset to next row, prev x position
      // and is incremented up to offset to next row, succ x position
      // note 2: there are 2 diagonal offsets, then 2 orthogonal offsets
      //         then other 2 diagonal, then 2 more orthogonal
      [d=r.search`\n`,-d, ++d,-d, ++d,-d, 1,-1].map( // for each offset
        (d,j) => // d: current offset, j: array position (0 to 7)
        r[i+d] == c && // if find a '#' at current offset ...
          ( 
            --n, // decrement n to check for 2 neighbors or just 1
            s += j & 2 ? 1 : Math.SQRT2 // add the right distance to s
          ),
      n = 1), // n starts at 1, will be -1 if 2 neighbors found, else 0
      // if n==0 we have found a start or end position, record it in v and w
      n || (v=w, w=i)
   ),
  w=s=0), // init s and w, no need to init v
  // at the end 
  // d is the length of a line + 1
  // s is twice the total length of the river
  // v and w can be used to find the x,y position of start and end
  s/2/Math.hypot(v%--d-w%d,~(v/d)-~(w/d))
)

পরীক্ষা

F=
r=>r.replace(/#/g,(c,i)=>([d=r.search`\n`,-d,++d,-d,++d,-d,1,-1].map((d,j)=>r[i+d]==c&&(--n,s+=j&2?1:Math.SQRT2),n=1),n||(v=w,w=i)),w=s=0)&&s/2/Math.hypot(v%--d-w%d,~(v/d)-~(w/d))

Yellow=`        ### ####           
       #   #    #          
       #       #          #
       #       #         # 
       #       #        #  
      #         #      #   
##   #          # #####    
  ##  #          #         
    ##                     `

Nile=`         #     
         #     
          #    
           #   
           #   
          #    
         #     
        #      
        #  #   
        # # #  
         #  #  
            #  
          ##   
         #     
         #     
        #      
        #      
       #       
       #       
       #       
       #       
   #  #        
  # ##         
  #            
  #            
   #           
    #          
     #         
     #         
      #        
     #         
    #          
     #         
      #        `

Missi=` ###            
#   #           
     #          
     #          
    #           
   #            
  #             
  #             
  #             
   #            
    #           
     #          
      #         
       #        
        #       
        #       
        #       
         #      
          #     
           #    
          #     
       ###      
      #         
       #        
      #         
     #          
    #           
    #           
    #           
    #           
     #          
      ##        
        #       
        #       
         ##     
           ##   
             ## 
               #
              # 
             #  
            #   
           #    
          #     
         #      
        #       
        #       
        #       
        #       
        #       
       #        
      #         
     #          
      #         
       #        
        ####    
            #   
             #  `
console.log('Yellow River',F(Yellow))
console.log('Nile River',F(Nile))
console.log('Mississippi River',F(Missi))

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