ผ้าขนหนูพับ!


19

ผมได้ยินบางที่สิ่งหนึ่งที่เทคโนโลยีไม่สามารถทำได้เลยคือผ้าขนหนูพับ1 ตอนนี้มันเป็นหน้าที่ของคุณที่จะพิสูจน์ว่าข้อความนั้นเป็นเท็จ!

รับสายเป็นอินพุทประกอบด้วยสี่เหลี่ยม (ผ้าเช็ดตัว) ดังต่อไปนี้พับผ้าเช็ดตัวแต่ละครึ่งครึ่ง ตัวอย่างเช่น:

+------+    +------+        +--+
|      |    |      |        |  |
|      |    |      |        |  |
|      | -> +------+ ->     +--+
|      |    
|      |    
|      |    
+------+    

โปรดสังเกตว่าเมื่อพับผ้าเช็ดตัวมันจะถูกพับขึ้นมาก่อนจากนั้นจากซ้ายไปขวา คุณโปรแกรมต้องเลียนแบบพฤติกรรมนี้เช่นกัน โปรดสังเกตว่าในกรณีทดสอบผ้าเช็ดตัวจะอยู่ในที่เดียวกัน แต่พับ

กฎ:

  • วิธีการมาตรฐานของอินพุต / เอาต์พุต
  • ช่องโหว่มาตรฐานใช้
  • อินพุตและเอาต์พุตควรเป็นสตริง
  • เอาท์พุทท้ายก็โอเคเอาท์พุทตราบใดที่ผ้าเช็ดตัวอยู่ในสถานที่ที่เหมาะสมเมื่อเทียบกับกันและกัน
  • คุณอาจสมมติว่าความยาวของแต่ละด้านของผ้าเช็ดตัวจะหารด้วย 2 เสมอ
  • ผ้าเช็ดตัวที่ผ่านเป็นอินพุตจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ
  • ผ้าขนหนูจะถูกแยกออกเสมอ - อย่างไรก็ตามพวกเขาอาจจะแยกจากกันด้วยจำนวนตัวแปร

  • รหัสที่สั้นที่สุดชนะ!

กรณีทดสอบ:

Input:
+------+
|      |
|      |
|      |
|      |
|      |
|      |
+------+
Output:
    +--+
    |  |
    |  |
    +--+




Input:
+--+ +--+ +--+
|  | |  | |  |
|  | |  | |  |
+--+ +--+ +--+

Output:
  ++   ++   ++
  ++   ++   ++


Input:
+----+
|    |
|    |
|    |
|    | ++
+----+ ++

Output:

   +-+
   | |
   +-+

        +

Input:
+--+
+--+     ++
         ||
         ||
         ++
Output:
  ++
          +
          +

1: สิ่งนี้ได้รับการพิสูจน์หักล้างโดย Geobits และ Laikoni อย่างไรก็ตามฉันได้ยินมันที่ไหนซักแห่ง


ทำไมต้องลงคะแนน หากมีสิ่งที่สามารถแก้ไขได้โปรดบอกฉัน
สหาย SparklePony


@Laikoni ดูเหมือนว่าเทคโนโลยีสามารถทำอะไรก็ได้ :-)
Mr. Xcoder

@LuisMendo แก้ไขแล้วจะมีช่องว่างระหว่างผ้าเช็ดตัวเสมอ
สหาย SparklePony

ผ้าขนหนูที่ได้รับจะเป็นแนวนอนเสมอหรือไม่ ฉันหมายความว่าจะไม่มีผ้าเช็ดตัวอยู่ใต้อีกอัน?
Dead Possum

คำตอบ:


5

เรติน่า 245 ไบต์

m1+`^((.)*(?!\+ )[+|]([- ])*[+|].*¶(?<-2>.)*)([+|][- ]*[+|])
$1$.4$* 
m+`^((.)*) ( *) (.*¶(?<-2>.)*)(?(2)(?!))\|\3\|
$1|$3|$4 $3 
m+`^((.)*)\|( *)\|(?=.*¶(?<-2>.)*(?(2)(?!)) )
$1+$.3$*-+
([+|])\1
 $1
(?!\+ )([+|])([- ])\2(\2*)\3\1
$.3$*   $1$3$1

ลองออนไลน์!

หมายเหตุ: บางบรรทัดลงท้ายด้วยช่องว่าง คำอธิบาย:

m1+`                    Repeatedly search from the beginning of input
    ^((.)*              Optional indentation
      (?!\+ )           Towel does not start with a plus and a space
      [+|]([- ])*[+|]   A row of towel
      .*¶               Rest of the line
      (?<-2>.)*         Some indentation on the next line
     )
     ([+|][- ]*[+|])    Another row of towel
$1$.4$*                 Replace the second row with blanks

ลบบรรทัดอื่น ๆ ของผ้าเช็ดตัวทุกอัน (ใช้งานได้เนื่องจากผ้าเช็ดตัวทั้งหมดมีความสูงเท่ากัน)

