ASCII-visualiza un gráfico

8

Su misión, si elige aceptarla, es ingresar una serie de pares de puntos que forman un gráfico, como este:

A, BC, AB, AA, DA, EF, GC, G

Luego debe generar una visualización ASCII del gráfico.

Por ejemplo, A,B C,A C,Dpodría ser:

A-----------------B
 \                
  \                  
   C---------D

Editar: según los comentarios, aquí hay algunas restricciones de entrada:

  • cada nodo tiene como máximo 5 conexiones (+20 si puede manejar más)
  • el gráfico es plano, es decir, no se cruzan líneas (¡+200 si puedes manejar incluso un crossover!)
  • hay como máximo 16 nodos (+20 si puede manejar más)

Su puntaje es 999 - (la longitud de su código) + (cualquier bonificación) .

Enciendan sus motores :)

Soham Chowdhury
fuente
code-golf, code-challengeO qué? ¿Y cuál es / son los criterios / criterios ganadores?
Paul R
code-golf/ 10char
Soham Chowdhury
1
¿Se garantiza que el gráfico sea plano? ¿Se requiere que la representación ASCII sea plana? (Si es así, esta es una tarea bastante desafiante).
Peter Taylor
1
@SohamChowdhury: Planar significa que se puede dibujar sin cruzar líneas.
Marinus
2
Este es un desafío extremadamente amplio y difícil en este momento. Herramientas como graphviz y search.cpan.org/~tels/Devel-Graph-0.12/lib/Devel/Graph.pm han sido diseñadas para este tipo de trabajo. También intenté hacer algo similar en el pasado pero fallé. Las reglas adicionales de que el gráfico es plano y que los nodos tienen como máximo 4 conexiones lo convertirían en un desafío de golf de código mucho más sensible.
Shiona

Respuestas:

7

Python 3, 168 caracteres, Puntuación = 999- 168 + 240 = 1071

Solo acortando la gran respuesta de Keith Randalls .

  1. En Python 3, printes una función y, por lo tanto, se puede abreviar p=print. Guarda el 3 * (4 - 1) - 8 = 1personaje.

  2. En Python 3, inputse usa en lugar de raw_input, guarda 4 caracteres.

  3. En lugar de ' '*len(V)usted puede usar ' '*80(o algo similar). Esto lleva a un mayor número de espacios finales, pero a quién le importa ... ¡si salva otros 4 personajes!

  4. Ahora se pone interesante: ¡en lugar de cadenas, usa listas! Esto facilita mucho la actualización S, pero complica un poco la impresión. Llamaré a la lista Tpara no confundirla con la cadena Sde marinus.

  5. Comencemos convirtiendo los vértices en una lista, no en una cadena separada por espacios, que guarda 4 caracteres. La línea de salida Tdebe convertirse en una lista ( T=[' ']*40), que cuesta 2 caracteres.

  6. La impresión de la línea actual se T vuelve 5 caracteres más larga: necesito corchetes para concatenar las listas de cadenas correctamente, necesito dos -caracteres más (porque x e y son solo la mitad de grandes ahora), y necesito un *para hacer que la printfunción tome los elementos de la lista como argumentos separados e imprímalos separados por espacios (¡y no como una lista!). (Este paso fue difícil )

  7. La línea actual se puede actualizar con un simple en T[x]=T[y]="|"lugar de S=S[:x]+'|'+S[x+1:y]+'|'+S[y+1:], que ahorra 19 caracteres.

  8. Para imprimir Tnuevamente, y para la impresión final espaciada de los vértices, se necesitan asteriscos, que cuesta 2 caracteres.

  9. Y justo mientras escribo esto, veo que no hay daño en tener un vértice invisible no conectado ( ' '). Esto permite crear el conjunto de vértices mucho más cortos, ahorrando 4 caracteres más.

En total, el ahorro es 1 + 4 + 4 + 4 - 2 - 5 + 19 - 2 + 4 = 27.

R=input()
p=print
V=list(set(R)-{','})
T=[' ']*40
for e in R.split():x,y=sorted(map(V.index,e[::2]));p(*T[:x]+["+"+"--"*(y-x-1)+"-+"]+T[y+1:]);T[x]=T[y]="|";p(*T)
p(*V)

Ejemplo que muestra el efecto de 9 .: la entrada A,B A,Cconduce a la salida

+-----+                                                                        
|     |                                                                        
+---+ |                                                                        
|   | |                                                                        
A   C B
Reinstalar a Mónica
fuente
1
Originalmente tenía S y T como listas, pero en Python 2 necesitas la ''.join()basura que lo hizo más largo. No sabía que esa *Tcosa existía en python3. Próximo golf ...
Keith Randall
19

APL ( 171 166 162 caracteres, todas las bonificaciones: 999 - 171 166 162 + 20 + 20 + 200 = 1068 1073 1077)

Este es el programa APL de golf más largo que he escrito hasta ahora. Esto podría ser un poco engañoso, pero no hay nada en la pregunta que realmente lo rechace. Lo que estoy haciendo es poner todos los nodos en una línea vertical y dibujar el gráfico como un diagrama de arco. Sin embargo, obviamente todavía es un gráfico.

Todavía me tomó algunas horas.

V←' '⍴⍨99,⍨2×⍴P←∪,C←(2,⍨2÷⍨⍴G)⍴G←G/⍨⎕A∊⍨G←⍞⋄V[2×⍳⍴P;50]←P⋄M←1⋄G←⍴D←{⍵[⍋⍵]}¨↓P⍳C⋄{V[A B←⍵;L←50+M×⌽⍳G]∘←'-'⋄V[A+⍳B-A;⊃L]∘←'|'⋄V[⍵;⊃L]∘←'+'⋄M×←¯1⋄G-←1}¨2×D[⍒|-/↑D]⋄V

