迷宮を歩く


15

または、それは実際には迷路ではありませんが、それでもです。

ルール:

  1. 入力は、2行の文字列で構成される*1xX。そのひもは通り抜ける迷路です。行の長さ同じです

    入力を,(カンマ)を含む文字列またはこれらの2行の間の任意の便利な区切り文字として受け取ることができます。または、両方の行を関数の個別の引数として使用できます。

  2. 出力は、文字列を終了するために必要な手順の数です(最後の手順は、文字列から移動する手順です)。

  3. 最初のシンボルのの左上隅(上の行)から開始します。

  4. 各ステップで、1シンボルずつ(n番目から(n + 1)番目の位置まで)移動します。次に、踏んだキャラクターに応じて、結果は異なります。各文字の機能は次のとおりです。

    • *-何もない。普通に踏むだけです。
    • x-踏んだら、ラインを切り替えますが、最初から同じ水平距離を保ちます。たとえば、上の行の3番目の位置に足を踏み、xここで小文字に遭遇しました。次に、すぐに下の行に移動しますが、再び3番目の位置に移動します。
    • X-行を切り替えて、次の位置に移動します。この例は同じですが、3番目から4番目の位置に移動します(したがって、2番目の行の4番目の位置にいます)。
    • 1 -ちょうど別の位置で前進します。

各キャラクターが仕事をすると、スペースに置き換えられ、「機能」しなくなります。

次に例を示します。

  1. 入力

    x
    *
    

    前述のように、最初の行の最初のシンボルの前から開始します。最初のステップでは、文字に移動しx、この文字は、2行目に切り替えます。文字xはもはや機能しませんxが、で置き換えられ*ます。これは、後者の例でより関連します。あなたは今、下の行のアスタリスクにいて、それはあなたに何もしませんでした。

    2番目のステップは前方への移動であり、ストリングを終了するため、ラビリンスは完了し、2ステップかかりました。

    出力 2

  2. 入力

    xX*
    x1*
    

    最初のステップxに進みますx。これにより、下の行に移動します。ここに、使用された文字がアスタリスクに置き換えられるというルールがあります。その後、最初の行に戻りますxが、使用されてアスタリスクになったため、もう行はありません。したがって、このアスタリスク上を安全に移動し、ステップが完了しました(最初の行の最初の位置にいます)。

    2番目のステップ:上に移動Xすると、下の行に移動し、次に前方に移動します。2行目の3番目の位置(アスタリスク)に常駐し、2番目の位置(を含む1)には一度もアクセスしたことがありません。

    3番目のステップ:前方に移動して、文字列を終了します。

    出力3

テストケース:

  1. 入力:

    *1*
    xxx
    

    出力:3。(13番目の位置にジャンプするため)。ここでは、2行目にアクセスすることはありませんが、入力の必須部分です。

  2. 入力:

    *X*1*x
    x*1xx*
    

    出力:4

  3. 入力:

    1x1x
    ***X
    

    出力:3

  4. 入力:

    1*x1xxx1*x
    x*x1*11X1x
    

    出力:6

  5. 入力:

    xXXXxxx111*
    **xxx11*xxx
    

    出力:6


それは2行の文字列ではありませんように空の文字列は、有効な入力すべきではない
edc65

@edcハハ、私は自分自身に矛盾しています。はい、確かに。
ニカエル

"\n\n"は2行の文字列です
...-feersum

@feersumそれでは1、最初の行の前から始めて、一歩先に進み、迷路を終えると、出力はであるはずだと思います...
Amit Gold

回答:


5

カタツムリ、34バイト

A^
\1r|\xud|\Xaa7},(\*|\xud=\x)r},

拡張:

{
    {
        \1 r |
        \x ud |
        \X aa7
    },
    (\* | \x ud =\x)
    r
},

Nステップかかるパスの場合、プログラムは、0ステップ、1ステップ、...、N-1ステップのトラバーサルごとに1つの成功した一致を見つけます。


3

Haskell、68 66 65バイト

(a:b)#l@(c:d)|a<'+'=1+b#d|a>'w'=l#('*':b)|a>'W'=d#b|1<2=b#d
_#_=1

関数#は、両方の行を個別のパラメーターとして受け取ります。使用例:"1x1x" # "***X" -> 3

*足を踏み入れる星の数に1を足すだけです。

(a:b)#l@(c:d)             -- bind: a -> first char of first line
                                   b -> rest of first line
                                   l -> whole second line
                                   c -> first char of second line (never used)
                                   d -> rest of second line
   |a < '+' = 1+b#d       -- stepped on a *, so add 1 and go on
   |a > 'w' = l#('*':b)   -- x switches lines and replaces the x with *
   |a > 'W' = d#b         -- X switch lines and go on
   |1<2     = b#d         -- the rest (-> 1) simply walks forward
