Ti viene dato un elenco di numeri L = [17, 5, 9, 17, 59, 14]
, un sacco di operatori O = {+:7, -:3, *:5, /:1}
e un numero N = 569
.
Compito
Emette un'equazione che utilizza tutti i numeri L
sul lato sinistro e solo il numero N
sul lato destro. Se ciò non è possibile, generare False. Soluzione di esempio:
59*(17-5)-9*17+14 = 569
Limitazioni e chiarimenti
- Non puoi concatenare i numeri (
[13,37]
non può essere usato come1337
) - Verranno visualizzati solo numeri naturali e zero
L
. - L'ordine in
L
non importa. - Devi usare tutti i numeri in
L
. - Solo gli operatori
+
,-
,*
,/
apparirannoO
. O
può avere più operatori del necessario, ma almeno|L|-1
operatori- È possibile utilizzare ciascun operatore un numero qualsiasi di volte fino al valore in
O
. - Tutte e quattro le operazioni in
O
sono le operazioni matematiche standard; in particolare,/
è normale divisione con frazioni esatte.
Punti
- Meno punti, meglio è
- Ogni carattere del tuo codice ti dà un punto
Devi fornire una versione senza golf che sia di facile lettura.
sfondo
Una domanda simile è stata posta su Stack Overflow. Ho pensato che potesse essere un'interessante sfida per il golf del codice.
Complessità computazionale
Come ha detto Peter Taylor nei commenti, puoi risolvere la somma dei sottoinsiemi con questo:
- Hai un'istanza della somma del sottoinsieme (quindi un insieme S di numeri interi e un numero x)
- L: = S + [0, ..., 0] (| S | volte uno zero), N: = x, O: = {+: | S | -1, *: | S | - 1, /: 0, -: 0}
- Ora risolvi questa istanza del mio problema
- La soluzione per la somma dei sottoinsiemi è il numero di S che non viene moltiplicato per zero.
Se trovi un algoritmo migliore di O (2 ^ n), dimostri che P = NP. Poiché P vs NP è un problema del premio del millennio e quindi vale 1.000.000 di dollari USA, è molto improbabile che qualcuno trovi una soluzione per questo. Quindi ho rimosso questa parte della classifica.
Casi test
Le seguenti non sono le sole risposte valide, esistono altre soluzioni e sono consentite:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
/
≡ div
), solo errori in virgola mobile e speranza per nessun arrotondamento, ...?
5+10+2*3+7*0+0...
m = |L|
? Se sì, come puoi aspettarti che il runtime non dipenda dalle dimensioni di tale elenco? Ad esempio[2,2],[+,+,...,+,/],1
,. Infatti, poiché n è O (m), potresti semplicemente scrivere tutto in termini di m.