Práctica

6

C, 450 caracteres

Editar: eliminado zero

Editar: usando solo plusyminus

Busqué la expresión más corta que agregue caracteres y mantenga la condición verdadera. Encontré plus ten plus five15 largos y agrega 15 a la cadena.

Solo necesito expresiones para los primeros 15 números que no son imposibles, para expresar cualquier número posible. 12 es el número imposible más grande, por lo tanto, es suficiente para codificar números menores de 28.

4 = cuatro
11 = seis más cinco
13 = ocho más cinco
14 = veinte menos seis
15 = veinte menos cinco
16 = dieciocho menos dos
17 = catorce más tres
18 = veintidos menos cuatro
20 = treinta y dos menos doce
21 = veinte más dos menos uno
22 = veinte más cuatro menos dos
23 = treinta menos ocho más uno
24 = veinte más ocho menos cuatro
25 = veinte más ocho menos tres
27 = veintiocho menos seis más cinco

Podemos escribir cada número> 27 como x * 15 + uno de los números anteriores.

Golfed

#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 legible

#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
fuente
2
No estoy muy seguro de cómo funciona su código, pero dado que la pregunta establece que all numbers used in the output must be positive integers, ¿podría eliminarlo #define Z "zero"de su código junto con instancias de Z ya que nunca debería usarlo?
Qwix
"más doce" son 12 letras. ¿Eso ayudaría a acortar tu código?
isaacg
Lo haría más corto, por desgracia, los espacios no cuentan, plus twelveson solo 10 letras
Optokopper
OK, leí mal las reglas.
isaacg