Prática

6

C, 450 caracteres

Editar: removido zero

Editar: usando apenas pluseminus

Procurei a expressão mais curta que adiciona caracteres e mantém a condição verdadeira. Eu descobri que plus ten plus fivetem 15 anos e acrescenta 15 à string.

Eu preciso apenas de expressões para os 15 primeiros números que não são impossíveis, para expressar qualquer número possível. 12 é o maior número impossível; portanto, basta codificar números menores 28.

4 = quatro
11 = seis mais cinco
13 = oito mais cinco
14 = vinte menos seis
15 = vinte menos cinco
16 = dezoito menos dois
17 = catorze mais três
18 = vinte e dois menos quatro
20 = trinta e dois menos doze
21 = vinte mais dois menos um
22 = vinte mais quatro menos dois
23 = trinta menos oito mais um
24 = vinte mais oito menos quatro
25 = vinte mais oito menos três
27 = vinte e oito menos seis mais cinco

Podemos escrever todos os números> 27 como x * 15 + um dos números acima.

Golfe

#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");}

Código legível

#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
fonte
2
Não tenho muita certeza de como seu código funciona, mas como a pergunta afirma isso all numbers used in the output must be positive integers, você pode remover o #define Z "zero"código juntamente com instâncias de Z, pois nunca deve usá-lo?
Qwix 15/08
"mais doze" são 12 letras. Isso ajudaria a diminuir o seu código?
Isaacg
Eu torná-lo mais curto, espaços infelizmente não contagem, plus twelveé de apenas 10 letras
Optokopper
OK, eu li errado as regras.
Isaacg