Helfen Sie Herrn Jones, seine Radtour zu genießen


18

Herr Jones möchte mit seinem Fahrrad eine Rundreise machen. Er möchte mehrere Städte in beliebiger Reihenfolge besuchen, aber seine Route darf sie nicht selbst kreuzen, da er es hasst, in seinen Ferien zweimal am selben Ort zu sein. Da er sehr gerne Rad fährt, spielt die Länge seiner Strecke keine Rolle, aber er mag es nicht, ohne Ziel durch die Landschaft zu fahren. Die Route, die er mag, führt von einer Stadt in einer geraden Linie zu einer anderen, ohne Umwege.

Da Herr Jones ein leidenschaftlicher Code-Golfer ist, möchte er, dass Sie ein Programm finden, das für ihn eine Rundreise in einer Reihe von Städten plant. Die Eingabe hat die Form A (B|C). Aist der Name einer Stadt Bund Csind ihre Koordinaten. Sie können davon ausgehen, dass die Koordinaten positiv und kleiner als 1000 sind. Die Datensätze für die Städte sind durch Linien getrennt. Hier ist ein Beispiel, wie eine Beispieleingabe aussehen könnte:

SomeTown (1 | 10)
ACity (3 | 4)
Wo auch immer (7 | 7)
Zuhause (5 | 1)

Herr Jones ist nicht pedantisch, er möchte nur ein nützliches Programm haben. Auf diese Weise können Sie selbst entscheiden, wie die Ausgabe aussehen soll, sofern die folgenden Kriterien erfüllt sind:

  • Die Ausgabe ist eine Karte der Städte, zwischen denen die Route eingezeichnet ist. Wenn etwas richtig ist, sollte sich die Route nicht überlappen und dort enden, wo sie begonnen hat
  • Die Koordinaten sind wie bei der normalen Programmierung: (1 | 1) befindet sich in der NW-Ecke. Fügen Sie dem Kartenrand eine Art Lineal hinzu, um das Lesen zu erleichtern
  • Die Städtenamen müssen auf der Karte vermerkt sein. Sie können jedoch auch Abkürzungen verwenden, die an einer anderen Stelle auf der Karte erläutert werden
  • Die Karte kann sowohl eine ASCII-Grafik als auch ein Bild sein
  • Halten Sie die Ausgabe lesbar

Eine Ausgabe könnte folgendermaßen aussehen:

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

A: SomeTown
B: ACity
C: Wo auch immer
D: Zuhause

Das Programm mit der geringsten Zeichenanzahl gewinnt. Ich zähle keine Parameter für den Compiler / Interpreter, wenn sie zum Kompilieren benötigt werden, aber bitte missbrauchen Sie diese Regel nicht. Es gelten die üblichen Golfregeln.

Hier ist ein weiterer Testfall. Ihre Ausgabe muss weder meiner entsprechen, noch müssen Sie denselben Pfad wie ich wählen. Die Ausgabe wird von Hand gezeichnet und zeigt eine mögliche Ausgabe. Eingang:

Zuhause (5 | 7)
Supermarkt (13 | 12)
Park (15 | 5)
neuer Platz (9 | 16)
Haus eines Freundes (20 | 11)
altes schloss (14 | 21)
Flussufer (1 | 20)
Strand (10 | 1)
Kino (21 | 18)
Wald (23 | 7)
kleine Insel (21 | 1)
Museum für Code-Golf (6 | 25)
Flughafen (18 | 25)
Teestube (24 | 14)
Restaurant (24 | 22)
große Brücke (3 | 12)
SO Gebäude (25 | 9)

Und dies ist eine Beispielausgabe:

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

Ein Zuhause
B: Supermarkt
C: park
D: neuer Platz
E: Haus eines Freundes
F: altes Schloss
G: Flussufer
H: Strand
Ich: Kino
J: Wald
K: kleine Insel
L: Museum für Code-Golf
M: Flughafen
N: Teeladen
O: Restaurant
P: tolle Brücke
F: SO Gebäude

