Distribuire un numero in un elenco di valori il più possibile uguale la cui somma è uguale a quel numero


15

Probabilmente una semplice sfida di code-golf. Dati 2 numeri interi positivi me n, crea un elenco di nvalori che sono numeri interi positivi la cui somma è uguale al numero m. Tutti i valori nell'output hanno lo stesso valore o la differenza è esattamente 1.

Esempi

Per esempio

  • m=6e n=3diventerebbe2, 2, 2
  • m=7e n=3diventerebbe 2, 2, 3o 2, 3, 2o 3, 2, 2
  • m=7e n=2diventerebbe 3, 4o4, 3
  • m=7e n=1diventerebbe7
  • m=7e n=8genererebbe un errore perché la somma di 8 numeri interi positivi non può essere 7.
  • m=10e n=4diventerebbe 3, 3, 2, 2o qualsiasi altra permutazione

Regole

  • Sia l'input che l'output riguardano solo numeri interi positivi.
  • Tutti i valori nell'output hanno lo stesso valore o la differenza è esattamente 1.
  • L'ordine dei valori nell'elenco non è importante.
  • La somma dei valori nell'elenco è uguale a m.
  • Quando non è risolvibile, genera un errore o un valore falso (ad esempio nel caso di m = 7 e n = 8).
  • Come risultato delle altre regole m=8e n=3genererebbe una qualsiasi delle permutazioni di 3, 3, 2(non 2, 2, 4)

Il vincitore

Questo è code-golf, quindi la risposta valida più breve - misurata in byte - vince.


Suppongo che zero non sia positivo?
TheLethalCoder


1
@aras Non sono un matematico, ma da quello che ho letto di solito dipende dal contesto. Alcuni dicono che è senza segno, alcuni sia positivi che negativi, altri positivi ecc.
TheLethalCoder

1
@TheLethalCoder nel frattempo, in java (e in virgola mobile in generale), float a = -0f, b = 0f; System.out.println(a == b); System.out.println(a + "," + b);... produce truee -0.0,0.0. Vedi, 0 positivo e 0 negativo sono chiaramente due numeri distinti ... l'implementazione lo dice!
Socratic Phoenix,

Risposte:


2

Gaia , 4 byte

…÷l¦

C'è quasi solo un built-in per questo ...

Spiegazione

…     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.

Pensavo che ci fosse anche una soluzione a 4 byte con 05AB1E. Ora che non c'è più, mi rende più facile decidere. Complimenti e grazie!
Christiaan Westerbeek,


5

Mathematica, 33 byte

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

ingresso

[63, 11]

produzione

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

genera False quando non è risolvibile


5

MATL , 7 byte

:gie!Xs

Quando non c'è soluzione l'output è un array contenente almeno uno zero, che è errato in MATL.

Provalo online!

Spiegazione

Considerare input m = 10e 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

Carbone , 15 byte dopo l'applicazione di NDD 1

¿÷NNIEIη÷⁺IθιIη

Provalo online!

Non genera nulla se non c'è soluzione. Link alla versione dettagliata .

1 NDD = Sviluppo guidato da Neil.

La mia risposta precedente:

Carbone , 32 27 24 20 byte

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

Provalo online!

Non genera nulla se non c'è soluzione. Link alla versione dettagliata .

Certo, non avrei potuto giocare a golf senza l'aiuto di Neil.


La rimozione Castdell'operatore funziona per qualche motivo, ma questo non è un algoritmo ideale ... Ho una soluzione a 16 byte.
Neil,

@Neil Challenge accettata!
Charlie,

Mi piace la variabile predefinita, ma ora sapendo che Castfunziona sugli elenchi sono giù a 11 byte ...
Neil

@Neil E ancora non riesco a usare Map, come mai funziona ??
Charlie,

Mapè come la versione dell'espressione di for, fino all'utilizzo della stessa variabile di ciclo. Quindi, nel tuo esempio, anziché spingere ogni volta un'espressione in un elenco, Mapli raccoglie automaticamente e li valuta nell'elenco dei risultati.
Neil,

3

R , 33 byte

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

Un porto della risposta Octave di Luis Mendo . Abbastanza triste che questo sia quasi il 50% più breve della mia risposta precedente.

Provalo online!

risposta precedente, 63 byte:

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

Una funzione anonima che prende due argomenti (obbligatorio) me n, e due opzionali che sono per scopi golf. Restituisce un vettore in ordine crescente. Per errore, sarà il primo valore 0, che è falso in R, poiché ifutilizza solo il primo valore del vettore (con un avviso).

È sostanzialmente equivalente alla seguente funzione:

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

Provalo online!


pryr::f(diff(trunc(0:n*m/n)))funziona ed è più corto!
JAD,

2

Gelatina , 7 6 byte

:ȧœsL€

Provalo online! Non genera nulla per falsità.

Come funziona

:ȧœ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 byte

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

Restituisce ERR: DIVIDE BY 0 in caso di errore


2

Ottava , 24 byte

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

Il codice definisce una funzione anonima. L'output è un array numerico (vettore riga). Quando non è presente, questo array contiene almeno uno zero, che è errato in Octave.

