Çökmeden dönebilir misin?


14

Birçoğumuz Tron oyununa aşinayız. Bir ızgara üzerine yerleştirilmiş bir "hafif bisiklet" kontrol. Hafif bisiklet her zaman ileriye doğru hareket eder (yönü kontrol etmenize rağmen) ve arkasında kalıcı bir iz bırakır. Bir patikaya girerseniz, kaza yaparsınız!

Buradaki amaç, belirli bir yolun geçerli bir döngü olup olmadığını belirlemektir, yani "çökmeden" başlangıç ​​noktasına geri döner. Bunu yapmak için, noktadan başladığımızı varsayıyoruz (0,0). Formda N2E1S2W1, her biri bir yönde kardinal yönler ( Nis north, Eis eastvb.) İle bir giriş verilir , ardından her biri bu yönde hareket mesafesi. Bu örnekte,

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

Bir yol, (0,0)başka bir koordinatı birden fazla ziyaret etmeden bitiyorsa geçerli sayılır ( (0,0)tam olarak iki kez ziyaret eder. Bir kez başlangıçta ve sonunda bir kez). Almak, yukarıdaki örnekte daha Unutmayın (0,0)için (0,2)biz mutlaka ziyaret (0,1)de.

Diğer örnekler:

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

Çıktınız, herhangi bir doğruluk veya falsey değeri için aynı çıktıyı verdiği sürece herhangi bir biçimde olabilir.

Girdi, bir dize olarak ya da bir karakter listesi olarak alınabilir, ya formda S1N2E3... ya da SNNEEE... Izgara boyutunda da sabit bir sınır yoktur, ancak girdinin hiçbir şey taşmayacağını varsayalım. Kod temel olarak sağlam olduğu sürece, bu gibi durumları ele almak çok önemli değildir N99999999999999.

NOT: vakaları değerlendirebilir N1S1, E1W1, S1N1, ve W1E1bununla birlikte istiyorum. Teknik olarak geçerli yollar, ancak mücadelenin “Tron” ruhuna karşı çıkıyorlar.

puanlama

Bu , bu yüzden en kısa cevap kazanır!


N1S1tanımlarınızla tutarlı olmak için doğru olmalıdır, çünkü tanımınız altında geçerli olan (0, 0)iki ve bir (0, 1)kez ulaşır .
HyperNeutrino

Ben alabilir miyim Nkadar 1j, Ekadar 1, Solarak -1j, ve Wsıra -1?
Leaky Nun

@LeakyNun Ben bununla iyi olduğumu düşünüyorum, çünkü herkes az çok böyle bir şey yapmalı. Bunu cevabınızda belirttiğinizden emin olun.
Lord Farquaad

1
@HyperNeutrino ama bir Tron bakış açısından, girişiniz sizi asla böyle bir noktaya koymasa bile, bisikletiniz (0, 0.5) iki kez geçer. Bu yüzden birisinin esnek bir çıktısı olduğunu düşünüyorum (çoğu dil için doğru dönmek daha kolay olsa da)
Value Ink

1
@steenbergh (0,0) köşede değil, bu yüzden altına veya soluna gidebilirsiniz; çılgın hissediyor olsan bile! Ayrıca, ızgara boyutunda sabit bir sınır yoktur, ancak girişin hiçbir şey taşmayacağını varsayalım. Kod temelde sağlam olduğu sürece, girişleri N99999999999999
işleyemiyorsa

Yanıtlar:



6

JavaScript, 247200 bayt

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}

ngiriş dizesinin true ve false için sdöndüren bir işlevidir10

İşte referans / açıklama için ungolfed versiyonu:

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



fark etmedi, teşekkürler
WaffleCohn

Bu containsherhangi bir javascript lehçesinde bir işlev değil gibi görünüyor . Lehçeyi belirtir misiniz?
Leaky Nun

Test etmek için sadece krom konsolunu kullanıyordum - orada mükemmel çalışıyor
WaffleCohn

Aslında krom konsolumda da çalışıyor ... ama belki daha evrensel bir cevaba dönüştürmeyi düşünürsünüz?
Leaky Nun

5

Piton 3 , 236 161 , 150 bayt

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

Çevrimiçi deneyin!

Leaky Nun sayesinde -75 bayt Leaky Nun
sayesinde -11 bayt Veya çalışma uzunluğu kodu çözülmüş karmaşık sayıların bir listesi olarak girdi almamıza izin verilirse:

Python 2 , 85 73 bayt

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

Çevrimiçi deneyin!

Bay Xcoder sayesinde -12 bayt / Leaky Nun sayesinde -9 bayt (bir düzenlemede birleştirildi)

Bu bana çok uzun geliyor


3
Pyth çözümünün 10 katından daha kısa olduğu sürece, çok uzun değildir.
Sızan Rahibe

@LeakyNun lol okay: P
HyperNeutrino


@LeakyNun oh snap nice. dediğim gibi çok uzun görmek: P
HyperNeutrino


3

Jöle , 14 12 bayt

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

Bu benim ilk kez Jelly'de golf oynamak. Öneriler bekliyoruz.

Girdi, [direction, distance]yönün karmaşık bir sayı olarak verildiği bir çift dizisidir .

Açıklama:

Œṙ+\µÇȧṛ/¬$   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

Son durumda başarısız olmalı.
Leaky Nun

0

Retina , 86 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

\d+
$*

Sayıları tekli olarak dönüştürün.

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

Çalışma uzunluğu harflerin kodunu çözer. N111dönüşmelidir NNN, böylece her bir tek sayıdan birer çıkarılır ve sonra her 1 bir önceki harfi çoğaltır.

.
 $`$&¶

Tüm önekleri (yani yol üzerindeki noktalar) ayrı satırlar olarak oluşturun. Boş satırlarla ilgili sorunlardan kaçınmak için boşluk eklenir.

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

Her satırdaki tüm harfleri sırayla sıralayın ve ardından eşleşen çiftleri silin. Izgaradaki herhangi bir nokta için benzersiz bir kod ile sonuçlanır.

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

İki şeyden birini kontrol edin: a) son nokta bir boşlukla bitmez (yani döngü kapanmadı) veya yoldaki iki yinelenen nokta. Yol geçerliyse, tüm denetimler başarısız olur ve sonuç sıfır olur.

^0

Sonucu ters çevirin.


0

Perl, 140

Dize girişi ile çalışır. Belki dizi ile kısaltabilirim, ama şüpheliyim. Daha fazla golf yardımı için mutluyuz :)

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