26

チャレンジ

  • レベルの終わりに到達してください!
  • 各(C)oinブロックを正確に2回ヒットするとボーナスポイント。

不許可

  • 何らかの方法でコマンド シーケンスをハード コーディングします。
  • このゴルフを解決するという、まさに 1 つのことを行うお気に入りの「1 文字言語」 。

方法

プログラムは、標準入力を介して下のレベル (改行なし) を受け取ります。
次に、レベルを正常に完了するために必要なコマンドを出力する必要があります。

レベル

  • Sは開始位置です。
  • Eレベルを完了するために必要な位置。
  • Cは 2 枚のコインが入ったコイン ブロックです。レベルを完了するために、これらの 1 つをスキップする必要はありません。
  • C_の両方が地面としてカウントされます。固体の地面のみがあり、フローティング プラットフォームはありません。
  • | | は壁です。レベルを完了するためにジャンプする必要がある壁はすべて、最大で 1 壁の高さです。それ以上のすべての壁は、決して抜け出せない奈落の底と見なすことができます。
  • xはスパイクです。触れるとどうなるか当ててみてください。スパイクは常に、周囲の地面より 1 レベル下にあります。

すべてのレベルは 4 行の高さで、各行の幅は 63 文字です。つまり、レベルごとに合計 252 文字になります。

>                       ______  ____       ________  ___        <
>    C            ______|    |  |  |  C  __|      |  | |   ____E<
>S______  __  ____|          |  |  |_____|        |__| |___|    <
>       xx  xx                xx                                <

注: >< は境界線を示すためのものであり、プログラムへの入力には含まれません。また、テキスト エディタにも気をつけてください。

コマンド

  • M = 右に 1 移動します。下に地面がない場合は、地面にぶつかるまで落下します。落下中 は動けません
  • J = ジャンプ、次の 3 つのコマンドの間、または (C)oin ブロックをヒットするまで、1 ずつ上に移動します。その後、地面に着くまで落下します。ジャンプできるのは地面にいるときだけです。M で地面と同じ高さになると、ジャンプはキャンセルされます。
  • O = NOP、あなたを待たせます/何もしません。このようにして、幅が 1 ブロックしかない穴やスパイクをジャンプできます (上記のレベルではこれは必要ありませんが、これが必要なレベルを解決できれば、追加のポイントを獲得できます)。

ソリューション(コインブロックあり)

連続するコマンドは、互いの上に積み重ねられます。
Fは落下する場所を示します (落下中は何もできないことに注意してください)。

                            MMMF                 MMMF            
    M                 MMMMMMJ  MMMMF M   MMMMMMMMJ  MMMF        
M   J MMMFMMMF  MMMMMMJ|    |  |  |F J MMJ|      |  | |F MMMMME
SMMMJMJ  MJ  MMMJ|          |  |  |MMJMJ|        |__| |MMJ|    
       xx  xx                xx                                

結果のコマンド シーケンス、長さ 75 文字:

MMMMJJMMJMMMMJMMMMMMJMMMMMMJMMMMMMJMMMMMMMMMJJMMJMMJMMMMMMMMJMMMMMMMMJMMMMM

これがいくつかの興味深い結果をもたらすことを願っています...そして、たくさんの炎ではありません:O

編集

OK、最初に考えていたよりもはるかに多くの可能性があります。すべての編集についてお詫び申し上げます。

4

4 に答える 4

14

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 メソッドのプロンプトは、一部のブラウザー (例: Google Chrome) でスペースを削除する傾向があります。そのため、これらのブラウザでは期待どおりに動作しない可能性があります。その他 (例: Firefox) では正常に動作します。

コメント付きバージョン

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
于 2010-07-04T03:16:21.013 に答える
10

Python 2.6 318 - 302 - 300 - 284 - 277 - 206 - 203 - 191 - 184 文字

基本的にHoLyVieRと同じアプローチです(根本的に異なる方向性が解決策としてたくさんあるのではないかと思います)。stdin から読み取ります。

更新 1 (318 -> 302): 確認せず、E63 位にあると仮定します (コメントで尋ねられたように)。
更新 2 (302 -> 300): (2 文字全体) に変更range(0,252,63)されました。更新 3 (300 -> 284):フェッチも行われるようですので、etc をドロップできます。 更新 4 (284 -> 277):更新 5 (277 -> 206): 2 次元リスト処理の代わりに文字列を使用し、大幅に節約しました...更新6 (206 -> 203): コメントに提案を実装しましたHoLyVieR の回答 (Nabb による) 更新 7 (203 -> 191): ブール文字列構築を使用して 200 文字の制限を破る...更新 8 (191 -> 184): 微調整(0,63,126,189)raw_inputstdinimport sys[y][x+3]=="_"and p[y][x+1]==" "p[y][x:x+4]==list("_ _")

すべてのコメントや提案を歓迎します!

注: (不要な) \andnewlineを以下のコードに追加しました (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 < level.txt

于 2010-07-04T07:50:05.613 に答える
2

Ruby - 231 226 218 198 197 文字

1文字のギャップを処理でき、盲目的に崖から飛び降ります。ピットのすぐ左でコインを取ろうとすると落ちる。

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
于 2010-07-04T21:24:10.647 に答える
1

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 文字のギャップと、プレイヤーがレベルの一番上の行を横切って歩いている場合に対応します。これらの 2 つのケースを気にしなければ、少し節約できます。

于 2010-07-04T22:49:52.727 に答える