Sắp xếp lại bằng mũi tên


11

Hãy nói rằng tôi đã viết một cái gì đó, và tôi vô tình viết nó vào ô sai:

+-------+--------+
| Verbs | Nouns  |
+-------+--------+
| Truck |        |
| eat   | Banana |
|       | Car    |
+-------+--------+

Vì vậy, tôi, lười biếng, chỉ đơn giản là vẽ một mũi tên vào không gian cần có:

+-------+--------+
| Verbs | Nouns  |
+-------+--------+
|[Truck]--->     |
| eat   | Banana |
|       | Car    |
+-------+--------+

Công việc của bạn là làm cho nó trông thật đẹp - biến nó thành thế này:

+-------+--------+
| Verbs | Nouns  |
+-------+--------+
|       | Truck  |
| eat   | Banana |
|       | Car    |
+-------+--------+

Quy tắc

  • Các cụm từ hoặc từ được bao quanh bởi dấu ngoặc ([...])
  • Các mục nhập đa dòng được ký hiệu là [...] (loại bỏ đa dòng), dòng mới, [...] --...-->. Vì vậy, mũi tên luôn luôn đi ra khỏi khung bên phải phía dưới

Ví dụ:

+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|[is a noun]->         |
| eat       | Banana   |
|           | Car      |
+-----------+----------+

Trở thành:

+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|           | is a noun|
| eat       | Banana   |
|           | Car      |
+-----------+----------+
  • Các hộp được giới hạn bởi các dấu cộng ("+") và phải giả sử rằng các mũi tên sẽ không vượt qua một dấu cộng
  • Sẽ luôn có chỗ ở cuối mũi tên cho từ hoặc cụm từ phù hợp
  • Vấn đề thứ tự - từ phải xuất hiện ở nơi mũi tên chỉ vào, mặc dù căn chỉnh dọc không quan trọng
  • Mũi tên có thể xoay 90 độ cùng một lúc, nhưng chỉ giữa "/" và "\" (xem bên dưới)

Ví dụ:

    +-----------+----------+
    |   Verbs   |  Nouns   |
    +-----------+----------+
    | [Truck]--\|          |
  /------------/|        <--\
  | | eat       | Banana   ||
  | |  /--\     | Car      ||
  | +--|--|-----+----------+|
  \----/  \-----------------/

Cuộc thi

Mọi đầu vào đều được chấp nhận (tệp văn bản, STDIN, v.v.)
mọi đầu ra có thể đọc được đều được chấp nhận (tệp văn bản, STDOUT, v.v.)

Dưới đây là một số ví dụ:

Đây là mã golf, vì vậy mã ngắn nhất sẽ thắng!

Một số trường hợp thử nghiệm:

   +--------+----------+-------------+
   | Colors |  Foods   |  Countries  |
   +--------+----------+-------------+
   | red    | pizza    | Switzerland |
 /-->     /---->       |             |
 | |[kale]/ | hot dogs | Brazil      |
 | |     <----------------------\    |
 | | orange |[yellow]\ | [green]/    |
 | +--------+--------|-+-------------+
 \-------------------/


/------------------------------------------\
|                                          |
|  +------------------+----------+-------+ |
|  | frog             |          |       | |
|  | forge            | dog      | eagle | |
|  | foundation       | diligent | ease  | |
|  |[Brother]--\      | down     | elf   | |
|  |           |      |[egg]--\  |[fort]---/
\---->         |      |       |  |       |  
   |           \-\    |       \----->    |  
   +-------------|----+----------+       |  
   |   Boy       \-->            |       |  
   |   Bull                      |       |  
   |   Browser                   |       |  
   +-----------------------------+-------+ 


             /--------------------------------------\
             |                     /---------------\|
/------------|---------------------/               ||
|            |               /---------------\     ||
|  +---------|-+-----------+-|------+--------|+    ||
\---->       | |  clarinet | \>     | [drums]/|    ||
   | [viola]\\--->         |        +---------+    ||
   |        \----->        |        |         |/---/|
   +-----------+ [violin]\ |        | [cello]--/    |
   |        <------------/ |        +---------+     |
   |           +-----------+      <----------\|     |
   |           |           |        |  [tuba]/|     |
   |           | [piano]\  |        |         |     |
   |        <-----------/  |        |         |     |
   |           +-----------+--------+         |     |
   |           |                    |[trumpet]------/
   | [flute]----->                  |         |      
   |           |     saxaphone      |         |      
   +-----------+--------------------+---------+ 

