Répartir un nombre dans une liste de valeurs aussi égales que possible dont la somme est égale à ce nombre


15

Probablement un simple défi de golf de code. Étant donné 2 entiers positifs met n, faites une liste de nvaleurs qui sont des entiers positifs dont la somme est égale au nombre m. Soit toutes les valeurs dans la sortie sont la même valeur ou la différence est exactement 1.

Exemples

Par exemple

  • m=6et n=3deviendrait2, 2, 2
  • m=7et n=3deviendrait 2, 2, 3ou 2, 3, 2ou 3, 2, 2
  • m=7et n=2deviendrait 3, 4ou4, 3
  • m=7et n=1deviendrait7
  • m=7et n=8générerait une erreur car la somme de 8 entiers positifs ne peut pas être 7.
  • m=10et n=4deviendrait 3, 3, 2, 2ou toute autre permutation

Règles

  • L'entrée et la sortie concernent uniquement des entiers positifs.
  • Soit toutes les valeurs dans la sortie sont la même valeur ou la différence est exactement 1.
  • L'ordre des valeurs dans la liste n'est pas important.
  • La somme des valeurs de la liste est égale à m.
  • Lorsqu'il n'est pas résoluble, générer une erreur ou une fausse valeur (dans le cas de m = 7 et n = 8 par exemple).
  • En raison des autres règles m=8et n=3générerait l'une des permutations de 3, 3, 2(non 2, 2, 4)

Le gagnant

Il s'agit de code-golf, donc la réponse valide la plus courte - mesurée en octets - l'emporte.


Je suppose que zéro n'est pas positif?
TheLethalCoder


1
@aras Je ne suis pas mathématicien mais d'après ce que j'ai lu, cela dépend généralement du contexte. Certains disent qu'il n'est pas signé, certains à la fois positifs et négatifs, certains positifs etc.
TheLethalCoder

1
@TheLethalCoder quant à lui, en java (et en virgule flottante en général), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... produit trueet -0.0,0.0. Vous voyez, 0 positif et 0 négatif sont clairement deux nombres distincts ... la mise en œuvre le dit!
Socratic Phoenix

Réponses:


2

Gaia , 4 octets

…÷l¦

Il y a presque juste une fonction intégrée pour cela ...

Explication

…     Get the range [0 .. m-1].
 ÷    Split into n roughly even length chunks. Throws an error if the number of chunks if 
       more than the list's length.
  l¦  Get the length of each chunk.

Je pensais qu'il y avait aussi une solution à 4 octets avec 05AB1E. Maintenant que c'est parti, cela me permet de décider plus facilement. Félicitations et merci!
Christiaan Westerbeek


5

Mathematica, 33 octets

#>#2&&Last@IntegerPartitions@##1&

contribution

[63, 11]

production

{6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5}

renvoie Faux lorsqu'il n'est pas résoluble


5

MATL , 7 octets

:gie!Xs

Lorsqu'il n'y a pas de solution, la sortie est un tableau contenant au moins un zéro, ce qui est faux dans MATL.

Essayez-le en ligne!

Explication

Considérez les entrées m = 10et n = 4.

:      % Implicitly input m. Push [1 2 ... m]
       % STACK: [1 2 3 4 5 6 7 8 9 10]
g      % Logical: convert nonzeros to 1
       % STACK: [1 1 1 1 1 1 1 1 1 1]
i      % Input n
       % STACK: [1 1 1 1 1 1 1 1 1 1], 4
e      % Reshape into matrix with n rows, padding with zeros
       % STACK: [1 1 1;
                 1 1 1;
                 1 1 0;
                 1 1 0]
!      % Transpose
       % STACK: [1 1 1 1;
                 1 1 1 1;
                 1 1 0 0]
Xs     % Sum of each column. Implicitly display
       % STACK: [3 3 2 2]


4

Fusain , 15 octets après application de NDD 1

¿÷NNIEIη÷⁺IθιIη

Essayez-le en ligne!

N'affiche rien s'il n'y a pas de solution. Lien vers la version détaillée .

1 NDD = Neil-Driven Development.

Ma réponse précédente:

Charbon de bois , 32 27 24 20 octets

NμNν¿÷μνIEν⁺÷μν‹ι﹪μν

Essayez-le en ligne!

N'affiche rien s'il n'y a pas de solution. Lien vers la version détaillée .

Bien sûr, je n'aurais pas pu jouer au golf sans l'aide de Neil.


La suppression de l' Castopérateur fonctionne pour une raison quelconque, mais ce n'est pas un algorithme idéal ... J'ai une solution à 16 octets.
Neil

@Neil Challenge accepté!
Charlie

J'aime la variable prédéfinie, mais maintenant, sachant que cela Castfonctionne sur les listes, je suis à 11 octets ...
Neil

@Neil Et je ne peux toujours pas utiliser Map, comment ça marche?
Charlie

Mapest comme la version d'expression de for, jusqu'à l'utilisation de la même variable de boucle. Ainsi, dans votre exemple, plutôt que de pousser une expression dans une liste à chaque fois, Maples recueille automatiquement et les évalue dans la liste des résultats.
Neil

3

