Berjalan di labirin

15

Atau mungkin itu bukan labirin, tapi tetap saja.

Aturan:

  1. Masukan adalah string dua baris, yang terdiri dari *, 1, xdan X. Tali itu adalah labirin untuk dilalui. Garis memiliki panjang yang sama .

    Anda bisa mengambil input sebagai string dengan ,(koma) atau pemisah yang nyaman antara dua baris ini. Atau Anda bisa menggunakan kedua baris sebagai argumen terpisah untuk fungsi Anda.

  2. Output adalah jumlah langkah yang harus Anda ambil untuk keluar dari string (langkah terakhir adalah langkah yang membuat Anda keluar dari string).

  3. Anda mulai di sudut kiri atas (garis yang lebih tinggi), sebelum simbol pertama.

  4. Untuk setiap langkah, Anda bergerak maju dengan satu simbol (dari n ke (n + 1) th posisi ). Kemudian, tergantung pada karakter yang Anda injak, hasilnya berbeda. Inilah yang dilakukan oleh masing-masing char:

    • *- tidak ada. Anda cukup menginjaknya secara normal.
    • x- setelah Anda menginjaknya, alihkan garis, tetapi tetap pada jarak horizontal yang sama dari awal. Misalnya, Anda menginjak posisi ketiga dari garis yang lebih tinggi, dan bertemu dengan huruf kecil di xsini. Kemudian Anda langsung pindah ke garis bawah, tetapi kembali di posisi ketiga.
    • X- pindah jalur dan pergi ke posisi berikutnya. Contohnya sama di sana, tetapi Anda juga pindah dari posisi ketiga ke posisi keempat (jadi Anda berada di baris kedua di posisi maju).
    • 1 - hanya bergerak maju dengan posisi lain.

Setelah setiap karakter melakukan tugasnya, itu diganti dengan spasi dan tidak lagi "berfungsi".

Contohnya ikuti.

  1. Masukan :

    x
    *
    

    Seperti yang dikatakan sebelumnya, Anda mulai sebelum simbol pertama dari baris pertama. Langkah pertama menggerakkan Anda menggunakan huruf xdan surat ini mengalihkan Anda ke baris kedua. Surat itu xtidak lagi berfungsi sebagai x, tetapi diganti dengan *. Ini akan lebih relevan dalam contoh-contoh terakhir. Anda sekarang berada di tanda bintang di garis bawah, dan itu tidak melakukan apa pun bagi Anda.

    Langkah kedua adalah menggerakkan Anda ke depan dan Anda keluar dari string, sehingga labirin selesai, dan butuh 2 langkah.

    Keluaran 2 .

  2. Masukan :

    xX*
    x1*
    

    Langkah 1 : Anda bergerak x, yang menggerakkan Anda pada xbaris bawah. Di sinilah aturan yang mengatakan bahwa karakter yang digunakan diganti dengan tanda bintang. Kemudian Anda kembali ke baris pertama, tetapi tidak lagi di xsana, karena telah digunakan dan menjadi tanda bintang. Jadi, Anda bergerak dengan aman di asterisk ini dan langkahnya selesai (Anda sekarang berada di posisi pertama dari baris pertama).

    Langkah ke-2 : Anda pindah X, itu mendorong Anda ke garis bawah dan kemudian mendorong Anda ke depan. Anda sekarang berada di posisi ketiga dari baris kedua (tanda bintang), tidak pernah mengunjungi posisi kedua (yang berisi 1).

    Langkah 3 : Anda bergerak maju, keluar dari string.

    Output : 3.

Kasus uji:

  1. Memasukkan:

    *1*
    xxx
    

    Output: 3. (karena 1membuat Anda melompat di posisi ketiga). Di sana Anda tidak pernah mengunjungi baris kedua, tetapi diperlukan bagian dari input.

  2. Memasukkan:

    *X*1*x
    x*1xx*
    

    Output: 4.

  3. Memasukkan:

    1x1x
    ***X
    

    Output: 3.

  4. Memasukkan:

    1*x1xxx1*x
    x*x1*11X1x
    

    Output: 6.

  5. Memasukkan:

    xXXXxxx111*
    **xxx11*xxx
    

    Output: 6.

nicael
sumber
String kosong seharusnya tidak menjadi input yang valid, karena ini bukan string dua baris
edc65
@ed Haha, saya kontradiksi dengan diri saya sendiri. Ya memang.
nicael
"\n\n"adalah string dua baris ...
feersum
@feersum maka saya pikir output harus 1, ketika Anda mulai sebelum baris 1, maka Anda bergerak maju satu langkah, dan kemudian Anda menyelesaikan labirin ...
Amit Gold

Jawaban:

5

Siput, 34 byte

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

Diperluas:

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

Untuk jalur yang mengambil langkah N, program menemukan satu kecocokan yang berhasil untuk setiap traversal dari 0 langkah, 1 langkah, ..., N - 1 langkah.

feersum
sumber
3

Haskell, 68 66 65 byte

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

Fungsi #mengambil kedua garis sebagai parameter terpisah. Contoh penggunaan: "1x1x" # "***X"-> 3.

Kita hanya harus menghitung bintang yang *kita injak plus 1 untuk pergi.

(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

Sunting: @feersum menyimpan satu byte. Terima kasih!

nimi
sumber
Bisakah Anda memberikan demo yang berfungsi (di ideone.com akan lebih mudah), saya bukan programmer Haskell tetapi ingin bermain dengannya.
nicael
1
@nicael: lihat di sini
nimi
Bisakah Anda menggunakan misalnya a>'a'bukan a=='x'?
feersum
Saya belum menyadarinya, tetapi sebenarnya string kosong adalah input yang tidak valid (karena saya telah menyatakan sendiri bahwa inputnya adalah string dua baris), sehingga Anda dapat menghapus validasi untuk
kasing
@feersum: ya, itu berhasil. Terima kasih!
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}

Kurang golf

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
}

Uji

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)
})  
 

edc65
sumber
2

TSQL (sqlserver 2012+), 276 byte

Golf:

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

Tidak Disatukan:

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

Biola

t-clausen.dk
sumber
1

JavaScript, 211 byte

Saya sedang berpikir untuk membuat versi yang menunjukkan setiap langkah dimainkan satu sama lain, ditampilkan di halaman 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}

Digunakan lebih banyak byte daripada yang saya harapkan ketika mengganti xdengan *karena JS tidak dapat diubah Strings. Saran untuk meningkatkan dihargai, terutama dengan bagian pengganti.

charredgrass
sumber