ช่วยนายโจนส์เพลิดเพลินไปกับจักรยานไป - กลับ


18

Mr Jones ต้องการเดินทางไปกลับบนจักรยานของเขา เขาต้องการไปหลายเมืองตามอำเภอใจ แต่เส้นทางของเขาจะต้องไม่ข้ามไปเองเนื่องจากเขาเกลียดที่จะอยู่ที่เดิมสองครั้งในช่วงวันหยุด ในขณะที่เขารักการขี่จักรยานความยาวเส้นทางของเขาไม่เกี่ยวข้องอย่างสมบูรณ์ แต่เขาไม่ชอบขับรถไปรอบ ๆ ภูมิประเทศโดยไม่มีเป้าหมาย เส้นทางที่เขาชอบมาจากในเมืองเป็นเส้นตรงไปยังอีกเส้นทางหนึ่งโดยไม่มีทางอ้อม

เนื่องจาก Mr Jones เป็นนักกอล์ฟที่หลงใหลในรหัสเขาจึงต้องการให้คุณหาโปรแกรมที่วางแผนการเดินทางไปกลับให้กับเขาตามเมืองต่างๆ A (B|C)การป้อนข้อมูลที่มีรูปแบบ Aเป็นชื่อเมืองBและCเป็นพิกัด คุณอาจสันนิษฐานว่าพิกัดนั้นเป็นค่าบวกและน้อยกว่า 1,000 ชุดข้อมูลสำหรับเมืองจะถูกคั่นด้วยเส้น นี่คือตัวอย่างลักษณะของอินพุตตัวอย่างที่อาจมีลักษณะ:

บางเมือง (1 | 10)
ACity (3 | 4)
ทุกที่ (7 | 7)
บ้าน (5 | 1)

Mr Jones ไม่ใช่คนที่คลั่งไคล้เขาเพียงต้องการมีโปรแกรมที่มีประโยชน์ ดังนั้นคุณอาจตัดสินใจเองว่าผลลัพธ์จะออกมาเป็นอย่างไรตราบใดที่มันตรงตามเกณฑ์เหล่านี้:

  • เอาท์พุทเป็นแผนที่ของเมืองที่มีเส้นทางวาดระหว่างพวกเขา หากมีสิ่งใดถูกต้องเส้นทางไม่ควรทับซ้อนกันและควรสิ้นสุดที่จุดเริ่มต้น
  • พิกัดเหมือนการเขียนโปรแกรมปกติ: (1 | 1) อยู่ในมุม NW เพิ่มไม้บรรทัดชนิดหนึ่งลงในเส้นขอบแผนที่เพื่อให้ง่ายต่อการอ่าน
  • ต้องเขียนชื่อเมืองลงบนแผนที่ แต่อย่าลังเลที่จะใช้ตัวย่อที่อธิบายที่อื่นบนแผนที่
  • แผนที่สามารถเป็นได้ทั้ง ASCII-art หรือรูปภาพ
  • เก็บเอาต์พุตที่อ่านได้

ผลลัพธ์อาจมีลักษณะเช่นนี้:

  1234567
 1 วัน  
 2 * * 
 3 * * 
 4 B *
 5 * *
 6 * *
 7 * C
 8 * ** 
 9 * *   
10A **

ตอบ: ได้บ้าง
B: ACity
C: ทุกที่
D: บ้าน

โปรแกรมที่มีจำนวนถ่านที่น้อยที่สุดชนะ ฉันไม่นับพารามิเตอร์ให้กับคอมไพเลอร์ / ล่ามหากพวกเขาจำเป็นสำหรับการรวบรวม แต่โปรดอย่าละเมิดกฎนี้ ใช้กฎการเล่นกอล์ฟแบบรหัสปกติ

นี่คือตัวอย่างอื่น ผลลัพธ์ของคุณไม่จำเป็นต้องตรงกับของฉันและคุณไม่ต้องเลือกเส้นทางเดียวกับฉัน เอาต์พุตถูกวาดด้วยมือและแสดงเอาต์พุตที่เป็นไปได้ การป้อนข้อมูล:

บ้าน (5 | 7)
ซุปเปอร์มาร์เก็ต (13 | 12)
สวนสาธารณะ (15 | 5)
พลาซ่าใหม่ (9 | 16)
เพื่อนของ (20 | 11)
ปราสาทเก่า (14 | 21)
ริมแม่น้ำ (1 | 20)
ชายหาด (10 | 1)
โรงหนัง (21 | 18)
ป่า (23 | 7)
เกาะเล็ก ๆ (21 | 1)
พิพิธภัณฑ์ code-golf (6 | 25)
สนามบิน (18 | 25)
ร้านน้ำชา (24 | 14)
ร้านอาหาร (24 | 22)
สะพานที่ดี (3 | 12)
อาคาร SO (25 | 9)

และนี่คือตัวอย่างเอาต์พุต:

           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 * * ฉัน * 
19 * * * * 
20G * * * 
21 * F * *
22 * ** * O 
23 * ** * **  
24 * ** * *    
25 L ** M **

