Esprimi un numero
Negli anni '60, i francesi inventarono il programma televisivo "Des Chiffres et des Lettres" (Digits & Letters). L'obiettivo della parte Digits dello spettacolo era avvicinarsi il più possibile a un determinato numero target di 3 cifre, usando alcuni numeri selezionati in modo semi-casuale. I concorrenti potrebbero utilizzare i seguenti operatori:
- concatenazione (1 e 2 è 12)
- aggiunta (1 + 2 è 3)
- sottrazione (5 - 3 = 2)
- divisione (8/2 = 4); la divisione è consentita solo se il risultato è un numero naturale
- moltiplicazione (2 * 3 = 6)
- parentesi, per ignorare la precedenza regolare delle operazioni: 2 * (3 + 4) = 14
Ogni dato numero può essere usato una sola volta o per niente.
Ad esempio, il numero target 728 può essere abbinato esattamente ai numeri: 6, 10, 25, 75, 5 e 50 con la seguente espressione:
75 * 10 - ( ( 6 + 5 ) * ( 50 / 25 ) ) = 750 - ( 11 * 2 ) = 750 - 22 = 728
In questa sfida del codice, ti viene assegnato il compito di trovare un'espressione il più vicino possibile a un determinato numero di destinazione. Dal momento che viviamo nel 21 ° secolo, introdurremo numeri target più grandi e più numeri con cui lavorare rispetto agli anni '60.
Regole
- Operatori ammessi: concatenazione, +, -, /, *, (e)
- L'operatore di concatenazione non ha simboli. Concatena i numeri.
- Non esiste una "concatenazione inversa". 69 è 69 e non può essere diviso in 6 e 9.
- Il numero target è un numero intero positivo e ha un massimo di 18 cifre.
- Ci sono almeno due numeri con cui lavorare e un massimo di 99 numeri. Questi numeri sono anche numeri interi positivi con un massimo di 18 cifre.
- È possibile (in realtà molto probabilmente) che il numero target non possa essere espresso in termini di numeri e operatori. L'obiettivo è avvicinarsi il più possibile.
- Il programma dovrebbe concludersi in un tempo ragionevole (pochi minuti su un moderno PC desktop).
- Si applicano scappatoie standard.
- Il tuo programma potrebbe non essere ottimizzato per il set di test nella sezione "punteggio" di questo puzzle. Mi riservo il diritto di modificare il set di test se sospetto che qualcuno violi questa regola.
- Questo non è un codegolf.
Ingresso
L'input è costituito da una matrice di numeri che possono essere formattati in qualsiasi modo conveniente. Il primo numero è il numero di destinazione. Il resto dei numeri sono i numeri con cui dovresti lavorare per formare il numero di destinazione.
Produzione
I requisiti per l'output sono:
- Dovrebbe essere una stringa composta da:
- qualsiasi sottoinsieme dei numeri di input (tranne il numero di destinazione)
- qualsiasi numero di operatori
- Preferisco che l'output sia a linea singola senza spazi, ma se è necessario, è possibile aggiungere spazi e newline come meglio credi. Saranno ignorati nel programma di controllo.
- L'output dovrebbe essere un'espressione matematica valida.
Esempi
Per motivi di leggibilità, tutti questi esempi hanno una soluzione esatta e ogni numero di input viene utilizzato esattamente una volta.
Ingresso: 1515483, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
Uscita:111*111*(111+11+1)
Ingresso: 153135, 1, 2, 3, 4, 5, 6, 7, 8, 9
Uscita:123*(456+789)
Ingresso: 8888888888, 9, 9, 9, 99, 99, 99, 999, 999, 999, 9999, 9999, 9999, 99999, 99999, 99999, 1
Uscita:9*99*999*9999-9999999-999999-99999-99999-99999-9999-999-9-1
Ingresso: 207901, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Uscita:1+2*(3+4)*(5+6)*(7+8)*90
Input: 34943, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0
Output: 1+2*(3+4*(5+6*(7+8*90)))
Ma anche un output valido è:34957-6-8
punteggio
Il punteggio di penalità di un programma è la somma degli errori relativi delle espressioni per il testset di seguito.
Ad esempio se il valore target è 125 e la tua espressione dà 120, il tuo punteggio di penalità è abs (1 - 120/125) = 0,04.
Vince il programma con il punteggio più basso (errore relativo totale più basso). Se due programmi finiscono allo stesso modo, il primo invio vince.
Infine, il testset (8 casi):
14142, 10, 11, 12, 13, 14, 15
48077691, 6, 9, 66, 69, 666, 669, 696, 699, 966, 969, 996, 999
333723173, 3, 3, 3, 33, 333, 3333, 33333, 333333, 3333333, 33333333, 333333333
589637567, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
8067171096, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199
78649377055, 0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272, 306, 342, 380, 420, 462, 506, 552, 600, 650, 702, 756, 812, 870, 930, 992
792787123866, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169
2423473942768, 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 2000000, 5000000, 10000000, 20000000, 50000000
Puzzle simili precedenti
Dopo aver creato questo puzzle e averlo pubblicato sulla sandbox, ho notato qualcosa di simile (ma non uguale!) In due puzzle precedenti: qui (nessuna soluzione) e qui . Questo enigma è un po 'diverso, perché introduce l'operatore di concatenazione, non cerco una corrispondenza esatta e mi piace vedere le strategie per avvicinarmi alla soluzione senza forza bruta. Penso che sia stimolante.