Bay Jones'a bisiklet turuna çıkmasına yardımcı olun


18

Bay Jones bisikletiyle gidiş-dönüş yapmak istiyor. Birkaç şehri keyfi sırayla ziyaret etmek istiyor, ancak tatilinde iki kez aynı yerde olmaktan nefret ettiği için rotası kendi kendine geçmemelidir. Bisiklete binmeyi gerçekten sevdiğinden, rotasının uzunluğu tamamen önemsizdir, ancak bir hedef olmadan manzarayı dolaşmaktan hoşlanmaz. Sevdiği rota, şehirden düz bir çizgide, herhangi bir sapma olmadan.

Bay Jones tutkulu bir kod golfçüsü olduğundan, bir dizi şehir göz önüne alındığında, onun için bir gidiş-dönüş planlayan bir program bulmanızı istiyor. Girdi forma sahiptir A (B|C). Abir şehrin adı Bve Ckoordinatlarıdır. Koordinatın pozitif ve 1000'den az olduğunu varsayabilirsiniz. Şehirler için veri kümeleri satırla ayrılmıştır. Örnek bir girişin nasıl görünebileceğine ilişkin bir örnek:

SomeTown (1 | 10)
ACity (3 | 4)
Nerede (7 | 7)
Ana Sayfa (5 | 1)

Bay Jones bilgiçlik değil, sadece yararlı bir programa sahip olmak istiyor. Böylece, bu kriterleri karşıladığı sürece çıktının nasıl göründüğüne kendiniz karar verebilirsiniz:

  • Çıktı, şehirlerin, aralarında rota çizilen bir haritadır. Bir şey doğruysa, rota kendisiyle örtüşmemeli ve başladığı yerde sona ermelidir
  • Koordinatlar olağan programlamadaki gibidir: (1 | 1) KB köşesinde. Okumayı kolaylaştırmak için haritalar kenarlığına bir cetvel ekleyin
  • Şehir adları harita üzerinde yazılmalıdır, ancak haritada başka bir yerde açıklanan kısaltmaları kullanmaktan çekinmeyin
  • Harita hem ASCII-art hem de bir resim olabilir
  • Çıktıyı okunabilir tutma

Bir çıktı şöyle görünebilir:

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

A: SomeTown
B: ACity
C: Nerede
D: Ana Sayfa

En küçük karakter sayısına sahip program kazanır. Derleme / yorumlayıcıya parametreleri saymam, derleme için gerekli olmaları durumunda, lütfen bu kuralı kötüye kullanmayın. Her zamanki kod golf kuralları geçerlidir.

İşte başka bir test çantası. Çıktınız benimkine uymak zorunda değil, benimle aynı yolu seçmek zorunda değilsiniz. Çıktı elle çizilir ve olası bir çıktı gösterilir. Giriş:

ev (5 | 7)
süpermarket (13 | 12)
park (15 | 5)
yeni plaza (9 | 16)
arkadaş evi (20 | 11)
eski kale (14 | 21)
nehir kenarı (1 | 20)
plaj (10 | 1)
sinema (21 | 18)
orman (23 | 7)
küçük ada (21 | 1)
kod golf müzesi (6 | 25)
havaalanı (18 | 25)
çay dükkanı (24 | 14)
restoran (24 | 22)
büyük köprü (3 | 12)
SO binası (25 | 9)

Ve bu örnek bir çıktıdır:

           1111111111222222
  1234567890123456789012345
 1 H * * K    
 2 * * * *   
 3 * * * *   
 4 * * ** *   
 5 * C *   
 6 * *   
 7 AJ  
 8 * *  
 9 * S
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 **

Bir ev
B: süpermarket
C: park
D: yeni plaza
E: arkadaşın evi
F: eski kale
G: nehir kenarı
H: plaj
I: sinema
J: orman
K: küçük ada
L: Kod Golf Müzesi
M: havaalanı
N: çay dükkanı
O: restoran
P: büyük köprü
Q: SO yapı

Ben anadili İngilizce değil. Gerekirse dilimi ve dilbilgimi düzeltmekten çekinmeyin.

Yanıtlar:


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

Bu sadece orijinalin hızlı bir şekilde sıkıştırılmasıdır (aşağıya bakınız). Pek çok işe yaramaz rütbe manipülasyonu ve boksunu ortadan kaldırmak için muhtemelen birçok golf mümkündür.

Sadece uyarı: Cetvel, örnek çıktıdan farklı olarak sadece son basamaktır.

Düzenleme: Hata düzeltme - Şehirler yanlış etiketlere sahipti (ve haritada alfa düzeninde değildi).

Edit 2: 69 karakterden tasarruf etmek için her türlü at oyunu ve tomfoolery kaldırıldı.

Çıktı (Test betiğinden Aynen,):

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

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)

Biliyorsunuz, soru, çıktının çoğunlukla serbest biçimli olduğunu belirtiyor, bu nedenle etiketlerin belirli bir sırasını korumak zorunda değilsiniz.
FUZxxl

@FUZxxl: Emir değil, şehirlerin yanlış etiketlendiği (yanlış pozisyonlar)
Jesse Millikan

1
Sen kazandın. (15 karakter)
FUZxxl

2
Bir yorumda en az 15 karakter olmalıdır. Size söylemek istediğimden, görevimi kazandığınızı ve "Siz kazandınız.
FUZxxl

2
Bu küçük konuşmayı yaptığımız için mutluyum.
Jesse Millikan

21

Haskell, 633 karakter

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

Kod golf için oldukça uzun, ama güzel bir SVG haritası üretir: Bay Jones'un Rotası

Veya tarayıcınız SVG'yi, bu resmin bir PNG'sini işleyemiyorsa: Bay Jones'un Rotası


  • Düzenleme: (648 -> 633) satır içi koordinat çizimi ve muhtemelen gerekenden daha fazla çizmek, onları tarafından kırpılmasına izin viewBox; Ayrıca orada birkaç golf hilesi var.

Xmlns şeylerini soymaya ne dersiniz? Bazı görüntüleyenlerin buna ihtiyacı yoktur.
FUZxxl

1
Sahip olduğum hiçbir tarayıcı xmlns bildirimi olmadan SVG görüntüleyemez.
MtnViewMark

Hm ... en azından cüce gözleri yapacak. (Bir tarayıcı olmasa da)
FUZxxl

12

Python, 516 476 bayt

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

(Not: Bayt sayısına ilk iki satırı dahil etmedim, onları "yorumlayıcı parametreleri" olarak kabul ettim. Ama programın utf-8 uzunluğu için bayt cinsinden ücret aldım.)

İkinci örneğinizde:

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

Yay, Unicode glifleri!


Ooo ... bisiklet seyahatimi böyle istemiyorum. Başlangıçta, yalnızca iki şehir arasındaki en kısa rotaya izin vermeyi planladım, ancak bu kısıtlamayı unuttum. Kabul ederseniz, soruyu yeniden yazmak istiyorum, böylece sadece iki şehir arasında doğrudan rotalara izin verilir.
FUZxxl

1
Tabii, bu iyi olur. Bu bir nakit ödül değil :)
Keith Randall

Çok teşekkür ederim. Girişinizi yanlış yaptığınız için çok üzgünüm, bunun yerine özel bir fiyat alırsınız.
FUZxxl

6

Python, 1074 bayt

Tamam, çalışmak için makul yollar almak için çok fazla bayt (ve zaman) harcadı.

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

Yine de güzel yollar yapar:

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


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

ve

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

İki şehir arasında mümkün olan en kısa bağlantıyı kullanmasa da bu güzel.
FUZxxl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.