บ้าน
B: ซุปเปอร์มาร์เก็ต
C: สวนสาธารณะ
D: พลาซ่าใหม่
E: บ้านเพื่อน
F: ปราสาทเก่า
G: ริมแม่น้ำ
H: ชายหาด
ฉัน: โรงหนัง
J: ป่า
K: เกาะเล็ก ๆ
L: พิพิธภัณฑ์แห่งการรหัสกอล์ฟ
M: สนามบิน
N: ร้านชา
O: ร้านอาหาร
P: สะพานที่ดี
Q: อาคาร SO

ฉันไม่ใช่เจ้าของภาษาอังกฤษ รู้สึกฟรีเพื่อแก้ไขภาษาและไวยากรณ์ของฉันหากจำเป็น

คำตอบ:


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

นี่เป็นเพียงการบีบอัดต้นฉบับอย่างรวดเร็ว (ดูด้านล่าง) การเล่นกอล์ฟจำนวนมากยังคงเป็นไปได้ที่จะกำจัดยักย้ายยศและมวยที่ไร้ประโยชน์มากมาย

ข้อแม้เท่านั้น: ไม้บรรทัดเป็นตัวเลขหลักสุดท้ายซึ่งแตกต่างจากตัวอย่างเอาต์พุต

แก้ไข: แก้ไขข้อผิดพลาด - เมืองมีป้ายกำกับที่ไม่ถูกต้อง (และไม่อยู่ในลำดับที่บนแผนที่)

แก้ไข 2:ลบ horseplay และ tomfoolery ทุกประเภทออกเพื่อประหยัด 69 ตัว

เอาท์พุท (คำต่อคำจากสคริปต์ทดสอบ):

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 ดั้งเดิม:

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)

คุณรู้คำถามระบุว่าผลลัพธ์ส่วนใหญ่เป็นรูปแบบอิสระดังนั้นคุณไม่จำเป็นต้องรักษาลำดับเฉพาะของป้ายกำกับไว้
FUZxxl

@FUZxxl: ไม่ใช่คำสั่งมันเป็นเพราะเมืองถูกระบุว่าผิด (ตำแหน่งผิด)
Jesse Millikan

1
คุณชนะ. (15 ตัวอักษร)
FUZxxl

2
ความคิดเห็นต้องมีอย่างน้อย 15 ตัวอักษร เนื่องจากฉันต้องการบอกคุณว่าคุณชนะงานของฉันและข้อความธรรมดา»คุณชนะ«น้อยกว่า 15 ปีดังนั้นฉันจึงต้องเพิ่มข้อความนี้
FUZxxl

2
ฉันดีใจที่เราคุยกันเล็กน้อย
Jesse Millikan

21

Haskell, 633 ตัวอักษร

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

ค่อนข้างยาวสำหรับรหัสกอล์ฟ แต่สร้างแผนที่ SVG ที่น่ารัก: เส้นทางของ Mr Jones

หรือหากเบราว์เซอร์ของคุณไม่สามารถจัดการ SVG ได้ PNG ของภาพนั้น: เส้นทางของ Mr. Jones


  • แก้ไข: (648 -> 633) ในสายการผลิตประสานงานการวาดภาพและวาดอาจเกินความจำเป็นให้พวกเขาถูกตัดโดยviewBox; นอกจากนี้ยังมีเทคนิคการเล่นกอล์ฟไม่กี่ที่นี่และที่นั่น

วิธีการเกี่ยวกับการลอกสิ่ง xmlns? ผู้ชมบางคนไม่ต้องการมัน
FUZxxl

1
ฉันจะไม่แสดงเบราว์เซอร์ SVG โดยไม่มีการประกาศ xmlns
MtnViewMark

หืม ... อย่างน้อยตาของคำพังเพยจะทำ (แม้ว่าจะไม่ใช่เบราว์เซอร์)
FUZxxl

12

Python 516 476 ไบต์

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

(หมายเหตุ: ฉันไม่ได้รวมสองบรรทัดแรกในจำนวนไบต์ฉันพิจารณา "พารามิเตอร์ตัวแปล" แต่ฉันคิดค่าใช้จ่ายตามความยาว utf-8 ของโปรแกรมเป็นไบต์)

ในตัวอย่างที่สองของคุณฉันผลิต:

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

ยายร่ายมนตร์ Unicode!


Ooo ... นั่นไม่ใช่วิธีที่ฉันต้องการขี่จักรยานของฉัน แต่เดิมฉันวางแผนที่จะอนุญาตเส้นทางที่สั้นที่สุดระหว่างสองเมืองเท่านั้น แต่ฉันลืมข้อ จำกัด นี้ หากคุณเห็นด้วยฉันต้องการเขียนคำถามใหม่เพื่อให้อนุญาตเส้นทางตรงระหว่างสองเมืองเท่านั้น
FUZxxl

1
แน่นอนว่าจะไม่เป็นไร ไม่ใช่รางวัลเงินสด :)
Keith Randall

ขอบคุณท่านมาก ฉันขอโทษที่ทำให้รายการของคุณผิดคุณจะได้รับราคาพิเศษแทน
FUZxxl

6

Python 1074 ไบต์

ตกลงใช้เวลามากเกินไปทาง (และเวลา) ในการรับเส้นทางที่เหมาะสมในการทำงาน

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

ทำให้เป็นเส้นทางที่ดีแม้ว่า:

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

อันนั้นดีแม้ว่ามันจะไม่ใช้การเชื่อมต่อที่สั้นที่สุดเท่าที่จะเป็นไปได้ระหว่างสองเมือง
FUZxxl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.