Numeri auto-sommati


12

Converti un numero in una somma di cifre

Nessuna somma: abbiamo bisogno della somma più breve
Nessuna cifra: puoi usare solo cifre del numero

Esempio
Verrà fornito come input un numero interon>0

Diciamo di Let n=27. Devi esprimere 27come somma , usando solo le cifre [2,7] , nel modo più breve possibile. Non devi usare tutte le cifre del numero dato!

Così 27=2+2+2+7+7+7. Abbiamo poi prendiamo queste cifre e contarli : [2,2,2,7,7,7].
La risposta finale n=27è6

Un altro esempio per n=195per ottenere la somma più breve dobbiamo usare le seguenti cifre:
[5,5,5,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]e la risposta è23

La sfida

Dato un numero intero n>0, genera il numero minimo di cifre (contenuto nel numero) che si sommano a questo numero

Casi test

Input->Output

1->1  
2->1  
10->10  
58->8  
874->110  
1259->142  
12347->1765  
123456->20576  
3456789->384088  

Questo è Vince la risposta più breve in byte!


Ci sono numeri che non possono essere sommati a se stessi / verranno inseriti?
Stephen,

1
@Stephen Possono tutti!

7
@Stephen Perché ogni numero può essere espresso come d_0 + 10 * d_1 + 100 * d_2, ecc ...
geokavel

Possiamo prendere l'input come stringa, char-array o intero-array?
Kevin Cruijssen,

1
@KevinCruijssen La stringa è ok. char-array o integer-array non lo sono.

Risposte:


4

Buccia , 12 byte

Lḟo=⁰ΣṁΠḣ∞d⁰

Gestisce i numeri a due cifre abbastanza velocemente. Provalo online!

Spiegazione

