Oklarla Yeniden Düzenleme


11

Bir şey yazdığımı söyleyeyim ve yanlışlıkla yanlış kutuya yazdım:

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

Bu yüzden tembel olarak, sadece olması gereken alana bir ok çiziyorum:

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

İşiniz güzel görünmesini sağlamak - buna dönüştürün:

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

kurallar

  • İfadeler veya kelimeler parantez içine alınır ([...])
  • Çok satırlı girişler [...] (çok satırlı kaldırıldı), yeni satır, [...] --...--> olarak belirtilir. Böylece ok her zaman sağ alt köşeden çıkar

Örneğin:

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

Dönüşür:

+-----------+----------+
|   Verbs   |  Nouns   |
+-----------+----------+
|           |          |
|           | is a noun|
| eat       | Banana   |
|           | Car      |
+-----------+----------+
  • Kutular artılarla ("+") sınırlıdır ve okların bir artıyı geçmeyeceği varsayılmalıdır.
  • Kelimenin veya ifadenin sığması için her zaman bir okun sonunda yer olacaktır
  • Sıra önemlidir - dikey hizalama önemli olmasa da, kelime okun işaret ettiği yerde görünmelidir
  • Oklar bir seferde 90 derece dönebilir, ancak yalnızca "/" ve "\" arasında olabilir (aşağıya bakın)

Örneğin:

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

Rekabet

Herhangi bir giriş kabul edilebilir (metin dosyası, STDIN, vb.)
Herhangi bir okunabilir çıkış kabul edilebilir (metin dosyası, STDOUT, vb.)

İşte birkaç örnek daha:

Bu kod golf, bu yüzden en kısa kod kazanır!

Bazı test örnekleri:

   +--------+----------+-------------+
   | 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
Bu güzel bir meydan okuma, sadece kanlı zor görünüyor!
Beta Çürüğü

2
Kutu tanımlaması yazmaya çalışırken, bir sınırı geçen yeterli ok varsa kaç kutu olduğunu belirsiz hale getirmenin mümkün olduğunu belirttim, örneğin, bu düzende kaç kutu var ? Pastebin.com/xyBjTAwK ? Bunun gerçekleşmeyeceğine veya durum için beklenen davranışın açıklanmasına dair bir garanti verebilir miyiz?
VisualMelon

2
@VisualMelon Bunun olmayacağını varsayabilirsiniz. Bir sonraki satırda / sütunda 2 artı bulunan ve bağlı olmayan bir durum asla olmayacaktır. Ayrıca, parantez hakkında, bu benim açımdan bir kusurdu. Parantez içindeki herhangi bir şeyin hareket ettiğini varsayabilirsiniz.
Stretch Maniac

1
Tek istediğim, değerler hareketleri hariç, orijinal tabloya benzeyen bir tablo çıktısı. Başka bir deyişle, bir tablo gibi göründüğü sürece (örn. Rastgele satır kesmeleri yok), göremediğim şeyleri umursamıyorum (örneğin, boşluklar / satır kesmeleri)
Streç Manyak

1
Siparişte, öğenin üstü okun işaret ettiği yere doğru yerleştirilirse, doğru yerde olmalıdır. Örneğin, "Kardeş", "Oğlan" ın sağına gider. Okun çok satırlı bir öğenin hedefinin ilk satırını gösterdiğini varsayabilirsiniz. Bir öğeyi neyin nitelendirdiği konusunda - Köşeli ayraçlarla çevrili her şey (hatta> <| ^ ve boşluk) öğenin bir parçası olarak kabul edilir. Üzerinde ok çıkmadan köşeli ayraç varsa, çok satırlı bir öğenin parçasıdır.
Stretch Maniac

Yanıtlar:


8

Python, 700 681 676 667 karakter

Henüz tam golf değil, ama bir cevap koymak istedim.

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)

Strateji :

Girişi bir matrise dönüştürüyorum. Sonra satır satır tarayarak [s buluyorum . Her biri [için eşleşmeyi buluyorum ], sonra Themen sağdaki nokta ile izleme işlevini çağırıyorum ]. İzleme işlevi, yolu takip eder, yolu ' 'giderken s ile değiştirir ve sözcüğün gitmesi gereken yere döner. Sonra eski konumda kelimeyi silerim ve yeni konuma koyarım.

Sonunda, Fkutuları tekrarlayan bir şekilde yeniden inşa ediyorum .

Testler :

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      |         |      
   +-----------+--------------------+---------+ 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.