Die Herausforderung
Schreiben Sie eine Funktion, die zwei positive ganze Zahlen n und k als Argumente verwendet und die Nummer der letzten von n verbleibenden Person nach dem Auszählen jeder k- ten Person zurückgibt .
Dies ist eine Code-Golf-Herausforderung, also gewinnt der kürzeste Code.
Das Problem
n Personen (nummeriert von 1 bis n ) stehen in einem Kreis und jedes k- te wird ausgezählt, bis eine einzelne Person übrig bleibt (siehe den entsprechenden Wikipedia-Artikel ). Bestimmen Sie die Nummer dieser letzten Person.
ZB für k = 3 werden zwei Personen übersprungen und die dritte Person wird ausgezählt. Dh für n = 7 werden die Zahlen in der Reihenfolge 3 6 2 7 5 1 (im Detail 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 1 4 ) ausgezählt und die Antwort lautet somit 4 .
Beispiele
J(7,1) = 7 // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7 // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4 // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
{k block}
es,[0..n-1]
dass Sieg(0,k) 0 k
mit dem Umklappen beginnen? Entschuldigung, wenn ich diese Fragen an der falschen Stelle poste.0 1 block
. Sehr bequem, das ist zufällig sog(1, k) (2-1) block
. Also fängt esg(1,k) 1
eher an alsg(0,k) 0
. Nachdem der Block ausgeführt wurde, drückt er das nächste Element aus dem Array (2
) und führt den Block erneut aus usw.Minsky Register Machine (25 Non-Stop-Zustände)
Technisch gesehen keine Funktion, aber es handelt sich um ein Rechenparadigma, das per se keine Funktionen hat ...
Dies ist eine geringfügige Abweichung vom Haupttestfall meiner ersten MRM-Interpretationsaufgabe :
Eingabe in Register
n
undk
; Ausgabe im Registerr
; Es wird davon ausgegangen, dassr=i=t=0
bei der Einreise. Die ersten beiden Halt-Anweisungen sind Fehlerfälle.quelle
k=1
dannr=0
. Hmm, ich muss noch einmal darüber nachdenken ...i
zählt einfach von2
bis,n
währendr
das Register ist, das das Ergebnis ansammelt.Python, 36
Ich habe auch die Formel aus Wikipedia verwendet:
Beispiele:
quelle
Mathematica,
3836 BytesGleiche Wikipedia-Formel:
quelle
If[#<2,1,Mod[#0[#-1,#2]+#2,#,1]]&
C 40 Zeichen
Dies ist so ziemlich genau die Formel, die der oben verlinkte Wikipedia-Artikel angibt:
Hier ist eine Implementierung, die die Simulation ausführt (99 Zeichen):
quelle
j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
.Gleichstrom, 27 Bytes
Verwendet die Wiederholung aus dem Wikipedia-Artikel. Erläuterung:
quelle
J, 45 Zeichen
Führt die Simulation aus.
Alternativ können Sie die Formel (31 Zeichen) verwenden:
Ich hoffe Howard macht es nichts aus, dass ich das Eingabeformat leicht angepasst habe, um es einem dyadischen Verb in J anzupassen.
Verwendung:
quelle
GolfScript,
3224 BytesVerwendung: Erwartet, dass sich die beiden Parameter n und k im Stapel befinden, und verlässt den Ausgabewert.
(Danke an Peter Taylor, der einen iterativen Ansatz und viele andere Tipps vorgeschlagen hat.)
Der alte (rekursive) Ansatz von 32 Zeichen:
Dies ist mein erstes GolfScript. Bitte teilen Sie mir Ihre Kritik mit.
quelle
1-
hat einen speziellen Opcode(
. Ähnlich1+
ist es)
. Sie müssen keine alphabetischen Zeichen zum Speichern verwenden, sodass Sie z. B.^
anstelle von verwenden könnenJ
und kein Leerzeichen danach benötigen. Sie haben weit mehr$
s als in einem gut golfenen Programm üblich: Überlegen Sie, ob Sie sie mit einer Kombination aus reduzieren können\@.
.$
Referenzen zu entfernen .g
aus dem Wikipedia-Artikel aus und verwenden Sie,
und/
.{,{\2$+\)%}*)\;}:f;
Stellen Sie sicher , dass Sie verstehen , warum es funktioniert;)k
die Schleife zu verwenden und dann 2 weitere, um sie am Ende zu verwerfen, können wir ihn mit+
17 Zeichen in die Schleife ziehen :{{@+\)%}+\,*)}:f;
Ich bezweifle, dass dies verbessert werden kann.R 48
Laufende Version mit Beispielen: http://ideone.com/i7wae
quelle
Groovy, 36 Bytes
quelle
Haskell, 68
Führt die eigentliche Simulation durch. Demonstration:
quelle
Scala, 53 Bytes
quelle
C 88 Zeichen
Tut die Simulation, berechnet die Formel nicht.
Viel länger als die Formel, aber kürzer als die andere C-Simulation.
Anmerkungen:
1. Belegt den Speicher und gibt ihn niemals frei.
2. Ordnet
n*8
anstelle von zun*4
, weil ich benutzep[n]
. Konnte zuordnen(n+1)*4
, aber es ist mehr Zeichen.quelle
C ++, 166 Bytes
Golf gespielt:
Ungolfed:
quelle
J
Mithilfe des ternären Operators können Sie Bytes für die Funktion speichern .intn
in Ihrer Golf-Version wird nicht kompiliert#include <list>
J, 8 Bytes
quelle
Ruby, 39 Bytes
Laufende Version mit Testfällen: http://ideone.com/pXOUc
quelle
Q, 34 Bytes
Verwendung:
quelle
Ruby, 34 Bytes
quelle
Haskell, 29
Verwendung der Formel aus Wikipedia.
quelle
JavaScript (ECMAScript 5), 48 Byte
ECMAScript 5 wurde verwendet, da dies die neueste Version von JavaScript war, als diese Frage gestellt wurde.
ES6-Version (nicht konkurrierend), 33 Byte
Erläuterung
Hier gibt es nicht viel zu sagen. Ich implementiere nur die Funktion, die mir der Wikipedia-Artikel gibt.
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
quelle
8. 82 Bytes
Code
SED (Stack Effect Diagram) ist:
n k -- m
Verwendung und Erklärung
Der Algorithmus verwendet ein Array von Ganzzahlen wie folgt: Wenn der Personenwert 5 ist, ist das Array [1,2,3,4,5].
quelle
J , 24 Bytes
Probieren Sie es online!
Ein iterativer Ansatz, der auf der dynamischen Programmierlösung basiert.
Erläuterung
quelle
J , 19 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Dart , 33 Bytes
Probieren Sie es online!
quelle
Japt , 15 Bytes
Probieren Sie es online!
Ein Byte könnte durch 0-Indizierung von k gespeichert werden , aber es ist eigentlich kein Index, deshalb habe ich mich dagegen entschieden.
Erläuterung:
quelle
Japt
-h
, 10 BytesVersuch es
quelle
Powershell, 56 Bytes
Wichtig! Das Skript ruft sich selbst rekursiv auf. Speichern Sie das Skript als
f.ps1
Datei im aktuellen Verzeichnis. Sie können auch eine Skriptblockvariable anstelle einer Skriptdatei aufrufen (siehe das Testskript unten). Dieser Anruf hat die gleiche Länge.Testskript:
Ausgabe:
quelle