Ćwiczyć

6

C, 450 znaków

Edycja: usunięto zero

Edycja: używając tylko plusiminus

Szukałem najkrótszego wyrażenia, które dodaje znaki i utrzymuje warunek prawdziwy. Znalazłem plus ten plus five15 długich i dodaje 15 do łańcucha.

Potrzebuję tylko wyrażeń dla pierwszych 15 liczb, które nie są niemożliwe, aby wyrazić dowolną możliwą liczbę. 12 jest największą niemożliwą liczbą, dlatego wystarcza do kodów o mniejszym numerze 28.

4 = cztery
11 = sześć plus pięć
13 = osiem plus pięć
14 = dwadzieścia minus sześć
15 = dwadzieścia minus pięć
16 = osiemnaście minus dwa
17 = czternaście plus trzy
18 = dwadzieścia dwa minus cztery
20 = trzydzieści dwa minus dwanaście
21 = dwadzieścia plus dwa minus jeden
22 = dwadzieścia plus cztery minus dwa
23 = trzydzieści minus osiem plus jeden
24 = dwadzieścia plus osiem minus cztery
25 = dwadzieścia plus osiem minus trzy
27 = dwadzieścia osiem minus sześć plus pięć

Możemy zapisać każdą liczbę> 27 jako x * 15 + jedna z powyższych liczb.

Grał w golfa

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

Kod czytelny

#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
źródło
2
Nie jestem pewien, jak działa Twój kod, ale skoro pytanie mówi all numbers used in the output must be positive integers, czy możesz usunąć go #define Z "zero"z kodu wraz z instancjami Z, skoro nigdy nie powinieneś go używać?
Qwix,
„plus dwanaście” to 12 liter. Czy pomogłoby to skrócić Twój kod?
isaacg
Zrobiłbym to krócej, niestety spacje się nie liczą, plus twelvejest tylko 10 liter
Optokopper
OK, źle odczytałem zasady.
isaacg