壁に足を踏み入れないでください!


16

いくつかのテキストベースのローグのようなものは、あなたが壁に足を踏み入れることを許さず、あなたが行おうとするならあなたにあなたの動きを与えます。プレーヤーを最も近い有効な方向に移動できるのに、なぜそうするのですか?

チャレンジ

方向と3 x 3のキャラクターのグリッドが与えられると、プレーヤーが一歩進んだ後に同じグリッドを出力する関数のプログラムを書きます。

例えば、

9
#..
.@#
#.#

になる

#.@
..#
#.#

入力

  • 方向は1〜9の1桁の数字で示され、それぞれが8つの基本方向に対応し、静止しています。これは、キーパッド上の数字の相対的な位置から導出されます。

    NW N NE
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    ただし、789、456、123の代わりに123、456、789の番号を使用することもできます。言い換えると、必要に応じて上下2行または番号を入れ替えることができます。これらは、許容される唯一の2つのインデックスの組み合わせです。

  • 3 x 3グリッドは、歩行可能な床、壁、およびプレーヤーを表す3つの異なる印刷可能なASCII文字で構成されます。(テストケースで.は、床に使用され、#sは壁であり@、プレーヤーです)

  • プログラムで使用する文字を選択することもできますが、回答にそれらを明記する必要があり、複数の試行にわたって一貫している必要があります。
  • 文字を表す文字は常に3 x 3グリッドの中央にあり、方向は常に1〜9を含みます(含む)。
  • 任意の順序で入力を取得できます
  • 3 x 3のグリッドは、char配列、string配列、9 lengthの文字列、または別の妥当な代替として入力できます。

出力

  • 関数からの戻り、またはStdOutまたは最も近い代替への出力
  • 末尾のスペースと改行が許可されます
  • 入力と同じ文字表現を使用する必要があります
  • 入力に許可されているのと同じ形式が出力に許可されています

プレイヤーの動き

指定された方向が壁によってブロックされている場合(たとえば、上記の例に方向6がある場合)、最も近い2つの方向を確認します。

  • 1つ(および1つだけ)の方向が空いている場合、その方向にプレーヤーを移動します。
  • 無料の方向がない場合は、次に近い2つの方向(方向5を除く)を確認します。周りを包み込んで、開いている方向(壁に囲まれたプレーヤー)が見つからない場合は、プレーヤーを動かさないでください。
  • 両方の方向が開いている場合、ランダムに移動する方を選択します(必ずしも均一ではありません)。

指定された方向が5の場合、プレーヤーを動かさないでください

テストケース

#=壁、.=床、@=プレーヤー)

入力:

9
#..
。@#
#。#

出力:

#。@
..#
#。#


入力:

3
#..
。@#
#。#

出力:

#..
..#
#@#


入力:

7
##。
#@#
..#

出力:

## @ ##。
#。#または#。#
..#@。#


入力:

5
...
。@。
...

出力:

...
。@。
...


入力:

2
###
#@#
###

出力:

###
#@#
###

得点

これはであるため、バイト単位の最短回答が優先されます。


使用していyuhjklbnない?RIP。
Rɪᴋᴇʀ

また、「別の方向を選ぶ」部分があまり好きではありません。「プレイヤーを指定された方向に動かして出力する」というチャレンジの他の部分とは少し異なります。それは個人的な好みです。
Rɪᴋᴇʀ

1
この部分は紛らわしいです。「空いている方向がない場合は、次に近い2つの方向を見てください。」
リーキー修道女

1
各要素にASCII文字の代わりに番号を割り当てて、2次元リストとして入力を取得できますか?または、文字列でなければなりませんか?
スコットミルナー

2
123;456;789代わりに指示を使用できます789;456;123か?
リーキー修道女

回答:


2

Pyth- 73 70バイト

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

それを試してみてください

入力は2行で構成されます。

1行目:移動の方向

2行目:ボード(123456789の位置、123が最上行)


3

JavaScript(ES6)、192 163バイト

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

ノート

この関数は特別な入力形式を使用します。最初の入力は、マップを表す整数の配列(0for floor1for wallおよび2for player)です。2番目の入力は(反転)方向です。1北西、2北、3北東、4西などです。入力はカリー化構文(Z(a)(b))で指定する必要があります。

テストケース

マップと方向は、入力形式に合わせて変更されました。

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}


1

Pythonの3、120の 104 153 176 175バイト

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

オンラインでお試しください!

このメソッドは、方向と「。」、「#」、「@」のリストを取得します。インデックスは1〜9で始まります(実際にはリストの0〜8)。だからそれは形をしています

123 
456
789 

メソッドは、新しい位置を持つ新しいリストを返します。

この行

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

このタイプのリストを返します。

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

自由点までの距離を計算し、ランダム性を追加します。なぜならord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')、最も近い「。」n = 7(リスト内のインデックス)のインデックスは8です。

ここに画像の説明を入力してください

例:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']

1)これは、プレイヤーが移動したい方向が占有されており、正しい位置が最初ではない','テストケースでは機能しません(テストケース2、3、5の場合)。2)I / Oフォーマットが質問と同じではないようです。I / O形式をお知らせください。
ルーク

あなたの例f(9, ...は機能しません-文字を2に配置しますが、9に最も近い位置は6と8なので、そのうちの1つをランダムに選択する必要があります(コードにもランダム性はありません)。さらに、次に最も近いものを見つけるために周囲を移動する必要があるためf(9,list("####@#.##"))、キャラクターを唯一の可能な場所に配置する必要があります(ここでは7)。
ジョナサンアラン

間違いを指摘してくれてありがとう、私にとってのニュースは、コードl [4]、l [l.index( '。')] = '。@'とl [l.index( '。')]、l [4 ] = '@。' 異なっている
КириллМалышев

@JonathanAllan、最初はルールをよく理解していませんでした。コードを正しく修正できることを願っています。
КириллМалышев

まだ正しくありません、いいえ。1.例f(9, ...が返されますlist("#....##@#")(8は無料で、9の隣にあるため)。2.のようなものは、「両方の方向が開いている場合、ランダムに移動する方を選択してください」と指定されf(9,list("####@.#.#"))ているようにlist("####..#@#")(常にではないlist("####.@#.#"))戻る可能性があります。
ジョナサンアラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.