( defun probability-of-kill ( sides health)
( * ( / ( expt sides ( floor health sides) ) )
( if ( > ( mod health sides) 0 )
( / ( 1 + ( - sides ( mod health sides) ) ) sides)
1 ) ) )
( progn
( dolist ( x '( ( 4 1 )
( 4 4 )
( 4 5 )
( 4 6 )
( 1 10 )
( 100 200 )
( 8 20 ) ) )
( format t "~a sides, ~a health -> ~f% probability~%"
( first x)
( second x)
( * 100 ( probability-of-kill ( first x) ( second x) ) ) ) )
( terpri) )
KGRlZnVuIHByb2JhYmlsaXR5LW9mLWtpbGwgKHNpZGVzIGhlYWx0aCkKICAoKiAoLyAoZXhwdCBzaWRlcyAoZmxvb3IgaGVhbHRoIHNpZGVzKSkpCgkgKGlmICg+IChtb2QgaGVhbHRoIHNpZGVzKSAwKQoJICAgICAoLyAoMSsgKC0gc2lkZXMgKG1vZCBoZWFsdGggc2lkZXMpKSkgc2lkZXMpCgkgICAgIDEpKSkKCihwcm9nbgogIChkb2xpc3QgKHggJygoNCAxKQoJCSAgICg0IDQpCgkJICAgKDQgNSkKCQkgICAoNCA2KQoJCSAgICgxIDEwKQoJCSAgICgxMDAgMjAwKQoJCSAgICg4IDIwKSkpCgkoZm9ybWF0IHQgIn5hIHNpZGVzLCB+YSBoZWFsdGggLT4gfmYlIHByb2JhYmlsaXR5fiUiCgkJKGZpcnN0IHgpCgkJKHNlY29uZCB4KQoJCSgqIDEwMCAocHJvYmFiaWxpdHktb2Yta2lsbCAoZmlyc3QgeCkgKHNlY29uZCB4KSkpKSkKICAodGVycHJpKSk=
stdout
4 sides, 1 health -> 100.0% probability
4 sides, 4 health -> 25.0% probability
4 sides, 5 health -> 25.0% probability
4 sides, 6 health -> 18.75% probability
1 sides, 10 health -> 100.0% probability
100 sides, 200 health -> 0.01% probability
8 sides, 20 health -> 0.9765625% probability