Wer liebt Permutationen nicht unbedingt, oder? Ich weiß, sie sind unglaublich - so viel Spaß!
Warum nicht diesen Spaß nehmen und ihn lustiger machen ?
Hier ist die Herausforderung:
Bei einer Eingabe in der genauen Form:, nPr
wobei n
der Pool entnommen wird und r
die Anzahl der Auswahlen aus diesem Pool (und n
und r
ganze Zahlen), wird die genaue Anzahl der Permutationen ausgegeben / zurückgegeben. Für diejenigen von euch, die ein bisschen verrostet sind mit der Terminologie: Permutation, def. 2a .
Hier kommt jedoch die Herausforderung ins Spiel (macht es nicht zu einfach):
Sie dürfen keine eingebaute Bibliothek, Framework oder Methode für Ihre Permutationsfunktion verwenden. Sie dürfen keine Fakultätsmethode, Permutationsmethode oder ähnliches verwenden. du musst alles selbst schreiben.
Wenn weitere Klarstellungen erforderlich sind, zögern Sie bitte nicht, mich in den Kommentaren darauf hinzuweisen, und ich werde umgehend entsprechend handeln.
Hier ist ein E / A-Beispiel:
Beispielfunktion ist permute(String) -> int
Eingang:
permute("3P2")
Ausgabe:
6
Das ist Code-Golf, also gewinnt der kürzeste Code!
quelle
split
, um den Eingang am aufzuteilenP
? Was ist mit einer Funktion, die eine Zeichenfolge in eine Zahl umwandelt?0 <= r <= n
?Antworten:
CJam,
15 bis14 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
Perl, 27 Bytes
Zählt man den Shebang als 4, wird die Eingabe von stdin übernommen.
Beispielnutzung
quelle
l61
?$\
auf1
(char 49, octal 61) gesetzt.Haskell,
7166 BytesZiemlich unkompliziertes Zeug: Teilen Sie am 'P' auf und nehmen Sie dann das Produkt zwischen (n-k + 1) und n.
Danke an nimi für die Idee, Pattern Guards anstelle von a zu verwenden
where
Klausel zu verwenden, konnten 5 Bytes eingespart werden.quelle
Minkolang 0,11 ,
132519 BytesVielen Dank an Sp3000 für diesen Vorschlag!
Probieren Sie es hier aus.
Erläuterung
Dies verwendet den gleichen Algorithmus wie Alex:
n P k
=n(n-1)(n-2)...(n-k+1)
.quelle
Julia,
635848 BytesDadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge akzeptiert und eine Ganzzahl zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=s->...
.Ungolfed:
Dies nutzt die Tatsache , dass die Anzahl der Permutationen ist n ( n - 1) ( n - 2) ... ( n - k + 1).
10 Bytes gespart dank Glen O!
quelle
Int
, so können Sie einfach verwendenmap(parse,...)
.Int
es in dieser Situation notwendig war. Vielen Dank!Bash + Linux-Utils, 33
jot
erzeugt die Folge vonr
ganzen Zahlen beginnend mitn-r+1
und trennt sie mit*
. Dieser Ausdruck wirdbc
zur arithmetischen Auswertung weitergeleitet.quelle
MATLAB, 54 Bytes
Versuchte es kleiner zu machen, aber eines der Dinge, in denen MATLAB wirklich schlecht ist, ist das Erhalten von Eingaben. Es dauert 32 Zeichen, nur um die beiden Zahlen aus der Eingabezeichenfolge zu erhalten!
Ziemlich selbsterklärender Code. Ruft die Eingabe in der Form ab,
%dP%d
in der% d eine Ganzzahl ist. Teilen Sie das inn
und aufr
. Zeigen Sie dann das Produkt jeder ganzen Zahl im Bereichn-r+1
bis ann
. Interessanterweise funktioniert dies sogarxP0
, wenn die richtige Antwort 1 lautet. Dies liegt daran, dass dieprod()
Funktion in MATLAB 1 zurückgibt, wenn Sie versuchen, das Produkt eines leeren Arrays zu erstellen. Immer wennr
Null ist, wird der Bereich ein leeres Array sein, also bekommen wir 1.Dies funktioniert auch perfekt mit Octave . Sie können es hier online ausprobieren .
quelle
Javascript,
5957 Bytesquelle
Java (594 Byte)
quelle
J, 23 Bytes
Eine anonyme Funktion. Beispiel:
Erläuterung:
Die Stope-Funktion, die ich verwendet habe, kann als eingebaut gelten ... Sie liegt irgendwo zwischen der Allgemeinheit des Multiplikationsoperators und der Spezifität des Fakultätsoperators.
quelle
APL, 23
Nimmt den String als Argument. Erläuterung:
quelle
⎕ML←3
In Dyalog verwenden.Python 2, 66
Ziemlich einfach. Verarbeitet die Zahleneingabe als
a,b
. Hält ein laufendes Produkt alsP
, das mit den erstenb
Gliedern von multipliziert wirda, a-1, a-2, ...
.quelle
input()
es nicht zu einem Fehler kommen konnte."3P2"
, die meiner Meinung nach normalerweise zulässig sind, aber hier lautet die Aufforderung "eine Eingabe in der exakten Form", und ich ändere sie in eine Funktion, die eine Zeichenfolge annimmt.TI-BASIC, 52 Bytes
TI-BASIC verfügt über eine "Produkt einer Liste" -Funktion, so dass es nicht allzu schwierig ist, die Einschränkungen für integrierte Funktionen zu umgehen. TI-BASIC unterstützt jedoch keine leeren Listen - wir müssen es also tun
Um die beiden Zahlen zu extrahieren, extrahiere ich die erste Zahl als Teilzeichenfolge. Das ist teuer ; es nimmt die ganze zweite Zeile ein. Um zu vermeiden, dass dies für die zweite Nummer erneut ausgeführt werden muss, setze ich die Variable P auf diese Nummer und bewerte die gesamte Zeichenfolge mit
expr(
bewerte und dividiere dann durch P².Schließlich nehme ich eine zufällige Permutation der Liste zwischen den beiden Zahlen (wobei ich darauf achte, eine zur zweiten Zahl hinzuzufügen) und nehme das Produkt.
quelle
Ouroboros ,
4745 BytesEiniges davon ist ziemlich hässlich - ich würde mir vorstellen, dass man weiter Golf spielen könnte.
Jede Codezeile in Ouroboros stellt eine Schlange dar, die ihren Schwanz frisst.
Schlange 1
S
wechselt zum gemeinsamen Stack.r.r
liest eine Zahl, dupliziert sie und liest eine andere. (Nicht-numerische Zeichen wieP
werden übersprungen.)-
Subtrahiert die beiden. Ist der Eingang war7P2
, haben wir jetzt7
,5
auf dem gemeinsamen Stapel. Zum Schluss1(
isst der letzte Charakter der Schlange. Da dies das Zeichen ist, auf dem sich der Befehlszeiger befindet, stirbt die Schlange.Schlange 2
)s
tut nichts beim ersten mal durch..!+
dupliziert die Oberseite des Stapels von Schlange 2, prüft, ob er Null ist, und fügt in diesem Fall 1 hinzu. Bei der ersten Iteration ist der Stapel leer und wird so behandelt, als ob er unendliche Nullen enthielte1
. Bei späteren Iterationen enthält der Stapel einen Wert ungleich Null. Dies hat keine Auswirkung.Als nächstes
S
schaltet auf den freigegebenen Stapel, wo wir die Nummer habenn
und einen Zähler für die Berechnung des Produkts.1+
erhöht den Zähler..@@.@\<!
dupliziert beide Zahlen und drückt 1, wennn
der Zähler noch größer oder gleich ist, andernfalls 0.@@*Y
Dann multipliziert man den Zähler mit dieser Zahl und wirft eine Kopie auf den Stapel von Schlange 2.s.!+
Wechselt zurück zum Stapel von Snake 2 und verwendet denselben Code wie zuvor, um die oberste Zahl in 1 umzuwandeln, wenn sie 0 war, und ansonsten beizubehalten. Dann*
multipliziert man das Ergebnis mit dem Teilprodukt, das auf diesem Stapel lag.Wir kehren jetzt zum gemeinsamen Stapel (
S
) zurück, duplizieren den Zähler-oder-Null-Zähler (.
) und negieren ihn zweimal (!!
), um einen Zähler ungleich Null in eine 1 zu verwandeln.4*.(
Multipliziert dies mit 4, dupliziert und frisst so viele Zeichen aus dem Ende der Schlange.(
werden gegessen, und die Steuerung springt zum Anfang des Codes. Hier werden)
vier Zeichens
wieder auferlegt, zum Stapel von Snake 2 zurückgeschaltet und die Ausführung fortgesetzt.n
, haben wir eine 0 auf dem Stapel, und es wird nichts gegessen.sn
wechselt zum Stapel von Schlange 2 und gibt den Höchstwert als Zahl aus; dann1(
isst das letzte Zeichen und stirbt.Das Ergebnis ist, dass das Produkt
(r+1)*(r+2)*...*n
berechnet und ausgegeben wird.Versuch es
Code-Snippet anzeigen
quelle