置換パスを描く


20

次の図が垂直交差チューブのセットであると想像してください。

1 2    1 2    1 2 3 4
\ /    \ /    \ / \ /
 X      |      |   |
/ \    / \    / \ / \
2 1    1 2   |   X   |
              \ / \ /
               X   X
              / \ / \
              3 1 4 2

左端の図では、12はそれぞれのスラッシュを下にスライドし、で交差し、X開始点の反対側に出てきます。

中央の図でも同じ考え|ですが、パスが交差しないことを意味しているため、何も変わりません。

右端の図は、より複雑なチューブルーティングを示し1 2 3 4てい3 1 4 2ます。

ゴール

このコードゴルフチャレンジの目標は、などの順列を与えてこれらの「チューブルーティング図」を描くこと3 1 4 2です。バイト単位の最短プログラムが勝ちます。

詳細

  1. 入力は、スペースで区切られた1からnまでの数字の順列として標準入力から取得されます。ここで、nは正の整数です。すべての入力が整形式であると想定できます。
  2. ルーティング図の出力は標準出力に送られます。

    • 図の上部に1〜nの数字を順番に「ドロップ」すると、入力の並べ替えが下部に表示されます。(上部と下部は常にスラッシュのレイヤーです。)
    • 図は、最適に小さくする必要はありません。それが正しい限り、必要なだけ多くのレベルがあります。
    • ダイアグラムには、文字\/ X|だけでなく改行(数字なし)のみを含める必要があります。
    • |を使用してもX意味がないため、常に最も外側の交差点で使用する必要があります。
    • 図がすべて正しく整列している限り、先頭または末尾のスペースをいくつか使用しても問題ありません。

の入力は3 1 4 2生成される可能性があります(上記と同じ)

 \ / \ /
  |   | 
 / \ / \
|   X   |
 \ / \ /
  X   X 
 / \ / \

入力1かもしれないプロデュース

 \
  |
 /
|
 \
  |
 /

入力3 2 1かもしれないプロデュース

 \ / \
  X   |
 / \ /
|   X
 \ / \
  X   |
 / \ /

入力2 1 3 4 6 5かもしれないプロデュース

\ / \ / \ /
 X   |   X
/ \ / \ / \

4
いい質問です!あなたが参加したのはたった2週間だったとは信じられません-あなたはどこにでもいるようです。
XNOR

@xnor:Dたくさんありがとう。しかし、実際に私が...ここにも多くの時間を費やしてきた
カルバンの趣味

ことが可能Xに直接接続する|方法/ありませんか?別にX
xnor 14

1
@xnorいいえそれは常にである必要がありrow of slashesrow of X's and |'srow of slashesrow of X's and |'s、...形式。
カルバンの趣味14

n10より大きくできますか?
Οurous

回答:


4

パイソン2、218 219 220 222 224 227 243 247 252 259 261 264

l=map(int,raw_input().split())
f=n=len(l)
o=s=n*' \ /'
while f+n%2:
 f-=1;i=f+n&1;a=s[2*i:][:2*n]+'\n|   '[::2-i]
 while~i>-n:a+='|X'[l[i+1]<l[i]]+'   ';l[i:i+2]=sorted(l[i:i+2]);i+=2
 o=a+f%2*'|'+'\n'+o
print o[:-2*n]

私はわずかに異なるアプローチを取りました。入力をソートするのに必要なスワップを見つけ、ソートされたリストを入力に変えるのに必要なスワップを取得するためにそれを垂直に反転させました。このアプローチの追加ボーナスとして、任意の数のリストを取り、入力の種類を入力に変えるための置換パスを与えることができます。

例:

$ python sort_path.py <<< '3 1 4 5 9 2 6 8 7'
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   |   |   |   |   
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   |   |   |   |   
 \ / \ / \ / \ / \
  |   |   |   |   |
 / \ / \ / \ / \ /
|   X   |   |   X   
 \ / \ / \ / \ / \
  |   X   |   X   |
 / \ / \ / \ / \ /