_#_=1                     -- base case: the empty string counts 1 for leaving

編集:@feersumはバイトを保存しました。ありがとう!


おそらく実際に動作するデモを提供してもらえますか(ideone.comでは便利です)、私はHaskellのプログラマーではありませんが、試してみたいと思います。
ニカエル


a>'a'代わりに例えばを使用できますa=='x'か?
feersum

私はそれを実現していないが、(私は入力が2行の文字列であることを自分自身を述べてきましたので)あなたは:)このエッジケースの検証取り除くことができるように、実際に空の文字列は、無効な入力である
nicaelを

@feersum:はい、動作します。ありがとう!
nimi

2

JavaScript(ES6)、119

l=>{z=-~l.search`
`,l=[...l+' '];for(n=p=0;(c=l[p%=2*z])>' ';p+=c>'X'?z:c>'1'?z+1:c>'0'?1:(++n,1))l[p]='*';return-~n}

少ないゴルフ

l=>{
  z=1+l.search`\n`;
  l=[...l+' '];
  for( n = p = 0; 
       (c=l[p%=2*z])>' '; 
       p += c>'X' ? z : c>'1' ? z+1 : c>'0'? 1 : (++n,1) )
    l[p] = '*';
  return 1+n
}

テスト

f=l=>{z=-~l.search`
`,l=[...l+' '];for(n=p=0;(c=l[p%=2*z])>' ';p+=c>'X'?z:c>'1'?z+1:c>'0'?1:(++n,1))l[p]='*';return-~n}

[['x\n*',2]
,['xX*\nx1*',3]
,['*1*\nxxx',3]
,['*X*1*x\nx*1xx*',4]
,['1x1x\n***X',3]
,['1*x1xxx1*x\nx*x1*11X1x',6]
,['xXXXxxx111*\n**xxx11*xxx',6]
].forEach(t=>{
  var i=t[0],k=t[1],r=f(i) 
  console.log('Test result '+r+(r==k?' OK ':' KO (expected '+k+')')+'\n'+i)
})  
 


2

TSQL(sqlserver 2012 +)、276バイト

ゴルフ:

DECLARE @i VARCHAR(99)=
'xXXXxxx111*'+CHAR(13)+CHAR(10)+
'**xxx11*xxx'

,@t BIT=0,@c INT=1,@ INT=1WHILE @<LEN(@i)/2SELECT @t-=IIF(a like'[1*]'or'xx'=a+b,0,1),@c+=IIF(a='*'or'xx'=a+b,1,0),@+=IIF(a='x'and'x'>b,0,1)FROM(SELECT SUBSTRING(d,@t*c+@,1)a,SUBSTRING(d,(1-@t)*c+@,1)b FROM(SELECT LEN(@i)/2+1c,REPLACE(@i,'X','q'COLLATE thai_bin)d)x)x PRINT @c

ゴルフをしていない:

DECLARE @i VARCHAR(99)=
'xXXXxxx111*'+CHAR(13)+CHAR(10)+
'**xxx11*xxx'

,@t BIT=0,@c INT=1,@ INT=1
WHILE @<LEN(@i)/2
  SELECT
    @t-=IIF(a like'[1*]'or'xx'=a+b,0,1),
    @c+=IIF(a='*'or'xx'=a+b,1,0),
    @ +=IIF(a='x'and'x'>b,0,1)
  FROM
    (
      SELECT
        SUBSTRING(d,@t*c+@,1)a,
        SUBSTRING(d,(1-@t)*c+@,1)b
      FROM 
        (SELECT LEN(@i)/2+1c,REPLACE(@i,'X','q'COLLATE thai_bin)d)x
    )x

PRINT @c

フィドル


1

JavaScript、211バイト

Webページに表示される各ステップを順番に表示するバージョンを作成することを考えています。

(x,y)=>{t=0;l=0;n=1;while(t<x.length){c=(l?x:y);if(c[t]=='x'){l=!l;if(l){x=x.slice(0,t-2)+'*'+x.slice(t-1);}else{y=y.slice(0,t-2)+'*'+y.slice(t-1);}}if(c[t]=='X'){l=!l;t++;}if(c[t]=='1'){return n}

JS immutableのために置き換えるときにx、思っていたよりも多くのバイトを使用しました。特に交換部品については、改善の提案を歓迎します。*Strings

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.