Giúp ông Jones tận hưởng chuyến đi khứ hồi bằng xe đạp


18

Ông Jones muốn thực hiện một chuyến đi khứ hồi bằng xe đạp của mình. Anh ta muốn đến thăm một số thành phố theo thứ tự tùy ý, nhưng tuyến đường của anh ta không được tự đi qua, vì anh ta ghét phải ở cùng một nơi hai lần trong các ngày lễ của mình. Vì anh ấy thực sự thích đạp xe, chiều dài của tuyến đường của anh ấy hoàn toàn không liên quan, nhưng anh ấy không thích lái xe quanh cảnh quan mà không có mục tiêu. Con đường anh ấy thích là từ thành phố theo đường thẳng đến nơi khác, không có đường vòng.

Vì Mr Jones là một tay golf đam mê mã, anh ta muốn bạn tìm một chương trình, kế hoạch một chuyến đi khứ hồi cho anh ta, đưa ra một loạt các thành phố. Đầu vào có dạng A (B|C). Alà tên của thành phố BClà tọa độ của nó. Bạn có thể giả sử rằng tọa độ là dương và nhỏ hơn 1000. Các tập dữ liệu cho các thành phố được phân tách bằng dòng. Đây là một ví dụ, về cách một đầu vào ví dụ có thể trông như thế nào:

Một số (1 | 10)
ACity (3 | 4)
Bất cứ nơi nào (7 | 7)
Nhà (5 | 1)

Ông Jones không phải là người phạm tội, ông chỉ muốn có một chương trình hữu ích. Do đó, bạn có thể tự quyết định đầu ra trông như thế nào, miễn là nó phù hợp với các tiêu chí này:

  • Đầu ra là một bản đồ của các thành phố, với tuyến đường được vẽ giữa chúng. Nếu bất cứ điều gì là chính xác, tuyến đường không nên tự trùng lặp và sẽ kết thúc ở nơi nó bắt đầu
  • Các tọa độ giống như trong lập trình thông thường: (1 | 1) nằm ở góc NW. Thêm loại thước kẻ vào viền bản đồ, để dễ đọc
  • Tên thành phố phải được ghi trên bản đồ, nhưng vui lòng sử dụng các chữ viết tắt được giải thích ở một nơi khác trên bản đồ
  • Bản đồ có thể là cả nghệ thuật ASCII hoặc hình ảnh
  • Giữ đầu ra dễ đọc

Một đầu ra có thể trông như thế này:

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

A:
B: ACity
C: bất cứ nơi nào
D: nhà

Chương trình có số char nhỏ nhất sẽ thắng. Tôi không đếm các tham số cho trình biên dịch / trình thông dịch, nếu chúng cần để biên dịch, nhưng xin đừng lạm dụng quy tắc này. Quy tắc golf thông thường áp dụng.

Đây là một thử nghiệm khác. Đầu ra của bạn không phải phù hợp với tôi, bạn cũng không phải chọn con đường giống như tôi. Đầu ra được vẽ bằng tay và hiển thị một đầu ra có thể. Đầu vào:

nhà (5 | 7)
siêu thị (13 | 12)
công viên (15 | 5)
quảng trường mới (9 | 16)
nhà của bạn bè (20 | 11)
lâu đài cổ (14 | 21)
ven sông (1 | 20)
bãi biển (10 | 1)
rạp chiếu phim (21 | 18)
rừng (23 | 7)
hòn đảo nhỏ (21 | 1)
bảo tàng golf-code (6 | 25)
sân bay (18 | 25)
quán trà (24 | 14)
nhà hàng (24 | 22)
cây cầu lớn (3 | 12)
Tòa nhà SO (25 | 9)

Và đây là một ví dụ đầu ra:

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

Một ngôi nhà
B: siêu thị
C: công viên
D: quảng trường mới
E: nhà của bạn
F: lâu đài cổ
G: ven sông
H: bãi biển
Tôi: rạp chiếu phim
J: rừng
K: hòn đảo nhỏ
L: bảo tàng golf-code
M: sân bay
N: quán trà
O: nhà hàng
P: cây cầu vĩ đại
Q: Tòa nhà SO

