Entraine toi

6

C, 450 caractères

Modifier: supprimé zero

Modifier: utiliser uniquement plusetminus

J'ai recherché l'expression la plus courte qui ajoute des caractères et maintient la condition vraie. J'ai trouvé plus ten plus fiveest long de 15 et ajoute 15 à la chaîne.

Je n'ai besoin que d'expressions pour les 15 premiers nombres qui ne sont pas impossibles, pour exprimer n'importe quel nombre possible. 12 est le plus grand nombre impossible, il suffit donc de coder en dur des nombres plus petits 28.

4 = quatre
11 = six plus cinq
13 = huit plus cinq
14 = vingt moins six
15 = vingt moins cinq
16 = dix-huit moins deux
17 = quatorze plus trois
18 = vingt-deux moins quatre
20 = trente-deux moins douze
21 = vingt plus deux moins un
22 = vingt plus quatre moins deux
23 = trente moins huit plus un
24 = vingt plus huit moins quatre
25 = vingt plus huit moins trois
27 = vingt-huit moins six plus cinq

Nous pouvons écrire chaque nombre> 27 comme x * 15 + un des nombres ci-dessus.

Golfé

#define P" plus "
#define M" minus "
#define U"four"
#define F"five"
#define E"eight"
#define W"twenty"
#define A"ten"P F P
*e[]={0,0,0,0,U,0,0,0,0,0,0,F P"six",0,E P F,W M"six",W M F,E"een"M"two",U"teen"P"three",W" two"M U,A U,"thirty two"M"twelve",W P"two"M"one",W M"two"P U,"thirty"P"one"M E,W P E M U,W M"three"P E,A F P"six",W" "E M"six"P F};main(n){n=atoi(1[(int*)1[&n]]);for(printf("%d: ",n);n>27;n-=15)printf(A);puts(e[n]?e[n]:"impossible");}

Code lisible

#include <stdio.h>
#include <stdlib.h>

// add fifteen to string, both as value and as character count (without spaces)
const char *add_fifteen = "plus ten plus five";

// table with hardcoded expressions
// NOTE: we could calculate 19, 26, 28 and 29 from 4, 11, 13 and 14
// but we would need more logic, so we hardcode those 4 numbers too.
const char *expressions[30]={"impossible", "impossible", "impossible", "impossible",
    "four", "impossible", "impossible", "impossible", "impossible",
    "impossible", "impossible", "five plus six", "impossible",
    "eight plus five", "twenty minus six",
    "fourteen plus one", "eighteen minus two", "fourteen plus three",
    "twenty two minus four", "four plus ten plus five",
    "thirty two minus twelve", "nine plus seven plus five",
    "twenty plus four minus two", "twelve plus seven plus four",
    "twenty plus eight minus four", "twenty plus eight minus three",
    "five plus six plus ten plus five", "twenty eight minus six plus five",
    "eight plus five plus ten plus five", "seven plus seven plus ten plus five"};

int main(int argc,char *argv[])
{
    int n = strtol(argv[1], NULL, 0);
    int fifteens = 0;

    printf("%d: ", n);

    // how many times do we need to add fifteen?
    if(n>29){
        fifteens=(n/15) - 1;
        n -= fifteens*15; // ensure 30 > n >= 15, so we don't get "impossible"
    }

    // look up the expression for n
    printf("%s", expressions[n]);

    // add fifteens till we are done
    while(fifteens-- > 0) {
        printf(" %s", add_fifteen);
    }

    printf("\n");
    return 0;
}
Optokopper
la source
2
Vous ne savez pas exactement comment fonctionne votre code, mais comme la question l'indique all numbers used in the output must be positive integers, pourriez-vous supprimer le #define Z "zero"de votre code ainsi que les instances de Z car vous ne devriez jamais l'utiliser?
Qwix
"plus douze" est de 12 lettres. Est-ce que cela aiderait à raccourcir votre code?
isaacg
Je le raccourcirais, hélas les espaces ne comptent pas, plus twelvec'est seulement 10 lettres
Optokopper
OK, j'ai mal lu les règles.
isaacg