Language detail: Vim

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

Unsolved challenges

codes

Feed

Used modules

ファイルサイズの取得 (Nested Flatten)

vim scriptで。

1
2
3
4
5
function! EchoFileSize(filename)
  if getftype(a:filename) ==# "file" 
    echo getfsize(a:filename)
  endif
endfunction
ナベアツ算 (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)
実行するとfile.txtは書き換わってしまうので注意
1
vim -c "%g/^#/d _|wq" file.txt
ピラミッドを作る (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)
ノーマルモードで実行
1
:%s!\(\d\+\)!\=submatch(0)*105/100!g
指定されたフォルダ以下のゴミ掃除 (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")

Index

Feed

Other

Link

Pathtraq

loading...