Labirenti yürü


15

Ya da belki de gerçekten bir labirent değil, yine de.

Kurallar:

  1. Girdi , iki satırlık dize oluşan *, 1, xve X. Bu ip, içinden geçilmesi gereken bir labirent. Çizgiler eşit uzunlukta .

    Girdiyi ,(virgül) veya bu iki satır arasında herhangi bir uygun ayırıcıyla dize olarak alabilirsiniz . Veya her iki satırı da işlevinize ayrı bağımsız değişkenler olarak alabilirsiniz.

  2. Çıktı , dizeden çıkmak için atmanız gereken adım sayısıdır (son adım, sizi dizeden çıkartan adımdır).

  3. Sol üst köşeden (daha yüksek satır) ilk sembolden önce başlarsınız .

  4. Her adım için bir sembol ileri gider (n. - (n + 1 ). Konum ). Ardından, bastığınız karaktere bağlı olarak sonuç farklıdır. Her karakter şöyle yapar:

    • *- hiçbir şey değil. Normalde üzerine basarsınız.
    • x- üzerine bastığınızda, hattı değiştirin, ancak başlangıçtan itibaren aynı yatay mesafede kalın. Örneğin, yüksek çizginin üçüncü konumuna bastınız ve burada bir küçük harfle tanıştınız x. Sonra hemen alt satıra geçersiniz, ancak yine üçüncü konumda.
    • X- hattı değiştirin ve bir sonraki konuma geçin. Örnek orada aynıdır, ancak aynı zamanda üçüncü konumdan dördüncü konuma hareket edersiniz (böylece dördüncü pozisyondaki ikinci çizgidesiniz).
    • 1 - sadece başka bir pozisyonda ilerleyin.

Her karakter işini yaptıktan sonra, bir boşlukla değiştirilir ve artık "işe yaramaz".

Örnekler aşağıdadır.

  1. Giriş :

    x
    *
    

    Daha önce de belirtildiği gibi, ilk satırın ilk sembolünden önce başlarsınız. İlk adım sizi harf üzerine taşır xve bu harf sizi ikinci satıra götürür . Harf xartık olarak işlev xgörmüyor ancak onunla değiştiriliyor *. Bu, sonraki örneklerde daha alakalı olacaktır. Şimdi alt çizgide bir yıldız işaretindesiniz ve bu sizin için hiçbir şey yapmadı.

    İkinci adım sizi ileriye doğru hareket ettirir ve dizeden çıkarsınız, böylece labirent tamamlanır ve 2 adım attı.

    Çıktı 2 .

  2. Giriş :

    xX*
    x1*
    

    1. adım : devam edersiniz x, bu da sizi xalt çizginin üzerine taşır . Burada, kullanılan karakterin yıldız işareti ile değiştirildiğini söyleyen kural gelir. Sonra ilk satıra geri dönersin, ama artık değilx orada değil, çünkü kullanılmış ve yıldız işareti oldu. Böylece bu yıldız işareti üzerinde güvenle hareket edersiniz ve adım tamamlanır (şimdi ilk satırın ilk pozisyonundasınız).

    2. adım : devam ederseniz X, sizi alt satıra iter ve sonra ileri doğru iter. Artık ikinci satırı (yıldız içeren 1) hiç ziyaret etmemiş olmak üzere, ikinci satırı (yıldız) üçüncü konumda bulabilirsiniz .

    3. adım : dizeden çıkarak ileri doğru hareket edersiniz.

    Çıktı : 3.

Test senaryoları:

  1. Giriş:

    *1*
    xxx
    

    Çıktı: 3. (çünkü 1üçüncü pozisyonda zıplamanızı sağlar). Orada asla ikinci satırı ziyaret etmezsiniz, ancak girişin bir parçası gereklidir.

  2. Giriş:

    *X*1*x
    x*1xx*
    

    Çıktı: 4.

  3. Giriş:

    1x1x
    ***X
    

    Çıktı: 3.

  4. Giriş:

    1*x1xxx1*x
    x*x1*11X1x
    

    Çıktı: 6.

  5. Giriş:

    xXXXxxx111*
    **xxx11*xxx
    

    Çıktı: 6.


Boş bir dize, iki satırlı bir dize olmadığından geçerli bir giriş olmamalıdır
edc65

@edc Haha, kendimle çelişiyorum. Evet kesinlikle.
nicael

"\n\n"iki satırlı bir dize ...
feersum

@feersum sonra çıktı olması gerektiğini düşünüyorum 1, 1. satırdan önce başlar, o zaman bir adım ileri gidersiniz ve sonra labirenti bitirirsiniz ...
Amit Gold

Yanıtlar:


5

Salyangoz, 34 bayt

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

Expanded:

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

N adımı atan bir yol için, program 0 adımlı, 1 adımlı, ..., N - 1 adımlı her bir geçiş için bir başarılı eşleşme bulur.


3

Haskell, 68 66 65 bayt

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

İşlev #her iki satırı ayrı parametreler olarak alır. Kullanım örneği: "1x1x" # "***X"-> 3.

Sadece *adım attığımız yıldızları ve ayrılmak için 1'i saymalıyız.

(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

Düzenleme: @feersum bir bayt kaydetti. Teşekkürler!


Muhtemelen çalışan bir demo sunabilir misiniz ( ideone.com'da bu uygun olurdu), ben bir Haskell programcısı değilim ama onunla oynamak istiyorum.
nicael

1
@nicael: buraya bakın
nimi

Örneğin, a>'a'yerine kullanabilir misiniz a=='x'?
feersum

Bunu fark etmedim, ama aslında boş dize geçersiz giriş (kendimi girdinin iki satırlı bir dize olduğunu belirttiğim için), bu kenar durumu için doğrulamayı kaldırabilirsiniz :)
nicael

@feersum: evet, işe yarıyor. Teşekkürler!
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}

Daha az 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
}

Ölçek

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 bayt

golfed:

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

Ungolfed:

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

Vaktini boşa harcamak


1

JavaScript, 211 bayt

Bir web sayfasında görüntülenen birbiri ardına oynanan her adımı gösteren bir sürüm yapmayı düşünüyorum.

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

Değiştirilemediğinden JS xile değiştirirken umduğumdan daha fazla bayt kullanıldı . İyileştirme önerileri, özellikle yedek parça ile takdir edilmektedir.*Strings

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.