Aidez M. Jones à profiter de son aller-retour à vélo

18

M. Jones veut faire un aller-retour sur son vélo. Il veut visiter plusieurs villes dans un ordre arbitraire, mais son itinéraire ne doit pas le traverser lui-même, car il déteste être au même endroit deux fois pendant ses vacances. Comme il aime vraiment le vélo, la longueur de son parcours est complètement hors de propos, mais il n'aime pas conduire dans le paysage sans cible. L'itinéraire qu'il aime est d'une ville en ligne droite à l'autre, sans aucun détour.

Comme M. Jones est un golfeur passionné de code, il veut que vous trouviez un programme, qui prévoit un aller-retour pour lui, étant donné un ensemble de villes. L'entrée a la forme A (B|C). Aest le nom d'une ville, Bet Csont ses coordonnées. Vous pouvez supposer que les coordonnées sont positives et inférieures à 1 000. Les ensembles de données pour les villes sont séparés par des lignes. Voici un exemple, à quoi pourrait ressembler un exemple d'entrée:

SomeTown (1 | 10)
ACity (3 | 4)
Partout (7 | 7)
Accueil (5 | 1)

M. Jones n'est pas pédant, il veut juste avoir un programme utile. Ainsi, vous pouvez décider par vous-même à quoi ressemble la sortie, tant qu'elle répond à ces critères:

  • Le résultat est une carte des villes, avec l'itinéraire tracé entre elles. Si quelque chose est correct, l'itinéraire ne doit pas se chevaucher et doit se terminer là où il a commencé
  • Les coordonnées sont comme dans la programmation habituelle: (1 | 1) est dans le coin NW. Ajoutez une sorte de règle à la bordure des cartes pour en faciliter la lecture
  • Les noms des villes doivent être écrits sur la carte, mais n'hésitez pas à utiliser des abréviations qui sont expliquées ailleurs sur la carte
  • La carte peut être à la fois de l'art ASCII ou une image
  • Gardez la sortie lisible

Une sortie pourrait ressembler à ceci:

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

A: SomeTown
B: ACity
C: Partout
D: Accueil

Le programme avec le plus petit nombre de caractères gagne. Je ne compte pas les paramètres dans le compilateur / interprète, s'ils sont nécessaires pour la compilation, mais veuillez ne pas abuser de cette règle. Les règles de golf habituelles s'appliquent.

Voici un autre cas d'essai. Votre sortie ne doit pas nécessairement correspondre à la mienne, ni choisir le même chemin que moi. La sortie est dessinée à la main et montre une sortie possible. Contribution:

maison (5 | 7)
supermarché (13 | 12)
parc (15 | 5)
nouvelle place (9 | 16)
maison d'amis (20 | 11)
vieux château (14 | 21)
bord de rivière (1 | 20)
plage (10 | 1)
cinéma (21 | 18)
forêt (23 | 7)
petite île (21 | 1)
musée du code-golf (6 | 25)
aéroport (18 | 25)
salon de thé (24 | 14)
restaurant (24 | 22)
grand pont (3 | 12)
Bâtiment SO (25 | 9)

Et ceci est un exemple de sortie:

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

Une maison
B: supermarché
C: parc
D: nouvelle place
E: la maison d'un ami
F: vieux château
G: au bord de la rivière
H: plage
I: cinéma
J: forêt
K: petite île
L: musée du code-golf
M: aéroport
N: salon de thé
O: restaurant
P: grand pont
Q: bâtiment SO

Je ne suis pas un locuteur natif anglais. N'hésitez pas à corriger ma langue et ma grammaire, si nécessaire.

FUZxxl
la source

Réponses:

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

Ceci est juste une compression rapide de l'original (voir ci-dessous). Beaucoup de golf est probablement encore possible pour éliminer beaucoup de manipulations de rang et de boxe inutiles.

Seul bémol: la règle n'est que le dernier chiffre contrairement à l'exemple de sortie.

Edit: Correction d'un bug - Les villes avaient des étiquettes erronées (et n'étaient pas en ordre alpha sur la carte).

Edit 2: Suppression de toutes sortes de jeux de chevaux et de tromperies pour une économie de 69 caractères.

Sortie (Verbatim, à partir du script de test):

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 non 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
la source
Vous savez, la question indique que la sortie est principalement de forme libre, vous n'avez donc pas à garder un ordre spécifique des étiquettes.
FUZxxl
@FUZxxl: Ce n'est pas l'ordre, c'est que les villes ont été mal étiquetées (mauvaises positions)
Jesse Millikan
1
Vous gagnez. (15 caractères)
FUZxxl
2
Un commentaire doit contenir au moins 15 caractères. Comme je voulais vous dire que vous avez gagné ma tâche et que le message clair «Vous gagnez» est plus court que 15, j'ai dû ajouter ce texte.
FUZxxl
2
Eh bien, je suis content que nous ayons eu cette petite conversation.
Jesse Millikan
21

Haskell, 633 caractères

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

Plutôt long pour le golf de code, mais produit une belle carte SVG: Route de M. Jones

Ou, si votre navigateur ne peut pas gérer SVG, un PNG de cette image: Route de M. Jones


  • Modifier: (648 -> 633) dessin de coordonnées en ligne, et éventuellement dessiner plus que nécessaire, en les laissant écrêtés par le viewBox; aussi quelques coups de golf ici et là.
MtnViewMark
la source
Que diriez-vous de supprimer les trucs xmlns? Certains téléspectateurs n'en ont pas besoin.
FUZxxl
1
Aucun navigateur que j'ai n'affichera le SVG sans la déclaration xmlns.
MtnViewMark
Hm ... au moins les yeux de gnome feront l'affaire. (Bien que ce ne soit pas un navigateur)
FUZxxl
12

Python, 516 476 octets

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

(Remarque: je n'ai pas inclus les deux premières lignes dans le nombre d'octets, je les considère comme des "paramètres d'interpréteur". Mais je me suis facturé pour la longueur utf-8 du programme en octets.)

Sur votre deuxième exemple, je produis:

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

Oui, les glyphes Unicode!

Keith Randall
la source
Oooh ... ce n'est pas comme ça que j'aimerais mon voyage à vélo. À l'origine, j'avais prévu d'autoriser l'itinéraire le plus court entre deux villes uniquement, mais j'ai oublié cette restriction. Si vous êtes d'accord, j'aimerais réécrire la question, afin que seuls les itinéraires directs entre deux villes soient autorisés.
FUZxxl
1
Bien sûr, ce serait bien. Ce n'est pas un prix en argent :)
Keith Randall
Merci beaucoup. Je suis vraiment désolé de vous être trompé, vous obtenez un prix spécial à la place.
FUZxxl
6

Python, 1074 octets

Ok, j'ai dépensé beaucoup trop d'octets (et de temps) pour trouver des chemins raisonnables pour travailler.

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

Fait de beaux chemins, cependant:

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


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

et

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
la source
Celui-ci est sympa, même s'il n'utilise pas la connexion la plus courte possible entre deux villes.
FUZxxl