คุณสามารถวนซ้ำได้โดยไม่หยุดทำ


14

พวกเราหลายคนคุ้นเคยกับเกมตรอน คุณสามารถควบคุม "lightcycle" ที่วางไว้บนตาราง แสงไฟเคลื่อนที่ไปข้างหน้าเสมอ (แม้ว่าคุณจะควบคุมทิศทาง) และทิ้งรอยทางถาวรไว้ด้านหลัง หากคุณวิ่งเข้าไปในเส้นทางคุณผิดพลาด!

เป้าหมายที่นี่คือการตรวจสอบว่าเส้นทางที่กำหนดเป็นวงที่ถูกต้องนั่นคือมันจะกลับไปที่จุดเริ่มต้นโดยไม่ต้อง "หยุดทำ" ในการทำเช่นนี้เราถือว่าเราเริ่มต้นที่จุด(0,0)นั้น การป้อนข้อมูลจะได้รับในรูปแบบN2E1S2W1ที่มีชุดของทิศทางพระคาร์ดินัล ( Nคือnorth, Eคือeast, และอื่น ๆ ) แต่ละตามระยะทางในการเดินทางว่าทิศทาง ในตัวอย่างนี้คุณจะเดินทาง

N2 : North 2 to (0,2)
E1 : East 1  to (1,2)
S2 : South 2 to (1,0)
W1 : West 1  to (0,0)

เส้นทางนั้นจะถือว่าถูกต้องหากมันสิ้นสุดที่(0,0)โดยไม่ต้องไปที่พิกัดอื่นมากกว่าหนึ่งครั้ง (มันจะไป(0,0)สองครั้งแน่นอนเมื่ออยู่ที่จุดเริ่มต้นและอีกครั้งในตอนท้าย) โปรดทราบว่าในตัวอย่างด้านบนเพื่อรับจาก(0,0)ถึง(0,2)เราจำเป็นต้องเยี่ยมชม(0,1)เช่นกัน

ตัวอย่างอื่น ๆ :

input        -> output
N1E1S1W1     -> true
N1E1N1E1S2W2 -> true
N1S1E1W1     -> false     // Visits (0,0) 3 times
N4E2S2W4S2E2 -> false     // Visits (0,2) twice
N3E2S3       -> false     // Does not return to (0,0)
N1S1         -> anything  //I don't care how you evaluate this case

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

อินพุตสามารถใช้เป็นสตริงหรือเป็นรายการของตัวละครไม่ว่าจะเป็นในรูปแบบS1N2E3... หรือSNNEEE... นอกจากนี้ยังมีข้อ จำกัด เรื่องขนาดกริดไม่ยากเช่นกัน แต่สมมติว่าอินพุตไม่มากจนเกินไป ตราบใดที่รหัสนั้นฟังดูดีก็ไม่สำคัญที่จะต้องจัดการกับกรณีเช่นN99999999999999นี้

หมายเหตุ: คุณอาจจะประเมินกรณีN1S1, E1W1, S1N1และW1E1อย่างไรที่คุณต้องการ พวกมันเป็นเส้นทางที่ถูกต้องทางเทคนิค แต่พวกเขาต่อต้านวิญญาณ "ตรอน" ของความท้าทาย

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบที่สั้นที่สุดชนะ!


N1S1ควรเป็นจริงเพื่อให้สอดคล้องกับคำจำกัดความของคุณเพราะถึง(0, 0)สองครั้งและ(0, 1)ครั้งเดียวซึ่งถูกต้องตามคำนิยามของคุณ
HyperNeutrino

ฉันสามารถใช้Nเป็น1j, Eเป็น1, Sเป็น-1jและWเป็น-1?
Leun Nun

@LeakyNun ฉันคิดว่าฉันโอเคเพราะทุกคนควรทำอะไรแบบนี้มากกว่านี้ เพียงให้แน่ใจว่าคุณระบุไว้ในคำตอบของคุณ
ลอร์ด Farquaad