R , 33 octets

function(m,n)diff(trunc(0:n*m/n))

Un port de la réponse Octave de Luis Mendo . Assez triste que ce soit presque 50% plus court que ma réponse précédente.

Essayez-le en ligne!

réponse précédente, 63 octets:

function(m,n,o=rep(m%/%n,n),d=m-sum(o))o+c(rep(0,n-d),rep(1,d))

Une fonction anonyme qui prend deux arguments (obligatoires) met n, et deux optionnels qui sont à des fins de golf. Renvoie un vecteur dans l'ordre croissant. En cas d'échec, la première valeur sera 0, qui est falsey dans R, car ifn'utilise que la première valeur du vecteur (avec un avertissement).

Il est essentiellement équivalent à la fonction suivante:

function(m,n){o=rep(m%/%n,n)
d=m-sum(o)
o+c(rep(0,n-d),rep(1,d))}

Essayez-le en ligne!


pryr::f(diff(trunc(0:n*m/n)))fonctionne et est plus court!
JAD

2

Gelée , 7 6 octets

:ȧœsL€

Essayez-le en ligne! Ne produit rien pour la falsification.

Comment ça fonctionne

:ȧœsL€    Main link. Arguments: m (integer), n (integer)
:         Integer division. Yields 0 if m < n; a positive integer otherwise.
 ȧ        Logical AND. Yields 0 if m < n; m otherwise.
  œs      Split into n roughly equal groups. Since the left argument is an integer,
          this implicitly converts it to [1..m] (or [] for 0) before splitting.
    L€    Length of €ach. If the inputs were 7 and 3, the previous result would be
          [[1,2,3],[4,5],[6,7]], so this would give [3,2,2].

2

TI-Basic, 23 octets

