Допоможіть містерові Джонсу насолодитися його велосипедним туром


18

Містер Джонс хоче зробити подорож на своєму велосипеді. Він хоче відвідати кілька міст у довільному порядку, але його маршрут не повинен перетинати його самостійно, оскільки він ненавидить бути на одному і тому ж місці двічі у свої свята. Оскільки він по-справжньому любить їздити на велосипеді, тривалість його маршруту абсолютно не має значення, але він не любить їздити по пейзажу без цілі. Маршрут, який йому подобається, проходить з міста по прямій лінії до іншої, без об’їзду.

Оскільки містер Джонс - пристрасний гольфіст з кодом, він хоче, щоб ви знайшли програму, яка планує для нього поїздку в обидва кінці з урахуванням набору міст. Вхід має форму A (B|C). Aназва міста Bта Cйого координати. Ви можете припустити, що координати є позитивними та меншими ніж 1000. Набори даних для міст розділені рядками. Ось приклад того, як може виглядати вклад прикладу:

Деякі міста (1 | 10)
Близькість (3 | 4)
Де б не було (7 | 7)
Головна (5 | 1)

Містер Джонс не педантичний, він просто хоче мати корисну програму. Таким чином, ви можете самостійно вирішити, як виглядає результат, доки він відповідає цим критеріям:

  • Вихід - карта міст з маршрутом, прокресленим між ними. Якщо щось правильно, маршрут не повинен перетинатись і повинен закінчуватися там, де він почався
  • Координати, як у звичайному програмуванні: (1 | 1) знаходиться в куті СЗ. Додайте вид лінійки до межі карт, щоб полегшити її читання
  • Назви міст мають бути записані на карті, але сміливо використовуйте абревіатури, що пояснюються десь на карті
  • Карта може бути як ASCII-мистецтвом, так і зображенням
  • Зберігайте результат читабельним

Вихід може виглядати приблизно так:

  1234567
 1 D  
 2 * * 
 3 * * 
 4 B *
 5 * *
 6 * *
 7 * С
 8 * ** 
 9 * *   
10А **

A: Деякі міста
Б: Гострота
С: Куди б не було
Д: Головна

Перемагає програма з найменшим числом лічильників. Я не зараховую параметри до компілятора / інтерпретатора, якщо вони потрібні для компіляції, але, будь ласка, не зловживайте цим правилом. Діють звичайні правила гольфу.

Ось ще одна перевірка. Вихідні дані не повинні відповідати моїм, і ви не повинні вибирати той самий шлях, що і я. Вихід складається вручну і показує можливий вихід. Вхід:

додому (5 | 7)
супермаркет (13 | 12)
парк (15 | 5)
новий майданчик (9 | 16)
будинок друга (20 | 11)
старий замок (14 | 21)
річка (1 | 20)
пляж (10 | 1)
кінотеатр (21 | 18)
ліс (23 | 7)
маленький острів (21 | 1)
музей кодового гольфу (6 | 25)
аеропорт (18 | 25)
чайний магазин (24 | 14)
ресторан (24 | 22)
великий міст (3 | 12)
Будівля ТА (25 | 9)

І це приклад результату:

           1111111111222222
  1234567890123456789012345
 1 Н * * К    
 2 * * * *   
 3 * * * *   
 4 * * ** *   
 5 * С *   
 6 * *   
 7 AJ  
 8 * *  
 9 * Q
10 * *
11 * *** E *
12 PB *** * * 
13 * * * * 
14 * * * N 
15 * * * * 
16 * D * * 
17 * * * * 
18 * * я * 
19 * * * * 
20G * * * 
21 * F * *
22 * ** * О 
23 * ** * **  
24 * ** * *    
25 л ** М **

A: додому
Б: супермаркет
С: парк
Д: нова площа
Е: будинок друга
F: старий замок
Г: річка
Н: пляж
Я: кіно
J: ліс
К: маленький острів
Л: музей коду-гольфу
М: аеропорт
Н: чайний магазин
O: ресторан
П: великий міст
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: Видалено всі види кінної гри та моторолерів для економії 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

Оригінальний оригінал:

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
годин

2
У коментарі має бути не менше 15 символів. Оскільки я хотів сказати вам, що ви перемогли у моєму завданні, а просте повідомлення «Ви перемагаєте» коротше 15, мені довелося додати цей текст.
FUZxxl

2
Ну, я радий, що ми мали цю маленьку розмову.
Джессі Мілікан

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: Маршрут містера Джонса

Або якщо ваш браузер не може працювати з SVG, PNG цього зображення: Маршрут містера Джонса


  • Редагувати: (648 -> 633) лінійний координатний креслення, і, можливо, намалювати більше, ніж потрібно, дозволяючи їх обрізати viewBox; також кілька трюків для гольфу тут і там.

Як щодо зняття файлів xmlns? Деяким глядачам це не потрібно.
FUZxxl

1
Жоден у мене браузер не відображатиме SVG без декларації xmlns.
MtnViewMark

Гм ... принаймні очі гнома зроблять. (Хоча це і не браузер)
FUZxxl

12

Пітон, 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 гліфи!


Ооо ... це не так, як я хотів би свою велосипедну поїздку. Спочатку я планував дозволити найкоротший маршрут між двома містами, але забув це обмеження. Якщо ви згодні, я хотів би переписати це питання, щоб дозволено лише прямі маршрути між двома містами.
FUZxxl

1
Звичайно, це було б добре. Це не грошовий приз :)
Кіт Рендалл

Дуже вам дякую. Мені дуже шкода, що ви зробили неправильний запис, натомість ви отримуєте спеціальну ціну.
FUZxxl

6

Пітон, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.