เดินเขาวงกต


15

หรืออาจจะไม่ใช่เขาวงกตจริงๆ แต่ก็ยังอยู่

กฎ:

  1. การป้อนข้อมูลเป็นสตริงสองบรรทัดประกอบด้วย*, 1, และx Xสายนั้นเป็นเขาวงกตที่จะเดินผ่าน เส้นมีความยาวเท่ากัน

    คุณสามารถรับอินพุตเป็นสตริงที่มี,(เครื่องหมายจุลภาค) หรือตัวคั่นใด ๆ ที่สะดวกระหว่างสองบรรทัดนี้ หรือคุณอาจใช้ทั้งสองบรรทัดเป็นอาร์กิวเมนต์แยกกันในการทำงานของคุณ

  2. เอาต์พุตคือจำนวนขั้นตอนที่คุณต้องดำเนินการเพื่อออกจากสายอักขระ (ขั้นตอนสุดท้ายคือขั้นตอนที่จะย้ายคุณออกจากสายอักขระ)

  3. คุณเริ่มต้นที่มุมซ้ายบน (บรรทัดที่สูงกว่า) หน้าสัญลักษณ์แรก

  4. สำหรับแต่ละขั้นตอนคุณก้าวไปข้างหน้าโดยหนึ่งในสัญลักษณ์ (จากที่ n จะ (n + 1) TH ตำแหน่ง ) จากนั้นขึ้นอยู่กับตัวละครที่คุณก้าวเข้ามาผลลัพธ์จะแตกต่างกัน นี่คือสิ่งที่แต่ละถ่านทำ:

    • *- ไม่มีอะไร คุณเพียงแค่เหยียบมันตามปกติ
    • x- เมื่อคุณเหยียบมันแล้วให้สลับสาย แต่ยังคงอยู่ในระยะทางแนวนอนเดียวกันจากจุดเริ่มต้น ตัวอย่างเช่นคุณก้าวไปสู่ตำแหน่งที่สามของบรรทัดที่สูงกว่าและพบตัวพิมพ์เล็กxที่นี่ จากนั้นคุณย้ายไปที่บรรทัดล่างทันที แต่อีกครั้งที่ตำแหน่งที่สาม
    • X- สลับสายและไปที่ตำแหน่งถัดไป ตัวอย่างมีเหมือนกัน แต่คุณย้ายจากตำแหน่งที่สามไปยังตำแหน่งที่สี่ (ดังนั้นคุณจึงอยู่ในบรรทัดที่สองที่ตำแหน่งที่สี่)
    • 1 - เพียงแค่เดินหน้าต่อไปโดยตำแหน่งอื่น

เมื่อตัวละครแต่ละตัวทำงานแล้วมันจะถูกแทนที่ด้วยช่องว่างและไม่สามารถใช้งานได้อีกต่อไป

