Skip to content

Instantly share code, notes, and snippets.

@todashuta
Created March 16, 2014 07:51
Show Gist options
  • Save todashuta/9579860 to your computer and use it in GitHub Desktop.
Save todashuta/9579860 to your computer and use it in GitHub Desktop.
" 最強のたらいまわし
" 出典: http://blog.livedoor.jp/dankogai/archives/50838244.html
" ただのたらいまわし関数
function! s:normal_tarai(x, y, z)
return a:x <= a:y ? a:y
\ : s:normal_tarai(s:normal_tarai(a:x - 1, a:y, a:z),
\ s:normal_tarai(a:y - 1, a:z, a:x),
\ s:normal_tarai(a:z - 1, a:x, a:y))
endfunction
" 最強のたらいまわし関数
function! s:laziest_tarai(x, y, zx, zy, zz)
return a:x <= a:y ? a:y
\ : s:laziest_tarai(s:tarai(a:x - 1, a:y, a:z),
\ s:tarai(a:y - 1, a:z, a:x),
\ s:tarai(a:zx, a:zy, a:zz)-1, a:x, a:y)
endfunction
function! s:tarai(x, y, z)
return a:x <= a:y ? a:y
\ : s:laziest_tarai(s:tarai(a:x - 1, a:y, a:z),
\ s:tarai(a:y - 1, a:z, a:x),
\ a:z - 1, a:x, a:y)
endfunction
set maxfuncdepth=500
let s:start = reltime()
echo 'ただのたらいまわし(10, 5, 0) :' s:normal_tarai(10, 5, 0)
echo '時間:' reltimestr(reltime(s:start))
let s:start = reltime()
echo '最強のたらいまわし(10, 5, 0) :' s:tarai(10, 5, 0)
echo '時間:' reltimestr(reltime(s:start))
echo ''
let s:start = reltime()
echo 'ただのたらいまわし(12, 6, 0) :' s:normal_tarai(12, 6, 0)
echo '時間:' reltimestr(reltime(s:start))
let s:start = reltime()
echo '最強のたらいまわし(12, 6, 0) :' s:tarai(12, 6, 0)
echo '時間:' reltimestr(reltime(s:start))
echo ''
let s:start = reltime()
echo 'ただのたらいまわし(18, 12, 6) :' s:normal_tarai(18, 12, 6)
echo '時間:' reltimestr(reltime(s:start))
let s:start = reltime()
echo '最強のたらいまわし(18, 12, 6) :' s:tarai(18, 12, 6)
echo '時間:' reltimestr(reltime(s:start))
echo ''
echo ''
"let s:start = reltime()
"echo 'ただのたらいまわし(100, 50, 0) :' s:normal_tarai(100, 50, 0)
"echo '時間:' reltimestr(reltime(s:start))
let s:start = reltime()
echo '(参考) 最強のたらいまわし(100, 50, 0) :' s:tarai(100, 50, 0)
echo '時間:' reltimestr(reltime(s:start))
echo ''
@todashuta
Copy link
Author

結果

ただのたらいまわし(10, 5, 0) : 10
時間:   3.377707
最強のたらいまわし(10, 5, 0) : 10
時間:   0.000665

ただのたらいまわし(12, 6, 0) : 12
時間: 121.659904
最強のたらいまわし(12, 6, 0) : 12
時間:   0.001054

ただのたらいまわし(18, 12, 6) : 18
時間: 127.321181
最強のたらいまわし(18, 12, 6) : 18
時間:   0.001890


(参考) 最強のたらいまわし(100, 50, 0) : 100
時間:   0.084649

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment