Гольф кода: 2D платформер

26
задан 11 revs, 2 users 100% 4 July 2010 в 19:59
поделиться

4 ответа

Javascript:

Краткая версия (334 280 256 240 238 236 233 223 207 205 196 184 182 символа)

a=prompt();j=i=0;while(a[++j*63]<(o="M"));while(++i<62){while(a[h=j*63+i]<"_")j++;if(a[h-63]>"B")o+="JJ";if(a[h+1]>"z")o+="J",j--;if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2;o+="M"}alert(o)

Примечание: Метод Javascript prompt имеет тенденцию удалять пробел в некоторых браузерах (например. : Google Chrome). По этой причине в этих браузерах он может работать не так, как ожидается. В других браузерах (например, Firefox) он будет работать нормально.

Commented Version

a=prompt(); // Read the input //
j=i=0;
while(a[++j*63]<(o="M")); // Place the cursor at the "S" //
while(++i<62){ // While we are not at the end point //
 while(a[h=j*63+i]<"_")j++; // If we are on a space, we fall //
 if(a[h-63]>"B")o+="JJ";// We jump for coins //
 if(a[h+1]>"z")o+="J",j--; // We jump when we reach a wall //
 if(a[h+3]+a[h+1]=="_ ")o+="JMM",i+=2; // We jump on gap //
 o+="M" // We add the movemment in the output
}
alert(o) // Output
14
ответ дан 28 November 2019 в 07:54
поделиться

Ruby - 231 226 218 198 197 символов

Он может обрабатывать пробелы в один символ и слепо прыгает с любых обрывов. Падает, если пытается достать монету сразу слева от ямы.

l=?\s*63+gets
c=l=~/S/
r=->{c-=62;'JM'}
(print l[c-63]==?C?r[]:(l[c+1]>?\s&&l[c+1]<?x?(c+=1;?M):(l[c+1]<?C&&l[c]>?\s?(c-=61;'JMM'+(l[c+63]<?C?(c+=1;?M):?O)):r[]))
c+=63 while l[c]<?C)while l[c]!=?E
2
ответ дан 28 November 2019 в 07:54
поделиться

C - 275 байт (окончания строк DOS)

#define A(B,C)!memcmp(p+1,B,C)
#define P printf
char*p,l[318],k=63;f(){P("M");++p;while(*p<33)p+=k;}main(){read(0,l+k,4*k);p=strchr(l+k,83);while(*p!=69)p[-k]==67?(P("JJM"),++p):(p[1-k]>94?(P("JM"),p+=1-k):(A("  _",3)?(P("JMMM"),p+=3):(A(" _",2)?(P("JMMO"),p+=2):f())));}

Это учитывает пробелы в 1 символ и случай, когда игрок идет по самой верхней строке уровня. Вы могли бы немного сэкономить, если бы не заботились об этих двух случаях.

1
ответ дан 28 November 2019 в 07:54
поделиться

Python 2.6 318 - 302 - 300 - 284 - 277 ] - 206 - 203 - 191 - 184 символа

В основном тот же подход, что и HoLyVieR (интересно, может ли быть много радикально разных направлений решения -Мудрый). Читает из стандартного ввода.

Обновление 1 (318 -> 302): не проверяйте E , но предполагайте, что он находится на позиции 63 (как указано в комментарии).
Обновление 2 (302 -> 300): изменен диапазон (0,252,63) на (0,63,126,189) (два целых символа) Обновление 3 (300 -> 284): кажется, raw_input также извлекает stdin , поэтому import sys и т. Д. Можно удалить. Обновление 4 (284 -> 277): [y] [x + 3] == "_" и p [y] [x + 1] == "" в p [y] [x: x + 4] == list ("_ _") Обновление 5 (277 -> 206): перешли на строку вместо обработки двумерного списка, большая экономия ...
Обновление 6 (206 -> 203): реализованы предложения в комментарии к ответу HoLyVieR (от Nabb) Обновление 7 (203 -> 191): нарушение ограничения в 200 символов с помощью построения логической строки ...
Обновление 8 (191 -> 184): незначительные изменения

Все комментарии и предложения приветствуются!

Примечание: Я добавил (ненужные) \ и новую строку в код ниже (EOL 5-> 6) (чтобы избежать полос прокрутки здесь)

l=raw_input()
x,y,o=0,l.index('S')//63,''
while x<62:
 while l[y*63+x]==" ":y+=1
 b=y*63+x;g=l[b+1]>"z";h=l[b:b+4]=="_  _";o+=(l[b-63]>"A")*"JJ"+g*"J"+h*"JMM"+\
"M";y-=g;x+=1+h*2
print o

Использование : python 2dplatform.py

10
ответ дан 28 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: