solution

門松列列${}_{n,k}$とは、長さ$n$の門松列列を作って前から$k$文字を適切に破壊すれば必ず作れる。 結果の列に辞書順最小などの制約はないので適当にする。 $O(N)$。

implementation

$54$byte perl。

<>!~$";print"3 "x$';print$_+$_%2*($_+1),$"for 1..$`-$'

$50$byte sh $\to$ ruby。

read n k;ruby -e"p *([1]*$k+[1,3,2,4]*$n)[0...$n]"

$46$byte perl。

print<>!~$",substr"1 "x$'."1 3 2 4 "x$`,0,$`*2

鑑賞

tailsさんの$45$byte perl: http://yukicoder.me/submissions/146584

print$,=$/=$",((1)x<>,(1,3,2,4)x6e3)[0..<>-1]
  • $"は既定値が空白
  • $,は出力区切り
    • print 1,3,2,4print 1,$",3,$",2,$",4つまり空白区切りにする
    • printの引数の位置で代入してるのは括弧をprintに食われるのを防ぐため
  • $/は入力区切り
    • 既定値は改行\nだが、ここに空白を入れることで<>がいい感じになる

後は上のとだいたい同じ