1
@HyperNeutrino แต่จากจุดยืนของตรอนแสงจักรยานของคุณจะผ่าน (0, 0.5) สองครั้งแม้ว่าอินพุตจะไม่ทำให้คุณถึงจุดนั้น นั่นเป็นเหตุผลที่ฉันคิดว่ามีเอาต์พุตที่ยืดหยุ่น (แม้ว่าภาษาส่วนใหญ่มันจะง่ายกว่าที่จะคืนจริง)
Value Ink

1
@steenbergh (0,0) ไม่ได้อยู่ในมุมห้องดังนั้นคุณสามารถเข้าไปข้างใต้หรือทางซ้ายของมัน แม้ว่าคุณจะรู้สึกบ้า! นอกจากนี้ยังไม่มีการ จำกัด ขนาดของกริดที่แข็ง แต่เพียงสมมติว่าอินพุตจะไม่ล้นอะไร ตราบใดที่รหัสนั้นฟังดูดีฉันก็ไม่สนว่าจะจัดการกับอินพุตไม่ได้หรือไม่N99999999999999
Lord Farquaad

คำตอบ:



6

JavaScript, 247 200 ไบต์

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

nเป็นฟังก์ชันของอินพุตสตริงsที่ส่งคืนค่า1จริงและ0เท็จ

นี่คือรุ่นที่ไม่ได้บรรจุไว้สำหรับการอ้างอิง / คำอธิบาย:

function n(s)
{
    var dir = s.match(/\w\d+/g);
    var x = y = z = 0;
    var been = "";
    for (d of dir)
    {
        var a = d[0];
        var b = 1*d.substring(1);
        while(b-- > 0)
        {
            if (a == "N") y++;
            if (a == "S") y--;
            if (a == "E") x++;
            if (a == "W") x--;
            var pt = [x,y] + ";";
            if (~been.indexOf(pt))
                if (x==0 && y==0)
                    z++;
                else
                    return false;
            been += pt;
        }
    }
    return (x == 0 && y==0 && z == 0);
}

n=s=>{r=s.match(/\w\d+/g)
x=y=z=0
e=""
for(d of r){a=d[0]
b=d.slice(1)
while(b--){
y+=a=="N"
y-=a=="S"
x+=a=="E"
x-=a=="W"
p=[x,y]+";"
if(~e.indexOf(p))if(!x&!y)z++
else return 0
e+=p}}return!x&!y&!z}

console.log(n("N1E1S1W1"))
console.log(n("N1E1N1E1S2W2"))
console.log(n("N1S1E1W1"))
console.log(n("N4E2S2W4S2E2"))
console.log(n("N3E2S3"))



ไม่ได้สังเกตว่าขอบคุณ
WaffleCohn

ดูเหมือนว่าcontainsไม่ใช่ฟังก์ชั่นในการใช้ภาษาจาวาสคริปต์ คุณช่วยระบุภาษาถิ่นได้ไหม?
Leun Nun

ฉันเพิ่งใช้คอนโซล Chrome เพื่อทดสอบ - มันทำงานได้อย่างสมบูรณ์แบบที่นั่น
WaffleCohn

ที่จริงมันใช้งานได้ในคอนโซลโครเมี่ยมของฉันด้วย ... แต่บางทีคุณอาจลองเปลี่ยนมันเป็นคำตอบที่เป็นสากลมากกว่านี้?
Leun Nun

5

Python 3 , 236 161 150 ไบต์

import re
p=0
a=[]
for i in''.join(s[0]*int(s[1:])for s in re.findall(r".\d+",input())):p+=1j**"NESW".find(i);a+=[p]
print(len({*a})-len(a)==0==a[-1])

ลองออนไลน์!

-75 bytes ขอบคุณแม่ชี Leaky
-11 bytes ขอบคุณแม่ชี Leaky หรือถ้าเราได้รับอนุญาตให้ป้อนข้อมูลเป็นรายการของจำนวนเชิงซ้อนถอดรหัสความยาวรัน:

Python 2 , 85 73 ไบต์

c=0;k=[]
for i in input():c+=i;k+=[c]
print(k[-1]==0==len(set(k))-len(k))

ลองออนไลน์!

-12 ไบต์ขอบคุณ Mr. Xcoder / -9 ไบต์ขอบคุณ Leaky Nun (ผสานเข้ากับการแก้ไขเดียว)