Lḟo=⁰ΣṁΠḣ∞d⁰  Input is n, say n = 13.
          d⁰  Digits of n: [1,3]
         ∞    Repeat infinitely: [[1,3],[1,3],[1,3],[1,3]...
        ḣ     Prefixes: [[],[[1,3]],[[1,3],[1,3]],[[1,3],[1,3],[1,3]],...
      ṁ       Map and concatenate
       Π      Cartesian product: [[],[1],[3],[1,1],[3,1],[1,3],[3,3],[1,1,1],[3,1,1],...
 ḟo           Find the first element
     Σ        whose sum
   =⁰         equals n: [3,3,3,3,1]
L             Return its length: 5

2

Pyth , 12 byte

lef!-TsM`Q./

Provalo online!

Sfortunatamente memoria errori su input grandi quanto 58.

Spiegazione

lef!-TsM`Q./
          ./    All lists of integers that sum to [the input]
  f             Filter for:
    -TsM`Q           Remove all occurrences of the digits in the input
   !                 Check if falsey (i.e. an empty list)
le              Length of the last occurrence, which is the shortest because all the
                filtered partitions share the same digit pool

ti dispiacerebbe aggiungere una spiegazione?
Giona,

@Jonah Spiegazione aggiunta.
Notjagan,

1
Grazie. È interessante notare che Pyth ha una primitiva che risolve essenzialmente il problema in./
Giona

Alternativa a 12 byte: lef<.{TjQ;./(filtro - sottoinsieme corretto - delle cifre dell'ingresso)
Mr. Xcoder

2

Mathematica, 78 byte

(t=1;While[(s=IntegerPartitions[x=#,t,IntegerDigits@x])=={},t++];Tr[1^#&@@s])&  

trova l'ultimo caso di test in 5 sec


Un po 'più breve:Length@IntegerPartitions[#, All, Sort@DeleteCases[0]@IntegerDigits@#, 1][[1]] &
Kuba

2

R , 78 byte

function(n){while(all(F-n)){F=outer(F,n%/%10^(0:nchar(n))%%10,"+")
T=T+1}
T-1}

Provalo online! (versione golfizzata)

Algoritmo di pura forza bruta, quindi in realtà non risolve tutti i casi di test e penso che abbia tentato di allocare 40.000 GB per l'ultimo caso di test ...

Tin R per impostazione predefinita 1abbiamo quindi un errore off-by-one che correggiamo al passaggio di ritorno, ma otteniamo anche Fquali impostazioni predefinite a 0cui ripaga.

spiegazione non golfata:

function(n){
 d <- n%/%10^(0:nchar(n))%%10   # digit list with a 0 appended at end
 d <- unique(d[d>0])            # filter zeros (not technically necessary)
                                # and get unique digits
 x <- 0                         # storage for sums
 i <- 0                         # counter for number of sums done
 while(!any(x==n)){             # until we find a combination
  x <- outer(x,d,"+")           # take all sums of x and d, store as x
  i <- i + 1}                   # increment counter
i}                              # return counter

Provalo online! (versione meno golfy)


2

Python 2, 168 155 144 byte

Non è il più breve che potrebbe essere, ma è meglio prima e non vero male, runtime saggio.

n=input()
g=sorted(set(n)-{0})[::-1]
def h(k):
 if k<0:return
 if`k`in g:return 1
 for d in g:
  f=h(k-int(d))
  if f:return 1+f
print h(int(n)) 

Il filter(None...è quello di rimuovere 0 da una cifra, che ho imparato che potevo fare rendendo questo.

Il problema più grande sono i frame stack di Python, che realisticamente non mi permettono di eseguirlo sugli input più grandi. Quindi, non è una soluzione valida, davvero, ho giocato con l'aumento del limite di ricorsione che ha appena portato a errori di seg. Questo deve essere fatto con un ciclo e uno stack o con molta più intelligenza per lavorare in Python.

modifica: Grazie a caird e Chas Brown per 13 byte!


È possibile utilizzare inpute richiedere che l'input sia racchiuso tra virgolette.
caird coinheringaahing

2
È perfettamente accettabile fallire a causa di limitazioni fisiche, purché abbia successo in teoria, cosa che succede.
Jonathan Allan,

Salva 9 byte sostituendoli filter(None,sorted(map(int,set(n)))[::-1])con sorted(set(map(int,n))-{0})[::-1](anche se la Nonecosa è abbastanza carina da sapere).
Chas Brown,

@ChasBrown Nella maggior parte dei casi è possibile utilizzare filter(len,...)per elenchi e stringhe e filter(abs,...)per numeri interi e float.
Ovs


0

JavaScript (ES6), 82 byte

f=(n,l=0,a=n,[c,...b]=a)=>n?1/c?Math.min(!+c|+c>n?1/0:f(n-c,l+1,a),f(n,l,b)):1/0:l
<input type=number oninput=o.textContent=f(this.value)><pre id=o>

Accetta l'input come stringa.


Puoi spiegare perché stai usando 1/0?
Zacharý,

1
@ Zacharý Voglio la somma più breve, ovvero il numero minimo di cifre. I tentativi che portano a una soluzione non valida non devono essere conteggiati, quindi per escluderli, ottengono un punteggio Infinity, che non influisce sul minimo.
Neil,

Oh, non avevo realizzato che fosse ricorsivo.
Zacharý,

@ Zacharý L' f=inizio è un grande indizio, dal momento che non ne hai bisogno per lambda non ricorsivi.
Neil,

0

Rubino , 70 byte

->n{w,s=n.digits,0;s+=1while !w.product(*[w]*s).find{|x|x.sum==n};s+1}

Molto lento, prova tutte le possibili combinazioni aumentando le dimensioni fino a raggiungere una soluzione.

Grazie Dennis per Ruby 2.4 su TIO.

Provalo online!


0

Gelatina , 23 byte

D;0ṗµḟ€0
ÇS€=µT
Çị1ĿL€Ṃ

Provalo online!

Questo è così inefficiente, che non viene eseguito per i casi di test dopo il terzo su TIO a causa di un limite di tempo> _ <

Tutti i consigli sul golf sono i benvenuti!


0

Python 2 , 183 176 172 166 161 byte

def f(n,D=0,p=0,b=0):
	D=D or set(map(int,`n`))-{0}
	d=min(D);c=0;D=D-{d}
	q=[p+n/d,b][n%d>0]
	while c<min(D or{0}):q=b=f(n-c*d,D,p+c,b);c+=1
	return[q,b][q>b>0]

Provalo online!

Più lungo dell'altra risposta di Python, ma esegue tutti i casi di test combinati più 987654321in meno di un secondo su TIO.

Sfrutta il fatto che se d1<d2sono cifre, allora ci deve essere al massimo d2-1 d1nella somma (poiché le d2istanze di d1possono essere sostituite con d1istanze di d2per una somma più breve). Quindi, ordinando le cifre in ordine crescente, ci sono "solo" al massimo 9! = 362880possibili somme da considerare; e una profondità massima di ricorsione di 9(indipendentemente dal valore di n).


0

Haskell , 91 byte

f n=[read[c]|c<-show n,c>'0']#n!!0
s#n|n>0,x:m<-(s#).(n-)=<<s=[1+minimum(x:m)]|1<3=[0|n==0]

Provalo online! Esempio di utilizzo: f 58rese 8. Rapido per numeri a due cifre, tremendamente lento per input più grandi.

La funzione fconverte il numero di input nin un elenco di cifre mentre filtra gli zeri. Quindi questo elenco e nse stesso vengono passati alla (#)funzione, che restituisce un elenco singleton. !!0restituisce l'elemento di questo elenco singleton.

(#)utilizza singleton e liste vuote come tipo di opzione. Dato un input di n=58e s=[5,8], l'idea è di sottrarre tutte le cifre sda n, quindi applicare ricorsivamente (#)e controllare quale cifra ha comportato il numero minimo di passaggi e restituire uno più questo minimo come risultato. La prima parte è calcolata da (s#).(n-)=<<s, che è la stessa di concat(map(s#)(map(n-)s)). Quindi, nel nostro esempio, [58-5,58-8]viene prima calcolata, seguita da [[5,8]#53,[5,8]#50]quali risultati in [[7],[7]]o [7,7]dopo concat. Il risultato viene abbinato sul modello x:mper assicurarsi che l'elenco abbia almeno un elemento ( minimumaltrimenti fallisce), quindi la lista singleton di 1 più il minimo del risultato viene risintonizzata. Senera zero inferiore o la chiamata ricorsiva ha restituito un elenco vuoto, ci troviamo in un ramo non riuscito della ricerca e viene restituito un elenco vuoto. Se n==0il ramo ha avuto successo e [0]viene restituito.


Haskell , 101 byte

f n=[d|d<-[9,8..1],show d!!0`elem`show n]#n!!0
s@(d:r)#n|n>=d,[x]<-s#(n-d)=[x+1]|1<3=r#n
s#n=[0|n==0]

Provalo online! Un approccio molto più efficiente, controlla tutti i casi di test in meno di un secondo.

Questa volta, l'elenco delle cifre dell'input viene calcolato in ordine decrescente, il che consente (#)di provare a utilizzare la cifra più grande il più spesso possibile, quindi la seconda più grande e così fino a quando non viene trovata una soluzione. Anche la prima soluzione trovata in questo modo è la più piccola.

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.