5
Đây là một thử thách tốt đẹp, nó chỉ có vẻ khó khăn!
Beta Decay

2
Trong khi cố gắng viết nhận dạng hộp, tôi đã lưu ý rằng có thể mơ hồ có bao nhiêu hộp nếu bạn có đủ mũi tên đi qua một ranh giới, ví dụ: Có bao nhiêu hộp trong bố cục này pastebin.com/xyBjTAwK ? Chúng tôi có thể có một số đảm bảo rằng điều này sẽ không xảy ra, hoặc giải thích về hành vi dự kiến ​​cho tình huống.
VisualMelon

2
@VisualMelon Bạn có thể cho rằng điều đó sẽ không xảy ra. Sẽ không bao giờ có trường hợp 2 dấu cộng ở hàng / cột tiếp theo và không được kết nối. Ngoài ra, về dấu ngoặc, đó là một lỗ hổng về phía tôi. Bạn có thể giả định rằng bất cứ điều gì trong ngoặc di chuyển.
Căng thẳng Maniac

1
Tất cả những gì tôi yêu cầu là nó xuất ra một bảng trông giống như bảng gốc, ngoại trừ với các giá trị di chuyển. Nói cách khác, miễn là nó trông giống như một cái bàn (ví dụ: không có ngắt dòng ngẫu nhiên), tôi không quan tâm đến những thứ tôi không thể nhìn thấy (ví dụ: dấu cách / dấu ngắt dòng)
Stretch Maniac

1
Theo thứ tự, nếu đỉnh của vật phẩm được đặt đúng nơi mũi tên đang chỉ, thì nó phải ở đúng vị trí. Ví dụ: "Anh" sẽ ở bên phải của "Cậu bé". Bạn có thể giả sử rằng mũi tên đang chỉ vào hàng đầu tiên của đích đến của một mục đa hướng. Trên những gì đủ điều kiện một mục - Bất kỳ điều gì được bao quanh bởi dấu ngoặc (thậm chí> <| ^ và khoảng trắng) được coi là một phần của mục. Nếu có dấu ngoặc ở trên mà không có mũi tên nào xuất hiện, thì đó là một phần của mục đa dòng.
Căng thẳng điên cuồng

Câu trả lời:


8

Python, 700 681 676 667 ký tự

Chưa chơi golf đầy đủ, nhưng muốn đưa ra một câu trả lời.

import os
D=map(list,os.read(0,9999).split('\n'))
Z=Q=[-1,0,1,0,-1]
J=''.join
def T(y,x,d,_):c=D[y][x];D[y][x]=' ';d={'\\':3-d,'/':1-d}.get(c,d)%4;j=(y+Q[d],x+Q[d+1],d,c=='>');return c in'<>'and j or T(*j)
def F(y,x,d):
 if y<Y or x<L:
    if D[y][x]=='+':
     if J(D[y]).find('+',x+1)+1:F(y,x+1,1)
     if any((l[x:]+[''])[0]=='+'for l in D[y+1:]):F(y+1,x,2)
    else:D[y][x]='--||'[d];F(y+Q[d],x+Q[d+1],d)
i=0
for l in D:
 I=l.index
 if'+'in l:
    if Z:P,K,L,Z=i,I('+'),J(l).rfind('+'),0
    Y=i
 while'['in l:
    s,e=map(I,'[]');y,x,_,R=T(i,e+1,1,1);W=l[s+1:e]
    if R:D[y][x:x+e-s-1]=W
    else:D[y][x-e+s+2:x+1]=W
    l[s:e+1]=' '*(e-s+1)
 i+=1
F(P,K+1,1);F(P+1,K,2)
for l in D:print J(l)

Chiến lược :

Tôi biến đầu vào thành một ma trận. Sau đó, tôi quét nó từng dòng, tìm [s. Đối với mỗi [, tôi tìm thấy sự phù hợp ], sau đó tôi gọi hàm theo dõi Tvới vị trí ngay bên phải của ]. Hàm theo dõi theo dòng, thay thế đường dẫn bằng ' 's khi nó đi và trả về nơi mà từ đó sẽ đi. Sau đó, tôi xóa từ ở vị trí cũ và đặt từ ở vị trí mới.

Cuối cùng, tôi gọi F, trong đó đệ quy lại các hộp.

Các xét nghiệm :

