ASCII-memvisualisasikan grafik

8

Misi Anda, jika Anda memilih untuk menerimanya, adalah dengan memasukkan serangkaian pasangan titik yang membentuk grafik, seperti ini:

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

Anda kemudian harus mengeluarkan visualisasi ASCII dari grafik.

Misalnya, A,B C,A C,Dbisa:

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

Sunting: Sesuai komentar, berikut adalah beberapa batasan input:

  • setiap node memiliki paling banyak 5 koneksi (+20 jika Anda dapat menangani lebih banyak)
  • grafiknya adalah planar, yaitu tidak ada garis silang (+200 jika Anda dapat menangani satu crossover!)
  • paling banyak ada 16 node (+20 jika Anda dapat menangani lebih banyak)

Skor Anda adalah 999 - (panjang kode Anda) + (bonus apa pun) .

Mulai mesin Anda :)

Soham Chowdhury
sumber
code-golf,, code-challengeatau apa? Dan apa kriteria / kriteria yang menang?
Paul R
code-golf/ 10char
Soham Chowdhury
1
Apakah grafik dijamin planar? Apakah representasi ASCII harus planar? (Jika demikian, ini tugas yang cukup menantang).
Peter Taylor
1
@SohamChowdhury: Planar berarti dapat ditarik tanpa melewati garis.
marinus
2
Ini adalah tantangan yang sangat luas dan sulit saat ini. Alat-alat seperti graphviz dan search.cpan.org/~tels/Devel-Graph-0.12/lib/Devel/Graph.pm telah dirancang untuk jenis pekerjaan ini. Saya juga mencoba melakukan sesuatu yang serupa di masa lalu tetapi gagal. Aturan tambahan bahwa grafik planar dan node memiliki paling banyak 4 koneksi akan membuat ini tantangan golf kode yang jauh lebih masuk akal.
shiona

Jawaban:

7

Python 3, 168 karakter, Skor = 999- 168 + 240 = 1071

Persingkat jawaban Keith Randalls sangat singkat .

  1. Dalam Python 3, printadalah fungsi, dan karenanya dapat disingkat p=print. Menghemat 3 * (4 - 1) - 8 = 1karakter.

  2. Dalam Python 3, inputdigunakan sebagai pengganti raw_input, menyimpan 4 karakter.

  3. Alih-alih ' '*len(V)Anda dapat menggunakan ' '*80(atau yang serupa). Ini mengarah pada peningkatan jumlah ruang gerak, tetapi siapa yang peduli ... jika itu menyelamatkan 4 karakter lainnya!

  4. Sekarang menjadi menarik: Alih-alih string, gunakan daftar! Ini membuat pembaruan menjadi Slebih mudah, tetapi agak mempersulit pencetakan. Saya akan memanggil daftar Tjadi saya tidak akan bingung dengan string Sdari marinus.

  5. Mari kita mulai dengan mengubah simpul menjadi daftar, bukan string yang dipisahkan ruang, yang menyimpan 4 karakter. Baris output Tharus menjadi daftar ( T=[' ']*40), yang biayanya 2 karakter.

  6. Pencetakan baris saat ini T menjadi 5 karakter lagi: saya perlu kurung untuk menggabungkan daftar string dengan benar, saya perlu dua -karakter (karena x dan y hanya sekitar setengah besar sekarang), dan aku butuh *untuk membuat printfungsi take elemen daftar sebagai argumen yang terpisah dan mencetaknya dipisahkan dengan spasi (dan bukan sebagai daftar!). (Langkah ini sulit .)

  7. Baris saat ini dapat diperbarui dengan sederhana T[x]=T[y]="|"alih-alih S=S[:x]+'|'+S[x+1:y]+'|'+S[y+1:], yang menyimpan 19 karakter.

  8. Untuk mencetak Tlagi, dan untuk pencetakan titik terakhir dari simpul, tanda bintang diperlukan, yang harganya 2 karakter.

  9. Dan ketika saya sedang mengetik ini, saya melihat bahwa tidak ada salahnya memiliki simpul tak terlihat yang tidak terhubung ( ' '). Ini memungkinkan untuk membuat set simpul lebih pendek, menghemat 4 karakter lebih banyak.

Secara keseluruhan, penghematannya adalah 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)

Contoh yang menunjukkan efek 9 .: input A,B A,Cmengarah ke output

+-----+                                                                        
|     |                                                                        
+---+ |                                                                        
|   | |                                                                        
A   C B
Pasang kembali Monica
sumber
1
Saya awalnya memiliki S dan T sebagai daftar, tetapi dalam python 2 Anda membutuhkan ''.join()sampah yang membuatnya lebih lama. Saya tidak tahu *Tbenda itu ada di python3. Golf berikutnya ...
Keith Randall
19

APL ( 171 166 162 karakter, semua bonus: 999 - 171 166 162 + 20 + 20 + 200 = 1068 1073 1077)

Ini adalah program APL golf terpanjang yang saya tulis sejauh ini. Ini mungkin sedikit curang, tetapi tidak ada dalam pertanyaan yang benar-benar melarang ini. Apa yang saya lakukan adalah meletakkan semua node pada garis vertikal dan menggambar grafik sebagai diagram busur. Ini jelas masih berupa grafik.

Saya masih butuh beberapa jam.

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

Node harus berupa huruf besar tunggal, sehingga mendukung maksimum 26 node. Ia dapat menangani garis yang dilintasi, dan setiap node dapat memiliki koneksi sebanyak yang akan ditangani oleh layar.

Contoh output:

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
sumber
Itu kira-kira apa yang saya pikirkan untuk dilakukan (dan mungkin belum dilakukan). Hanya cara singkat yang jelas untuk menanganinya.
Peter Taylor
3
Bagi saya, ini adalah misteri bagaimana orang menulis APL. +1
Soham Chowdhury
7

Python, 195 karakter, skor = 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

Setiap tepi mendapat satu baris. S adalah string dengan koneksi vertikal yang perlu kita pertahankan saat kita membuat grafik.

Berikut beberapa contoh input / output:

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

dan dicuri dari 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
sumber