ตัวอย่างดังต่อไปนี้

  1. อินพุต :

    x
    *
    

    ดังที่ได้กล่าวไว้ก่อนหน้านี้คุณจะเริ่มก่อนสัญลักษณ์แรกของบรรทัดแรก ขั้นตอนแรกจะเลื่อนคุณเป็นตัวอักษรxและตัวอักษรนี้จะเปลี่ยนคุณเป็นบรรทัดที่สอง จดหมายxไม่มีฟังก์ชั่นไม่เป็นแต่แทนที่ด้วยx *สิ่งนี้จะมีความเกี่ยวข้องมากขึ้นในตัวอย่างหลัง ตอนนี้คุณอยู่ในเครื่องหมายดอกจันที่บรรทัดล่างและคุณไม่ได้ทำอะไรเลย

    ขั้นตอนที่สองคือการย้ายคุณไปข้างหน้าและคุณออกจากสายเพื่อให้เขาวงกตเสร็จสมบูรณ์และใช้เวลา 2 ขั้นตอน

    เอาท์พุต 2เอาท์พุต

  2. อินพุต :

    xX*
    x1*
    

    ขั้นตอนที่ 1 : คุณเดินหน้าต่อxไปxบรรทัดล่าง นี่คือกฎที่บอกว่าตัวละครที่ใช้ถูกแทนที่ด้วยเครื่องหมายดอกจัน จากนั้นคุณย้ายกลับไปที่บรรทัดแรก แต่ไม่ได้xอยู่ที่นั่นอีกต่อไปเนื่องจากมีการใช้และกลายเป็นเครื่องหมายดอกจัน ดังนั้นคุณจะย้ายไปอย่างปลอดภัยบนเครื่องหมายดอกจันนี้และขั้นตอนก็เสร็จสมบูรณ์ (ตอนนี้คุณอยู่ในตำแหน่งแรกของบรรทัดแรก)

    ขั้นตอนที่ 2 : คุณก้าวต่อไปXมันจะผลักคุณไปยังบรรทัดล่างแล้วผลักคุณไปข้างหน้า ตอนนี้คุณอยู่ในตำแหน่งที่สามของบรรทัดที่สอง (เครื่องหมายดอกจัน) โดยที่ไม่เคยไปที่ตำแหน่งที่สอง (ซึ่งมี1 )

    ขั้นตอนที่ 3 : คุณก้าวไปข้างหน้าออกจากสตริง

    ผลลัพธ์ : 3.

กรณีทดสอบ:

  1. การป้อนข้อมูล:

    *1*
    xxx
    

    ผลลัพธ์: 3. (เพราะ1ทำให้คุณกระโดดขึ้นอันดับที่สาม) คุณไม่เคยไปที่บรรทัดที่สอง แต่เป็นส่วนหนึ่งของอินพุต

  2. การป้อนข้อมูล:

    *X*1*x
    x*1xx*
    

    ผลลัพธ์: 4.

  3. การป้อนข้อมูล:

    1x1x
    ***X
    

    ผลลัพธ์: 3.

  4. การป้อนข้อมูล:

    1*x1xxx1*x
    x*x1*11X1x
    

    ผลลัพธ์: 6.

  5. การป้อนข้อมูล:

    xXXXxxx111*
    **xxx11*xxx
    

    ผลลัพธ์: 6.


สตริงว่างไม่ควรเป็นอินพุตที่ถูกต้องเนื่องจากไม่ใช่สตริงสองบรรทัด
edc65

@ edc ฮ่าฮ่าฉันขัดแย้งกับตัวเองแล้ว ใช่แน่นอน.
nicael

"\n\n"เป็นสตริงสายสอง ...
feersum

@feersum แล้วฉันคิดว่าผลลัพธ์ควรจะ1เป็นในขณะที่คุณเริ่มก่อนบรรทัดที่ 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 ขั้นตอน


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 แต่ต้องการเล่นกับมัน
nicael


คุณสามารถใช้เช่นa>'a'แทนได้a=='x'หรือไม่
feersum

ฉันไม่ได้ตระหนักถึงสิ่งนั้น แต่จริง ๆ แล้วสตริงว่างเปล่าคืออินพุตที่ไม่ถูกต้อง (เนื่องจากฉันได้ระบุด้วยตนเองว่าอินพุตเป็นสตริงสองบรรทัด) ดังนั้นคุณสามารถลบการตรวจสอบสำหรับกรณีขอบนี้ :)
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}

น้อย golfed

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

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

ซอ


1

JavaScript, 211 ไบต์

ฉันกำลังคิดเกี่ยวกับการสร้างเวอร์ชันที่แสดงแต่ละขั้นตอนเล่นซึ่งกันและกันปรากฏบนหน้าเว็บ

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

มือสองไบต์มากกว่าผมหวังว่าจะได้เมื่อเปลี่ยนxด้วย*เพราะ JS Stringsเปลี่ยนรูป ข้อเสนอแนะในการปรับปรุงได้รับการชื่นชมโดยเฉพาะอย่างยิ่งกับชิ้นส่วนทดแทน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.