与えられた並べ替えを実現するあみだくじの生成
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
|


shiro
#4704()
Rating13/13=1.00
お題#4476を見て思いつきました。
0からn (n>=1) までの数字を任意の順で並べたリストが与えられた時、0からnまでが順に並んだ状態から出発して、与えられたリストの順で結果が得られるようなあみだくじを作成して出力するプログラムを書いてください。
与えられたリストが (3 5 2 4 0 1) の場合、出力の1例を示します:
一応、制約条件を示しておきます。
一つのリストに対して複数の解があり得ます。ナイーブな解に飽き足らなければ出力行数をなるべく少なくする解を求める方法を考えてみてください。
[ reply ]