Ayuda al señor Jones a disfrutar de su bicicleta ida y vuelta

18

Jones quiere hacer un viaje de ida y vuelta en su bicicleta. Quiere visitar varias ciudades en orden arbitrario, pero su ruta no debe cruzarse por sí misma, ya que odia estar en el mismo lugar dos veces en sus vacaciones. Como realmente ama el ciclismo, la duración de su ruta es completamente irrelevante, pero no le gusta conducir por el paisaje sin un objetivo. La ruta que le gusta es desde una ciudad en línea recta a otra, sin ningún desvío.

Como el Sr. Jones es un apasionado del golf de códigos, quiere que encuentres un programa que planee un viaje de ida y vuelta para él, dado un conjunto de ciudades. La entrada tiene la forma A (B|C). Aes el nombre de una ciudad By Cson sus coordenadas. Puede suponer que las coordenadas son positivas y menos de 1000. Los conjuntos de datos para las ciudades están separados por líneas. Aquí hay un ejemplo de cómo se vería una entrada de ejemplo:

SomeTown (1 | 10)
Ciudad (3 | 4)
Donde sea (7 | 7)
Inicio (5 | 1)

El Sr. Jones no es pedante, solo quiere tener un programa útil. Por lo tanto, puede decidir por sí mismo cómo se ve la salida, siempre que cumpla con estos criterios:

  • El resultado es un mapa de las ciudades, con la ruta dibujada entre ellas. Si algo es correcto, la ruta no debería solaparse y debería terminar donde comenzó
  • Las coordenadas son como en la programación habitual: (1 | 1) está en la esquina NO. Agregue una especie de regla al borde de los mapas, para facilitar su lectura.
  • Los nombres de las ciudades deben escribirse en el mapa, pero puede usar las abreviaturas que se explican en otro lugar del mapa
  • El mapa puede ser tanto ASCII-art como una imagen
  • Mantenga la salida legible

Una salida podría verse así:

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

A: SomeTown
B: ciudad
C: donde sea
D: inicio

El programa con el recuento de caracteres más pequeño gana. No cuento los parámetros para el compilador / intérprete, si son necesarios para la compilación, pero no abuses de esta regla. Se aplican las reglas habituales del código de golf.

Aquí hay otro caso de prueba. Su salida no tiene que coincidir con la mía, ni tiene que elegir el mismo camino que yo. La salida se dibuja a mano y muestra una salida posible. Entrada:

hogar (5 | 7)
supermercado (13 | 12)
parque (15 | 5)
nueva plaza (9 | 16)
casa de un amigo (20 | 11)
antiguo castillo (14 | 21)
a orillas del río (1 | 20)
playa (10 | 1)
cine (21 | 18)
bosque (23 | 7)
pequeña isla (21 | 1)
museo del código-golf (6 | 25)
aeropuerto (18 | 25)
tienda de té (24 | 14)
restaurante (24 | 22)
gran puente (3 | 12)
Edificio SO (25 | 9)

Y este es un ejemplo de salida:

           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 **

Una casa
B: supermercado
C: parque
D: nueva plaza
E: casa de un amigo
F: antiguo castillo
G: Riverside
H: playa
Yo: cine
J: bosque
K: pequeña isla
L: museo del código-golf
M: aeropuerto
N: tienda de té
O: restaurante
P: gran puente
Q: edificio SO

No soy hablante nativo de inglés. Siéntase libre de corregir mi idioma y gramática, si es necesario.

FUZxxl
fuente

Respuestas:

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

Esto es solo una rápida compresión del original (ver más abajo). Probablemente todavía sea posible jugar mucho al golf para eliminar muchas manipulaciones de rangos y boxeo inútiles.

Solo advertencia: la regla es solo el último dígito, a diferencia de la salida de ejemplo.

Editar: corrección de errores: las ciudades tenían etiquetas incorrectas (y no estaban en orden alfa en el mapa).

Edición 2: se eliminaron todo tipo de juegos bruscos y tonterías por un ahorro de 69 caracteres.

Salida (Verbatim, del script de prueba):

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

Original sin golf:

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)
Jesse Millikan
fuente
La pregunta indica que la salida es principalmente de forma libre, por lo que no tiene que mantener un orden específico de las etiquetas.
FUZxxl
@FUZxxl: No es el orden, es que las ciudades fueron etiquetadas incorrectamente (posiciones incorrectas)
Jesse Millikan
1
Tú ganas. (15 caracteres)
FUZxxl
2
Un comentario debe tener al menos 15 caracteres. Como quería decirte que ganaste mi tarea, y el simple mensaje "Tú ganas" es más corto que 15, tuve que agregar este texto.
FUZxxl
2
Bueno, me alegra que hayamos tenido esta pequeña charla.
Jesse Millikan
21

Haskell, 633 caracteres

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

Más bien anhela el código de golf, pero produce un mapa SVG encantador: Ruta del señor Jones

O, si su navegador no puede manejar SVG, un PNG de esa imagen: Ruta del señor Jones


  • Editar: (648 -> 633) dibujo de coordenadas en línea, y posiblemente dibuje más de lo necesario, permitiendo que sean recortados por viewBox; También algunos trucos de golf aquí y allá.
MtnViewMark
fuente
¿Qué tal despojar las cosas xmlns? Algunos espectadores no lo necesitan.
FUZxxl
1
Ningún navegador que tenga mostrará el SVG sin la declaración xmlns.
MtnViewMark
Hm ... al menos los ojos de gnomo serán suficientes. (Aunque no es un navegador)
FUZxxl
12

Pitón, 516 476 bytes

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

(Nota: no incluí las dos primeras líneas en el recuento de bytes, los considero "parámetros de intérprete". Pero sí me cargué por la longitud utf-8 del programa en bytes).

En su segundo ejemplo produzco:

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

¡Sí, glifos Unicode!

Keith Randall
fuente
Ooo ... así no es como me gustaría mi viaje en bicicleta. Originalmente, planeaba permitir la ruta más corta entre dos ciudades solamente, pero olvidé esta restricción. Si está de acuerdo, me gustaría volver a escribir la pregunta, de modo que solo se permitan rutas directas entre dos ciudades.
FUZxxl
1
Claro, eso estaría bien. No es un premio en efectivo :)
Keith Randall
Muchas gracias. Lamento mucho haber hecho un error en su entrada, en su lugar, obtiene un precio especial.
FUZxxl
6

Python, 1074 bytes

Ok, pasé demasiados bytes (y tiempo) obteniendo rutas razonables para trabajar.

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

Sin embargo, hace buenos caminos:

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


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

y

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     └──────────────────────────┘
Keith Randall
fuente
Esa es buena, aunque no utiliza la conexión más corta posible entre dos ciudades.
FUZxxl