পতনশীল শিলাগুলির পূর্বাভাস দিন


18

এই চ্যালেঞ্জে আপনাকে পাশ থেকে দেখা দ্বি-মাত্রিক ভূখণ্ডের একটি মানচিত্র দেওয়া হবে। দুর্ভাগ্যক্রমে, ভূখণ্ডের কিছু অংশ বাতাসে ভাসছে, যার অর্থ তারা ভেঙে পড়বে। আপনার কাজটি তারা কোথায় অবতরণ করেছে তা অনুমান করা।

ইনপুট

আপনার ইনপুটটি সমান দৈর্ঘ্যের এক বা একাধিক নিউলাইন-বিভাজিত স্ট্রিং, কেবলমাত্র অক্ষর #(একটি সংখ্যা চিহ্ন, একটি শিলাকে নির্দেশ করে) বা .(একটি সময়কাল, খালি স্থান নির্দেশ করে) থাকে।

আউটপুট

আপনার আউটপুট ইনপুট হিসাবে একই ফর্ম্যাট আছে, কিন্তু নিম্নলিখিত পরিবর্তন সঙ্গে। আসুন শৈলগুলির একটি দ্বিমাত্রিক গ্রিড হিসাবে ইনপুট স্ট্রিংটি দেখতে দিন। সংলগ্ন শিলার একটি পথ দ্বারা গ্রিডের নীচে সংযুক্ত ইনপুটটির প্রতিটি শিলা দৃ firm় ; অন্যান্য পাথর আলগা হয় । ত্রিভুজ সংলগ্ন শিলাগুলি সংলগ্ন হিসাবে বিবেচনা করা হয় না। সমস্ত আলগা শিলা সোজা নীচে নেমে যাবে এবং দৃ rock় পাথর বা নীচের সারিটির উপরে একটি স্ট্যাক হিসাবে শেষ হবে। আলগা শিলাগুলি একে অপরের সাথে সংযুক্ত থাকে না, তাই এগুলি পৃথকভাবে পড়ে যায়, বড় আকারের গঠনের মতো নয়। আউটপুট ফলাফল গ্রিড হয়।

উদাহরণ

  • ইনপুট

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

    কোনও আলগা শিলা নেই, সুতরাং আউটপুট এটির মতো।

  • ইনপুট

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

    শীর্ষে একটি আলগা রক রয়েছে যা এটির নীচে দৃ rock় শিলায় পড়ে। আউটপুট হয়

    ......
    .#..#.
    .#..##
    .#.#.#
    .#####
    .#...#
    
  • ইনপুট

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

    বাম দিকে আলগা শিলাগুলির একটি বিশাল দল রয়েছে। শিলা পড়ার সাথে সাথে গ্রুপটি ভেঙে যায়, ফলে আউটপুটও হয়

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

ব্যাখ্যা

  • আপনি হয় STDIN এবং আউটপুট থেকে STDOUT এ ইনপুট নিতে পারেন, বা কোনও ফাংশন লিখতে পারেন।
  • এটি কোড-গল্ফ, তাই সংক্ষিপ্ততম প্রোগ্রাম (বাইটে) বিজয়ী।
  • স্ট্যান্ডার্ড লুফোলগুলি অনুমোদিত নয়।

উত্তর:


12

সিজেএম, 180 ... 133 101 ... 94 90 87 বাইট

qN/~'#/S*_,):L;]N*_,_,*{:A1$='#={[W1LL~)]Af+{W>},1$f=S&,{ASct}*}*}/N/z{S/{$W%}%'#*}%zN*

নিশ্চয়ই প্রচুর গল্ফিং সম্ভব, তবে সম্পূর্ণরূপে কাজ করার পরে আমি এটি পোস্ট করতে চাই।

দেখ মা! কোনও স্ক্রোলবার নেই!

শিলা গ্রিড (গঠিত লাগে .এবং #stdin থেকে একটি trailing সম্পর্কে newline ছাড়া) এবং stdout- এ আউটপুট ছাপে

আপডেট : দৃ firm় শিলাগুলি বের করার জন্য একটি অদক্ষ তবে সংক্ষিপ্ত আংশিক বন্যার ফিল ব্যবহার করা Using

আপডেট 2 : শিলা নীচে পড়ে যাওয়ার জন্য অ্যালগরিদম পরিবর্তন হয়েছে। এখন অনেক খাটো!

আপডেট 3 : বেশ কয়েকটি ছোট্ট অপ্টিমাইজেশন হয়েছে এবং শেষ পর্যন্ত আমি বাইট গণনাটি মূল কোডের অর্ধেক করে নামাতে সক্ষম হয়েছি!

এটি কীভাবে কাজ করে :

qN/~'#/S*_,):L;]N*             "Preparations";
qN/~                           "Read the input, split by new line and expand the array";
    '#/S*                      "In the last row, replace # by space";
         _,):L                 "Copy the last row and store length + 1 in L";
              ;]N*             "Pop the length, wrap everything in array and join by \n";

