ジョーンズ氏が自転車で往復するのを手伝ってください


18

ジョーンズ氏は自転車で往復したいと考えています。彼は複数の都市を任意の順序で訪れたいと考えていますが、休日に同じ場所に2度いるのが嫌いなので、自分のルートを自分自身に渡ってはいけません。彼はサイクリングが大好きなので、ルートの長さはまったく関係ありませんが、ターゲットなしで風景を走り回るのは嫌です。彼が好むルートは、迂回することなく、市内から直線で他の都市へのルートです。

ジョーンズ氏は情熱的なコードゴルファーであるため、一連の都市を考慮して、彼のために往復旅行を計画するプログラムを見つけてもらいたいと考えています。入力の形式はA (B|C)です。Aは都市の名前でBありC、その座標です。座標は正で、1000未満であると想定できます。都市のデータセットは行区切りです。次に、入力例がどのように見えるかの例を示します。

SomeTown(1 | 10)
ACity(3 | 4)
どこでも(7 | 7)
ホーム(5 | 1)

ジョーンズ氏はつまらないものではなく、有用なプログラムを持ちたいだけです。したがって、これらの基準を満たす限り、出力がどのように見えるかを自分で決めることができます。

  • 出力は都市の地図であり、それらの間にルートが描かれています。何かが正しい場合、ルートはそれ自体と重ならないようにし、開始した場所で終了する
  • 座標は通常のプログラミングのようです:(1 | 1)はNWコーナーにあります。読みやすいように、マップの境界線に一種の定規を追加します
  • 都市名は地図上に書き留める必要がありますが、地図上のどこかで説明されている略語を自由に使用してください
  • マップはASCIIアートまたは画像の両方にすることができます
  • 出力を読みやすくする

出力は次のようになります。

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

A:SomeTown
B:ACity
C:どこでも
D:ホーム

文字数が最小のプログラムが勝ちです。コンパイルに必要な場合、コンパイラ/インタープリターへのパラメーターはカウントしませんが、このルールを乱用しないでください。通常のゴルフ規則が適用されます。

ここに別のテストケースがあります。出力は私のものと一致する必要はなく、私と同じパスを選択する必要もありません。出力は手で描かれ、可能な出力を示しています。入力:

ホーム(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)
SOビル(25 | 9)

そして、これは出力例です:

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

A:ホーム
B:スーパーマーケット
C:公園
D:新しい広場
E:友達の家
F:古いお城
G:リバーサイド
H:ビーチ
I:映画
J:森
K:小さな島
L:コードゴルフ博物館
M:空港
N:ティーショップ
O:レストラン
P:素晴らしい橋
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:順序ではなく、都市に間違ったラベルが付けられた(間違った位置)
ジェシーミリカン

1
あなたが勝ちます。(15文字)
-FUZxxl

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

code-golfはやや長めですが、素敵なSVGマップを生成します。 ジョーンズ氏のルート

または、ブラウザがSVGを処理できない場合、その画像のPNG: ジョーンズ氏のルート


  • 編集:(648-> 633)インラインの座標描画。必要に応じて描画し、viewBox; でクリップできるようにします。また、あちこちでいくつかのゴルフのトリック。

xmlnsのものを削除するのはどうですか?一部の視聴者はそれを必要としません。
FUZxxl

1
xmlns宣言なしでSVGを表示するブラウザはありません。
MtnViewMark

うーん...少なくともgnomeの目はやるでしょう。(ブラウザではありませんが)
-FUZxxl

12

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

(注:最初の2行はバイトカウントに含めませんでした。「インタープリターパラメーター」と見なします。しかし、プログラムのutf-8の長さをバイト単位で請求しました。)

2番目の例では、以下を作成します。

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グリフ!


うーん...それは私の自転車旅行が好きな方法ではありません。当初は、2つの都市間の最短ルートのみを許可する予定でしたが、この制限を忘れていました。同意したら、質問を書き直して、2つの都市間の直接ルートのみが許可されるようにします。
-FUZxxl

1
確かに、それは問題ないでしょう。賞金ではありません:)
キースランドール

よろしくお願いします。エントリを間違えて申し訳ありません。代わりに特別価格が適用されます。
-FUZxxl

6

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

2つの都市間で可能な限り最短の接続を使用していませんが、それは素晴らしいことです。
FUZxxl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.