Pomóż panu Jonesowi cieszyć się podróżą rowerową

18

Jones chce odbyć podróż w obie strony na swoim rowerze. Chce odwiedzić kilka miast w dowolnej kolejności, ale jego trasa nie może przecinać go, ponieważ nie znosi być dwa razy w tym samym miejscu podczas swoich wakacji. Ponieważ naprawdę uwielbia jeździć na rowerze, długość jego trasy jest całkowicie nieistotna, ale nie lubi jeździć po krajobrazie bez celu. Trasa, którą lubi, prowadzi z miasta w linii prostej do innej, bez żadnego objazdu.

Ponieważ Jones jest pasjonatem kodeksu, chce, abyś znalazł program, który planuje dla niego podróż w obie strony, biorąc pod uwagę zbiór miast. Dane wejściowe mają postać A (B|C). Ato nazwa miasta Bi Cjego współrzędne. Można założyć, że współrzędne są dodatnie i mniejsze niż 1000. Zbiory danych dla miast są rozdzielone liniami. Oto przykład, jak może wyglądać przykładowe dane wejściowe:

SomeTown (1 | 10)
ACity (3 | 4)
Gdziekolwiek (7 | 7)
Strona główna (5 | 1)

Pan Jones nie jest pedantyczny, po prostu chce mieć przydatny program. W ten sposób możesz sam zdecydować, jak wyglądać produkt wyjściowy, o ile spełnia następujące kryteria:

  • Wynikiem jest mapa miast z wytyczoną trasą między nimi. Jeśli coś jest prawidłowe, trasa nie powinna się pokrywać i powinna kończyć się w miejscu, w którym się rozpoczęła
  • Współrzędne są jak w zwykłym programowaniu: (1 | 1) znajduje się w rogu północno-zachodnim. Dodaj linijkę do granicy mapy, aby ułatwić jej odczytanie
  • Nazwy miast muszą być zapisane na mapie, ale możesz używać skrótów, które wyjaśniono gdzie indziej na mapie
  • Mapa może być zarówno obrazem ASCII, jak i obrazem
  • Zachowaj czytelność wyjścia

Dane wyjściowe mogą wyglądać następująco:

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

Odp .: SomeTown
B: ACity
C: Gdziekolwiek
D: Dom

Program z najmniejszą liczbą znaków wygrywa. Nie liczę parametrów do kompilatora / interpretera, jeśli są one potrzebne do kompilacji, ale proszę nie nadużywaj tej reguły. Obowiązują zwykłe zasady gry w golfa.

Oto kolejna sprawa testowa. Twój wynik nie musi odpowiadać mojej, ani nie musisz wybierać tej samej ścieżki co ja. Wyjście jest rysowane ręcznie i pokazuje możliwe wyjście. Wejście:

dom (5 | 7)
supermarket (13 | 12)
park (15 | 5)
nowy plac (9 | 16)
dom przyjaciela (20 | 11)
stary zamek (14 | 21)
riverside (1 | 20)
plaża (10 | 1)
kino (21 | 18)
las (23 | 7)
mała wyspa (21 | 1)
muzeum golfa kodowego (6 | 25)
lotnisko (18 | 25)
herbaciarnia (24 | 14)
restauracja (24 | 22)
wielki most (3 | 12)
Budynek SO (25 | 9)

A to jest przykładowy wynik:

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

Dom
B: supermarket
C: park
D: nowy plac
E: dom przyjaciela
F: stary zamek
G: brzeg rzeki
H: plaża
I: kino
J: las
K: mała wyspa
L: muzeum golfa kodowego
M: lotnisko
N: herbaciarnia
O: restauracja
P: świetny most
P: Budynek SO

Nie jestem językiem ojczystym języka angielskiego. W razie potrzeby możesz poprawić mój język i gramatykę.

FUZxxl
źródło

Odpowiedzi:

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

To tylko szybkie ściśnięcie oryginału (patrz poniżej). Dużo gry w golfa jest prawdopodobnie nadal możliwe, aby wyeliminować wiele niepotrzebnych manipulacji rangami i boksu.

Tylko zastrzeżenie: Linijka jest tylko ostatnią cyfrą, w przeciwieństwie do przykładowego wyjścia.

Edycja: Poprawka błędu - Miasta miały błędne etykiety (i nie były w kolejności alfabetycznej na mapie).

Edycja 2: Usunięto wszelkiego rodzaju gry konne i wygłupy dla oszczędności 69 znaków.

Dane wyjściowe (dosłownie, ze skryptu testowego):

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

Nie golfowany oryginał:

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
źródło
Wiesz, pytanie mówi, że dane wyjściowe są w większości dowolne, więc nie musisz utrzymywać określonej kolejności etykiet.
FUZxxl,
@FUZxxl: To nie jest rozkaz, to, że miasta zostały oznakowane błędne (zła pozycje)
Jesse Millikan
1
Wygrałeś. (15 znaków)
FUZxxl
2
Komentarz musi mieć co najmniej 15 znaków. Ponieważ chciałem ci powiedzieć, że wygrałeś moje zadanie, a zwykła wiadomość „Wygrywasz” jest krótsza niż 15, musiałem dodać ten tekst.
FUZxxl,
2
Cieszę się, że mogliśmy porozmawiać.
Jesse Millikan,
21

Haskell, 633 znaków

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

Raczej zbyt długo na golfa, ale tworzy piękną mapę SVG: Szlak pana Jonesa

Lub, jeśli twoja przeglądarka nie obsługuje SVG, PNG tego obrazu: Szlak pana Jonesa


  • Edytuj: (648 -> 633) rysowanie współrzędnych w linii i ewentualnie narysuj więcej niż to konieczne, pozwalając na ich obcięcie viewBox; także kilka sztuczek golfowych tu i tam.
MtnViewMark
źródło
Co powiesz na usunięcie zawartości xmlns? Niektórzy widzowie go nie potrzebują.
FUZxxl,
1
Żadna przeglądarka, którą mam, nie wyświetli SVG bez deklaracji xmlns.
MtnViewMark
Hm ... zrobią to oczy gnoma. (Chociaż nie jest to przeglądarka)
FUZxxl,
12

Python, 516 476 bajtów

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

(Uwaga: nie uwzględniłem dwóch pierwszych wierszy w liczbie bajtów, uważam je za „parametry interpretera”. Ale naliczyłem sobie opłatę za długość utf-8 programu w bajtach.)

Na drugim przykładzie tworzę:

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

Tak, glify Unicode!

Keith Randall
źródło
Ooo ... nie tak chciałbym moją wycieczkę rowerową. Początkowo planowałem pozwolić na najkrótszą trasę tylko między dwoma miastami, ale zapomniałem o tym ograniczeniu. Jeśli się zgadzasz, chciałbym przepisać pytanie, aby dozwolone były tylko bezpośrednie trasy między dwoma miastami.
FUZxxl,
1
Jasne, to by było w porządku. To nie jest nagroda pieniężna :)
Keith Randall
Dziękuję bardzo. Jest mi bardzo przykro z powodu błędnego wpisu, zamiast tego otrzymujesz specjalną cenę.
FUZxxl,
6

Python, 1074 bajty

Ok, spędziłem zbyt wiele bajtów (i czasu) na znalezieniu rozsądnych ścieżek do pracy.

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

Robi ładne ścieżki:

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


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

i

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
źródło
Ten jest fajny, chociaż nie korzysta z najkrótszego możliwego połączenia między dwoma miastami.
FUZxxl