_,_,*{ ... }/                  "Flood fill";
_,                             "Copy the array and calculate its length";
  _,                           "Copy the length and calculate [0 - length] array";
    *                          "Repeat the above array, length times";
     { ... }/                  "Run the code block on each element of the array";

:A1$='#={ ... }*               "Process only #";
:A1$                           "Store the number in A and copy the input array to stack";
    =                          "Get Ath index element from input array";
     '#={ ... }*               "Run the code block if Ath element equals #";

[W1LL~)]Af+{W>},1$f=S&,{ASct}* "Flood fill spaces";
[W1LL~)]Af+                    "Get the indexes of the 4 elements on the cross formed by"
                               "the Ath index";
           {W>},               "Filter out the negative values";
                1$f=           "For each of the index, get the char from input string";
                    S&,        "Check if space is one of the 4 chars from above step";
                       {    }* "Run the code block if space is present";
                        ASct   "Make the Ath character of input string as space";

N/z{S/{$W%}%'#*}%zN*           "Let the rocks fall";
N/z                            "Split the resultant string by newlines and"
                               "transpose the matrix";
   {           }%              "Run the code block for each row (column of original)";
    S/{   }%                   "Split by space and run the code block for each part";
       $W%                     "Sort and reverse. This makes # come down and . to go up";
            '#*                "Join by 3, effectively replacing back spaces with #";
                 zN*           "Transpose to get back final matrix and join by newline";

বন্যার জন্য, আমরা পুরো গ্রিড দৈর্ঘ্য (গ্রিড) বার মাধ্যমে পুনরাবৃত্তি। প্রতিটি পুনরাবৃত্তির, আমরা ধর্মান্তরিত অন্তত 1 গ্যারান্টী আছে #যা সরাসরি করার জন্য একটি স্থান স্পর্শ করা হয় (স্থান)। স্থান এখানে দৃ firm় রক গ্রুপকে উপস্থাপন করে। সুতরাং দৈর্ঘ্যের (গ্রিড) পুনরাবৃত্তির শেষে, আমরা নিশ্চিত হয়েছি যে সমস্ত দৃ firm় শিলা স্পেস দ্বারা প্রতিনিধিত্ব করবে।

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


15

পার্ল 5: 98

98 টি কমান্ড লাইন পতাকা সহ।

#!perl -p0
1while/
/,($x="($`)")=~y!#!.!,s/#(.*
$)/%$1/+s/#$x?%|%$x?#/%$1$2%/s;1while s/#$x\./.$1#/s;y!%!#!

ব্যাখ্যা:

#!perl -p0 #read entire input to $_ and print at the end
/\n/;($x="($`)")=~y!#!.!; #calculate pattern matching space
                          #between two characters in the same column
                          #looks like "(......)" 
1 while s/#(.*\n$)/%$1/+s/#$x?%|%$x?#/%$1$2%/s;
                          #flood fill solid rock with %
1 while s/#$x\./.$1#/s;   #drop loose rock
y!%!#!                    #change % back to #

@ অপ্টিমাইজার আমি ইনপুটটির চূড়ান্ত লাইনের উপর নির্ভর করে সঠিকভাবে শেষ হচ্ছে দেখুন: আদর্শ one.com/7E3gQh এই নির্ভরতা ব্যতীত এটি একটি চর একাকী (বা তার চেয়ে ছোট একটি বিপরীতে নির্ভর করবে - চূড়ান্ত EOL এর অভাব)।
নটকি

1
সিজেমকে প্রায় 30% মারছে? অ্যামেজিং। আমি আপনাকে অভিনন্দন জানাচ্ছি.
DLosc

@DLosc আর নয়: পি
অপ্টিমাইজার

100-0000% দ্বারা অন্যান্য অপরিহার্য ভাষাগুলি মারছেন? অ্যামেজিং। আমি আপনাকে অভিনন্দন জানাচ্ছি. ;)
ডিএলসাস

@ ডলোকস উপরের উত্তরটি দেখে, আমি পার্লকে আর অত্যাবশ্যকীয় ভাষার তালিকায় অন্তর্ভুক্ত করব না: পি
অপটিমাইজার

5

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

