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
Он может обрабатывать пробелы в один символ и слепо прыгает с любых обрывов. Падает, если пытается достать монету сразу слева от ямы.
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
#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 символ и случай, когда игрок идет по самой верхней строке уровня. Вы могли бы немного сэкономить, если бы не заботились об этих двух случаях.
В основном тот же подход, что и 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