Language detail: sed

Coverage: 14.29%
number of '+' ratings
contribution for coverage

Unsolved challenges

codes

Feed

Used modules

next >>

2^i * 3^j * 5^k なる整数 (Nested Flatten)
sedだと割り算のコストが高すぎるので、他のアルゴリズムでは難しそうです。
乗算+ソートのために内部は2進で計算しています。
 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
#!/bin/sed
s/.*/lol/
: loop
    s/^\([^l]*\)l*o\([lo]*\)\(\n.*\)\?$/\1a\2\3\nx\2o\nx\2o+\2=\nx\2oo+\2=/
    : 2->10
        s/[f-j]/#&/g
        s/[a-j][#l]/\U&/g
        y/AbBcCdDeEfFgGhHiIjJ/bcdefghijabcdefghij/
        s/^#/b/m
        s/#//g
        s/\([a-j]\)[Lo]/\1/
    /[a-j][lo]/ b 2->10
    y/abcdefghij/0123456789/
    : add
        s/\([xo]l*\)l+\([lo]*\)l=/\U\1\E+\2=o/g
        s/X/xl/g
        y/LO/ol/
        s/l+\([lo]*\)o=/+\1=l/g
        s/o+\([lo]*\)\([lo]\)=/+\1=\2/g
        s/+=//g
    t add
    s/^x\([lo]*\)$/\U\1\Eo\1/gm
    y/LO/ll/
    : sort
        s/^\([lo]*\)\n\1$/\1/gm
        s/^\(\([lo]*\)l[lo]*\)\n\(\2o[lo]*\)$/\3\n\1/gm
    t sort
    s/^\(\(\w*\n\)\{99\}\w*\)\n.*$/\1/
/[lo]/ b loop
LL Golf Hole 8 - 横向きのピラミッドを作る (Nested Flatten)

1桁限定で72B。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
s/^/\n/
:a
y/987654321/876543210/
s/^/*/
P
/0/!ba
s/\n0//
:b
s/.//
p
tb
LL Golf Hole 5 - 最上位の桁を数え上げる (Nested Flatten)

Count down していく方が短くなりそう。 55B 。

1
2
3
4
5
6
7
8
h
:
s/\n.*//
y/987654321/876543210/
s/^00/9/
G
h
/^0/!b
LL Golf Hole 7 - バイト数を読みやすくする (Nested Flatten)

81B。

1
2
3
4
5
6
/^..\?.\?$/b
s/$/.0kMGT/
:a
s/\(.\)\(.\)..\...\(.\)/\1.\2\3/
ta
s/\(\...\).*/\1/
LL Golf Hole 6 - 10進数を2進数に基数変換する (Nested Flatten)

こっちのほうが短いですね。

1
2
3
s/\(.*\) \+\(.*\)/echo "obase=\2;\1"|bc/e
t
s/.*/echo "obase=2;&"|bc/e

外部コマンドを使って楽するとこんな感じ。ほとんど単なるsh。

標準入力に「10」とか食わせると2進変換、「10 8」のように空白で区切って基数を付けるとその基数で変換。

1
2
/\(.*\) \+\(.*\)/{s//echo "obase=\2;\1"|bc/e;b}
s/.*/echo "obase=2;&"|bc/e

無駄にsedで実装してみます。標準入力。2進のみ。

かなりダサいので誰か短くしてください。

 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
#!/bin/sed -f
s/^/@/
:a
/@0\?$/{s///;b}
/[02468]$/s/.*@/0&/
/[13579]$/s/.*@/1&/
s/@/&#/
:b
/#1$/{
  s///
  ba
}
/#10/{s//5#/;bb}
/#11/{s//5#1/;bb}
/#12/{s//6#/;bb}
/#13/{s//6#1/;bb}
/#14/{s//7#/;bb}
/#15/{s//7#1/;bb}
/#16/{s//8#/;bb}
/#17/{s//8#1/;bb}
/#18/{s//9#/;bb}
/#19/{s//9#1/;bb}
/#[3579]/{
  h
  s/.*#\(.\)*/\1/
  y/3579/1234/
  G
  /#.$/{s/\(.\)\n\(.*\)#./\2\1/;ba}
  s/\(.\)\n\(.*\)#./\2\1#1/
  bb
}
/#[02468]/{
  h
  s/.*#\(.\).*/\1/
  y/02468/01234/
  G
  s/\(.\)\n\(.*\)#./\2\1#/
}
/#./bb
s/#//
ba
文字列の反転(括弧の対応を保存) (Nested Flatten)