s=>{for(s=[...s+'1'.repeat(r=1+s.search('\n'))];s=s.map((c,p)=>c=='#'&(s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f;);for(;s.map((c,p)=>c=='#'&s[p+r]=='.'&&(s[p]='.',f=s[p+r]=c),f=0),f;);return s.join('').replace(/1/g,rok).slice(0,-r)}

স্ট্রিং প্যারামিটার সহ একটি ফাংশন হিসাবে এবং একটি স্ট্রিং ফিরে।

প্রথমে, স্থল রেখাটি সনাক্ত করতে '1' এর নীচের সারিটি যুক্ত করুন।
স্থিরীকৃত শিলাগুলির জন্য প্রথম লুপ অনুসন্ধান (এটি একটি '1' এর নিকটে) এবং সেগুলিকে '1' হিসাবে চিহ্নিত করে।
দ্বিতীয় লুপটি অবশিষ্ট '#' অক্ষরকে নীচের সারির দিকে সরিয়ে দেয়। আবার কোনও পাথর সরে না যাওয়া পর্যন্ত এটি পুনরাবৃত্তি হয়।
শেষ অবধি, আবার '#' এর সাথে '1' প্রতিস্থাপন করুন এবং নীচের সারিটি কেটে দিন।

কম গল্ফড

s=>{
  r = 1+s.search('\n');
  s = [...s+'1'.repeat(r)];
  for (; s = s.map((c,p) => c=='#' & (s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f; );
  for (; s.map((c,p) => c=='#' & s[p+r]=='.'&& (s[p] ='.', s[p+r]=c, f=1),f=0),f; );
  return s.join('')
    .replace(/1/g,'#')
    .slice(0,-r)
}

পরীক্ষা (কী পাথর দৃ firm় এবং কোনটি পড়েছে তার প্রমাণ থাকতে পারে)

F=
s=>{for(s=[...s+'1'.repeat(r=1+s.search('\n'))];s=s.map((c,p)=>c=='#'&(s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f;);for(;s.map((c,p)=>c=='#'&s[p+r]=='.'&&(s[p]='.',f=s[p+r]=c),f=0),f;);return s.join('').replace(/1/g,rok).slice(0,-r)}

var rok // using rok that is 3 chars like '#'

function update() {
  rok = C.checked ? '@' : '#';
  O.textContent=F(I.textContent)
}

update()
td { padding: 5px }
pre { border: 1px solid #000; margin:0 }
<table><tr><td>Input</td><td>Output</td></tr>
<tr><td><pre id=I>.#####....
.#....####
###.###..#
#.#...##..
.####..#.#
......###.
..#...#..#
..#...#..#</pre></td>
<td><pre id=O></pre>
</td></tr></table>
<input type='checkbox' id=C oninput='update()'>Show firm rocks


3

এপিএল, 130 119

'.##'[1+⊖1↓⍉↑↑{,/{⍵[⍒⍵]}¨x⊂⍨2=x←2,⍵}¨↓ ⍉⊃⌈/(1,¨⍳⍴⊃↓x){x←⍵⋄(⍺⌷x)∧←2⋄x≡⍵:x⋄⊃⌈/((⊂⍴⍵)⌊¨1⌈(,∘-⍨↓∘.=⍨⍳2)+⊂⍺)∇¨⊂x}¨⊂⊖'#'=x←⎕]

যেহেতু ইনপুটটি প্রম্পট করার সময় নতুন লাইনে প্রবেশ করা (যতদূর আমি জানি) সম্ভব নয়, সুতরাং এই প্রোগ্রামটি ইনপুট হিসাবে একটি অক্ষর ম্যাট্রিক্স গ্রহণ করে।

ব্যবহৃত অ্যালগরিদম প্রথমে বাইনারি ম্যাট্রিক্সে রূপান্তরিত হয় ( 0বায়ু এবং 1শিলা হয়) তারপরে দৃ r় শিলা চিহ্নিত করতে নীচের সারি থেকে বন্যা ভরাট হয় 2। তারপরে প্রতিটি কলামকে "দৃ r় শিলাগুলির মধ্যে ফাঁকে" বিভক্ত করুন এবং প্রতিটি পার্টিশনটি আলগা শিলাটি "বায়ুতে" পড়ার জন্য সাজান।

সম্পাদনা 1: কিছু লোক বন্যার ফিল অ্যালগরিদম ব্যবহার করে গল্ফ করেছে


টেস্ট রান

চালান ঘ

একটি অক্ষর ম্যাট্রিক্স সংজ্ঞায়িত করুন Aএবং এটি মুদ্রণ করুন:

      A←↑('.#####....') ('.#....####') ('###.###..#') ('#.#...##..') ('.####..#.#') ('......###.') ('..#...#..#') ('..#...#..#')
      A
.#####....
.#....####
###.###..#
#.#...##..
.####..#.#
......###.
..#...#..#
..#...#..#

তারপরে Aপ্রোগ্রামটিতে ফিড দিন :

      '.##'[1+⊖1↓⍉↑↑{,/{⍵[⍒⍵]}¨x⊂⍨2=x←2,⍵}¨↓⍉(1,¨⍳⊃⌽⍴x){⍵≡y←⊃⌈/x←⍺{x←⍵⋄(⍺⌷x)∧←2⋄x}¨⊂⍵:y⋄((⊂⍴⍵)⌊¨1⌈,(,∘-⍨↓∘.=⍨⍳2)∘.+⍺/⍨x≢¨⊂⍵)∇y}⊖'#'=x←⎕]
⎕:
      A
..........
....######
..#.###..#
..#...##..
.##....#..
.##...####
####..#..#
#####.#..#

চালান 2

      A←↑('#######')('#.....#')('#.#.#.#')('#.....#')('#######')
      A
#######
#.....#
#.#.#.#
#.....#
#######
      '.##'[1+⊖1↓⍉↑↑{,/{⍵[⍒⍵]}¨x⊂⍨2=x←2,⍵}¨↓⍉(1,¨⍳⊃⌽⍴x){⍵≡y←⊃⌈/x←⍺{x←⍵⋄(⍺⌷x)∧←2⋄x}¨⊂⍵:y⋄((⊂⍴⍵)⌊¨1⌈,(,∘-⍨↓∘.=⍨⍳2)∘.+⍺/⍨x≢¨⊂⍵)∇y}⊖'#'=x←⎕]
⎕:
      A
#######
#.....#
#.....#
#.#.#.#
#######

2

জেএস - 443 বাইট

function g(b){function f(b,c,e){return b.substr(0,c)+e+b.substr(c+1)}function e(d,c){"#"==b[c][d]&&(b[c]=f(b[c],d,"F"),1<d&&e(d-1,c),d<w-1&&e(d+1,c),1<c&&e(d,c-1),c<h-1&&e(d,c+1))}b=b.split("\n");w=b[0].length;h=b.length;for(i=0;i<w;i++)"#"==b[h-1][i]&&e(i,h-1);for(j=h-2;-1<j;j--)for(i=0;i<w;i++)if(k=j+1,"#"==b[j][i]){for(;k<h&&"F"!=b[k][i]&&"#"!=b[k][i];)k++;k--;b[j]=f(b[j],i,".");b[k]=f(b[k],i,"#")}return b.join("\n").replace(/F/g,"#")};

বন্যাটি নীচ থেকে শিলাগুলিকে পূর্ণ করে, তারপরে বন্যায় ভরা শিলাগুলি নীচে নিয়ে আসে। বন্যার ভরাটের সাথে প্রচুর পুনরাবৃত্তি ব্যবহার করে যাতে এটি আপনার ব্রাউজারটিকে কিছুটা পিছিয়ে রাখতে পারে।

এটি একটি ফাংশন - এর সাথে কল করুন g("input")

জেএসফিডাল: http://jsfiddle.net/mh66xge6/1/

অবরুদ্ধ জেএসফিডেল: http://jsfiddle.net/mh66xge6/


1

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

আমি নিশ্চিত যে এর থেকে আরও নিঃসৃত হতে পারে ... তবে এটি আর কখনও সিজেএম এবং পার্লের সাথে প্রতিযোগিতা করবে না to

z="%";R=range
def F(r,c,g):
 if z>g[r][c]:g[r][c]=z;[F(r+d%2*(d-2),c+(d%2-1)*(d-1),g)for d in R(4)]
def P(s):
 t=s.split()[::-1];w=len(t[0]);g=[list(r+".")for r in t+["."*w]];[F(0,c,g)for c in R(w)]
 for c in R(w):
  for r in R(len(g)):
   while g[r][c]<z<g[r-1][c]and r:g[r][c],g[r-1][c]=".#";r-=1
 return"\n".join(''.join(r[:w])for r in g[-2::-1]).replace(z,"#")

অন্যান্য উত্তরের মতো। একটি উদ্বেগ হ'ল এটি গ্রিডটিকে প্রথমে উল্টো দিকে ঘুরিয়ে দেয় (লুপ সূচকগুলি আরও সুবিধাজনক করার জন্য) এবং একটি অতিরিক্ত সারি & কলাম যুক্ত করে .(মোড়কে -1সূচকগুলিতে সমস্যা এড়াতে )। ফোন করে চালাও P(string)

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