VB.NET Josephus Problem, blutiger Anfänger

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    @VaporiZed Ja das mit den Runden hab ich hergenommen, damit das Loop nicht einfach nur so "durchrauscht" und nur das nackte Ergebnis dasteht.
    Mit dem Knopf drücken kann man nach jeder Runde über die Checkboxen des DGV sehen, was in dieser Runde passiert ist etc.. Bei Anzahl 1000 Personen wäre das natürlich hinderlich :P .
    (ich lass das mal unter kreativer Freiheit laufen)
    Lg nogood
    codewars.com Rank: 4 kyu

    Benutzername schrieb:

    Wenn ich jetzt wegen mir 10 verschiedene Outfits habe, gibt es auch 10 Klassen.
    Nein - typischer Anfänger-DenkFehler.
    In einer Klasse definierst du überhaupt erstmal, was ein Outfit ausmacht.
    Bei meine Person das "Outfit" besteht aus Nummer und Sitzen. Habe ich diese Eigenschaften definiert, kann ich 10 Personen basteln, und ihren Eigenschaften verschiedene Werte zuweisen. (Oder auch die gleichen, wenn mir danach ist).

    Aber Outfit ist ein sehr sehr schlechter Begriff, um Programmierkram zu erläutern. Vergiss den. Merke dir: Eine Klasse hat Eigenschaften.
    Weil inne Realität bedeutet Outfit ja selbst wieder ein Sammelsurium von Eigenschaften (Haarschnitt, Nagellack, Schuh-Marke, wasweissich).
    Und bei der einen mag das Bauchnabelpiercing zum "Outfit" dazugehören, bei anneren nicht.
    Aber die Eigenschaften: Haarschnitt, Nagellack, Schuh-Marke, wasweissich, Bauchnabelpiercing - das alles kannste natürlich in einer Person-Klasse anlegen.
    Einmal angelegt, und gut ist.
    Nun kannste 10 Personen erstellen, und deren Eigenschaften individuell gestalten, manche mit Piercing, manche ohne.
    Es ist nur eine Klasse, aber 10 Personen (Objekte), verschiedene.

    Merken: Die Klasse ist der Bauplan der Objekte. Ein Objekt wird mit dem Schlüsselwort New erstellt:

    VB.NET-Quellcode

    1. 'eine Person:
    2. dim pers = New Person
    3. 'nocheine Person:
    4. dim pers2 = New Person
    5. 'viele Personen, in einem Person-Array:
    6. dim personen(999) as Person
    7. For i=0 to 999
    8. personen(i)=new Person
    9. next
    Alle diese Personen haben denselben Bauplan - also denselben Satz von Eigenschaften.
    Nur welche Werte die Eigenschaften jeweils annehmen - das ist individuell verschieden: Der eine hat Glatze, der annere Pony-Schnitt, Dockers/DocMartins, ... Aber Haarschnitt und Schuhe haben alle - weil die Klasse ist so angelegt.

    Hier noch was evtl. auch Klarheit schafft befördert: Grundlagen: Fachbegriffe


    Nochmal von vorne:

    Benutzername schrieb:

    Wenn ich jetzt wegen mir 10 verschiedene Outfits habe, gibt es auch 10 Klassen.
    Nein.
    Sondern du hast eine Klasse Outfit (den Bauplan eines Outfits), und davon 10 verschiedene Objekte. (So könnte man das modellieren.)

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich weiß jetzt nicht, ob das schon geklärt war. Ist das jetzt eine Hausaufgabe oder fürs Studium ect.?
    Irgendwie muss ich an Rekursion denken. Hier mein zweiter Wurf eher Richtung kurz und knapp und mit Rekursion (diesmal als Consolen Projekt). Wohl eher für mich selbst und Interessierte als für den Threadersteller.

    Main:
    Spoiler anzeigen

    C#-Quellcode

    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. Console.WriteLine("1000 Personen stehen im Kreis. Jeder siebte setzt sich hin bis nur noch 3");
    6. Console.WriteLine("Personen übrig sind die stehen! Nenne die Positon dieser drei!\n");
    7. Game GameObj = new Game();
    8. GameObj.Play(GameObj.LstPersonen);
    9. Console.WriteLine("Es stehen noch Position:\n");
    10. foreach (var person in GameObj.LstPersonen)
    11. {
    12. Console.WriteLine(person.Id);
    13. }
    14. Console.ReadLine();
    15. }
    16. }


    Class Person:

    C#-Quellcode

    1. public class Person
    2. {
    3. public int Id { get; set; }
    4. public Person(int id)
    5. {
    6. Id = id;
    7. }
    8. }


    Class Game:
    Spoiler anzeigen

    C#-Quellcode

    1. public class Game
    2. {
    3. const int EndeBeiAnzahlStehender = 3;
    4. const int GesamtPersonenAnzahl = 1000;
    5. const int Teiler = 7;
    6. private int CounterStehender = 0;
    7. public List<Person> LstPersonen = new List<Person>();
    8. public void Play(List<Person> lstPersonen)
    9. {
    10. if (lstPersonen.Count <= EndeBeiAnzahlStehender)
    11. {
    12. return;
    13. }
    14. List<Person> NochStehendePersonen = new List<Person>();
    15. foreach (Person person in lstPersonen)
    16. {
    17. CounterStehender += 1;
    18. if (CounterStehender != Teiler)
    19. {
    20. NochStehendePersonen.Add(person);
    21. }
    22. if (CounterStehender == Teiler)
    23. {
    24. CounterStehender = 0;
    25. }
    26. }
    27. LstPersonen = NochStehendePersonen;
    28. //Rekursion
    29. Play(NochStehendePersonen);
    30. }
    31. public Game()
    32. {
    33. for (int i = 1; i <= GesamtPersonenAnzahl; i++)
    34. {
    35. LstPersonen.Add(new Person(i));
    36. }
    37. }
    38. }


    Die Idee war in der Methode Play jede Person bis auf die je"siebten" in eine neue Liste zu adden und dann dieselbe Methode mit dieser neuen Liste solange auf zu rufen bis die Länge der Liste 3 Personen oder weniger enthält. Nicht Remove, da das in einer Foreach Schleife nicht geht.


    Lösung:

    P.S.: Stimmt die Lösung?
    Bilder
    • Bild_2020-12-04_230322.png

      6 kB, 604×147, 24 mal angesehen
    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nogood“ ()

    @exc-jdbi
    Of to the races then :)



    Ja musste auch erstmal schauen, hatte bei 1000 Personen < 1 ms also ne 0 stehen dachte ich hätte was falsch gemacht.
    Aber scheint so zu sein Rekursion for the win (oder meine CPU ist einfach Monster ;) ).


    Was ich mich aber jetzt frage, warum ist die Lösung bei kleiner Menge 1000 ca. 20 mal schneller, aber bei 1 Mio "nur" ca. 3 mal schneller?
    Bilder
    • Bild_2020-12-04_234835.png

      12,27 kB, 336×323, 27 mal angesehen
    codewars.com Rank: 4 kyu
    Ich hab mir schon gedacht, dass mein Algo nicht so schnell ist. in C# wärer sicher noch schneller. Aber auf 269 ms werde ich nicht runter kommen. Nicht mit meinem Prozessor.

    Diese Frage habe ich mir auch schon gestellt. Bei 9ms für 1000, würde man vermuten, dass er für 1 Mio. min. das 1000-fache haben sollte, je nach Komplexität des Algorithmus. Ich kann es mir nicht genau erklären, wird wahrscheinlich mit dem Prozessor bzw. CPU zu tun haben, dass er sich irgendwie auf diese Menge einstellt.

    Und JA: Dein Prozessor ist ein Monster.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Benutzername schrieb:

    Was genau passiert hier nach dem ersten =-Zeichen?

    VB.NET-Quellcode

    1. Dim pers = New Person With {.Nummer = i, .Sitzt = False}
    Meine Überlegung:
    Für jede Person i von 0 bis 999 (da die 0 mitgezählt wird sind es 1000 Personen, richtig?) wird ein Element "Person" angelegt. Jedes dieser Elemente wird fortlaufend und aufsteigend nummeriert (.Nummer = i) und bekommt erstmal den "Status", dass die zugehörige Person gerade steht (.Sitzt = False)
    Jo - ziemlich richtig! :thumbsup:
    Nur du sprichst von Elementen, die Personen zugeordnet sind. (So als stünden da tatsächlich 1000 Leute im Kreis).

    Streich das "Elemente".
    Da werden 1000 Person-Objekte erzeugt, also Objekte mit dem Datentyp Person - eine Klasse, die ich kurz zuvor programmiert hab. Die Personen haben eine Nummer und Sitzen oder nicht. Ich initialisiere sie so, dass sie nicht sitzen (also stehen).
    Nummer und Sitzt ist nicht etwas, was etwas anderem "zugeordnet" wäre.
    Sondern es sind Eigenschaften - also etwas, was ganz fest dran ist an der Person - mehr noch: das, was Person ausmacht - entsprechend ihres Bauplans.
    Ja: Nummer + Sitzt sind in Person eingebaut - nicht zugeordnet.

    So wie ein Kreis einen Radius hat und einen Mittelpunkt, so haben meine Person-Objekte eine Nummer, und sitzen (oder nicht).
    Man kann mw. den Radius ändern oder den Mittelpunkt - aber einen Kreis ohne diese Eigenschaften gibt es nicht - nicht denkbar - das wär kein Kreis.

    "Zuordnen" gibts natürlich auch inne Programmierung, aber das ist bisserl was anderes (deswegen haarspalter ich da bischen rum, wenn du sagst Nummer oder Sitzen sei den Personen nur zugeordnet).



    Achso - vlt. kennst du ja einfach die Syntax nicht - das ist einfach eine praktische Kurzschreibweise. Wurde glaub 2010 eingeführt. Also

    VB.NET-Quellcode

    1. Dim pers = New Person With {.Nummer = i, .Sitzt = False}
    2. 'ist dasselbe wie:
    3. Dim pers = New Person
    4. pers.Nummer = i
    5. pers.Sitzt = False
    Sowas sollteste aber schoma gesehen haben, odr?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @Benutzername Löse das Problem zunächst graphisch auf dem Papier, dazu reichen 10 oder 20 Probanden.
    Wenn Du das getan hast, kannst Du unsere Ausführungen besser verestehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    nogood schrieb:

    Ich weiß jetzt nicht, ob das schon geklärt war. Ist das jetzt eine Hausaufgabe oder fürs Studium ect.?

    Korrekt, Studium, 2. Hausaufgabe überhaupt, bestehen aller Hausaufgaben am Ende notwendig (zu min. 50%) um überhaupt zur Klausur zugelassen zu werden. Es wurden explizit keine Vorkenntnisse verlangt - Ich kenne seit 4 Wochen überhaupt erst den Begriff Visual Studio. Ich halte jetzt schon nicht mehr sehr viel von deren Lehr-Strategie. Habe von vielen anderen gehört, die dieselben Probleme haben (vielleicht ließt ja sogar jemand hier mit) und sich zum Teil auch direkt schon wieder abgemeldet hatten vom Kurs. Vielleicht wollen sie ja jetzt erstmal noch ausdünnen und danach geht es so weiter, dass auch ein Anfänger wieder Lernerfolge erzielen kann. Weil Skripte durchlesen und Mustersyntax schön und gut aber wenn man halt nicht mal hello world eigenständig programmieren kann, brauche ich doch mit dem Josephus-Problem gar nicht erst anfangen.

    Dann kämpf ich mich mal weiter durch die ganzen vielen neuen Antworten und hoffe, bis morgen Abend zur Abgabe irgendetwas zustande zu bringen - vielen Dank!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Benutzername“ ()

    Ich weiss jetzt nicht genau was du meinst.

    Der Algo sollte so konzipiert sein, dass schlussendlich immer alle sich hingesetzt haben. Das ist die Grundvoraussetzung.
    Wenn jetzt die letzten 3 Resultate verlangt werden, bricht der Algo einfach vorher ab, bevor alle sich hingesetzt haben.
    (Oder der Algo gibt die letzten 3 Resultate aus.)

    So habe ich das im Text auf Wiki verstanden.

    Ich muss aber zugeben, wenn man die Geschichte selber anschaut, war es das Los der die Person auswählte. Es musste also eine Art Fisher-Yates-Shuffle (oder eine Transposition) bestehen, was die Permutation definiert.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    Hi @Benutzername Ich weiß, dieser Beitrag gehört nicht zum Josephus-Problem, aber wenn du mehr über Klassen lernen möchtest, schau dir meinen Übungsthread an, den ich etxra angelegt habe.
    Hier kommt auch Vererbung zum Tragen, das heißt die Klasse Lebewesen
    ist ja viel zu allgemein und daher werden anhand einer biologischen Systematik mehrere Klassen gebaut (Säugetiere, dann Paarhufer, dann Echte Schweine), die von der jeweils oberen Klasse erben (also Eigenschaften mitnehmen) und auch selbst neue Eigenschaften in den Raum werfen. Oder andersherum formuliert: die obere Klasse muss an jemanden vererben (MustInherit), weil sie zu allgemein ist. Außerdem wird gesagt, dass die unterste Klasse, um die es geht, ([b]Hausschwein[/b]), selbst festlegt, was verändert werden darf. Man kann im Aufruf zum Beispiel nicht die Körpertemperatur oder die Anzahl der Zähne ändern (logisch!), aber sehr wohl das Alter.

    Zu Übungszwecken, damit man es mit drin hat, werden auch Structures und ganze Subs mitvererbt, die dann überschrieben werden müssen.

    Anderes Beispiel: Du bestellst eienen neuen (daher immer das Schlagwort New) VW Golf VII: du kannst bei der Bestellung andere Felgen wünschen, eine andere Farbe wünschen, aber Blinker und Achse bleiben dieselben ;)

    Und jetzt noch einen Schritt weiter: Wenn ich so viele Klassen habe, kann ich natürlich auch eine Klasse aus der Mitte hernehmen, zum Beispiel Paarhufer und diese verwenden, um ein Kamel zu bauen.

    Wie gesagt, tut nichts zur Sache des Josephus-Problems, aber ich dachte, weil du dich für Klassen interessierst, kannst du mal drüberlesen.
    An die Neulinge: Nutzt Option Strict On und Option Infer Off. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bartosz“ ()

    exc-jdbi schrieb:

    Der Algo sollte so konzipiert sein, dass schlussendlich immer alle sich hingesetzt haben. Das ist die Grundvoraussetzung.
    Jo - hab ich jetzt gemacht - kriege trotzdem annere Ergebnisse:
    n=1000, k=7, endGame=3, übrig bleiben: 97, 291, 398

    Ich hab meinen Algo mit Papier-gemalt überprüft, und halte ihn für wasserdicht.
    Ah - die Tests kann ich ja darstellen - nämlich die Josephus-Folgen (also die Reihenfolge der rausgekegelten Elemente) für n und k bis keiner übrig ist:
    n=11, k=7: 1 8 5 3 2 4 7 11 6 9 10
    n=4, k=7: 1 2 3 4
    Das kann man ja auf papier gemalt nachvollziehen.
    Ich hab meinen Algo selber geschrieben, und eine Bestätigung das meine Zahlen stimmen habe ich nicht.

    n = 11, k = 7 9 7 2 10 11 8 1 5 4 6 3
    n = 4, k =7 3 4 1 2

    Vielleicht findet man im Netzt Resultate.

    Ist es möglich, das dein Algo wenn der Personenkreis geschlossen wird, wieder bei 0 anfängt? Meiner dreht einfach immer weiter.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    @ErfinderDesRades @exc-jdbi Da habi Ihr wohl die von mir in Post #9 aufgeworfene Frage unterschiedlich beantwortet. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    eiglich nicht. Ich denke, wir fussen beide auf Wiki: de.wikipedia.org/wiki/Josephus-Problem
    Das ist eine eindeutige Beschreibung.
    Und sie beantwortet deine Frage mit: 5, denn die Liste muss einen Ring simulieren.



    exc-jdbi schrieb:


    n = 11, k = 7 9 7 2 10 11 8 1 5 4 6 3
    n = 4, k =7 3 4 1 2
    Hmm - kann ich auf Papier nicht nachvollziehen.
    In meiner Welt sollte eine Josephus-Folge immer mit dem ersten Element der ursprünglichen Liste anfangen, also immer mit 1 - wie kommts, dass bei dir mal mit 9 anfängt, mal mit 3?



    Ups - ich sehe grade:

    Wiki schrieb:

    Es werden n nummerierte Objekte im Kreis angeordnet; dann wird, beginnend mit der Nummer k, jedes k-te Objekt entfernt, wobei der Kreis immer wieder geschlossen wird. Die Reihenfolge der entfernten Objekte wird als Josephus-Permutation bezeichnet.
    Bei Wiki fängt Josephus komischerweise mit dem k-ten Element an.
    Aber auch dann kann ich exc-jdbis Ergebnisse nur für n=4 nachvollziehen, nicht für n=11:
    n = 11, k = 7 7 3 11 9 8 10 2 6 1 4 5
    n = 4, k =7 3 4 1 2

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich bin auch bei @nogood & @exc-jdbi
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private WithEvents JosephusProblem As New JosephusProblem(1000, 3)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. JosephusProblem.Solve()
    5. End Sub
    6. Private Sub JosephusProblem_PersonWasKilled(sender As Object, e As KilledPersonEventArgs) Handles JosephusProblem.PersonWasKilled
    7. ListBox1.Items.Add(e.Person.ID)
    8. End Sub
    9. Private Sub JosephusProblem_PersonsThatSurvived(sender As Object, e As SurvivedPersonEventArgs) Handles JosephusProblem.PersonsThatSurvived
    10. ListBox2.Items.AddRange(e.Persons.Select(Function(x) x.ID.ToString).ToArray)
    11. End Sub
    12. End Class
    13. Friend Class JosephusProblem
    14. Private CurrentPersonIndex As Integer = 0
    15. Private ReadOnly TargetCount As Integer
    16. Private ReadOnly PersonsLeft As New List(Of Person)
    17. Private ReadOnly DeadPersons As New List(Of Person)
    18. Friend Event PersonWasKilled As EventHandler(Of KilledPersonEventArgs)
    19. Friend Event PersonsThatSurvived As EventHandler(Of SurvivedPersonEventArgs)
    20. Friend Sub New(CountOfPersonsAtStart As Integer, TargetCount As Integer)
    21. Me.TargetCount = TargetCount
    22. Enumerable.Range(0, CountOfPersonsAtStart).ForEach(Sub(x) PersonsLeft.Add(New Person With {.ID = x + 1}))
    23. End Sub
    24. Friend Sub Solve()
    25. Do Until ProblemIsSolved()
    26. KillNextPersonAtRelativePosition7()
    27. Loop
    28. InformAboutLeftPersons()
    29. End Sub
    30. Private Function ProblemIsSolved() As Boolean
    31. Return PersonsLeft.Count = TargetCount
    32. End Function
    33. Private Sub InformAboutLeftPersons()
    34. RaiseEvent PersonsThatSurvived(Me, New SurvivedPersonEventArgs With {.Persons = PersonsLeft})
    35. End Sub
    36. Private Sub KillNextPersonAtRelativePosition7()
    37. CurrentPersonIndex = (CurrentPersonIndex + 6) Mod PersonsLeft.Count
    38. InformAboutKilledPerson(PersonsLeft(CurrentPersonIndex))
    39. DeadPersons.Add(PersonsLeft(CurrentPersonIndex))
    40. PersonsLeft.RemoveAt(CurrentPersonIndex)
    41. End Sub
    42. Private Sub InformAboutKilledPerson(Person As Person)
    43. RaiseEvent PersonWasKilled(Me, New KilledPersonEventArgs With {.Person = Person})
    44. End Sub
    45. End Class
    46. Friend Class SurvivedPersonEventArgs
    47. Property Persons As IEnumerable(Of Person)
    48. End Class
    49. Friend Class KilledPersonEventArgs
    50. Property Person As Person
    51. End Class
    52. Friend Class Person
    53. Property ID As Integer
    54. End Class


    Bilder
    • JosephusVaporiZed.png

      3,17 kB, 394×242, 16 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Meiner ist iterativ aufgebaut, und der iter zählt einfach immer weiter. Mit Modulo kann ich nachgucken, ob die Position besetzt ist.

    Jede Person im Kreis ist unbestimmt, und bekommt die Nummer erst, wenn er ausgewählt wird.

    Bei n = 4, k =7 bekommt der Index 2 die PersonenNummer 1 (ist 0-basierend). Der Index 0 ist also erst an 3-ter Stelle (PersonenNummer 3) dran.

    Genaus so auch bei n = 11, k = 7. Der Index 6 (0-basieren) bekommt die Personenzahl 1, der Index 2 (Position 13 % 11 = 2) bekommt die Personennummer 2 , die nächste Position wäre 21, das ist der Index 10 mit Personennummer 3 etc.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    @Benutzername Ich kann mich noch zu gut an die Zeit erinnern. Hier heute mal ein Freilos (vorausgesetzt, dass meine Lösung stimmt)!

    Visual Studio neues Consolen Vb.net App Framework Projekt erstellen und Copy Paste
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. '//Bauplan Person mit nur einer Eigenschaft jede Person hat seine "Sitz/Stehplatznummer"
    3. Public Class Person
    4. Public Property Id As Integer
    5. Public Sub New(nr As Integer)
    6. Id = nr
    7. End Sub
    8. End Class
    9. '//^^^Bauplan Person Ende
    10. '//Hauptprogramm
    11. '//Liste mit dem Namen "Personen" die Person-Objekte enthält wird reserviert
    12. '//Konvention ist die Liste im Plural der enthaltenden Ojekte zu benennen
    13. '// Also Personen = Liste of Person
    14. Public Personen As List(Of Person) = New List(Of Person)()
    15. Sub Main()
    16. '//Erzeugung der Liste Personen = (Person(Id=1), Person(Id=2), ... Person(Id=1000))
    17. For i As Integer = 1 To 1000
    18. Personen.Add(New Person(i))
    19. Next
    20. Console.WriteLine("1000 Personen stehen im Kreis jeder siebte setzt sich hin bis nur noch drei stehen:")
    21. '//erster Aufruf von Play mit der Liste der 1000 Personen
    22. Play(Personen)
    23. '//Ergebnis Darstellung in der ehemals 1000 Personen Liste stehen nur noch 3 drin
    24. Console.WriteLine("Es stehen zum Schluss noch Position:")
    25. For Each p As Person In NochStehendePersonen
    26. Console.WriteLine(p.Id)
    27. Next
    28. Console.ReadLine()
    29. End Sub
    30. '//^^^Hauptprogramm Ende
    31. '//Play Methode (o. auch Funktion genannt) die die "echte Arbeit" macht und die Position findet
    32. Private CounterStehender As Integer = 0
    33. Private NochStehendePersonen As List(Of Person) = New List(Of Person)()
    34. Private Sub Play(ByVal personen As List(Of Person))
    35. '//Abbruch Kriterium
    36. If personen.Count() <= 3 Then
    37. '//Übergabe der Liste der Stehenden Personen nach "außerhalt" der Play Methode
    38. '//falls da dann nur 3 drin stehen wird die Play Methode ja abgebrochen
    39. personen = New List(Of Person)()
    40. personen.AddRange(NochStehendePersonen)
    41. Return
    42. End If
    43. '//Neue Liste der jetzt noch stehenden Personen wieder bei null anfangen
    44. NochStehendePersonen = New List(Of Person)()
    45. '//jeder 7 setzt sich hin
    46. For Each p As Person In personen
    47. CounterStehender += 1
    48. If CounterStehender <> 7 Then
    49. NochStehendePersonen.Add(p)
    50. End If
    51. If CounterStehender = 7 Then
    52. CounterStehender = 0
    53. End If
    54. Next
    55. '//Rekursion: die Methode Play wird jetzt mit dieser Liste(PersonenDieNochStehen) neu aufgerufen bis
    56. Play(NochStehendePersonen)
    57. End Sub
    58. '//^^^Play Ende
    59. End Module


    webspace.ship.edu/deensley/mathdl/Joseph.html

    codewars.com Rank: 4 kyu

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „nogood“ ()

    der Link bestätigt mein Ergebnis für n=11, k=7.
    Jetzt habich meinen nochmal mit 1000 genudelt, und bin mit den 3 übrigen nun mit euch konform:
    n=1000, k=7, endGame=3: Übrig bleiben: 404 297 103

    Verstehe daher @exc-jdbis 11-er Abweichung immer weniger.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()