Qui n'aime absolument pas les permutations, non? Je sais, ils sont incroyables - tellement amusant!
Eh bien, pourquoi ne pas prendre ce plaisir et le rendre plus amusant ?
Voici le défi:
Étant donné une entrée sous la forme exacte:, nPr
où n
est le pool pris et r
est le nombre de sélections de ce pool (et n
et r
sont des entiers), affiche / renvoie le nombre exact de permutations. Pour ceux d'entre vous qui sont un peu rouillés avec la terminologie: Permutation, def. 2a .
Cependant, c'est là que le défi entre en jeu (le rend pas trop facile):
Vous ne pouvez utiliser aucune bibliothèque, structure ou méthode intégrée pour votre fonction de permutation. Vous ne pouvez pas utiliser une méthode factorielle, une méthode de permutation ou quoi que ce soit du genre; vous devez tout écrire vous-même.
Si des éclaircissements supplémentaires sont nécessaires, n'hésitez pas à me le dire dans les commentaires et j'agirai rapidement en conséquence.
Voici un exemple d'E / S:
La fonction d'échantillon est permute(String) -> int
Contribution:
permute("3P2")
Production:
6
C'est le code-golf, donc le code le plus court gagne!
la source
split
pour diviser l'entrée à laP
? Qu'en est-il d'une fonction qui convertit une chaîne en nombre?0 <= r <= n
?Réponses:
CJam,
1514 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Perl, 27 octets
En comptant le shebang comme 4, l'entrée provient de stdin.
Exemple d'utilisation
la source
l61
?$\
sur1
(caractère 49, octal 61).Haskell,
7166 octetsTrucs assez simples: diviser au 'P' puis prendre le produit entre (n-k + 1) et n.
Merci à nimi pour leur idée d'utiliser des gardes de modèle plutôt qu'une
where
clause, cela a réduit de 5 octets.la source
Minkolang 0,11 ,
132519 octetsMerci à Sp3000 de l' avoir suggéré!
Essayez-le ici.
Explication
Cela utilise le même algorithme que celui d'Alex:
n P k
=n(n-1)(n-2)...(n-k+1)
.la source
Julia,
635848 octetsCela crée une fonction sans nom qui accepte une chaîne et retourne un entier. Pour l'appeler, donnez-lui un nom, par exemple
f=s->...
.Non golfé:
Cela utilise le fait que le nombre de permutations est n ( n -1) ( n -2) ... ( n - k +1).
10 octets enregistrés grâce à Glen O!
la source
Int
, donc vous pouvez simplement utilisermap(parse,...)
.Int
c'était nécessaire dans cette situation. Merci beaucoup!Utilitaires Bash + Linux, 33
jot
produit la séquence d'r
entiers commençant parn-r+1
et les sépare avec*
. Cette expression est canalisée pourbc
une évaluation arithmétique.la source
MATLAB, 54 octets
J'ai essayé de le rendre plus petit, mais MATLAB est vraiment mal à obtenir des entrées. Il faut 32 caractères juste pour obtenir les deux nombres de la chaîne d'entrée!
Code assez explicite. Obtenez l'entrée sous la forme
%dP%d
où% d est un entier. Divisez cela enn
etr
. Affichez ensuite le produit de chaque entier de la plagen-r+1
àn
. Fait intéressant, cela fonctionne même pourxP0
donner la bonne réponse de 1. En effet, dans MATLAB, laprod()
fonction renvoie 1 si vous essayez de faire le produit d'un tableau vide. Chaque fois qu'ilr
est nul, la plage sera un tableau vide, donc le bingo-test nous obtenons 1.Cela fonctionne également parfaitement avec Octave . Vous pouvez l'essayer en ligne ici .
la source
Javascript,
5957 octetsla source
Java (594 - octets)
la source
J, 23 octets
Une fonction anonyme. Exemple:
Explication:
La fonction de chantier que j'ai utilisée pourrait frôler le fait de compter comme une fonction intégrée ... Elle repose quelque part entre la généralité de l'opérateur de multiplication et la spécificité de l'opérateur factoriel.
la source
APL, 23
Prend la chaîne comme argument. Explication:
la source
⎕ML←3
dans Dyalog.Python 2, 66
Assez simple. Traite l'entrée numérique comme
a,b
. Conserve un produit en cours d'exécution telP
que multiplié par les premiersb
termes dea, a-1, a-2, ...
.la source
input()
n'a pas pu entraîner une erreur."3P2"
, ce qui, je pense, est généralement autorisé, mais ici le défi dit "une entrée sous la forme exacte", donc je la change en une fonction qui prend une chaîne.TI-BASIC, 52 octets
TI-BASIC a une fonction "produit d'une liste", donc contourner la restriction sur les builtins n'est pas trop difficile. Cependant, TI-BASIC ne prend pas en charge les listes vides. Nous devons donc
Pour extraire les deux nombres, j'extrais le premier nombre comme une sous-chaîne. C'est cher ; il occupe toute la deuxième ligne. Pour éviter d'avoir à refaire cela pour le deuxième nombre, j'ai défini la variable P sur ce nombre, et évalué la chaîne entière à l'aide
expr(
, puis divisée par P².Enfin, je prends une permutation aléatoire de la liste entre les deux nombres (en prenant soin d'en ajouter un au deuxième nombre) et de prendre le produit.
la source
Ouroboros ,
4745 octetsUne partie de cela est assez moche - j'imagine que cela pourrait être joué plus loin.
Chaque ligne de code dans Ouroboros représente un serpent mangeant sa queue.
Serpent 1
S
bascule vers la pile partagée.r.r
lit un nombre, le duplique et en lit un autre. (Les caractères non numériques commeP
sont ignorés.)-
Soustrait les deux. Si l'entrée était7P2
, nous l'avons maintenant7
,5
sur la pile partagée. Enfin,1(
mange le dernier personnage du serpent. Puisque c'est le caractère sur lequel se trouve le pointeur d'instruction, le serpent meurt.Serpent 2
)s
ne fait rien la première fois..!+
duplique le haut de la pile de snake 2, vérifie si elle est nulle, et si c'est le cas ajoute 1. Lors de la première itération, la pile est vide et traitée comme si elle contenait des zéros infinis, donc cela pousse1
; sur les itérations ultérieures, la pile contient une valeur non nulle et cela n'a aucun effet.Ensuite,
S
passe à la pile partagée, où nous avons le numéron
et un compteur pour calculer le produit.1+
incrémente le compteur..@@.@\<!
duplique les deux nombres et pousse 1 sin
est toujours supérieur ou égal au compteur, 0 sinon.@@*Y
multiplie ensuite le compteur par cette quantité et tire une copie sur la pile de serpent 2.s.!+
revient à la pile de snake 2 et utilise le même code que précédemment pour convertir le premier numéro en 1 s'il était égal à 0 et le conserver dans le cas contraire.*
Multiplie ensuite le résultat par le produit partiel qui se trouvait sur cette pile.Nous retournons maintenant à la pile partagée (
S
), dupliquons le compteur ou zéro (.
), et l'annulons deux fois (!!
) pour transformer un compteur différent de zéro en 1.4*.(
multiplie cela par 4, duplique et mange autant de caractères du fin du serpent.(
sont mangés et les boucles de contrôle jusqu'au début du code. Ici)
régurgite quatre personnages,s
revient à la pile de serpent 2 et l'exécution continue.n
, nous avons un 0 sur la pile et rien n'est mangé.sn
bascule vers la pile de snake 2 et sort la valeur supérieure sous forme de nombre; puis1(
mange le dernier personnage et meurt.Le résultat est que le produit
(r+1)*(r+2)*...*n
est calculé et sorti.Essaye le
Afficher l'extrait de code
la source