Bantu Tuan Jones menikmati pulang pergi sepedanya


18

Tuan Jones ingin melakukan perjalanan pulang pergi dengan sepedanya. Dia ingin mengunjungi beberapa kota dalam urutan sewenang-wenang, tetapi rutenya tidak boleh melintasinya sendiri, karena dia benci berada di tempat yang sama dua kali dalam liburannya. Karena ia benar-benar suka bersepeda, panjang rutenya benar-benar tidak relevan, tetapi ia tidak suka mengemudi di sekitar bentang alam tanpa target. Rute yang dia suka adalah dari kota dalam garis lurus ke yang lain, tanpa jalan memutar.

Karena Tuan Jones adalah pegolf kode yang bergairah, dia ingin Anda menemukan sebuah program, yang merencanakan perjalanan pulang-pergi untuknya, dengan serangkaian kota. Input memiliki formulir A (B|C). Aadalah nama kota, Bdan Cmerupakan koordinatnya. Anda dapat mengasumsikan, bahwa koordinatnya positif dan kurang dari 1000. Kumpulan data untuk kota-kota dipisahkan oleh garis. Berikut ini contoh, bagaimana contoh input terlihat:

SomeTown (1 | 10)
ACity (3 | 4)
Dimanapun (7 | 7)
Beranda (5 | 1)

Tuan Jones tidak bertele-tele, dia hanya ingin memiliki program yang bermanfaat. Dengan demikian, Anda dapat memutuskan sendiri bagaimana outputnya, asalkan memenuhi kriteria berikut:

  • Outputnya adalah peta kota-kota, dengan rute yang diambil di antara mereka. Jika ada yang benar, rute tidak boleh tumpang tindih dan harus berakhir di tempat dimulainya
  • Koordinatnya seperti pada pemrograman biasa: (1 | 1) ada di sudut NW. Tambahkan semacam penggaris ke perbatasan peta, untuk memudahkan membacanya
  • Nama-nama kota harus dituliskan di peta, tetapi jangan ragu untuk menggunakan singkatan yang dijelaskan di tempat lain di peta
  • Peta dapat berupa seni ASCII atau gambar
  • Biarkan hasilnya mudah dibaca

Output mungkin terlihat seperti ini:

  1234567
 1 D  
 2 * * 
 3 * * 
 4 B *
 5 * *
 6 * *
 7 * C
 8 * ** 
 9 * *   
10A **

A: SomeTown
B: ACity
C: Dimanapun
D: Rumah

Program dengan jumlah char terkecil menang. Saya tidak menghitung parameter ke kompiler / juru bahasa, jika mereka diperlukan untuk kompilasi, tapi tolong jangan menyalahgunakan aturan ini. Aturan golf kode biasa berlaku.

Ini testcase lain. Output Anda tidak harus cocok dengan milik saya, Anda juga tidak harus memilih jalur yang sama dengan saya. Output ditarik dengan tangan dan menunjukkan kemungkinan output. Memasukkan:

home (5 | 7)
supermarket (13 | 12)
park (15 | 5)
alun-alun baru (9 | 16)
rumah teman (20 | 11)
benteng tua (14 | 21)
riverside (1 | 20)
pantai (10 | 1)
bioskop (21 | 18)
hutan (23 | 7)
pulau kecil (21 | 1)
museum kode-golf (6 | 25)
bandara (18 | 25)
kedai teh (24 | 14)
restoran (24 | 22)
jembatan besar (3 | 12)
SO building (25 | 9)

Dan ini adalah contoh output:

           1111111111222222
  1234567890123456789012345
 1 H * * K    
 2 * * * *   
 3 * * * *   
 4 * * ** *   
 5 * C *   
 6 * *   
 7 AJ  
 8 * *  
 9 * Q
10 * *
11 * *** E *
12 PB *** * * 
13 * * * * 
14 * * * N 
15 * * * * 
16 * D * * 
17 * * * * 
18 * * I * 
19 * * * * 
20G * * * 
21 * F * *
22 * ** * O 
23 * ** * **  
24 * ** * *    
25 L ** M **

Sebuah rumah
B: supermarket
C: taman
D: alun-alun baru
E: rumah teman
F: puri lama
G: tepi sungai
H: pantai
I: bioskop
J: hutan
K: pulau kecil
L: museum kode-golf
M: bandara
N: toko teh
O: restoran
P: jembatan besar
T: BEGITU membangun

Saya bukan penutur asli bahasa Inggris. Jangan ragu untuk memperbaiki bahasa dan tata bahasa saya, jika perlu.

