Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !
En 67 l'historien hébreu Flavius Josèphe et quarante de ses compatriotes étaient cernés par les Romains dans une grotte de la ville de Jotapata. Ils décidèrent de ne pas se rendre et de se suicider.
Pour préserver sa vie ainsi que celle d'un de ses amis, Flavius Josèphe demanda que les suicides soient successifs.
La méthode utilisée n'est pas précisée, Bachet suggère que c'est en comptant de trois en trois qu'ils s'éliminèrent, sauf évidemment les deux derniers.
[COLOR="DarkSlateGray"][B]Function Flavius(n As Integer, m As Integer, Optional k As Integer = 2) As String
Dim Coll As New Collection
Application.Volatile
If n > 1 And m > 0 Then
Do
Coll.Add Coll.Count + 1
Loop While Coll.Count < n
Do While Coll.Count > 2
k = 1 + (k + m - 2) Mod Coll.Count
Coll.Remove k
Loop
Flavius = Coll(1) & ", " & Coll(2)
End If
End Function[/B][/COLOR]
[B][COLOR="DarkSlateGray"]=Flavius(41;3)[/COLOR][/B]
[COLOR="DarkSlateGray"][B]=Flavius(20;3;[COLOR="Red"]1[/COLOR])[/B]
[B]=Flavius(100;3;[COLOR="Red"]1[/COLOR])[/B][/COLOR]
Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer
'auteur du code : Kyle : source : The Daily WTF
Murderize = IIf(SoldiersInCircle = 1, 0, (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle)
End Function
Sub test()
MsgBox Murderize(41, 3)
End Sub
Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer
Return IIf(SoldiersInCircle = 1, 0, (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle)
End Function
source:Josephus problem -wikipediaThe easiest way to solve this problem in the general case is to use dynamic programming. This approach gives us the recurrence:
which is evident when considering how the survivor number changes when switching from n − 1 to n. This approach has running time O(n), but for small k and large n there is another approach. The second approach also uses dynamic programming but has running time O(klogn). It is based on considering killing k-th, 2k-th, ..., -th people as one step, then changing the numbering.
[/quote]Bonjour à tous
Merci de votre implication.
Dans les exemples que j'ai glané sur le net, certains ne cherchent la place que pour un seul survivant, d'autres pour deux.
Je vous livre la fonction que j'arrive pas à faire fonctionner
(elle doit être récursive si j'ai bien compris)
Code:Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer 'auteur du code : Kyle : source : The Daily WTF Murderize = IIf(SoldiersInCircle = 1, 0, (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle) End Function
PS: le code original était rédigé ainsi (ce n'est donc pas du VBA non ?)Code:Sub test() MsgBox Murderize(41, 3) End Sub
Code:Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer Return IIf(SoldiersInCircle = 1, 0, (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle) End Function
Sub test()
MsgBox Murderize(8, 3)
End Sub
Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer
'auteur du code : Kyle : source : The Daily WTF
If SoldiersInCircle <= 1 Then
Murderize = 0
Else
Murderize = (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle
End If
End Function
[COLOR="DarkSlateGray"]Public Function Murderize(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer
'auteur du code : Kyle : source : The Daily WTF
Murderize = IIf(SoldiersInCircle = 1, 0, (Murderize(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle)
End Function[/COLOR]
[COLOR="DarkSlateGray"][B]Public Function Mortderire(ByVal SoldiersInCircle As Integer, ByVal KillEveryXth As Integer) As Integer
If SoldiersInCircle = 1 Then
Mortderire = 0
Else
Mortderire= (Mortderire(SoldiersInCircle - 1, KillEveryXth) + KillEveryXth) Mod SoldiersInCircle
End If
End Function[/B][/COLOR]
Function Flavius2(soldats As Integer, intervalle As Integer, Optional debut As Integer = 2) As String
For n = 1 To soldats
cercle = cercle & Format(n, "000") & ","
Next n
posel = (debut + intervalle - 2) * 4 + 1
el = Mid(cercle, posel, 4)
While Len(cercle) > 8
cercle = Replace(cercle, el, "")
If posel + (intervalle - 1) * 4 > Len(cercle) Then
posel = posel + (intervalle - 1) * 4 - Len(cercle)
Else
posel = posel + (intervalle - 1) * 4
End If
el = Mid(cercle, posel, 4)
Wend
Flavius2 = CInt(Split(cercle, ",")(0)) & "," & CInt(Split(cercle, ",")(1))
End Function
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?
We use cookies and similar technologies for the following purposes:
Est ce que vous acceptez les cookies et ces technologies?