文字列にコントロールコードが入っていないこと前提。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sed -f
:paren
s/(\([^][(){}]*\))/\x01\1\x02/g;
t paren
s/{\([^][(){}]*\)}/\x03\1\x04/g;
t paren
s/\[\([^][(){}]*\)\]/\x05\1\x06/g;
t paren

s/\x01/)/g;
s/\x02/(/g;
s/\x03/}/g;
s/\x04/{/g;
s/\x05/]/g;
s/\x06/[/g;

s/$/\n/
:reverse
s/^\(.\)\(.*\n\)\(.*\)$/\2\1\3/
t reverse
s/\n//
仲間はずれの判定 (Nested Flatten)

「echo '111111' | sed -f nakama.sed 」や「echo '111211' | sed -f nakama.sed」のように使います。

1
2
3
4
5
6
7
s/^\(.\)\1*$/homo \1/
t
s/^\(.\)\1*\(.\)\1*$/quasi-homo \1 \2/
t
s/^\(.\)\(.\)\2*$/quasi-homo \2 \1/
t
c hetero
ファイル内の重複行削除(後優先) (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/sed -nf
H
x
s/\n\([^\n]*\)\n\1$/\n\1/
s/\n\([^\n]*\)\n\(.*\)\n\1$/\n\2\n\1/
x
${
    g
    s/^\n//
    p
}
重複する要素を取り除く (Nested Flatten)

echo '314159265' | sed -f onlyunique.sed のように使います。

1
2
3
4
5
s/$/#/
:loop
s/\(.\)\(.*\)\1\(.*\)$/\2\3\1/
t loop
s/#.*//
LL Golf Hole 5 - 最上位の桁を数え上げる (Nested Flatten)

標準入力。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/sed -nf
x
:a
s/$/0/
:b
p
G
/^\(.*\)\n\1$/b
s/\n.*//
/^9/{s//1/;ba}
y/12345678/23456789/
s/^0/1/
bb
LL Golf Hole 2 - 文字列に含まれる単語の最初の文字を大文字にする (Nested Flatten)

GNU sed版

1
sed 's/\b./\U&/g'

GNU sedで確認しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
:a
/\<[a-z].*/{
s//\n&/
h
s/.*\n\(.\).*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
H
g
s/\n.\(.*\)\n\(.\)$/\2\1/
b a
}
コマンドライン引数の取得 (Nested Flatten)
最初の直感でsedでは絶対無理だと思ったのですが、卑怯な技を思いついたので書いて見ました。
GNU拡張とシェル、procファイルシステムの力で無理やり実現しています(互換性の保証無し)。
自己参照するので、ファイル名を固定する必要があります。
このソースではカレントディレクトリにshowargs.sedという名前で保存して
./showargs.sed a b c d
などと実行します。
カレントディレクトリ以外から実行できるようにするためには--file=の部分を絶対パスに直してください。
1
2
3
4
5
6
7
#!/bin/sed --file=showargs.sed

s%^.*$%sed -e 's/[[:cntrl:]]/ /g' /proc/$PPID/cmdline%
e
s/^.*sed --file=showargs\.sed .*showargs\.sed *//
s/ *$//
q
ポーカーの役判定 (Nested Flatten)

その後、まじめにsedで書いてみました。こっちのほうがきれいかも。

 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
#!/bin/sed -f

/^\([CDHS][A2-9TJQK]\)\{5\}$/!b
/\([CDHS][A2-9TJQK]\).*\1/b

/\(.\).\(\1.\)\{4\}/{
    s/^/X/
}

s/[CDHS]//g

s/\([2468TQK]\+\)\([A3579J]\+\)/\2\1/g
s/\([2468TQK]\+\)\([A3579J]\+\)/\2\1/

s/\([3478JQK]\+\)\([A2569T]\+\)/\2\1/g
s/\([3478JQK]\+\)\([A2569T]\+\)/\2\1/

s/\([5-8K]\+\)\([A2349TJQ]\+\)/\2\1/g
s/\([5-8K]\+\)\([A2349TJQ]\+\)/\2\1/

s/\([9TJQK]\+\)\([A2-8]\+\)/\2\1/g
s/\([9TJQK]\+\)\([A2-8]\+\)/\2\1/

/[2-5]$/y/A2345/9TJQK/
/[6-9]$/y/A23456789/56789TJQK/
/[TJ]$/y/A23456789TJ/3456789TJQK/
/Q$/y/A23456789TJQ/23456789TJQK/

s/^\(.\)\1\1\1K$\|^.KKKK$/Four of a kind/

s/\(.\)\1\+//g

s/^$/Full house/
s/^.$/Two pair/
s/^..$/Three of a kind/
s/^...$/One pair/
s/^[A9]TJQK$/Straight/
s/^.....$/No pair/
s/^XATJQK$/Royal flush/
s/^X9TJQK$/Straight flush/
s/^X.....$/Flush/
アルファベットの繰り上がり (Nested Flatten)
codegolfに慣れている人はもっと格好良く書けるんだろうな、と思いつつ
sed で succ 実装したよ記念。
sedは入力無いと動き始めないので、適当に改行でも叩いて下さい。
$ echo |./succ.sed 辺りでも可。

行の中身を捨てて「A」入れる
:loop
CV(=100)が終端なら抜ける。
終端を複製
終端にsucc
loopに戻る
 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
#!/bin/sed -f

s/^.*$/A/

:loop
/CV$/q
s/[A-Z]*$/&,&/

:succ

:carry
s/Z\(_*\)$/_\1/
t carry
s/Y\(_*\)$/Z\1/
s/X\(_*\)$/Y\1/
s/W\(_*\)$/X\1/
s/V\(_*\)$/W\1/
s/U\(_*\)$/V\1/
s/T\(_*\)$/U\1/
s/S\(_*\)$/T\1/
s/R\(_*\)$/S\1/
s/Q\(_*\)$/R\1/
s/P\(_*\)$/Q\1/
s/O\(_*\)$/P\1/
s/N\(_*\)$/O\1/
s/M\(_*\)$/N\1/
s/L\(_*\)$/M\1/
s/K\(_*\)$/L\1/
s/J\(_*\)$/K\1/
s/I\(_*\)$/J\1/
s/H\(_*\)$/I\1/
s/G\(_*\)$/H\1/
s/F\(_*\)$/G\1/
s/E\(_*\)$/F\1/
s/D\(_*\)$/E\1/
s/C\(_*\)$/D\1/
s/B\(_*\)$/C\1/
s/A\(_*\)$/B\1/

s/,_/,A_/
y/_/A/

b loop
与えられた文字列でピラミッド (Nested Flatten)
\nをデリミタにしています。(\nh o g e)
1.1番目の項目を手前にコピー
2.ピラミッド一段上の形に合わせる
3.合わせたものが空白で埋まっていなければループ

最後に先頭の無駄な改行消してドン。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/sed -f
s/ //g
s/./ &/g
s/^ /\n/

:loop
s/^\n[^\n]*/&&/
s/^\(\n *\)[^ ] /\1 /
s/\n/ \n/2
/^\n *\n/!b loop

s/^\n *\n//
与えられた数字のケタ数 (Nested Flatten)
sed でカウントアップ初挑戦。(ついでにラベル":"も初)
桁上がりまで実装できずに9桁止まりになってしまい。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/bin/sed -nf

/^[1-9][0-9]*$/!d
h
s/$/@0123456789/

:counter
s/^[^@]\(.*\)@.\(.*\)$/\1@\2/
t counter

s/@\(.\).*$/\1/
G
s/^\([0-9]\)\n\([0-9]*\)$/\2は\1桁で、/p
x
y/123456789/000000000/
s/^0/1/
s/^.*$/最大桁は&の位です。/p
整数の漢数字表記 (Nested Flatten)
一兆一あたりでNG。億と万を取り除かないと。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/sed -f
s/$/@/
s/\([0-9]\)\([0-9]\{12\}@\)/\1兆\2/
s/\([0-9]\)\([0-9]\{8\}@\)/\1億\2/
s/\([0-9]\)\([0-9]\{4\}@\)/\1万\2/
s/\([1-9]\)\([0-9][0-9][0-9][兆億万@]\)/\1千\2/g
s/\([1-9]\)\([0-9][0-9][兆億万@]\)/\1百\2/g
s/\([1-9]\)\([0-9][兆億万@]\)/\1十\2/g
s/1\([兆億万@]\)/一\1/g
s/[01]//g
y/23456789/二三四五六七八九/
s/億万/億/
s/兆億/兆/
s/@$//
next >>

Index

Feed

Other

Link

Pathtraq

loading...