Provalo online!

Spiegazione

0:m/n:mproduce una matrice di n+1valori da 0a mcon step m/n. fixarrotonda ogni voce verso 0e diffcalcola le differenze consecutive.

Come esempio, qui sono tutti i risultati intermedi per 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 array che contiene uno zero è errato. Sembra un tratto, ma non conosco nemmeno Octave. Provenendo da Javascript con le sue coercizioni, direi perché diavolo no. +1 da me.
Christiaan Westerbeek,

@ChristiaanWesterbeek Grazie! Sembra strano se vieni da altre lingue, ma è così in MATLAB / Octave
Luis Mendo,

2

Haskell , 93 89 88 87 86 71 byte

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

Provalo online!

Spiegazione

La funzione principale qui è e. eprenderà un elenco ed eseguirà essenzialmente un mattarello da sinistra a destra. Mentre c'è un elemento nell'elenco che è più grande del suo vicino a destra, ne sposteremo uno da esso a destra.

Ora tutto ciò che dobbiamo fare è alimentare questa funzione con un elenco sufficientemente sbilenco e consentirgli di fare la magia. L'elenco che sceglieremo è mseguito da n-1zero. Dal momento che è facile da fare.

L'ultima cosa che dobbiamo fare è assicurarsi che il caso di errore sia gestito. Per questo abbiamo appena lanciato un Non-exhaustive patterns in functionerrore m>n.


Penso che si può sbarazzarsi di error[]non avendo con un modello non esaustivo, invece: m!n|m>n=e$m:replicate(n-1)0.
Laikoni,

Inoltre (0<$[1..n-1])è più breve di replicate(n-1)0.
Laikoni,

2

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

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

genera un errore per input non validi.

Provalo online!

-4 byte grazie a TheLethalCoder

-11 byte grazie a OlivierGrégoire


1
Questo è solo uno snippet di codice al momento; devi solo avvolgerlo in una funzione anonima o a=>b=>all'inizio.
TheLethalCoder

@TheLethalCoder Hmm sei sicuro? Non devo aggiungere il using System.Collections.Genericse restituisco un IEnumerable<int>?
LiefdeWen

Ho sbagliato comunque perché stai restituendo un array (ho letto male la prima parte del ternario). Ma solo se questo viene visualizzato nel tuo codice e visto che IEnumerable<int>sarebbe nella definizione della funzione non dovrai includere il using.
TheLethalCoder

No, il tuo suggerimento è ancora valido poiché il codice senza .ToArray () viene ancora compilato.
LiefdeWen

1
@ OlivierGrégoire Hai ragione, scusa e grazie.
Liefde:

2

Haskell, 48 byte

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

Inizia con un elenco di nzeri. Ripeti i mtempi: prendi il primo elemento, aggiungine uno e mettilo alla fine dell'elenco.

Errore con un errore di corrispondenza del modello se n < m.

Provalo online!


1

Braingolf , 30 byte

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

Provalo online!

Accetta gli input in ordine inverso ( nè il primo input, mè il secondo)

Divide mper n, duplica i ntempi del risultato , quindi scorre e accelera uno alla m % nvolta


1

Lotto, 71 byte

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

cmd/cset/anon genera alcun separatore, quindi devo usare echo(( (evita la stampa ECHO is on.).


1

PHP> = 7.1, 62 byte

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

PHP Sandbox online


Fare clic sul collegamento alla Sandbox, fare clic su Esegui codice e ho visualizzato un errore di analisi.
Christiaan Westerbeek,

@ChristiaanWesterbeek Per impostazione predefinita, il sandbox è PHP 7.0.3.
Neil,

1
Con altri linguaggi come Octave e MATL uno zero in un array è considerato falso, ma non credo che questo sia il caso di php. Suppongo che l'output debba essere falso all'interno delle regole della lingua in cui è scritto il programma.
Christiaan Westerbeek,

1
@ChristiaanWesterbeek risolto
Jörg Hülsermann


1

Javascript (ES6), 57 56 53 41 byte

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

La risposta ora include un modo più intelligente di creare i valori. Grazie @Neil

uso

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]

Storia

Prima la mia

(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))

Quindi ha aggiunto l'operatore di diffusione e la sintassi di curry fornita da @Arnauld

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

1
_=>m++/n|0salva un sacco di byte.
Neil,



0

Pyth , 13 byte

KE?>KQ0lMcK*d

Provalo online! Uscita 0in caso di errore.

Barare, 6 byte

lMcE*d

Provalo online! L'array contiene un 0errore di accensione. Purtroppo questo non è falsy in Pyth .

Spiegazione

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 byte

{_2$>/,/z:,}

Provalo online!

Questo è un blocco anonimo che accetta l'input come n m nello stack. Sarebbe stata una buona risposta, ma il requisito di gestione degli errori l'ha completamente eliminata.

Errori con una divisione per zero quando non è possibile risolvere.

Spiegazione

{   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]
}

Se il requisito di gestione degli errori viene aumentato, questo può essere ridotto a 7 byte, con una riduzione di oltre il 40%:

{,/z:,}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.