Praktek

6

C, 450 karakter

Edit: dihapus zero

Edit: hanya menggunakan plusdanminus

Saya mencari ekspresi terpendek yang menambahkan karakter dan menjaga kondisi tetap benar. Saya menemukan plus ten plus five15 panjang dan menambahkan 15 ke string.

Saya hanya perlu ekspresi untuk 15 angka pertama yang bukan tidak mungkin, untuk menyatakan angka yang mungkin. 12 adalah angka mustahil terbesar, oleh karena itu cukup untuk angka hardcode yang lebih kecil 28.

4 = empat
11 = enam tambah lima
13 = delapan ditambah lima
14 = dua puluh minus enam
15 = dua puluh minus lima
16 = delapan belas dikurangi dua
17 = empat belas ditambah tiga
18 = dua puluh dua minus empat
20 = tigapuluh dua dikurangi dua belas
21 = dua puluh ditambah dua minus satu
22 = dua puluh ditambah empat dikurangi dua
23 = tiga puluh dikurangi delapan ditambah satu
24 = dua puluh ditambah delapan minus empat
25 = dua puluh ditambah delapan minus tiga
27 = dua puluh delapan dikurangi enam ditambah lima

Kita dapat menulis setiap angka> 27 sebagai x * 15 + salah satu angka di atas.

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

Kode yang Dapat Dibaca

#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
sumber
2
Tidak begitu yakin bagaimana kode Anda bekerja, tetapi karena pertanyaannya menyatakan all numbers used in the output must be positive integers, dapatkah Anda menghapus #define Z "zero"dari kode Anda bersama dengan contoh Z karena Anda seharusnya tidak pernah menggunakannya?
Qwix
"ditambah dua belas" adalah 12 huruf. Apakah itu membantu mempersingkat kode Anda?
isaacg
Saya akan membuatnya lebih pendek, sayangnya spasi tidak masuk hitungan, plus twelvehanya 10 huruf
Optokopper
OK, saya salah membaca aturan.
isaacg