Language detail: sed
Coverage: 12.18%
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- 文字列で+を表示する (Nested Flatten)
- 年賀はがきの当せん番号 (Nested Flatten)
- 箱詰めパズルの判定 (Nested Flatten)
- 関数やメソッドのソースの平均行数 (Nested Flatten)
- コレクションの実装 (Nested Flatten)
codes
除算・余剰を使わずに閏年
(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)
next >>
その後、まじめに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/
|




matori #8391() [ sed ] Rating1/1=1.00
初投稿。 関数ではありませんがsedで。
Rating1/1=1.00-0+
[ reply ]