Manhattan dönüş mesafesi mesafesi


9

Bu iyi bir zorluk olsa da: http://adventofcode.com/2016/day/1

Görev tanımı

Deseni (L | R) [1-9] [0-9] * takip eden bir dizi rotasyon ve mesafe verildiğinde, Manhattan'a başlangıç ​​ve bitiş noktaları arasındaki mesafeyi verin, bu minimum dikey ve yatay hareket sayısıdır bir ızgara.

Örnekler

Örneğin, kuzeye bakmaya başladığınızı varsayarsak:

R2'yi takiben, L3 sizi 2 blok Doğu ve 3 blok Kuzey veya 5 blok uzakta bırakır. R2, R2, R2, 2 blok ötede başlangıç ​​pozisyonunuzun güneyinden dolayı 2 blok bırakır. R5, L5, R5, R3 sizi 12 blok ötede bırakır.

Teknik detaylar

Hareketler arasındaki ayırıcıyı seçebilirsiniz (örneğin: "\ n", "," veya ","). Cevabı temel 10'da bir tamsayı olarak vermelisiniz.

Kopya değil!

Birden fazla nedenden dolayı bir kopya değil:

  • Hareketler aynı değil. Burada yön değil , dönüşlerdir .
  • Manhattan mesafesini istiyorum, öklid değil.

3
Sorunuzda Manhattan mesafesinin ne olduğuna dair bir açıklama eklemelisiniz. Sadece bir bağlantı göndermek biraz yapışkan.
Gabriel Benamy

2
Çok farklı ! Sadece rotasyonlarımız var!
Labo

1
@ Kabul ediyorum. Bu sadece cevabın Manhattan mesafede, diğeri Öklid mesafesinde olduğu gerçeğiyle ilgili değil. Bu, kaplumbağa tarzı bir harekete sahipken, diğeri pusula yönlerini NSEW belirtir (onları UDLR olarak adlandırması gerçeği önemsizdir)
Level River St

2
Ana siteye göndermeden önce zorluklarınız hakkında geri bildirim almak için lütfen gelecekte Sandbox'ı kullanın .
Mego

2
@Labo Bu iyi, yeni kullanıcıların bu sitenin tüm içeriğini ve çıkışlarını hemen bilmesini beklemiyoruz. Bir dahaki sefere sadece nazik bir öneri. :)
Mego

Yanıtlar:


4

Python 3, 109 99 104 101 bayt

Bu, boşlukla ayrılmış bir dize veya satırsonu ile ayrılmış bir dize olarak girdi içeren karmaşık sayılar kullanan basit bir yanıttır. Golf önerileri hoş geldiniz!

Düzenleme: Labo sayesinde -13 bayt. İnt dönüştürmek için +5 bayt.

d=p=0
for r in input().split():d+=1-2*(r<'R');p+=1j**d*int(r[1:])
print(int(abs(p.real)+abs(p.imag)))

Ungolfing

def manhattan_rotation(seq, nsew=0, pos = 0):
    for rot in seq.split():
        # change direction
        if rot[0] == "L":
            nsew += -1 
        else:
            nsew += 1
        # move in that direction rot[1:] times
        pos += 1j ** nsew * int(rot[1:])
    return int(abs(pos.real)+abs(pos.imag))

1-2 * (r [0] 'R') size 2 bayt kazandıracaktır :)
Labo

Bir işlev yapmayın, girişten okumak daha fazla karakter kaydetmenizi sağlar!
Labo

2 bayt kaydetmek için aynı satıra 2 değişken atayın: d = p = 0
Labo

Cevabınızı tekrar golf oynadım ve 99 karakter kazandı! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo belirtimi, mevcut yanıtları geçersiz kılacak şekilde düzenleyebileceğinizden emin değilim, ancak bazı modlar sormama izin verin.
Sherlock9

2

PHP, 93 bayt

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

Yıkmak