Los nodos deben ser letras mayúsculas individuales, por lo que admite un máximo de 26 nodos. Puede manejar líneas cruzadas, y cada nodo puede tener tantas conexiones como la pantalla manejará.

Salida de ejemplo:

A,B C,A C,D

      +-A--+                                              
      |    |                                              
      +-B  |                                              
           |                                              
        C+-+                                              
         |                                                
        D+   

A,B C,A B,A A,D A,E F,G C,G

          +--A-+-+-+                                           
          |    | | |                                           
          |  B-+ | |                                           
          |      | |                                           
        +-+--C   | |                                           
        |        | |                                           
        |    D---+ |                                           
        |          |                                           
        |    E-----+                                           
        |                                                      
        |   +F                                                 
        |   |                                                  
        +---+G                                                 


 T,H E,Q U,I C,K B,R O,W N,F O,X J,U M,P S,O V,E R,T H,E L,A Z,Y D,O G,S

               +---+----------T                                                 
               |   |                                                            
               |   +-------+--H                                                 
               |           |                                                    
               |           +--E---------+-------+                               
               |                        |       |                               
               |              Q---------+       |                               
               |                                |                               
               |     +--------U---------------+ |                               
               |     |                        | |                               
               |     +--------I               | |                               
               |                              | |                               
               |              C-------+       | |                               
               |                      |       | |                               
               |              K-------+       | |                               
               |                              | |                               
               |       +------B               | |                               
               |       |                      | |                               
               +-------+------R               | |                               
                                              | |                               
             +----------------O-----+-----+-+ | |                               
             |                      |     | | | |                               
             |                W-----+     | | | |                               
             |                            | | | |                               
             |           +----N           | | | |                               
             |           |                | | | |                               
             |           +----F           | | | |                               
             |                            | | | |                               
             |                X-----------+ | | |                               
             |                              | | |                               
             |                J-------------|-+ |                               
             |                              |   |                               
             |                M---+         |   |                               
             |                    |         |   |                               
             |                P---+         |   |                               
             |                              |   |                               
             |   +------------S-------------+   |                               
             |   |                              |                               
             |   |            V-----------------+                               
             |   |                                                              
             |   |            L-+                                               
             |   |              |                                               
             |   |            A-+                                               
             |   |                                                              
             |   |           +Z                                                 
             |   |           |                                                  
             |   |           +Y                                                 
             |   |                                                              
             +---|------------D                                                 
                 |                                                              
                 +------------G                                                 
marinus
fuente
Eso es más o menos lo que estaba pensando hacer (y aún puedo hacer). Única forma obvia de manejarlo.
Peter Taylor
3
Para mí es un misterio cómo la gente escribe APL. +1
Soham Chowdhury
7

Python, 195 caracteres, puntaje = 999 - 195 + 20 + 200 + 20 = 1044

R=raw_input()
V=' '.join(set(R)-set(' ,'))
S=' '*len(V)
for e in R.split():x,y=sorted(map(V.index,e[::2]));print S[:x]+'+'+'-'*(y-x-1)+'+'+S[y+1:];S=S[:x]+'|'+S[x+1:y]+'|'+S[y+1:];print S
print V

Cada borde obtiene una fila. S es una cadena con las conexiones verticales que debemos mantener a medida que construimos el gráfico.

Aquí hay algunos ejemplos de entrada / salida:

A,B C,A B,A A,D A,E F,G C,G
+---+        
|   |        
+-+ |        
| | |        
+---+        
| | |        
+-------+    
| | |   |    
+-----+ |    
| | | | |    
| | | | | +-+
| | | | | | |
| +-------+ |
| | | | | | |
A C B E D G F

y robado de marinus:

T,H E,Q U,I C,K B,R O,W N,F O,X J,U M,P S,O V,E R,T H,E L,A Z,Y D,O G,S
                +-----------------------+          
                |                       |          
      +-----------------------+         |          
      |         |             |         |          
      |       +-----------------------+ |          
      |       | |             |       | |          
  +---------------+           |       | |          
  |   |       | | |           |       | |          
  | +-------------------------------+ | |          
  | | |       | | |           |     | | |          
  | | |       | | |       +---------------+        
  | | |       | | |       |   |     | | | |        
  | | |     +---------------+ |     | | | |        
  | | |     | | | |       | | |     | | | |        
  | | |     | | | |       +---------------------+  
  | | |     | | | |       | | |     | | | |     |  
  | | |     | | | | +-----------------+ | |     |  
  | | |     | | | | |     | | |     | | | |     |  
  | | |     | | | | | +---------+   | | | |     |  
  | | |     | | | | | |   | | | |   | | | |     |  
  | | |     | | | | | |   +-------+ | | | |     |  
  | | |     | | | | | |   | | | | | | | | |     |  
  | | +-------------------------------------+   |  
  | | |     | | | | | |   | | | | | | | | | |   |  
  | | |     | | | | | |   | | | | | +---+ | |   |  
  | | |     | | | | | |   | | | | | | | | | |   |  
  | | +---------+ | | |   | | | | | | | | | |   |  
  | | |     | | | | | |   | | | | | | | | | |   |  
+-----------------------+ | | | | | | | | | |   |  
| | | |     | | | | | | | | | | | | | | | | |   |  
| | | |     | | | | | | | | | | | | | | | | | +---+
| | | |     | | | | | | | | | | | | | | | | | | | |
| | | | +-----------------+ | | | | | | | | | | | |
| | | | |   | | | | | | | | | | | | | | | | | | | |
| | | | | +-----------------------+ | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | |
A C B E D G F I H K J M L O N Q P S R U T W V Y X Z
Keith Randall
fuente