Reorganizuj według strzałek

11

Powiedzmy, że coś pisałem i przypadkowo napisałem to w niewłaściwym polu:

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

Więc, będąc leniwym, po prostu narysowałem strzałkę w przestrzeń, którą powinna być:

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

Twoim zadaniem jest, aby wyglądał ładnie - zmień go w następujący sposób:

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

Zasady

  • Zwroty lub słowa są otoczone nawiasami ([...])
  • Wpisy wielowierszowe są oznaczone jako [...] (usunięto wielowierszowy), nowa linia, [...] --...-->. Tak więc strzałka zawsze wychodzi z prawego dolnego wspornika

Na przykład:

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

Zamienia się w:

+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|           | is a noun|
| eat       | Banana   |
|           | Car      |
+-----------+----------+
  • Pola są ograniczone plusami („+”) i należy założyć, że strzałki nie przejdą przez plus
  • Na końcu strzałki zawsze będzie miejsce na dopasowanie słowa lub frazy
  • Kolejność ma znaczenie - słowo musi pojawić się w miejscu wskazanym przez strzałkę, chociaż wyrównanie w pionie nie jest ważne
  • Strzały mogą obracać się o 90 stopni na raz, ale tylko między „/” a „\” (patrz poniżej)

Na przykład:

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

Konkurs

Każde wejście jest dopuszczalne (plik tekstowy, STDIN itp.)
Każde czytelne wyjście jest dopuszczalne (plik tekstowy, STDOUT itp.)

Oto kilka innych przykładów:

To jest golf golfowy, więc wygrywa najkrótszy kod!

Niektóre przypadki testowe:

   +--------+----------+-------------+
   | 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      |         |      
   +-----------+--------------------+---------+ 
Stretch Maniac
źródło
5
To miłe wyzwanie, po prostu wydaje się cholernie trudne!
Beta Decay
2
Próbując napisać identyfikację skrzynki, zauważyłem, że może być dwuznaczne, ile jest pól, jeśli masz wystarczającą liczbę strzałek przekraczających granicę, na przykład: Ile pól jest w tym układzie pastebin.com/xyBjTAwK ? Czy możemy mieć jakąś gwarancję, że tak się nie stanie, lub wyjaśnienie oczekiwanego zachowania w tej sytuacji.
VisualMelon,
2
@VisualMelon Możesz założyć, że tak się nie stanie. Nigdy nie będzie przypadku, w którym 2 plusy będą w następnym rzędzie / kolumnie i nie zostaną połączone. Co do nawiasów, to była wada z mojej strony. Możesz założyć, że wszystko w nawiasach się porusza.
Stretch Maniac
1
Proszę tylko o to, że wyświetla tabelę, która wygląda jak oryginalna tabela, z wyjątkiem ruchów wartości. Innymi słowy, dopóki wygląda na tabelę (np. Bez przypadkowych podziałów linii), nie dbam o rzeczy, których nie widzę (np. Końcowe spacje / podziały linii)
Stretch Maniac
1
Jeśli zamówienie jest ułożone w miejscu, w którym wskazuje strzałka, na zamówieniu powinno znajdować się we właściwym miejscu. Na przykład „Brat” poszedłby na prawo od „Chłopiec”. Możesz założyć, że strzałka wskazuje pierwszy rząd miejsca docelowego elementu multirow. Co kwalifikuje element - Wszystko otoczone nawiasami (nawet> <| ^ i białe znaki) jest uważane za część elementu. Jeśli nad nim są nawiasy, bez strzały, oznacza to, że jest to element multilinii.
Stretch Maniac

Odpowiedzi:

8

Python, 700 681 676 667 znaków

Jeszcze nie w pełni grał w golfa, ale chciał znaleźć odpowiedź.

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)

Strategia :

Przekształcam dane wejściowe w macierz. Następnie skanuję go linia po linii, znajdując [s. Dla każdego [znajduję dopasowanie ], a następnie wywołuję funkcję śledzenia Tz miejscem bezpośrednio po prawej stronie ]. Funkcja śledzenia podąża za linią, zastępując ścieżkę ' 's, gdy idzie, i zwraca tam, gdzie słowo powinno się udać. Następnie usuwam słowo ze starej lokalizacji i umieszczam je w nowej lokalizacji.

Wreszcie dzwonię F, co rekurencyjnie rekonstruuje pudła.

Testy :

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      |         |      
   +-----------+--------------------+---------+ 
Claudiu
źródło