:Prompt M,N
:N(M≥N
:int(Ans⁻¹randIntNoRep(M,M+N-1

Renvoie ERR: DIVIDE BY 0 en cas d'erreur


2

Octave , 24 octets

@(m,n)diff(fix(0:m/n:m))

Le code définit une fonction anonyme. La sortie est un tableau numérique (vecteur ligne). Lorsqu'il n'y a pas, ce tableau contient au moins un zéro, ce qui est faux dans Octave.

Essayez-le en ligne!

Explication

0:m/n:m produit un tableau de n+1 valeurs de 0à mavec step m/n. fixarrondit chaque entrée vers 0et diffcalcule les différences consécutives.

À titre d'exemple, voici tous les résultats intermédiaires pour m = 7, n = 3:

>> 0:m/n:m
ans =
         0    2.3333    4.6667    7.0000

>> fix(0:m/n:m)
ans =
     0     2     4     7

>> diff(fix(0:m/n:m))
ans =
     2     2     3

Un tableau contenant un zéro est faux. Cela semble être un tronçon, mais je ne connais pas Octave non plus. Venant de Javascript avec ses contraintes, je dirais pourquoi pas. +1 de moi.
Christiaan Westerbeek

@ChristiaanWesterbeek Merci! Cela semble étrange si vous venez d'autres langues, mais c'est comme ça dans MATLAB / Octave
Luis Mendo

2

Haskell , 93 89 88 87 86 71 octets

m!n|n<=m=e$m:(0<$[2..n])
e(a:b:x)|b<a=e$a-1:e(b+1:x)
e(a:x)=a:e x
e x=x

Essayez-le en ligne!

Explication

La fonction principale ici est e . eprendra une liste et exécutera essentiellement un rouleau à pâtisserie le long de la gauche vers la droite. Bien qu'il y ait un élément dans la liste qui soit supérieur à son voisin de droite, nous en déplacerons un vers la droite.

Maintenant, tout ce que nous avons à faire est d'alimenter cette fonction d'une liste suffisamment déséquilibrée et de lui permettre de faire la magie. La liste que nous choisirons est juste msuivie den-1 zéros. Puisque c'est facile à faire.

La dernière chose que nous devons faire est de nous assurer que le cas d'erreur est traité. Pour cela, nous jetons simplement une Non-exhaustive patterns in functionerreur aussi longtemps que m>n.


Je pense que vous pouvez vous débarrasser de error[]par défaut avec un motif non exhaustif à la place: m!n|m>n=e$m:replicate(n-1)0.
Laikoni

Est également (0<$[1..n-1])plus court que replicate(n-1)0.
Laikoni

2

C # (.NET Core) , 86 82 71 octets

using System.Linq;a=>b=>new int[b].Select((x,i)=>(i<a%b?1:0/(a/b))+a/b)

renvoie une erreur pour les entrées non valides.

Essayez-le en ligne!

-4 octets grâce à TheLethalCoder

-11 octets grâce à OlivierGrégoire


1
Ce n'est qu'un extrait de code pour le moment; il vous suffit de l'envelopper dans une fonction anonyme ou a=>b=>au début.
TheLethalCoder

@TheLethalCoder Hmm êtes-vous sûr? N'ai-je pas besoin d'ajouter le using System.Collections.Genericsi je retourne un IEnumerable<int>?
LiefdeWen

Je me trompe quand même parce que vous retournez un tableau (j'ai mal lu la première partie du ternaire). Mais seulement si cela apparaît dans votre code et vu que le IEnumerable<int>serait dans la définition de la fonction, vous n'aurez pas besoin d'inclure le using.
TheLethalCoder

Non, votre astuce est toujours bonne puisque le code sans .ToArray () compile toujours.
LiefdeWen

1
@ OlivierGrégoire Vous avez raison, désolé et merci.
LiefdeWen

2

Haskell, 48 octets

m#n|m>=n=iterate(\(a:b)->b++[a+1])(0<$[1..n])!!m

Commencez par une liste de nzéros. Répéterm : prenez le premier élément, ajoutez-en un et placez-le à la fin de la liste.

Échoue avec une erreur de correspondance de modèle si n < m.

Essayez-le en ligne!


1

Braingolf , 30 octets

.M>.M/v.mR>[.]$_v%!?[R1+>v]|R=

Essayez-le en ligne!

Prend les entrées dans l'ordre inverse ( nest la première entrée,m est la deuxième)

Divise mpar n, duplique les ntemps de résultat , puis les boucle et les incrémente une à une m % nfois


1

Lot, 71 octets

@if %1 geq %2 for /l %%i in (1,1,%2)do @cmd/cset/an=(%1+%%i-1)/%2&echo(

cmd/cset/ane produit aucun séparateur, je dois donc utiliser echo(( (évite l'impression ECHO is on.).


1

PHP> = 7.1, 62 octets

for([,$s,$n]=$argv;$n;)$s-=$r[]=$s/$n--^0;$r[0]?print_r($r):0;

PHP Sandbox Online


Cliquez sur votre lien vers le bac à sable, cliquez sur Exécuter le code et j'ai eu une erreur d'analyse.
Christiaan Westerbeek

@ChristiaanWesterbeek Le bac à sable utilise par défaut PHP 7.0.3.
Neil

1
Avec d'autres langages comme Octave et MATL, un zéro dans un tableau est considéré comme faux, mais je ne pense pas que ce soit le cas avec php. Je suppose que la sortie doit être fausse dans les règles de la langue dans laquelle le programme est écrit.
Christiaan Westerbeek

1
@ChristiaanWesterbeek fixed
Jörg Hülsermann


1

Javascript (ES6), 57 56 53 41 octets

m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

La réponse inclut désormais une manière plus intelligente de créer les valeurs. Merci @Neil

Usage

f=m=>n=>m>=n&&[...Array(n)].map(_=>m++/n|0)

f(6)(3) // [2, 2, 2]
f(7)(3) // [3, 2, 2]
f(7)(2) // [4, 3]
f(7)(1) // [7]
f(7)(8) // false
f(8)(3) // [3, 3, 2]

Histoire

Première mine

(m,n)=>m>=n&&Array(n).fill(~~(m/n)).map((v,i)=>v+(i<m%n))

(m,n)=>m>=n&&Array(n).fill().map((v,i)=>~~(m/n)+(i<m%n))

Puis ajouté l'opérateur d'étalement et la syntaxe de curry inclinée par @Arnauld

m=>n=>m>=n&&[...Array(n)].map((v,i)=>~~(m/n)+(i<m%n))

1
_=>m++/n|0enregistre un tas d'octets.
Neil



0

Pyth , 13 octets

KE?>KQ0lMcK*d

Essayez-le en ligne! Sortie 0en cas d'erreur.

Tricherie, 6 octets

lMcE*d

Essayez-le en ligne! Le tableau contient une 0erreur. Malheureusement, ce n'est pas faux en Pyth .

Explication

KE?>KQ0lMcK*dQ    # Implicit input Q for m
KE                # Store n in K
           *d     # Generate a string of length Q containing only spaces
         cK       # Chop this string in K pieces of equal sizes, initial piece longer if necessary
       lM         # For each string, compute the length. Here we already have our result. However if the array contain a zero, we must output a falsy value
  ?>KQ            # If K > Q...
      0           # Then display zero, otherwise display the array

0

CJam , 13 12 octets

{_2$>/,/z:,}

Essayez-le en ligne!

Il s'agit d'un bloc anonyme qui prend l'entrée comme n msur la pile. Cela aurait été une bonne réponse, mais l'exigence de gestion des erreurs l'a complètement détruite.

Erreurs avec une division par zéro lorsqu'il n'est pas possible de les résoudre.

Explication

{   e# Stack:                | 3 10
 _  e# Duplicate:            | 3 10 10
 2$ e# Copy from back:       | 3 10 10 3
 >  e# Greater than:         | 3 10 1 (true)
 /  e# Divide:               | 3 10
    e# This will cause an error on invalid input.
 ,  e# Range:                | 3 [0 1 2 3 4 5 6 7 8 9]
 /  e# Split on nth element: | [[0 1 2] [3 4 5] [6 7 8] [9]]
 z  e# Transpose array:      | [[0 3 4 9] [1 4 7] [2 5 8]]
 :, e# Length of each:       | [4 3 3]
}

Si l'exigence de gestion des erreurs est levée, celle-ci peut être raccourcie à 7 octets, ce qui représente une diminution de plus de 40%:

{,/z:,}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.