Ich bin kein englischer Muttersprachler. Gerne können Sie meine Sprache und Grammatik bei Bedarf korrigieren.

Antworten:


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

Dies ist nur ein kurzer Druck auf das Original (siehe unten). Viel Golfspielen ist wahrscheinlich immer noch möglich, um viele nutzlose Rangmanipulationen und Boxen zu eliminieren.

Einzige Einschränkung: Lineal ist im Gegensatz zur Beispielausgabe nur die letzte Ziffer.

Bearbeiten: Fehlerbehebung - Städte hatten falsche Bezeichnungen (und waren nicht in alphabetischer Reihenfolge auf der Karte).

Edit 2: Alle Arten von Horseplay und Tomfoolery entfernt, um 69 Charaktere einzusparen.

Ausgabe (Wortlaut, aus Testskript):

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 original:

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)

Die Frage besagt, dass die Ausgabe größtenteils in Freiform erfolgt, sodass Sie keine bestimmte Reihenfolge der Etiketten einhalten müssen.
FUZxxl

@FUZxxl: Es ist nicht die Reihenfolge, es ist, dass die Städte falsch (falsche Positionen) gekennzeichnet wurden
Jesse Millikan

1
Du gewinnst. (15 Zeichen)
FUZxxl

2
Ein Kommentar muss mindestens 15 Zeichen enthalten. Da ich Ihnen sagen wollte, dass Sie meine Aufgabe gewonnen haben und die einfache Meldung »Sie gewinnen.« Kürzer als 15 ist, musste ich diesen Text hinzufügen.
FUZxxl

2
Ich bin froh, dass wir dieses kleine Gespräch geführt haben.
Jesse Millikan

21

Haskell, 633 Zeichen

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

Eher langwierig für Code-Golf, erzeugt aber eine schöne SVG-Karte: Mr Jones 'Route

Oder, falls Ihr Browser SVG nicht unterstützt, eine PNG des Bildes: Mr. Jones 'Route


  • Bearbeiten: (648 -> 633) Inline-Koordinaten zeichnen und möglicherweise mehr als nötig zeichnen, damit sie vom viewBox; auch ein paar golf-tricks hier und da.

Wie wäre es, wenn Sie die XMLNS-Dateien entfernen? Einige Zuschauer brauchen es nicht.
FUZxxl

1
Kein Browser, den ich habe, zeigt die SVG ohne die XMLNS-Deklaration an.
MtnViewMark

Hm ... zumindest Gnomenaugen werden es tun. (Obwohl es kein Browser ist)
FUZxxl

12

Python, 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])

(Hinweis: Ich habe die ersten beiden Zeilen nicht in die Byteanzahl aufgenommen, sondern als "Interpreter-Parameter" betrachtet. Ich habe mir jedoch die utf-8-Länge des Programms in Bytes berechnet.)

An Ihrem zweiten Beispiel zeige ich:

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

Ja, Unicode-Glyphen!


Oh ... so möchte ich meine Radtour nicht. Ursprünglich wollte ich nur die kürzeste Strecke zwischen zwei Städten zulassen, aber ich habe diese Einschränkung vergessen. Wenn Sie einverstanden sind, würde ich die Frage gerne umschreiben, sodass nur direkte Routen zwischen zwei Städten zulässig sind.
FUZxxl

1
Klar, das wäre in Ordnung. Es ist kein Geldpreis :)
Keith Randall

Vielen Dank. Es tut mir sehr leid, dass Sie falsch eingegeben haben. Stattdessen erhalten Sie einen Sonderpreis.
FUZxxl

6

Python, 1074 Bytes

Ok, viel zu viele Bytes (und zu viel Zeit) damit verbracht, vernünftige Wege zur Arbeit zu finden.

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

Macht aber schöne Wege:

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


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

und

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

Das ist schön, obwohl es nicht die kürzest mögliche Verbindung zwischen zwei Städten nutzt.
FUZxxl
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.