m+`             Repeatedly search
   ^((.)*)      Optional indentation
    ( *)        Find some space
    (.*¶        Rest of the line
     (?<-2>.)*) Matching indentation on the next line
    (?(2)(?!))  Ensure that the indentation exactly matches
    \|\3\|      Piece of towel
$1|$3|$4 $3     Swap the piece into the space above

เปลี่ยนผ้าเช็ดตัวที่แยกออกเป็นชิ้น ๆ

m+`                 Repeatedly search
   ^((.)*)          Optional indentation
    \|( *)\|        Piece of towel
    (?=             Followed by
       .*¶          Rest of the line
       (?<-2>.)*    Matching indentation on the next line
       (?(2)(?!))   Ensure that the indentation exactly matches
        )           Nothing on the next line
$1+$.3$*-+          Change the piece into a towel bottom

และแก้ไขด้านล่างของผ้าเช็ดตัวให้พับได้อย่างมีประสิทธิภาพ

([+|])\1    Match a row of towel of width 2, which is just ++ or ||
 $1         Change the first column to a space, which folds it

พับผ้าเช็ดตัวที่มีความกว้าง 2 ทางด้านขวา

(?!\+ )     Towel does not start with a plus and a space
([+|])      Start with a + or a |
([- ])\2    Then at least two -s or spaces
(\2*)\3     Then an even number of -s or spaces
\1          Then another + or |
$.3$*       Replace the left half with spaces
$1$3$1      Replace the first character of the right half

พับผ้าเช็ดตัวที่เหลือไปทางขวา


ฉันสนใจที่จะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานของ regex
Kritixi Lithos

@KritixiLithos บางอย่างเช่นนั้นหรือมีบางสิ่งที่เฉพาะเจาะจงหรือไม่
Neil

ใช่ขอบคุณ. และฉันถูกต้องในสมมติว่า<-2>เป็น. NET กลุ่มสมดุล?
Kritixi Lithos

@KritixiLithos ใช้มัน: (?<-2>.)*ดึงการจับภาพในแต่ละครั้งดังนั้นจึงไม่สามารถทำซ้ำได้มากกว่า(.)*เดิมในขณะที่(?(2)(?!))ตรวจสอบว่าไม่มีการจับภาพเหลืออยู่เพื่อให้สามารถทำซ้ำได้หลายครั้ง
Neil

3

ระดับเสียงคู่ด้วยแพ็คเกจภาพ , 277 272 ไบต์

function x=f(x)
[i,j,v]=find(bwlabel(x-32));a=@(w)accumarray(v,w,[],@max);r=-a(-i);R=a(i);s=-a(-j);S=a(j);x(:)=32;for k =1:nnz(r)
u=(r(k)+R(k)-1)/2;v=(s(k)+S(k)+1)/2;p=v:S(k);x(r(k),p)=45;x(u,p)=45;q=r(k):u;x(q,v)=124;x(q,S(k))=124;x(u,[v S(k)])=43;x(r(k),[v S(k)])=43;end

อินพุทและเอาท์พุทเป็นถ่านแบบสองมิติ

ลองออนไลน์! หรือตรวจสอบทุกกรณีทดสอบ: 1 , 2 , 3 , 4 (โปรดทราบว่าendfunctionในกรณีทดสอบจำเป็นต้องแยกฟังก์ชั่นจากโค้ดที่ตามมาเท่านั้นมันไม่จำเป็นถ้าฟังก์ชั่นนั้นถูกบันทึกในไฟล์ของตัวเอง)

เวอร์ชันและคำอธิบายที่อ่านได้

function x = f(x)
[i,j,v] = find(bwlabel(x-32)); % make background equal to 0 by subtracting 32.
% Then label each connected component (i.e. towel) with a unique integer
% Then get row indices (i) and column indices (j) of nonzero values (v)
a = @(w)accumarray(v,w,[],@max); % helper function. Gives the maximum of w for
% each group given by an integer label in v
r = -a(-i); % upper coordinate of each towel (minimum row index)
R = a(i); % lower coordinate of each towel (maximum row index)
s = -a(-j); % left coordinate of each towel (minimum column index)
S = a(j); % right coordinate of each towel (maximum column index)
x(:) = 32; % remove all towels: fill x with spaces
for k = 1:nnz(r) % for each original towel: create the new, folded towel 
    u = (r(k)+R(k)-1)/2; % new lower coordinate
    v = s(k)+S(k)+1)/2; % new left coordinate
    p = v:S(k); % column indices of horizontal edges
    x(r(k),p) = 45; % fill upper horizontal edge with '-'
    x(u,p) = 45; % fill lower horizontal edge with '-'
    q = r(k):u; % row indices of vertical edges
    x(q,v) = 124; % fill left vertical edge with '|'
    x(q,S(k)) = 124; % fill right vertical edge with '|'
    x(u,[v S(k)]) = 43; % fill lower corners with '+'
    x(r(k),[v S(k)]) = 43; % fill upper corners with '+'
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.