challenge 与えられた並べ替えを実現するあみだくじの生成

お題#4476を見て思いつきました。

0からn (n>=1) までの数字を任意の順で並べたリストが与えられた時、0からnまでが順に並んだ状態から出発して、与えられたリストの順で結果が得られるようなあみだくじを作成して出力するプログラムを書いてください。

与えられたリストが (3 5 2 4 0 1) の場合、出力の1例を示します:

 0 1 2 3 4 5
 | | |-| |-|
 | |-| |-| |
 |-| |-| | |
 | |-| |-| |
 | | |-| |-|
 | | | |-| |
 3 5 2 4 0 1

一応、制約条件を示しておきます。

  • あみだの横棒は縦棒をまたぐことはできません。常に隣接する縦棒同士の交換となります 。
  • 同じ行に複数の横棒があっても良いですが、ひとつの縦棒の同じ点からふたつ横棒が出ることはありません。

一つのリストに対して複数の解があり得ます。ナイーブな解に飽き足らなければ出力行数をなるべく少なくする解を求める方法を考えてみてください。

Posted feedbacks - PostScript

あいかわらず汚ないコードです。PostScript のカバレッジ稼ぎ。
ソートを記録して逆順に出力しているだけです。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
%!PS
/Data (352401) def

/MaxStringLength 100 def
/Log [] def

/Append { % String1 String2 Append NewString  / Depend on MaxStringLength
    exch
    MaxStringLength string dup dup
    0 5 -1 roll dup length 4 1 roll putinterval
    4 -1 roll dup length 2 index add 4 1 roll putinterval
    0 exch getinterval
} def

/Swap { % String/Array N0 N1 Swap -
    2 copy                % String N0 N1 N0 N1
    4 index exch get      % 
    exch 4 index exch get exch % String N0 N1 V0 V1
    4 index 4 -2 roll put put
} def

/Sort {
    /AmidaData exch def
    /InitialData AmidaData 100 string copy def
    /N AmidaData length def
    0 1 N 1 sub {
        /Line () def
        /Change false def
        dup
        dup 2 mod 0 ne {
            /Line Line (| ) Append def
        } if
        2 mod 2 N 2 sub {
            dup
            AmidaData exch 2 getinterval dup 0 get exch 1 get
            gt {
                AmidaData exch dup 1 add Swap
                /Line Line (|-| ) Append def
                /Change true def
            } {
                pop
                /Line Line (| | ) Append def
            } ifelse
        } for
        N sub 2 mod 0 ne {(|)}{()} ifelse Line exch Append /Line exch def
        Change { /Log [ Log aload pop Line ] def } if
    } for

    0 1 InitialData length 1 sub { InitialData exch 1 getinterval print ( ) print } for () =
    Log { = } forall
    0 1 AmidaData length 1 sub { AmidaData exch 1 getinterval print ( ) print } for  () =
} def

Data Sort

Index

Feed

Other

Link

Pathtraq

loading...