Language detail: Vim
Coverage: 6.60%
|
number of '+' ratings |
contribution for coverage |
Unsolved challenges
- 文字列で+を表示する (Nested Flatten)
- 年賀はがきの当せん番号 (Nested Flatten)
- 箱詰めパズルの判定 (Nested Flatten)
- 関数やメソッドのソースの平均行数 (Nested Flatten)
- コレクションの実装 (Nested Flatten)
codes
ナベアツ算
(Nested
Flatten)
ここまでやる必要はないのですが...
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | scriptencoding utf-8
silent! unlet s:ndg
let s:ndg = [
\ {0: ''},
\ {0: 'じゅう'},
\ {0: 'ひゃく', 3: 'ぴゃく', 6: 'ぴゃく', 8: 'ぴゃく'},
\ {0: 'せん', 3: 'ぜん'},
\ ]
silent! unlet s:dig
let s:dig = [
\ {0: ''},
\ {0: 'まん'},
\ {0: 'おく'},
\ {0: 'ちょう'},
\ {0: 'けい'},
\ {0: 'がい'},
\ {0: 'じょ'},
\ {0: 'じょう'},
\ {0: 'こう'},
\ {0: 'かん'},
\ {0: 'せい'},
\ {0: 'さい'},
\ {0: 'ごく'},
\ {0: 'こうがしゃ'},
\ {0: 'あそうぎ'},
\ {0: 'なゆた'},
\ {0: 'ふかしぎ'},
\ {0: 'むりょうたいすう'}
\ ]
silent! unlet s:num
let s:num = [
\ {0: 'ぜろ'},
\ {0: 'いち'},
\ {0: 'に'},
\ {0: 'さん'},
\ {0: 'よん'},
\ {0: 'ご'},
\ {0: 'ろく', 3: 'ろっ'},
\ {0: 'なな'},
\ {0: 'はち', 3: 'はっ', 4: 'はっ'},
\ {0: 'きゅう'},
\ ]
silent! unlet s:num_aho
let s:num_aho = [
\ {0: 'じぇろ'},
\ {0: 'いちぃ'},
\ {0: 'にぃ'},
\ {0: 'しゃん'},
\ {0: 'よぉん'},
\ {0: 'ごぉ'},
\ {0: 'ろくぅ', 3: 'ろぉっ'},
\ {0: 'ななぁ'},
\ {0: 'はちぃ', 3: 'はぁっ', 4: 'はぁっ'},
\ {0: 'きゅうぅ'},
\ ]
" return japanese numeric string from 'num'
function! s:num2ja(num, numdic, digdic, ndgdic, lstdic)
let str = "" . a:num
let numdic = a:numdic
let digdic = a:digdic
let len = len(str)
if str == 0
return numdic[0][0]
endif
if len >= 17*4+1
return digdic[17][0]
endif
let n = 0
let ret = ""
while n < len
if n == len - 1
let numdic = a:lstdic
endif
if str[n] != 0 && (str[n] != 1 || (len-n)%4 == 1)
let ret .= has_key(numdic[str[n]], len-n) ?
\ numdic[str[n]][len-n] : numdic[str[n]][0]
endif
if str[n] != 0
let ret .= has_key(a:ndgdic[(len-n-1)%4], str[n]) ?
\ a:ndgdic[(len-n-1)%4][str[n]] : a:ndgdic[(len-n-1)%4][0]
let ret .= has_key(a:digdic[(len-n-1)/4], str[n]) ?
\ a:digdic[(len-n-1)/4][str[n]] : a:digdic[(len-n-1)/4][0]
endif
let n = n + 1
endwhile
return ret
endfunction
" generate array from 'start' to 'end'
function! s:gen_array(start, end)
let ret = []
let n = a:start
while n <= a:end
call add(ret, n)
let n = n + 1
endwhile
return ret
endfunction
for n in s:gen_array(1, 40)
if !(n % 3) || n =~ '3'
let ret = s:num2ja(n, s:num_aho, s:dig, s:ndg, s:num_aho)
else
let ret = s:num2ja(n, s:num, s:dig, s:ndg, s:num)
endif
if !(n % 5)
let ret = substitute(ret." Oh!", "じゅう", "じゅぉぅ", "g")
endif
if !(n % 8)
let ret .= "ー?"
endif
echo ret
endfor
|
クリップボードへの転送
(Nested
Flatten)
vimでは、*レジスタに対する操作がクリップボードに対する操作になります。 ノーマルコマンドでは、 "*yw (1単語ヤンク(コピー)) "*p (現在位置の後ろにペースト) 等になります。
1 2 3 4 5 | " クリップボードに hoge を突っ込む
:call setreg("*", "hoge")
" クリップボードから取り出す
:let b:var = getreg("*");
|
2^i * 3^j * 5^k なる整数
(Nested
Flatten)
素因数分解していくバージョンで
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 | :new
:let s:n=1
:let s:m=0
:while s:m < 100
: if s:n != 1 && s:n % 2 != 0 && s:n % 3 != 0 && s:n % 5 != 0
: let s:n = s:n + 1
: continue
: endif
: let s:_ = s:n
: let s:i = 0
: let s:j = 0
: let s:k = 0
: while s:_ % 2 == 0
: let s:_ = s:_ / 2
: let s:i = s:i + 1
: endwhile
: while s:_ % 3 == 0
: let s:_ = s:_ / 3
: let s:j = s:j + 1
: endwhile
: while s:_ % 5 == 0
: let s:_ = s:_ / 5
: let s:k = s:k + 1
: endwhile
: if s:_ == 1
: call append(s:m, printf("%d = 2^%d * 3^%d * 5^%d", s:n, s:i, s:j, s:k))
: let s:m = s:m + 1
: endif
: let s:n = s:n + 1
:endwhile
:unlet! s:n
:unlet! s:m
:unlet! s:i
:unlet! s:j
:unlet! s:k
:unlet! s:_
|
METHINKS IT IS A WEASEL
(Nested
Flatten)
やればできる子でした<Vim
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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | :function! s:Random(n)
: if has('win32')
: let r = libcallnr("msvcrt", "rand", 0)
: else
: let r = libcallnr("libc", "rand", 0)
: endif
: return r % a:n
:endfunction
:function! s:MakeRandom()
: let res = ''
: for i in range(strlen(s:goal))
: let res = res . nr2char(char2nr('A')+s:Random(26))
: endfor
: return res
:endfunction
:function! s:CheckScore(line, goal)
: let score = 0
: for i in range(strlen(a:goal))
: let a = char2nr(strpart(s:goal,i,1))
: let b = char2nr(strpart(a:line,i,1))
: let d = a < b ? b - a : a - b
: let score = score + d
: endfor
: return score
:endfunction
:function! s:SortLines(num)
: for i in range(a:num)
: let line = getline(i+1)
: let score = s:CheckScore(line, s:goal)
: let line = printf("%05d:%s", score, line)
: call setline(i+1,line)
: endfor
": %!sort
: let lines = sort(getline(1,a:num))
: for i in range(a:num)
: call setline(i+1,strpart(lines[i],6,strlen(s:goal)))
: endfor
:endfunction
:function! s:ChangeLine(line_num, idx_num, var_num)
: for i in range(a:line_num)
: let line = getline(i+1)
: for j in range(a:var_num)
: let vline = line
: for k in range(a:idx_num)
: let split_idx = s:Random(strlen(s:goal))
: let head = strpart(vline,0,split_idx)
: let tail = strpart(vline,split_idx+1,strlen(s:goal))
: let vline = head .nr2char(char2nr('A')+s:Random(26)) . tail
: endfor
: call setline(a:line_num*(j+1)+i,vline)
: endfor
: endfor
:endfunction
:let s:initial_line_num = 300
:let s:change_idx_num = 1
:let s:variaty_num = 5
:let s:goal = "METHINKSITISAWEASEL"
:let s:start_time = localtime()
:new
:for s:i in range(s:initial_line_num)
: call setline(s:i+1, s:MakeRandom())
:endfor
:call s:SortLines(s:initial_line_num)
:let s:break_flag = 0
:while s:break_flag == 0
: call s:ChangeLine(s:initial_line_num,s:change_idx_num,s:variaty_num)
: call s:SortLines(s:initial_line_num * s:variaty_num)
: let s:line = getline(1)
: if s:line ==# s:goal
: let s:break_flag = 1
: endif
: echo getline(1)
:endwhile
:1
:let s:end_time = localtime()
:call append(0, (s:end_time - s:start_time) . " seconds elapsed")
|
LL Golf Hole 8 - 横向きのピラミッドを作る
(Nested
Flatten)
バッファが1つの数値のみからなる1行のみのとき、この数値を入力としてバッファを横向きピラミッドで置き換えます。
実行前にカーソルが1行目の左端にあることが必要です。なお、[Esc]はエスケープキー。Vim7で確認。
ほぼあなごるのASCII Starsに投稿したものの流用です。
1 | D@"A*[Esc]oGYlpxYggP@1[Esc]dd@1
|
すべて置換
(Nested
Flatten)
正規表現は magic オプションとかでいろいろ変わるので注意が必要です。
:help pattern
1 2 3 4 5 | substitute("2007-06-07", "-", "/", "g")
"=> 2007/06/07
substitute("2007-06-07", "[0-9][0-9]*", "*", "g")
"=> *-*-*
|
HTTPでGET
(Nested
Flatten)
コマンドモードで実行する。 このあと :w 好きなファイル名 とかすればよい。
1 | :e http://ja.doukaku.org/feeds/comments/
|
ピラミッドを作る
(Nested
Flatten)
vim7で...
1 2 3 | fun! Pyramid(n)
exe "normal! ".(a:n-1)."o\<esc>:%s/^/\\=repeat('*',line('.')*2-1)\<cr>:%ce\<cr>"
endfun
|
分数を小数に展開
(Nested
Flatten)
君はやれば出来るんだから、ちゃんと宿題やってきなさい!ってよく言われたなぁ...(意味不明)
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 | fun! Frac(a, b)
let a = a:a
let b = a:b
let i = 0
let col = range(1, b*b)
let col[0] = 0
let col[b] = 0
let s = (a / b) . "."
while 1
let i = i + 1
let a = a % b
let col[b+i] = a
let j = col[a]
if j >= 0 && j < i && col[b+j] == a
break
endif
let col[a] = i
let a = a * 10
let s .= (a / b)
endwhile
if a == 0
return s
endif
if col[a] == (i-1)
let i = 1
endif
let s = strpart(s, 0, col[a]+1) . "{" . strpart(s, col[a]+1, i) . "}"
return s
endfun
|
n人中m人が当選するくじ
(Nested
Flatten)
あ、ハードコーディング...orz
1 2 3 4 5 6 7 8 9 10 11 12 | fun! Lot(n, m)
let v = range(1, a:n)
while len(v) > a:m
if has('win32')
let r = libcallnr("msvcrt", "rand", 0)
else
let r = libcallnr("libc", "rand", 0)
endif
silent! call remove(v, (r % len(v)))
endwhile
return v
endfun
|
我ながら強引すぎるな...
(libcは動くかどうかわかりません汗)「:echo Lot(10, 5)」で実行
1 2 3 4 5 6 7 8 9 10 11 12 | fun! Lot(n, m)
let v = range(1, a:n)
while len(v) > a:m
if has('win32')
let r = libcallnr("msvcrt", "rand", 0)
else
let r = libcallnr("libc", "rand", 0)
endif
silent! call remove(v, (r % 10))
endwhile
return v
endfun
|
指定されたフォルダ以下のゴミ掃除
(Nested
Flatten)
vimスクリプト
1 2 3 4 5 6 | fun! DeleteBackupFiles(dir)
for v in split(globpath(a:dir, "*~"), "\n")
call delete(v)
endfor
endfun
call DeleteBackupFiles("/tmp")
|





turugina
#8720()
[
Vim
]
Rating0/0=0.00
vim scriptで。
Rating0/0=0.00-0+
[ reply ]