La situation:
Plusieurs ( M
) nains ont trouvé un coffre de gobelin avec N
des pièces d'or et doivent les diviser. En raison des anciennes règles régissant l'attribution du butin aux pirates par ordre d'ancienneté, le nain le plus âgé devrait obtenir une pièce de plus que le nain le plus ancien suivant, et ainsi de suite, de sorte que le plus jeune nain reçoive M-1
moins de pièces que le plus vieux nain. De plus, aucun nain ne doit lancer de pièces (c.-à-d. Aucune pièce négative à aucun nain)
Aidez les nains à diviser les pièces de cette façon, ou dites-leur que c'est impossible.
Le code du gagnant doit toujours répondre correctement (ce défi est déterministe) et suivre les règles générales du code-golf .
Contribution
On vous donne un entier N (3 ≤ N ≤ 1000) pour le nombre de pièces et un entier M (3 ≤ M ≤ N) pour le nombre de nains, séparés par des espaces.
Sortie
S'il est impossible de diviser les pièces comme le veulent les nains, imprimez -1 (moins un). Sinon, imprimez le nombre de pièces que chaque nain recevra, du plus vieux au plus jeune. Séparez les nombres par des espaces.
Échantillons :
contribution
3 3
sortie
2 1 0
contribution
9 3
sortie
4 3 2
contribution
7 3
sortie
-1
contribution
6 4
sortie
3 2 1 0
Réponses:
J -
32292825ne pasplus court que les autres solutions J,maiset utilise une idée différenteLa réponse pour le nombre de pièces que le gnome de rang le plus élevé obtient est simplement
N/M+(M-1)/2
(si c'est un entier), nous construisons le négatif de cela-:@-.@]-%
. Fait ensuitei:
un tableau comme celui-ci2 1 0 _1 _2
pour l'argument_2
et nous en prenons M éléments.la source
i:
. Vous pouvez enregistrer trois autres caractères en écrivant à la%
place de[%]
et en utilisant à la-.@]
place de(1-])
.J - 30 caractères
Très amusant au golf. Beaucoup de choses ont bien fonctionné.
Explication:
/
- Prenez les entiers séparés par des espaces comme argument et glissez la fonction entre eux. C'est-à-dire, considérons N l'argument gauche de la fonction entre parenthèses(...)
et M l'argument droit.i.&-
- Negate (-
) puis prenez des entiers (i.
). Normalement, lorsque vous faites quelque chose commei.5
vous0 1 2 3 4
. Chaque fois qu'ili.
reçoit un nombre négatif, cependant, il inverse cette liste de sortie. Donc, par exemplei._5
, donnera4 3 2 1 0
.s=.+/&
- Effectuez l'action ci-dessus sur chaque argument (&
) puis créez une table d'addition (+/
) à partir de ces tableaux. Nous avons maintenant une table où chaque ligne est une distribution possible de pièces aux M nains, mais peut-être pas quand il y a N pièces. Enfin, ce verbe de création de table est si utile que nous allons l'appelers
et le réutiliser plus tard.+/@s~
- Maintenant, nous utilisonss
nouveau, mais nous échangeons (~
) l'ordre des arguments, afin de transposer le tableau. C'est une façon golfique de prendre la somme de chaque ligne après avoir créé la table (+/@
), en rapport avec la façon dont J additionne les listes multidimensionnelles.i.[
- Dans cette liste de sommes, on cherche l'argument gauche du verbe, c'est-à-dire N. Si N est un item, on obtient cet index: sinon on obtient la longueur de la liste, qui est notamment un index invalide.{ ::_1:
- Maintenant, nous essayons d'utiliser l'index pour extraire une ligne du tableaus
.{
va lancer une erreur de domaine si l'index n'était pas valide, donc dans ce cas, nous interceptons l'erreur (::
) et retournons -1 (_1:
). Cela gère tout. Puisque nous utilisonsi.&-
précédemment, la distribution des pièces sera dans l'ordre décroissant, comme cela était nécessaire.Usage:
la source
9 3
devrait revenir4 3 2
, non-1
. Semble qu'il y a une transposition dans votre exemple d'utilisation?9 3
donne4 3 2
et7 3
donne_1
, comme prévu.R -
7170676665 caractèresUngolfed:
Solution:
Si M le nombre de nains, alors la séquence d'or payé peut être décomposée en deux séries singulières. D'abord une série se terminant par zéro: M-1, ..., 2, 1, 0 et une série constante de c, c, ..., c. La somme de la première série est toujours M * (M-1) / 2. Donc, si le reste (x = N - M * (M-1) / 2) pouvait être divisé sans reste (modulo égal à 0), chaque nain obtient x / M plus la partie de la série décroissante.
Usage:
la source
m*(m+1)/2
parsum(1:m)
PHP (187)
C'est ma première tentative de golf, et je sais que ça pourrait être mieux, mais quand même :)
Golfé:
Ungolfed:
Exécuter dans un shell
Idée basique:
Les pièces peuvent être séparées par ces règles, si l'une d'entre elles est vraie:
Si c'est le cas, nous prenons pour base la moyenne des pièces par nain (ACPD). Mais nous devons partir du plus haut et produire jusqu'à ce que nous atteignions le plus bas. Nous faisons donc une boucle avec un compteur à partir de ACPD + le décompte des autres nains vers l'extrémité supérieure, et continuons jusqu'à ce que nous atteignions l'ACPD - le décompte des autres nains vers l'extrémité inférieure.
C'est fondamentalement la même chose si les nains sont impairs (c'est-à-dire 5 nains - celui du milieu est 3, et aux deux extrémités il en reste 2), mais pas s'ils sont pairs - c'est pourquoi nous comptons sur le sol ET rond.
Problèmes jusqu'à présent: fonctionne avec un nombre de pièces trop faible, ce qui signifie que certains nains seront frappés et volés de leurs précieux gains. Et c'est triste. Ou du moins si vous aimez les nains.
Solution :
Solution plus intelligente :
Les pièces sont en métal. Faites fondre tous les nains, puis jetez-les dans une quantité de pièces plus petite / plus grande, afin qu'ils soient divisibles dans tous les cas.
Solution la plus intelligente :
Volez leur montagne, renommez-vous Smaug et gardez tout pour vous. Après tout, pourquoi devez-vous vous embêter avec des nains grincheux?
la source
Python 3 (100)
En utilisant la même idée que @Geobits mais en se conformant aux exigences d'entrée et de sortie.
la source
Python 3 -
109107103102 1029093En utilisant la même idée que Evpok, mais avec un certain nombre d'améliorations.
Les améliorations sont les suivantes:
la source
[::-1]
est mieux que ma solution. +1Python 3 - 114
Fonctionne en vérifiant si
N-(M*(M-1)/2)
est également divisible parM
. Nouveau sur python, donc tous les conseils sont appréciés.Exemple sur Ideone.com
la source
print
style de déclaration de Python 2 ? Ou comment la dernière ligne (else:print -1
) n'entraîne-t-elle pas une erreur?C # - 322
Score horrible mais j'ai adopté une approche différente et j'ai pu utiliser
goto
:)Je le raccourcirai plus tard.
la source
Convert.ToInt16
appels à justeint.Parse
. Vous pouvez déclarer n'importe quelle variable pré-affectée avecvar
(au lieu de par exempleint[]
). Vos paramètres de ligne de commande n'ont pas besoin d'être appelésargs
. Et vous pouvez alias des types fréquemment utilisés commeusing C = Console
. Je pense également que pour une solution aussi longue, il est préférable de présenter avec un interligne intact plutôt que de sauvegarder seulement quelques caractères. Oh, et je ne sais pas vraiment pourquoigoto
c'est mieux que les alternatives ici non plus ...Java 210
la source
class A{public static void main(String[]a)
est valide et vous permet d'économiser 3 caractères. Après chacunif
, et autour de chacunfor
, supprimez les espaces ... etc.R:
777370 caractèresCréez un vecteur allant de (M-1) à 0 et ajoutez 1 à chaque nombre jusqu'à ce que la somme ne soit plus inférieure à N. Si elle est supérieure, sortez -1 sinon sortez le vecteur.
Indenté et légèrement non golfé:
Exemple d'utilisation:
la source
Julia, 45 ans
Juste un peu d'algèbre, ça m'a pris beaucoup plus de temps que prévu.
la source
JavaScript - 76
J'aurais probablement pu écrire cela plus court dans une autre langue, mais il n'y avait pas encore de solution JS alors voici:
Exécutez dans la console.
Exemple d'entrée:
Sortie:
Contribution:
Sortie:
Contribution:
Sortie: -1
Dommage que console.log soit si long à épeler :) Malheureusement, la déclaration
l=console.log.bind(console)
ne la raccourcit pas etl=console.log
ne fonctionne tout simplement pas.Contribution:
Sortie:
la source
c=console
etc.log()
le raccourcir.Golfscript, 35
Comment ça marche
Dans l'exemple suivant, l'entrée est
9 3
.la source
Delphi XE3 (176)
Comment ça marche.
Lit 2 entiers, pièces et nains.
Soustrait la différence par nain.
Si le mod restant nains> 0, c'est impossible.
Sinon, obtenez une part égale par nain dans une boucle de nains-1 à 0 et affiche dwarfIndex + part égale
Ungolfed
la source
Mathematica 65
La fonction
g
,, génère toutes les séquences croissant par un, de longueur m, de 0 à n et vérifie si l'une d'elles se résume à m. En cas de succès, la séquence est renvoyée; sinon, -1 est retourné.Les séquences sont faites par
Partition
insérant la liste {0,1,2,3… m} dans toutes les sous-listes possibles de n entiers contigus.Il existe bien sûr des moyens plus efficaces pour obtenir le même effet, mais ceux que j'ai trouvés nécessitent plus de code.
Exemples
la source
C 131
Ungolfed
Cela se compile avec un avertissement car main n'a pas de type. Si ce n'est pas valable dans les règles du golf, je devrais ajouter cinq caractères.
la source
Cobra - 198
Site Web de Cobra
A expliqué:
Requis pour que le code s'exécute
Prend l'entrée et la stocke comme
a
etb
Initialise la liste de sortie
l
et initialise l'argent total requist
et le nombre de pièces à ajouter à chaque pile de nainsn
Trouve la valeur monétaire la plus basse possible qui fera en sorte que tous les nains auront un nombre de pièces autorisé dans leur pile
Détermine le nombre de pièces à ajouter à chaque pile afin que l'argent total requis soit> = à l'argent total disponible
Remplit la liste avec les piles d'argent de différentes tailles
Sorties soit
-1
oul
selon que le montant total requis est égal au total disponiblela source
Perl 5 , 78 + 1 (-n) = 79 octets
Essayez-le en ligne!
la source
Python (
1009694):Une belle réponse ronde.Plus maintenant, mais c'est plus court maintenant.Ungolfed:
Sortie:
la source