reorg_test1... True
Input:
+-------+--------+
| Verbs | Nouns  |
+-------+--------+
|[Truck]--->     |
| eat   | Banana |
|       | Car    |
+-------+--------+


Output:
+-------+--------+
| Verbs | Nouns  |
+-------+--------+
|       |   Truck|
| eat   | Banana |
|       | Car    |
+-------+--------+



reorg_test2... True
Input:
+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|[is a noun]->         |
| eat       | Banana   |
|           | Car      |
+-----------+----------+


Output:
+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|           | is a noun|
| eat       | Banana   |
|           | Car      |
+-----------+----------+



reorg_test3... True
Input:
    +-----------+----------+
    |   Verbs   |  Nouns   |
    +-----------+----------+
    | [Truck]--\|          |
  /------------/|        <--\
  | | eat       | Banana   ||
  | |  /--\     | Car      ||
  | +--|--|-----+----------+|
  \----/  \-----------------/


Output:
    +-----------+----------+
    |   Verbs   |  Nouns   |
    +-----------+----------+
    |           |          |
    |           |   Truck  | 
    | eat       | Banana   | 
    |           | Car      | 
    +-----------+----------+ 




reorg_test4... True
Input:
   +--------+----------+-------------+
   | Colors |  Foods   |  Countries  |
   +--------+----------+-------------+
   | red    | pizza    | Switzerland |
 /-->     /---->       |             |
 | |[kale]/ | hot dogs | Brazil      |
 | |     <----------------------\    |
 | | orange |[yellow]\ | [green]/    |
 | +--------+--------|-+-------------+
 \-------------------/


Output:
   +--------+----------+-------------+
   | Colors |  Foods   |  Countries  |
   +--------+----------+-------------+
   | red    | pizza    | Switzerland |
   | yellow |   kale   |             |
   |        | hot dogs | Brazil      |
   |green   |          |             |
   | orange |          |             |
   +--------+----------+-------------+




reorg_test5... True
Input:
/------------------------------------------\
|                                          |
|  +------------------+----------+-------+ |
|  | frog             |          |       | |
|  | forge            | dog      | eagle | |
|  | foundation       | diligent | ease  | |
|  |[Brother]--\      | down     | elf   | |
|  |           |      |[egg]--\  |[fort]---/
\---->         |      |       |  |       |  
   |           \-\    |       \----->    |  
   +-------------|----+----------+       |  
   |   Boy       \-->            |       |  
   |   Bull                      |       |  
   |   Browser                   |       |  
   +-----------------------------+-------+ 


Output:


   +------------------+----------+-------+  
   | frog             |          |       |  
   | forge            | dog      | eagle |  
   | foundation       | diligent | ease  |  
   |                  | down     | elf   |  
   |                  |          |       |  
   |  fort            |          |       |  
   |                  |          |   egg |  
   +------------------+----------+       |  
   |   Boy           Brother     |       |  
   |   Bull                      |       |  
   |   Browser                   |       |  
   +-----------------------------+-------+ 



reorg_test6... True
Input:
             /--------------------------------------\
             |                     /---------------\|
/------------|---------------------/               ||
|            |               /---------------\     ||
|  +---------|-+-----------+-|------+--------|+    ||
\---->       | |  clarinet | \>     | [drums]/|    ||
   | [viola]\\--->         |        +---------+    ||
   |        \----->        |        |         |/---/|
   +-----------+ [violin]\ |        | [cello]--/    |
   |        <------------/ |        +---------+     |
   |           +-----------+      <----------\|     |
   |           |           |        |  [tuba]/|     |
   |           | [piano]\  |        |         |     |
   |        <-----------/  |        |         |     |
   |           +-----------+--------+         |     |
   |           |                    |[trumpet]------/
   | [flute]----->                  |         |      
   |           |     saxaphone      |         |      
   +-----------+--------------------+---------+ 


Output:




   +-----------+-----------+--------+---------+      
   |  cello    |  clarinet |   drums|         |      
   |           |  trumpet  |        +---------+      
   |           |   viola   |        |         |      
   +-----------+           |        |         |      
   |  violin   |           |        +---------+      
   |           +-----------+  tuba  |         |      
   |           |           |        |         |      
   |           |           |        |         |      
   |   piano   |           |        |         |      
   |           +-----------+--------+         |      
   |           |                    |         |      
   |           |  flute             |         |      
   |           |     saxaphone      |         |      
   +-----------+--------------------+---------+ 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.