Trainieren

6

C 450 Zeichen

Bearbeiten: entfernt zero

Bearbeiten: nur mit plusundminus

Ich habe nach dem kürzesten Ausdruck gesucht, der Zeichen hinzufügt und die Bedingung wahr hält. Ich fand plus ten plus fiveist 15 lang und fügt 15 der Zeichenfolge hinzu.

Ich brauche nur Ausdrücke für die ersten 15 Zahlen, die nicht unmöglich sind, um eine mögliche Zahl auszudrücken. 12 ist die größte unmögliche Zahl, daher reicht es aus, Zahlen kleiner 28 fest zu codieren.

4 = vier
11 = sechs plus fünf
13 = acht plus fünf
14 = sechsundzwanzig minus
15 = fünfundzwanzig minus
16 = achtzehn minus zwei
17 = vierzehn plus drei
18 = zweiundzwanzig minus vier
20 = zweiunddreißig minus zwölf
21 = zwanzig plus zwei minus eins
22 = vierundzwanzig minus zwei
23 = dreißig minus acht plus eins
24 = zwanzig plus acht minus vier
25 = zwanzig plus acht minus drei
27 = achtundzwanzig minus sechs plus fünf

Wir können jede Zahl> 27 als x * 15 + eine der obigen Zahlen schreiben.

Golf gespielt

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

Lesbarer Code

#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
quelle
2
Sie sind sich nicht sicher, wie Ihr Code funktioniert, aber da die Frage lautet all numbers used in the output must be positive integers, können Sie den #define Z "zero"Code zusammen mit Instanzen von Z aus Ihrem Code entfernen, da Sie ihn niemals verwenden sollten?
Qwix
"plus zwölf" sind 12 Buchstaben. Würde das helfen, Ihren Code zu verkürzen?
isaacg
Ich würde es kürzer machen, leider zählen Leerzeichen nicht, plus twelveist nur 10 Buchstaben
Optokopper
OK, ich habe die Regeln falsch verstanden.
isaacg