Es gibt eine Frage auf dieser Website , die dieser Frage ähnlich ist, aber ich habe eine Wendung hinzugefügt.
Sie haben drei Eingaben, die Anzahl der Personen im Kreis n , die k- te Person, die bei jedem Schritt ausgezählt wird, und die q- te Person, die überlebt. Die Personen im Kreis sind von 1 bis n nummeriert .
In einem Kreis von 20 Personen ist beispielsweise die 20. Person, die überlebt, die erste Person, die entfernt wurde, der 19. Überlebende die zweite Person, die entfernt wurde, und so weiter. Normalerweise besteht das Josephus-Problem darin, die letzte entfernte Person zu bestimmen , die hier als erster Überlebender bezeichnet wird.
Schreiben Sie das kürzeste Programm oder die kürzeste Funktion, die mit diesen drei Eingaben die Nummer der q- ten Person zurückgibt, die überleben soll.
Wenn es Probleme mit der Klarheit gibt, lassen Sie es mich bitte wissen.
Einige Beispiele:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Bearbeiten: Angenommen, alle Eingaben sind gültig. Das heißt, niemand fragt nach 0 oder negativen Zahlen und niemand fragt nach dem 20. Überlebenden in einem Kreis von 5 Personen (dh 1 ≤ q ≤ n).
Bearbeiten: Ich akzeptiere eine Antwort um Mitternacht UTC + 7 Anfang Dezember 2.
q=1
dies genau das gleiche ist wie die verknüpfte Josephus-Frage, richtig?Antworten:
Pyth, 16 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Die Eingabe hat die Form
k<newline>n<newline>q
.Erläuterung:
quelle
Piet,
280273 codelsEdit: Ich habe das noch ein bisschen runter gespielt, und ich denke, ich kann es noch weiter runter spielen, aber das wird noch kommen. Im Moment bin ich nur froh, dass es funktioniert und dass ich Platz hatte, um es in der linken unteren Ecke zu unterschreiben. Zwei Ideen, die ich mehr Codels speichern muss, sind a) die Endanweisungen zu ändern
pop, push 1, add, out num
(pop n, output r + 1) und b) in der unteren linken Ecke erneut zu duplizieren, um Codels in der Stapelbearbeitung später in der Schleife zu speichern.Das Bild oben ist mein Code mit 8 Pixel pro Codel. Im Allgemeinen ist es derselbe Algorithmus wie meine Python-Antwort, jedoch mit Eingaben in der Reihenfolge k , q , n . In der Praxis gibt es auch viel Stapelmanipulation. Sie können es hier versuchen, indem Sie das Bild dort öffnen und den Code damit ausführen.
Erläuterung
Dies ist eine schrittweise Entgolfung der Lösung.
quelle
CJam,
222019 BytesDies liest die Eingabe als
q k n
. Probieren Sie es online im CJam-Interpreter aus .Wie es funktioniert
quelle
Golfscript,
585655353130 BytesAngenommen, die drei Eingänge befinden sich bereits im Stapel in der Reihenfolge n , k , q
Diese Lösung setzt voraus, dass ich alles außer der endgültigen Antwort loswerden muss.
Wie es funktioniert
Weitere
j(n,k,q)
Informationen finden Sie in meiner Python 3-Lösung.Edit 1: Verwendet @ Doorknobs Vorschlag (Ein + hinzugefügt, um alle Eingaben in das Array zu bekommen)
Früher,
Edit 2: ~ wurde gemäß den Regeln des Wikis hinzugefügt und der Code verkürzt. Danke @Dennis
Früher,
Edit 3: Ein kürzerer Algorithmus wurde implementiert.
Früher,
Edit 4: Herausgefunden, dass ich
%
als Karte verwenden könnte.Früher,
Bearbeiten 5: Kleine Bearbeitung. Geändert
2$
zu@
machen[0..q-1]
und abzurufen . Einen Bissen gerettet3$
2$
k
Früher,
quelle
\;\;\;\;
kann ersetzt werden durch])\;
(Zeilenumbruch in Array, Rechts-Uncons, Swap und Pop).JavaScript (ES6), 56 Byte
Ungolfed
Grundsätzlich eine JavaScript-Anpassung von @ Sherlock9s Python-Antwort.
Prüfung
quelle
Mathematica, 50 Bytes
Eine anonyme Funktion. Nimmt Eingaben in der Reihenfolge vor
q,n,k
.quelle
C,
8173 BytesBasierend auf @ user81655s Javascript-Implementierung meiner Python-Antwort.
Bearbeiten: Ich entfernt
Prüfung
quelle
int
vor den Parameternamen löschen.Python 3,
726662 BytesEine dynamische Programmierfunktion in 62 Bytes. Angepasst an den Algorithmus von Wikipedia. Früher gab es eine direkte Implementierung dieses Algorithmus, wenn auf dieser Seite q = 1 (dh i = 1, r = 0) war, aber ich sehe, dass dies jetzt entfernt wurde.
Edit 1: Ich habe entfernt
i
, um 4 Bytes zu sparen. Erklärung bleibt unverändert.Edit 2: Fehlberechnung in der Byteanzahl. Ich verwendete
\r\n
für EOL und bemerkte nicht, als das 3 Bytes hinzufügte. Ich habe meine Byteanzahl entsprechend gesenkt.Wie das geht
Vielen Dank an @Dennis, der mich daran erinnert hat, dass ich meinen Code erklären soll (wenn auch nur implizit, weil er einen in seine Antwort aufgenommen hat). Wenn etwas unklar ist, lassen Sie es mich bitte wissen.
Bearbeiten:
Früher,
Eine iterative Funktion, die von Graham, Knuth und Patashnik aus der Konkreten Mathematik übernommen wurde. Obwohl dieser Algorithmus länger ist, ist er für großes n und kleines k schneller .
quelle
+
.PHP, 71 Bytes
Basierend auf den Antworten von @ Sherlock9. Siehe seine Python-Antwort für den Algorithmus.
Alternativ ist hier mein ursprünglicher naiver Ansatz ohne den Algorithmus. Dies verwendet ein Array, um zu markieren, welche Personen gefunden werden.
91 Bytes
quelle
Haskell,
484743 BytesBasierend auf einem Haskell-Algorithmus auf der Rosetta-Codepage der Josephus-Funktion mit zwei Eingaben. Golfvorschläge sind willkommen.
Edit: Mein Dank geht an nimi für die Hilfe beim Golfen des ersten Algorithmus, indem sie eine pointfree-Version vorschlägt, und für die Hilfe beim Golfen des zweiten Algorithmus, indem sie mir mitteilt, dass das
until
Schlüsselwort existiert.Eine Version des Algorithmus am Ende meiner Python-Antwort, angepasst aus der Konkreten Mathematik von Graham, Knuth und Patashnik. Obwohl dieser Algorithmus mit 62 Bytes länger ist und nicht so viel Golf gespielt hat wie der erste, ist er für große
n
und kleine schnellerk
.Ungolfed:
Erster Algorithmus
Zweiter Algorithmus
quelle
until
für eine (mehr oder weniger) die direkte Übersetzung der Python - Version des zweiten Algorithmus:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
und unendlich viele Listen und alles Mögliche. Danke für Ihre Hilfe!GameMaker Language (GML), 88 Byte
Basierend auf der Antwort von @ user81655
quelle
Jelly ,
1413 BytesTryItOnline!
Wie?
quelle
Ruby,
5348 BytesEin Lambda.
Wie es funktioniert
quelle