C, 450 karakter
Edit: dihapus zero
Edit: hanya menggunakan plus
danminus
Saya mencari ekspresi terpendek yang menambahkan karakter dan menjaga kondisi tetap benar. Saya menemukan plus ten plus five
15 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
sumber
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?plus twelve
hanya 10 huruf