CJam, 180 ... 133101 ... 94 90 87 바이트
qN/~'#/S*_,):L;]N*_,_,*{:A1$='#={[W1LL~)]Af+{W>},1$f=S&,{ASct}*}*}/N/z{S/{$W%}%'#*}%zN*
확실히 많은 골프가 가능하지만 완전히 작동하게 한 후에 먼저 게시하고 싶었습니다.
엄마 봐요! 스크롤바가 없습니다!
(로 구성 바위 그리드 얻어 .
및 #
STDIN에서 후행 개행없이)를 표준 출력으로 출력을 인쇄
업데이트 : 비효율적이지만 짧은 부분 홍수 채우기를 사용하여 견고한 암석을 알아냅니다.
업데이트 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 개 이상 을
(공간)으로 변환해야합니다. 여기의 공간은 확고한 록 그룹을 나타냅니다. 따라서 길이 (그리드) 반복이 끝나면 모든 단단한 암석이 공백으로 표시됩니다.
여기에서 온라인으로 사용해보십시오