|   |   X   X   |   
 \ / \ / \ / \ / \
  X   |   X   |   |
 / \ / \ / \ / \ /
|   |   |   |   X   
 \ / \ / \ / \ / \

改善点:

264-> 261:外側のループをforからwhileに切り替えました。

261-> 259:Pythonでは算術演算子がビット単位演算子よりも優先度が高いため、のf%2代わりに使用さ(c^m)れます。

259-> 252:内部ループをforからwhileに切り替えました。結合さiれたc変数。

252-> 247:逆順でビルドするようにビルドを変更してからリバースを変更しました。

247-> 243:結合を使用する代わりに、手動で改行を追加しました。

243-> 227:grcのスラッシュ行生成方法を採用し(grc!に感謝)、sを追加しました。

227-> 224:%4拡張スライシングを使用してa を削除して文字を保存するために、スラッシュ行生成を内部のwhileループの前に移動しました。

224-> 222:mを削除。

222-> 220:f%2+n%2->f+n&1

220-> 219:| 1<n-1|-> |~i>-n|(先頭のスペースを削除)

組み合わせの初期化:> 218から219 osし、最後にスライスを移動しました。


9

Python、290

def g(o,u=1):
 s=['|']*o
 for i in range(o,n-1,2):v=r[i+1]in a[:a.index(r[i])]*u;s+=['|X'[v]];r[i:i+2]=r[i:i+2][::1-2*v]
 print'  '*(1-o)+'   '.join(s+['|']*(o^n%2))*u+'\n'*u+(' / \\'*n)[2*o:][:n*2]
a=map(int,raw_input().split())
n=len(a)
r=range(1,n+1)
o=1
g(1,0)
g(0)
while r!=a:g(o);o^=1

かなり基本的なアプローチを取りましたが、思っていたよりも少し長くなりました。ペアのリストを考慮し、各ペアを交換するかどうかを決定します。リストが入力と一致するまで、交差する行ごとにこれが繰り返されます。

例:

$ python path.py
5 3 8 1 4 9 2 7 6
 \ / \ / \ / \ / \
  |   |   |   X   |
 / \ / \ / \ / \ /
|   X   X   X   X
 \ / \ / \ / \ / \
  X   X   X   X   |
 / \ / \ / \ / \ /
|   X   X   |   X
 \ / \ / \ / \ / \
  X   X   X   |   |
 / \ / \ / \ / \ /
|   |   |   X   |
 \ / \ / \ / \ / \

2

HTML JavaScript、 553 419

私のエラーを指摘してくれた@izlinと@TomHartに感謝します。

p=prompt();b=p.split(" "),l=b.length,d=l%2,o="",s=["","","\\/"],n="\n",a=[];for(i=0;i<l;i++){a[b[i]-1]=i+1;s[1]+=" "+s[2][i%2];s[0]+=" "+s[2][(i+1)%2];o+=" "+(i+1)}s[1]+=n,s[0]+=n;o+=n+s[1];f=1,g=2;do{var c="";for(var i=(f=f?0:1);i<l-1;i+=2)if(a[i]>a[i+1]){c+="  x ";g=2;t=a[i];a[i]=a[i+1];a[i+1]=t;}else c+="  | ";if(g==2){o+=(d?(f?"| "+c:c+"  |"):(f?"| "+c+"  |":c))+n;o+=(s[f]);}}while(--g);o+=" "+p;alert(o);

ここでテスト:http : //goo.gl/NRsXEj
ここに画像の説明を入力してください ここに画像の説明を入力してください


ちょっとしたミスを犯しました。最初の行はソートされた数字で、最後の行は上記の例のように入力する必要があります。
izlin 14

あなたが正しいです。ありがとう。@grcの出力を見て、数字が開始位置だと思いました。おっとっと。
JeffSB 14

私はこの間違った見方をしているかもしれませんが、あなたが投稿した写真の両方で、最後の行は何も変わらないので冗長ではありませんか?
TMH 14

はい、あなたは正しいです。これが自分のやり方のコンセンサスであることは知っていました。しかし、おそらくそうである必要はありません。これについて考えます。コメントありがとう。
JeffSB 14

