問題1
scriptencoding utf-8
"forループ、whileループ、および再帰を使用して、リスト内の数字の合計を計算する
"3つの関数を記述せよ。
function! s:problem1_1()
let l = [3,5,1,2,9]
let s = 0
for i in l
let s += i
endfor
return s
endfunction
function! s:problem1_2()
let l = [3,5,1,2,9]
let s = 0
let i = 0
while i < len(l)
let s += l[i]
let i += 1
endwhile
return s
endfunction
function! s:_problem1_3(s, l)
if len(a:l)
return a:s + a:l[0] + s:_problem1_3(a:s, a:l[1:])
endif
return a:s
endfunction
function! s:problem1_3()
let l = [3,5,1,2,9]
return s:_problem1_3(0, l)
endfunction
if s:problem1_1() != 20
throw "プログラマ失格: s:problem1_1"
endif
if s:problem1_2() != 20
throw "プログラマ失格: s:problem1_2"
endif
if s:problem1_3() != 20
throw "プログラマ失格: s:problem1_3"
endif
問題2
scriptencoding utf-8
" 交互に要素を取ることで、2つのリストを結合する関数を記述せよ。例えば
" [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]
" を返す。
function! s:_problem2(lhs, rhs)
let r = []
for i in range(len(a:lhs))
call add(r, a:lhs[i])
call add(r, a:rhs[i])
endfor
return r
endfunction
function! s:problem2()
let lhs = ["a", "b", "c"]
let rhs = [1, 2, 3]
return s:_problem2(lhs, rhs)
endfunction
if s:problem2() !=# ["a", 1, "b", 2, "c", 3]
throw "プログラマ失格: s:problem2"
endif
問題3
scriptencoding utf-8
" 最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。定義では、フィ
" ボナッチ数列の最初の2つの数字は0と1で、次の数は前の2つの合計となる。例えば最
" 初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。
function! s:fib(n)
let r = [0, 1]
let i = 2
while i < a:n
call add(r, r[i-1] + r[i-2])
let i += 1
endwhile
return r
endfunction
function! s:problem3()
return s:fib(100)
endfunction
if s:problem3() !=# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026]
throw "プログラマ失格: s:problem3"
endif
問題4
scriptencoding utf-8
" 正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述
" せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる。
function! s:compare(lhs, rhs)
return a:rhs . a:lhs < a:lhs . a:rhs ? -1 : 1
endfunction
function! s:problem4()
let l = [50, 2, 1, 9]
return join(sort(l, function('s:compare')), '')
endfunction
if s:problem4() !=# 95021
throw "プログラマ失格: s:problem4"
endif
問題5
scriptencoding utf-8
" 1,2,…,9の数をこの順序で、"+"、"-"、またはななにもせず結果が100となるあらゆ
" る組合せを出力するプログラムを記述せよ。
" 例えば、1 + 2 + 34 - 5 + 67 - 8 + 9 = 100となる。
function! s:make100(r, b, n) abort
if a:n == 10
if eval(a:b) == 100
call add(a:r, a:b)
endif
else
for op in ['+', '-', '']
call s:make100(a:r, a:b . op . (a:n), a:n+1)
endfor
endif
return ''
endfunction
function! s:problem5()
set maxfuncdepth=200
let r = []
call s:make100(r, 1, 2)
return r
endfunction
for s:l in s:problem5()
if eval(s:l) != 100
throw "プログラマ失格: s:problem5"
endif
endfor
unlet s:l
で、問題3 なのですが Vim script では 32bit int しか扱えないので100個のフィボナッチ数列が数えられません。
よってわたくし、プログラマ失格となりました。みなさん今までお世話になりました。