นี่นานเกินไปสำหรับฉัน


3
ตราบใดที่มันสั้นกว่า 10 เท่าของสารละลาย Pyth มันก็จะไม่ยาวเกินไป
Leun Nun

@LeakyNun lol โอเค: P
HyperNeutrino


@LeakyNun โอ้ดีจัง ดูนานเกินไปอย่างที่ฉันพูด: P
HyperNeutrino


3

เยลลี่ขนาด14 12 ไบต์

Œṙ+\µQ⁼ȧṛ/¬$

นี่เป็นครั้งแรกที่ฉันเล่นกอล์ฟในเยลลี่ ข้อเสนอแนะยินดีต้อนรับ

อินพุตเป็นอาร์เรย์ของ[direction, distance]คู่ซึ่งทิศทางถูกกำหนดเป็นจำนวนเชิงซ้อน

คำอธิบาย:

Œṙ+\µÇȧṛ/¬$   Main link. Argument: n     = [[i, 3], [1, 2], [-i, 3]]
Œṙ            Run-length decode          = [i, i, i, 1, 1, -i, -i, -i]
  +\          Cumulative sum             = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2, i]
    µ         Begin a new monadic chain
     Q        Remove duplicates          = [i, 2i, 3i, 3i+1, 3i+2, 2i+2, i+2]
      ⁼       Equal to original?         = 0
           $  Make a monadic link:
        ṛ/      Reduce by right argument   = i
                (Gets the last element)
          ¬     Logical NOT:               = 0
       ȧ      Logical AND the two values = 0

ควรล้มเหลวกรณีสุดท้าย
Leun Nun

0

เรติน่า , 86 ไบต์

\d+
$*
1(1*)
$1
+`(.)1
$1$1
.
 $`$&¶
%O`.
+`NS|E(.*)W
$1
M`\w$|(?m)(^.+$)(?s).+^\1$
^0

ลองออนไลน์! ลิงก์มีกรณีทดสอบ คำอธิบาย:

\d+
$*

แปลงตัวเลขเป็น unary

1(1*)
$1
+`(.)1
$1$1

ระยะเวลาในการถอดรหัสตัวอักษร N111จำเป็นต้องเปลี่ยนเป็นNNNดังนั้นหนึ่งจะถูกลบออกจากแต่ละหมายเลข unary แล้วแต่ละ 1 ซ้ำตัวอักษรก่อนหน้า

.
 $`$&¶

สร้างคำนำหน้าทั้งหมด (เช่นจุดบนเส้นทาง) เป็นบรรทัดแยก ช่องว่างถูกนำหน้าเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับบรรทัดว่าง

%O`.
+`NS|E(.*)W
$1

เรียงลำดับตัวอักษรทั้งหมดในแต่ละบรรทัดตามลำดับแล้วลบคู่ที่ตรงกัน เราลงท้ายด้วยรหัสที่ไม่ซ้ำกันสำหรับจุดที่กำหนดในตาราง

M`\w$|(?m)(^.+$)(?s).+^\1$

ตรวจสอบหนึ่งในสองสิ่ง: ก) จุดสุดท้ายไม่ได้สิ้นสุดในช่องว่าง (เช่นการวนซ้ำไม่ได้ปิด) หรือจุดที่ซ้ำกันสองจุดในเส้นทาง หากพา ธ นั้นถูกต้องการตรวจสอบทั้งหมดจะล้มเหลวและผลลัพธ์จะเป็นศูนย์

^0

กลับผลลัพธ์


0

Perl, 140

ทำงานกับอินพุตสตริง บางทีฉันสามารถย่อให้สั้นลงด้วยอาร์เรย์ แต่ฉันสงสัยมัน มีความสุขสำหรับความช่วยเหลือเพิ่มเติมในการเล่นกอล์ฟ :)

sub w{$i=$_[0];%d=(E,[0],S,[1,-1],W,[0,-1]);$i=~s/(.)(.)/($d,$o)=(@{$d{$1}},1,1);for(1..$2){$s[$d]+=$o;$r+=$d{"@s"}++}/eg;!($s[0]+$s[1]+$r)}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.