@izlin-これに気づいてくれてありがとう。このエラーを修正しました。
JeffSB 14

1

Javascript-395

378出力に数字を印刷しない場合でも、見た目が良くなり、読みやすくなります。
ここでテストしてください。(未

ゴルフバージョン)ゴルフバージョン:

a=prompt(),n=a.split(" "),l=n.length,k=[],s="",i=1;for(j=0;j<l;j++){k[n[j]-1]=j+1;s+=" "+(j+1)}s+="\n";while(i++){for(j=0;j<l;j++)s+=i%2?j%2?" \\":" /":j%2?" /":" \\";for(z=0,y=0;z<l-1;z++)if(k[z]>k[z+1])y=1;if(y==0&&i!=2)break;s+="\n";for(m=i%2;m<l;m+=2){s+=i%2&&m==1?"|":"";if(k[m]>k[m+1]){[k[m],k[m+1]]=[k[m+1],k[m]];s+=i%2?"   X":"  X "}else{s+=i%2?"   |":"  | "}}s+="\n"}s+="\n "+a;alert(s)

説明

最初に、インデックス番号で入力を置き換え、結果で最初の行を変更します。例えば

3 1 4 2
v v v v substitude with
1 2 3 4

so the first line will become:
1 2 3 4
v v v v
2 4 1 3

sorting 1,2,3,4 to 3,1,4,2 is equivalent to 2,4,1,3 to 1,2,3,4

この置換により、バブルソートアルゴリズムを使用して2,4,1,3から1,2,3,4にソートできます。グラフは、私たちが探している最短のグラフになります。
あなたがコードを小さくする方法を考えているなら、コメントしてください:)

input: 3 4 2 1 7 5 6
output:
 1 2 3 4 5 6 7
 \ / \ / \ / \
  X   |   |   | 
 / \ / \ / \ /
|   X   |   X
 \ / \ / \ / \
  X   X   X   | 
 / \ / \ / \ /
|   X   |   |
 \ / \ / \ / \
 3 4 2 1 7 5 6


(1)BRタグを3箇所で使用していることがわかります。したがって、これを変数に入れることで少し節約できます。また、PREに出力するので、おそらく\ nを使用できます。
JeffSB

(2)ゴルフのJavaScriptに対処するためのさまざまな方法を試してきました。また、便利な入出力があります。私はあなたのプロンプトとアラートに触発された私の最新の方法が好きだと思います...私はコードにプロンプ​​トとアラートを使用するので、コンソールに貼り付けて誰でも動作します。しかし、TEXTAREAとPREを使用してWebページを作成し、機能することを示しました。Webページは、TEXTAREAとPREを使用するようにプロンプ​​トとアラートをオーバーライドします。したがって、同じコードであり、混乱が少ないでしょう。
JeffSB 14

@JeffSB <br>タグとtextareaはjsfiddleでのみ使用しました。アラートには等幅フォントがないため、出力は見栄えが悪くなります。ゴルフバージョンでは、アラートと\ nを使用します。あなたのウェブページは公開されていますか?
izlin 14

1

コブラ- 334 344 356 360

class P
    def main
        a,o,n=CobraCore.commandLineArgs[1:],['/','\\'],0
        c,l=a.count,a.sorted
        while (n+=1)%2or l<>a
            p,d='',(~n%4+4)//3
            for i in n%2*(c+1-c%2),p,o=p+o[1]+' ',[o.pop]+o
            for i in 1+d:c-n%2*c:2
                z=if(l[:i]<>a[:i],1,0)
                l.swap(i-z,i)
                p+=' ['|X'[z]]  '
            print[['','| '][d]+[p,p+'|'][d^c%2],p][n%2][:c*2]

各要素を左から順番に移動することで機能します。このため、それは途方もなく大きな(まだ正しい)パスマップを出力することがよくあります。

例:

3 1 4 2

\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
 X   X  
/ \ / \ 
|  X  |
\ / \ / 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.