Jawaban:


9

J, 357 288

m=:>:>./c=:>1{"1 p=:([:<`([:<1-~[:".;._1'|',}:);._1'(',]);._2(1!:1)3
'n c'=:|:o=:p/:12 o.j./"1 c-"1(+/%#)c
C=:<"1 c
L=:u:65+i.#o
g=:<"1;c([:<@|:0.5<.@+[+>@])"1(-~/"2(<@:*]%~i.@>:@])"0([:>./|@-/)"2)>C,"0(1|.C)
echo(u:48+10|i.>:0{m),|:(u:48+10|>:i.1{m),L C}'*'g}m$' '
echo' ',L,.':',.' ',.n

Ini hanya penjabaran cepat dari yang asli (lihat di bawah). Banyak bermain golf mungkin masih memungkinkan untuk menghilangkan banyak manipulasi peringkat yang tidak berguna dan tinju.

Hanya peringatan: Penggaris hanyalah digit terakhir tidak seperti contoh keluaran.

Edit: Perbaikan bug - Kota memiliki label yang salah (dan tidak berurutan pada peta).

Sunting 2: Menghapus segala macam permainan kuda dan omong kosong untuk menghemat 69 karakter.

Output (Verbatim, dari skrip uji):

First example: 
01234567
1    B  
2   **  
3   * * 
4  A  * 
5  *  * 
6 *    *
7 *    C
8 *  ** 
9* **   
0D*     

A: ACity    
B: Home     
C: Wherever 
D: SomeTown 

Second example:
012345678901234567890123456789012
1         D          F           
2        * *       ***           
3       *   **    *  *           
4       *     * **   *           
5      *       E     *           
6     *              *           
7    C              *          *I
8     **            *      ***** 
9       *           *   *H*   *  
0        **         * **     *   
1          **       G*     **    
2  A*********B            *      
3   **                   *       
4     *                 J        
5      **              *         
6        Q             *         
7      **             *          
8    **              K           
9  **                 *          
0P*                    *         
1 *           N        *         
2  *        ** *        L        
3   *     **    *     **         
4    *  **       *  **           
5     O*          M*             

A: great bridge        
B: supermarket         
C: home                
D: beach               
E: park                
F: little island       
G: friend's house      
H: SO building         
I: forest              
J: tea-shop            
K: cinema              
L: restaurant          
M: airport             
N: old castle          
O: museum of code-golf 
P: riverside           
Q: new plaza           
   End Second

Asli yang tidak digabungkan:

coords =: > 1 {" 1 parsed =: ([:<`([:<[:".;._1'|',}:);._1'(',]);._2 (1!:1)3

