Language detail: sed

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

Unsolved challenges

codes

Feed

Used modules

next >>

IPv6アドレスの短縮 (Nested Flatten)

初投稿。 関数ではありませんがsedで。

1
2
3
4
5
6
7
8
$ cat ipv6addr-example* ; cat ipv6addr-example* 
  | sed "s/00*\([0-9a-f]\)/\1/g; s/^0//; s/\(:\)0:0\(:0\)*/::/; s/:::/::/"
1230:5670:0000:0000:0123:0000:0000:00ab
0000:0000:0000:0000:0000:0000:0000:0001
0001:0000:0000:0000:0000:0000:0000:0000
1230:5670::123:0:0:ab
::1
1::
除算・余剰を使わずに閏年 (Nested Flatten)
cat << EOF | sed -f "sedスクリプトファイル"
> 1900
> 2000
> 2008
> 2009
> 2100
1900: False
2000: True
2008: True
2009: False
2100: False
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
h
s/^/000/
s/\(.*\)00$/\1/
/[02468][048]$/ b TRUE
g
s/$/: False/
b
:TRUE
g
s/$/: True/
'('と')'の対応 (Nested Flatten)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/bin/sed -f
s/[^\x28\x29]*//g
:a
s/\x28\x29//g
ta
/./{
  c False
  b
}
c True
漢数字で九九の表 (Nested Flatten)
sedでの罠は、正規表現の後方参照でした。
実行例。

$ echo | sed -nf kuku.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
#!/bin/sed -nf
s/.*/i@o: i/
:row
  h
  s/@/:/
  :num
    s/:o/:oo/
    s/ i*$/&&/
    G
    s/\n//
    s/@.*//
  /ooooooooo/!b num
  # print
  s/^.*://
  s/iiiiiiiiii/x/g
  s/ i/  i/g
  s/x /x○ /g
  s/xxxxxxxxx\|iiiiiiiii/九/g
  s/xxxxxxxx\|iiiiiiii/八/g
  s/xxxxxxx\|iiiiiii/七/g
  s/xxxxxx\|iiiiii/六/g
  s/xxxxx\|iiiii/五/g
  s/xxxx\|iiii/四/g
  s/xxx\|iii/三/g
  s/xx\|ii/二/g
  s/x\|i/一/g
  p
  # next
  g
  s/.*/i&i/
/^iiiiiiiiii/!b row
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/
next >>

Index

Feed

Other

Link

Pathtraq

loading...