while($m=$argv[++$i])       // loop through arguments:
    ${                      // 5. use as variable name
        chr(                // 4. cast to character (P,Q,R,S) 
        80|                 // 3. add 80
        3&                  // 2. modulo 4
        $d+=(P<$m)-(M>$m)   // 1. change direction depending on letter
    )}+=substr($m,1);       // 6. add number to variable
echo abs($P-$R)+abs($Q-$S); // calculate distance, print

2

Python 2, 86 bayt

x=y=0
for d in input().split():c=cmp(d,'M');x,y=int(d[1:])-y*c,x*c
print abs(x)+abs(y)

Akımı xve ykoordinatları izler . Döndürürken, yönü güncellemek yerine, geçerli değeri, hareket her zaman x pozitif yönde olacak şekilde döndürür. Karmaşık sayılar koordinatları çıkarmak için çok maliyetliydi.


1

Python 2, 103102 bayt

l=c=0
for i in input().split():c+=cmp(i[0],'N');l+=1j**c*int(i[1:])
print int(abs(l.imag)+abs(l.real))

repl.it

Girdi, boşlukla sınırlandırılmış yönlerden oluşan bir dizedir, örn "R5 L5 R5 R3".
Başlangıç ​​yeri ve varış noktası arasındaki Manhattan mesafesini yazdırır.

Nasıl?

Karmaşık düzlemin başlangıcında başlar l=0;

Kümülatif çeyrek sağa dönüş sayacı ile c=0;

Her bir komut için, i, ayrıştırılır dönüş karakteri yönünde ilk karakteri karşılaştırarak olduğunu 'N've cbuna göre ayarlanır.

Hareket mesafesi ile birlikte ayrıştırılır int(i[1:])ve komut, birçok blok büyüklüğündeki adımların, bunun cgücü kullanılarak verilen yönde atılarak yürürlüğe 0+1jgirer 1j**c.

Son Manhattan mesafesi, iki yöndeki başlangıç ​​noktasından gelen mutlak mesafelerin toplamıdır - hayali ve gerçek; ile başarıldıabs(l.imag)+abs(l.real)


1
@ Sherlock9 - Ah, cevap yakınsama. Python 2'ye geçerek ve cmpcevabım gibi kullanarak 2 bayt kaydedin , bana bildirin ve silerim.
Jonathan Allan

0

JavaScript (ES2016), 98 100

@Neil 2 bayt kurtardı

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x*x)**.5+(y*y)**.5

ES6 için 100 bayt

d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

Daha az golf

d => d.replace(/.(\d+)/g,
  (d,l)=>( // L or R in d, distance in l
    o += d>'M' || 3, // orientation in o, used %4
    l *= ~-(o&2), // convert to number and change sign if needed
    o&1 ? x -= l : y += l // move based on orientation
  ), x = y = o = 0)
&& (x>0?x:-x) + (y>0?y:-y)

Test (ES6)

F=
d=>d.replace(/.(\d+)/g,(d,l)=>(o+=d>'M'||3,l*=~-(o&2),o&1?x-=l:y+=l),x=y=o=0)&&(x>0?x:-x)+(y>0?y:-y)

function update() {
  O.textContent=F(I.value)
}

update()
<input id=I value='R5, L5, R5, R3' oninput='update()'><pre id=O></pre>


1
ES6 yanıtım aslında 106 bayt; ara değişkeninizi kopyalamak beni 3 bayt kurtardı; eşlemeden yeninize geçiş yapmak beni 2 bayt kurtardı ve aynı zamanda yönünüzü ve mesafeyi kopyalamak bana son bir bayt kazandırdı ve bunun sonucunda s=>s.replace(/.(\d+)/g,(c,n)=>(d+=c<'R'||3,n*=~-(d&2),d&1?x+=n:y+=n),x=y=d=0)&&(x<0?-x:x)+(y<0?-y:y)ES6 yanıtınızdan iki bayt daha kısa olan c<'R'||3ve n*=~-(d&2)hileler sayesinde .
Neil
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.