center =: (+/%#) coords
max =: >:>./ coords
angles =:  12 o. j./"1 coords -"1 center
ordered =: parsed /: angles
paths =: >(],"0(1)|.]) 1 {" 1 ordered

path_grid_lengths =: ([:>./|@-/)"2 paths
path_grid_interval =: ([:<]%~i.@>:@|)"0 path_grid_lengths
path_grid_distances =: -~/"2 paths
path_grid_steps =: path_grid_distances ([:<[*>@])"0 path_grid_interval

path_grid_points_sortof =: (> 1{"1 ordered) ([:<0.5<.@+[+>@])"0 path_grid_steps
path_grid_points =: <"1;([:<>@[,.>@])/"1 path_grid_points_sortof

graph_body =: }."1}. (u:65+i.#ordered) (1{"1 ordered) } '*' path_grid_points} max $ ' '

axis_top =: |:(":"0)10|}.i. 1{max
axis_side =: (":"0)10|i. 0{max

echo |:(axis_side) ,"1 axis_top, graph_body
echo ''
echo (u:65+i.#parsed),.':',.' ',.(> 0{"1 ordered)

Anda tahu, pertanyaannya menyatakan, bahwa output sebagian besar bentuknya unik, jadi Anda tidak harus menjaga urutan label tertentu.
FUZxxl

@FUZxxl: Ini bukan urutannya, melainkan bahwa kota-kota tersebut diberi label salah (posisi salah)
Jesse Millikan

1
Kamu menang. (15 chars)
FUZxxl

2
Komentar harus memiliki setidaknya 15 karakter. Karena saya ingin memberi tahu Anda, bahwa Anda memenangkan tugas saya, dan pesan sederhana »Anda menang.« Lebih pendek dari 15, saya harus menambahkan teks ini.
FUZxxl

2
Yah, aku senang kita bicara sedikit ini.
Jesse Millikan

21

Haskell, 633 karakter

import List
c n=n>>=(++" ").show.(*3)
(x&y)l="<text x='"++c[x]++"' y='"++c[y]++"'>"++l++"</text>"
f%p=[a-1,b+2,(a+b)/2]where n=map(f.fst)p;a=minimum n;b=maximum n
s p=concat["<svg xmlns='http://www.w3.org/2000/svg' viewBox='",c[i,m-1,j,n],"'><polygon fill='none' stroke='#c8c' points='",c$snd=<<(sort$map a p),"'/><g font-size='1' fill='#bbb'>",(\x->(x&m$show x)++(i&x$show x))=<<[floor(i`min`m)..ceiling(j`max`n)],"</g><g font-size='2'>",snd=<<p,"</g></svg>"]where a((x,y),_)=(atan2(x-q)(y-r),[x,y]);[i,j,q,m,n,r]=fst%p++snd%p
w(l,s)=((x,y),(x&y)l)where(x,r)=v s;(y,_)=v r
v=head.reads.tail
main=interact$s.map(w.break(=='(')).lines

Agak gemar kode-golf, tetapi menghasilkan peta SVG yang indah: Rute Tuan Jones

Atau, jika browser Anda tidak dapat menangani SVG, PNG dari gambar itu: Rute Tuan Jones


  • Sunting: (648 -> 633) gambar koordinat in-line, dan mungkin menggambar lebih dari yang dibutuhkan, membiarkannya dipotong oleh viewBox; juga beberapa trik golf di sana-sini.

Bagaimana dengan melucuti barang xmlns? Beberapa pemirsa tidak membutuhkannya.
FUZxxl

1
Tidak ada browser yang saya miliki akan menampilkan SVG tanpa deklarasi xmlns.
MtnViewMark

Hm ... setidaknya mata gnome akan berhasil. (Meskipun itu bukan browser)
FUZxxl

12

Python, 516 476 byte

#!/usr/bin/python
#coding=utf-8
import sys
H=V=0
T=[]
k=65
for L in sys.stdin.readlines():
 i,j,K=L.find('('),L.find('|'),'%c'%k
 n,h,v=L[:i-1],int(L[i+1:j]),int(L[j+1:-2])
 H=max(H,h);V=max(V,v);T+=[(K,h,v)];k+=1;print K+':',n
V=V+1&~1
for s in zip(*['%3d'%(i+1)for i in range(H)]):print'   '+''.join(s)
C=H*V*[u'─']
C[0::H]=u'│'*V
C[1::H]=V/2*u'└┌'
C[H-1::H]=V/2*u'┐┘'
C[0:2]=u'┌─'
C[-H:-H+2]=u'└─'
for K,h,v in T:C[v*H-H+h-1]=K
for i in range(V):print'%3d'%(i+1)+''.join(C[i*H:i*H+H])

(Catatan: Saya tidak memasukkan dua baris pertama dalam hitungan byte, saya menganggapnya sebagai "parameter penerjemah". Tetapi saya mengisi sendiri untuk panjang utf-8 dari program dalam byte.)

Pada contoh kedua Anda, saya menghasilkan:

A: home
B: supermarket
C: park
D: new plaza
E: friend's house
F: old castle
G: riverside
H: beach
I: cinema
J: forest
K: little island
L: museum of code-golf
M: airport
N: tea-shop
O: restaurant
P: great bridge
Q: SO building

            11111111112222222222333
   12345678901234567890123456789012
  1┌────────H──────────K──────────┐
  2│┌─────────────────────────────┘
  3│└─────────────────────────────┐
  4│┌─────────────────────────────┘
  5│└────────────C────────────────┐
  6│┌─────────────────────────────┘
  7│└──A──────────────────────────J
  8│┌─────────────────────────────┘
  9│└──────────────────────Q──────┐
 10│┌─────────────────────────────┘
 11│└─────────────────E───────────┐
 12│┌P─────────B──────────────────┘
 13│└─────────────────────────────┐
 14│┌─────────────────────N───────┘
 15│└─────────────────────────────┐
 16│┌──────D──────────────────────┘
 17│└─────────────────────────────┐
 18│┌──────────────────I──────────┘
 19│└─────────────────────────────┐
 20G┌─────────────────────────────┘
 21│└───────────F─────────────────┐
 22│┌─────────────────────O───────┘
 23│└─────────────────────────────┐
 24│┌─────────────────────────────┘
 25│└───L───────────M─────────────┐
 26└──────────────────────────────┘

Yay, mesin terbang Unicode!


Ooo ... bukan itu yang saya inginkan dari perjalanan sepeda saya. Awalnya, saya berencana untuk mengizinkan rute terpendek antara dua kota saja, tetapi saya lupa batasan ini. Jika Anda setuju, saya ingin menulis ulang pertanyaan, sehingga hanya rute langsung antara dua kota yang diizinkan.
FUZxxl

1
Tentu, itu akan baik-baik saja. Ini bukan hadiah uang tunai :)
Keith Randall

Terima kasih banyak. Saya sangat menyesal membuat entri Anda salah, Anda malah mendapatkan harga khusus.
FUZxxl

6

Python, 1074 byte

Oke, menghabiskan terlalu banyak byte (dan waktu) untuk mendapatkan jalur yang masuk akal untuk bekerja.

#!/usr/bin/python
#coding=utf-8
import sys
H=V=0
T=[]
k=65
R=1000
for L in sys.stdin.readlines():
 i,j,K=L.find('('),L.find('|'),'%c'%k
 n,h,v=L[:i-1],int(L[i+1:j]),int(L[j+1:-2])
 H=max(H,h);V=max(V,v);T+=[(v*R-R+h-1,K)];k+=1;print K+':',n
for s in zip(*['%3d'%(i+1)for i in range(H+1)]):print'   '+''.join(s)
T.sort()
U=reduce(lambda a,x:a[:-1]+[(a[-1][0],x)]if x/R==a[-1][0]/R else a+[(x,x)],[[(T[0][0],T[0][0])]]+map(lambda x:x[0],T))
C=R*V*[' ']
r=0
for x,y in U:C[x:y]=(y-x)*u'─'
for (a,b),(c,d)in zip(U,U[1:]):
 if r:
  if d%R>b%R:x=b/R*R+d%R;C[b:x]=(x-b)*u'─';C[x:d:R]=(d-x)/R*u'│';C[x]=u'┐'
  else:x=d/R*R+b%R;C[d:x]=(x-d)*u'─';C[b:x:R]=(x-b)/R*u'│';C[x]=u'┘'
 else:
  if c%R<a%R:x=a/R*R+c%R;C[x:a]=(a-x)*u'─';C[x:c:R]=(c-x)/R*u'│';C[x]=u'┌'
  else:x=c/R*R+a%R;C[a:x:R]=(x-a)/R*u'│';C[x:c]=(c-x)*u'─';C[x]=u'└'
 r^=1
p=U[0][1];C[p:H]=(H-p)*u'─'
if r:p=U[-1][1];C[p:R*V]=(R*V-p)*u'─'
else:V+=1;C+=[' ']*R;p=U[-1][0]+R;C[p:R*V]=(R*V-p)*u'─';C[p]=u'└'
C[H::R]=u'┐'+u'│'*(V-2)+u'┘'
for p,K in T:C[p]=K
for i in range(V):print'%3d'%(i+1)+''.join(C[i*R:i*R+H+1])

Namun, membuat jalur yang bagus:

A: SomeTown
B: ACity
C: Wherever
D: Home


   12345678
  1  ┌─D──┐
  2  │    │
  3  │    │
  4  B───┐│
  5      ││
  6      ││
  7┌─────C│
  8│      │
  9│      │
 10A──────┘

dan

A: home
B: supermarket
C: park
D: new plaza
E: friend's house
F: old castle
G: riverside
H: beach
I: cinema
J: forest
K: little island
L: museum of code-golf
M: airport
N: tea-shop
O: restaurant
P: great bridge
Q: SO building

            111111111122222222223333
   123456789012345678901234567890123
  1         H──────────K───────────┐
  2         │                      │
  3         │                      │
  4         │                      │
  5         └────C────────────────┐│
  6                               ││
  7    A──────────────────────────J│
  8    │                           │
  9    └───────────────────Q       │
 10                        │       │
 11  ┌────────────────E────┘       │
 12  P─────────B──────────┐        │
 13                       │        │
 14        ┌──────────────N        │
 15        │                       │
 16        D───────────┐           │
 17                    │           │
 18┌───────────────────I           │
 19│                               │
 20G────────────┐                  │
 21             F                  │
 22             └─────────O        │
 23                       │        │
 24                       │        │
 25     L───────────M─────┘        │
 26     └──────────────────────────┘

Itu bagus, meskipun tidak menggunakan koneksi sesingkat mungkin antara dua kota.
FUZxxl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.