Défi
Dans cette tâche, vous devez calculer le nombre de façons dont nous pouvons répartir les boules A dans les cellules B, chaque cellule ayant au moins une balle.
Les entrées A et B sont données sur une seule ligne séparée par un blanc, les entrées sont terminées par EOF.
Vous voudrez peut-être vérifier vos solutions ici .
Contribution
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Production
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Contraintes
- Chaque A et B peut être distingué.
- 0 <= A, B <= 20
- Vous pouvez utiliser la langue de votre choix
- La solution la plus courte gagne!
code-golf
math
combinatorics
Chimérique
la source
la source
S(n,0)
c'est1
sin=0
et0
autrement). Si vous le souhaitez, je peux trouver une référence pour l'affirmation plus forte que Stirling2 est dans le sous-groupe associatif du groupe exponentiel de Riordan.Réponses:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
De toute évidence, tout langage mathématique tel que APL me battra à cause de la verbosité de la syntaxe et du manque de constructions mathématiques intégrées :)
Modifier En outre, je n'ai aucune fonctionnalité liée à l'entrée, à l'exception des paramètres passés dans la fonction, je ne sais pas comment utiliser l'entrée standard avec JavaScript ...
Edit: Déplacer
i--
dans l'm=m*
expression; déplacern*=-1
enfor
; commencerr=1
à combiner les affectations et en supprimer une superflue au retour. (enregistrer 3 caractères)la source
readline
etprint
. Je ne sais pas ce que les autres utilisent ici.prompt
etalert
sont les io «standard» de JavaScript, car ce sont les appels io de blocage typiques, malgré le fait que vous n'utiliseriez jamais typiquement le blocage d'io avec JavaScript.Golfscript -
56 50 49 48 41 40 3837 caractèresRemarque: cela gère plusieurs lignes d'entrée, est rapide (1/8 s pour faire les cas de test) et ne se casse pour aucune entrée légale.
(La première version était également mon tout premier programme Golfscript; merci à eBusiness d'avoir signalé plusieurs trucs que j'ai manqués).
Afin d'en faire également un poste éducatif utile, voici une explication de son fonctionnement. Nous commençons par la récurrence
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Ceci peut être compris de manière combinatoire comme disant que pour placern
des boules distinctes dansk
des seaux reconnaissables de telle sorte que chaque seau contient au moins une balle, vous choisissez l'un desk
seaux pour la première balle (k *
), puis soit il contiendra au moins une balle supplémentaire (f(n-1, k)
) ou ce ne sera pas (f(n-1, k-1)
).Les valeurs qui en résultent forment une grille; prenant
n
comme l'index de ligne etk
comme l'index de colonne et l'indexation à la fois à partir de 0, il commencePassons donc au programme,
divise l'entrée en lignes, puis pour chaque ligne l'évalue, en mettant
n
etk
sur la pile, puis appelle<<STUFF>>
, comme suit:Ceci calcule les premières
k+1
entrées de lan+1
e ligne de cette grille. Initialement, la pile estn k
.),
donne pile den [0 1 2 ... k]
{!}%
donne pile d'n [1 0 0 ... 0]
où il y a desk
0.\{ <<MORE STUFF>> }*
amène len
haut et le fait le nombre de fois que nous exécutons<<MORE STUFF>>
.Notre pile est actuellement une ligne du tableau:
[f(i,0) f(i,1) ... f(i,k)]
0.@
met quelques 0 avant ce tableau. Le premier seraj
et le second seraf(i,j-1)
.{ <<FINAL LOOP>> }/
boucle à travers les éléments du tableau; pour chacun, il le place en haut de la pile puis exécute le corps de la boucle..@+2$*@)@
est la manipulation de la pile ennuyeuse pour prendre... j f(i,j-1) f(i,j)
et donner lieu... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
apparaît sur les restesk+1 f(i,k)
et rassemble tout dans un tableau, prêt pour le prochain tour de boucle.Enfin, lorsque nous avons généré la
n
e ligne du tableau,)p;
prend le dernier élément, l'imprime et supprime le reste de la ligne.Pour la postérité, trois solutions de 38 caractères sur ce principe:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
la source
[0]
->1,
, l'espace après zip peut simplement être supprimé, et l'autre espace peut être supprimé si vous stockez simplement dans un opérateur au lieu de k. Je n'ai pas encore parcouru votre code, mais je pense que vous pourriez vous contenter d'utiliser une valeur sans la mettre dans un tableau à certains endroits.J, 40
Par exemple
<1 s pour tous les cas de test.
Modifications
-/
au lieu d'alterner(1 _1)*
(idée de JB)1x+
la source
1x+
alors, mais ça ne me rachète que 1 personnage, alors que vous en avez pris 5!Lisp commun (83)
Il semble qu'il devrait y avoir un moyen plus court de tester les cas de base, mais rien ne me vient à l'esprit.
la source
J, 38 à 42
Selon vos préférences de rigueur concernant les langages interactifs et la présentation des résultats, faites votre choix dans le spectre J des solutions:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Lancez jconsole, entrez-le, puis collez l'entrée (terminez par Cd). Vous remarquerez que la sortie est séparée par des espaces (J est un langage vectoriel, il effectue le calcul sur l'ensemble de l'entrée dans son ensemble et le renvoie comme un vecteur 1D, dont la présentation par défaut est sur une seule ligne). Je considère que ok, l'esprit de ce problème est le calcul, pas la présentation. Mais si vous insistez pour avoir à la place des sauts de ligne:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
remplacement de Compose (
&
) par Under (&.
) renvoie un vecteur de chaînes dont la présentation se termine sur des lignes distinctes.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Exécuter à partir de la ligne de commande en tant que
$ jconsole balls.ijs < balls.in
Si vous avez voté pour cela, vous voudrez peut-être aussi donner du crédit à la solution d'Eelvex .
la source
&.
pour qu'il fonctionne correctement en mode interactif.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 caractères.GolfScript -
453836 caractèresRelation de récurrence d'implémentation de force moyenne (
3836 caractères):La relation de récurrence que j'ai volé de la solution de Peter Taylors, ça se passe comme ceci:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
Avec des cas spéciaux si l'une des variables est 0.
Mon implémentation ne réutilise pas les résultats précédents, donc chaque branche d'appel de fonction à deux nouveaux appels, sauf si l'un des zéro cas a été atteint. Cela donne le pire cas d'appels de fonction 2 ^ 21-1 qui prend 30 secondes sur ma machine.
Solution série Light-force (45 caractères):
la source
J, 55 caractères
wd
). Entrée sur stdin, sortie sur stdout.Script de test Bash:
la source
wd
?echo
, qui est défini comme0 0&$@(1!:2&2)
. Je ne sais pas ce que cela signifie, mais cela fait quelque chose comme de jolis éléments de rang 1 avec un saut de ligne. (Je remarque maintenant que 2 utilise plutôt que 4 ... Je pense que ça va toujours au stdout en mode console, au moins.)<< was unexpected at this time.
désolé, je suis nouveau sur l'entrée J, je l'ai toujours utilisé en mode console.Golfscript - 26 caractères
Avertissement: le boîtier 12 4 a besoin de beaucoup de mémoire (mais pas autant que la réponse ci-dessous) et prend un certain temps à s'exécuter
Évidemment, cette réponse a quelques problèmes, mais je vais la laisser ici parce que les commentaires y font référence et la réponse de mellamokb est basée sur elle.
Golfscript - 24 caractères
Avertissement: le boîtier 12 4 a besoin de beaucoup de mémoire et prend un certain temps à s'exécuter
la source
0 0
devrait produire1
;0 k
pour tout autrek
devrait produire0
;n 1
carn > 0
devrait produire1
.Python 140 caractères
la source
dc, 100 caractères
Hélas, dc ne semble pas être soutenu par ideone. Il peut y avoir un ou deux personnages à éliminer, mais c'est l'heure du coucher.
Remarque: cela prend en charge plusieurs lignes d'entrée, a une précision suffisante pour donner la sortie correcte même pour
20 19
(maudissez-vous, Perl, pour le temps que j'ai perdu à déboguer ma solution!), Et donne la sortie correcte pour0 0
.Les suggestions de Nabb permettent de raccourcir au moins
au prix de laisser du courrier indésirable dans les piles de registres (et donc de manquer de mémoire si nous calculons des milliards de réponses).
la source
l11
est analysé commel1 1
(vous pouvez utiliserK
comme un seul jeton de caractère0
si vous ne changez pas la précision de toute façon). Vous pouvez remplacer la boucle d'entrée par?[...?z1=4]
. Vous pouvez aligner la macro dans le registre1
. Et vous pouvez probablement enregistrer plus de caractères en général, mais j'attendrai qu'il soit plus court pour le comprendre.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Modification de
gnibbler
la solution GolfScript de. Je pense que c'est une solution de travail - testée avec [3,2], [4,2], [6,3] et [9,2] avec des réponses correctes. (J'ai utilisé$
et@
pour les variables pour resserrer l'espace autour dubase
mot - clé).Il existe deux problèmes avec
gnibbler
la solution actuelle de.Éditer
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Meilleure solution encore! Pas besoin d'incrémenter, il suffit d'ajouter à tous les nombres pour qu'ils commencent par [1], et aucun chiffre ne manquera (y compris le remplissage gauche de 0) une fois que vous déconnerez ce premier chiffre. Cette solution devrait fonctionner et a été testée avec les mêmes entrées ci-dessus. C'est aussi beaucoup plus rapide car nous n'incrémentons pas avant de prendre l'exposant pour générer le tableau (mais il souffre toujours du même problème de performances / mémoire pour une entrée plus grande).
Modifier : utilisez
gnibbler
l'idée de déplacer l'ajout de l'$
intérieur du filtre au lieu d'une étape supplémentaire. (économisez 3 caractères).la source
0 0
.n 1
pour tout n, le fait se bloquer. hmm ..05AB1E , 19 octets
REMARQUE: il est extrêmement lent et expire déjà
12 4
. Cependant, cela fonctionne comme prévu.Va voir si je peux trouver une méthode alternative qui fonctionne pour tous les cas de test dans un délai raisonnable.Voir ci-dessous pour une version beaucoup plus rapide qui exécute tous les cas de test en moins d'une seconde.Essayez-le en ligne ou vérifiez quelques autres cas de test (parmi les plus petits) .
Explication:
05AB1E , 29 octets
Voici une version beaucoup plus rapide qui fonctionne pour tous les cas de test en environ 0,5 seconde sur TIO:
Port de @mellamokb la réponse JavaScript , alors assurez-vous de voter pour lui!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
REMARQUE: fonctionne pour le cas de bord
0 0
dans ce cas (contrairement à la réponse JavaScript à partir de laquelle j'ai porté cette méthode), car la fonctionL
intégrée créera une liste[0,1]
.la source