Tôi không phải là người bản ngữ nói tiếng Anh. Hãy sửa ngôn ngữ và ngữ pháp của tôi, nếu cần thiết.

Câu trả lời:


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

Đây chỉ là một bản bóp nhanh của bản gốc (xem bên dưới). Rất nhiều môn đánh gôn có lẽ vẫn có thể loại bỏ rất nhiều thao tác xếp hạng và quyền anh vô dụng.

Chỉ báo trước: Thước chỉ là chữ số cuối cùng không giống như đầu ra ví dụ.

Chỉnh sửa: Sửa lỗi - Các thành phố có nhãn sai (và không theo thứ tự alpha trên bản đồ).

Chỉnh sửa 2: Loại bỏ tất cả các loại trò chơi ngựa và tomfoolery để tiết kiệm 69 ký tự.

Đầu ra (Nguyên văn, từ tập lệnh thử nghiệm):

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

Ungolfed gốc:

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)

Bạn biết, câu hỏi nêu rõ, đầu ra chủ yếu là dạng tự do, vì vậy bạn không phải giữ một thứ tự cụ thể của nhãn.
FUZxxl

@FUZxxl: Đó không phải là thứ tự, đó là các thành phố bị dán nhãn sai (vị trí sai)
Jesse Millikan

1
Bạn thắng. (15 ký tự)
FUZxxl

2
Một bình luận phải có ít nhất 15 ký tự. Vì tôi muốn nói với bạn rằng bạn đã thắng nhiệm vụ của tôi và thông điệp đơn giản »Bạn thắng.« Ngắn hơn 15, tôi phải thêm văn bản này.
FUZxxl

2
Chà, tôi mừng vì chúng tôi đã có cuộc nói chuyện nhỏ này.
Jesse Millikan

21

Haskell, 633 ký tự

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

Khá dài cho môn đánh gôn, nhưng tạo ra một bản đồ SVG đáng yêu: Tuyến đường của ông Jones

Hoặc, nếu trình duyệt của bạn không thể xử lý SVG, PNG của hình ảnh đó: Tuyến đường của ông Jones


  • Chỉnh sửa: (648 -> 633) bản vẽ tọa độ nội tuyến và có thể vẽ nhiều hơn mức cần thiết, cho phép chúng được cắt bởi viewBox; cũng có một vài thủ thuật golf ở đây và đó.

Làm thế nào về tước bỏ các công cụ xmlns? Một số người xem không cần nó.
FUZxxl

1
Không có trình duyệt nào tôi có sẽ hiển thị SVG với tuyên bố xmlns.
MtnViewMark

Hừm ... ít nhất là đôi mắt của gnome sẽ làm. (Mặc dù đó không phải là trình duyệt)
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])

(Lưu ý: Tôi không bao gồm hai dòng đầu tiên trong số byte, tôi coi chúng là "tham số trình thông dịch". Nhưng tôi đã tự tính phí cho độ dài utf-8 của chương trình theo byte.)

Trên ví dụ thứ hai của bạn, tôi sản xuất:

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, glyphs Unicode!


Ôi ... đó không phải là cách tôi muốn chuyến đi xe đạp của mình. Ban đầu, tôi dự định chỉ cho phép tuyến đường ngắn nhất giữa hai thành phố, nhưng tôi quên mất hạn chế này. Nếu bạn đồng ý, tôi muốn viết lại câu hỏi, để chỉ cho phép các tuyến trực tiếp giữa hai thành phố.
FUZxxl

1
Chắc chắn, điều đó sẽ ổn thôi. Đó không phải là giải thưởng tiền mặt :)
Keith Randall

Thanl bạn rất nhiều. Tôi rất xin lỗi vì đã làm cho mục nhập của bạn sai, thay vào đó bạn nhận được một mức giá đặc biệt.
FUZxxl

6

Python, 1074 byte

Ok, đã dành quá nhiều byte (và thời gian) để có đường dẫn hợp lý để làm việc.

#!/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])

Mặc dù tạo ra những con đường đẹp:

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


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

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     └──────────────────────────┘

Đó là một trong những tốt đẹp, mặc dù nó không sử dụng kết nối ngắn nhất có thể giữa hai thành phố.
FUZxxl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.