Манхеттенська відстань послідовності обертання


9

Я, хоча, це буде гарним викликом: http://adventofcode.com/2016/day/1

Опис завдання

Враховуючи послідовність обертів і відстаней за зразком (L | R) [1-9] [0-9] *, наведіть відстань Манхеттена між початковою і кінцевою точками, тобто мінімальна кількість вертикальних і горизонтальних рухів на сітка.

Приклади

Наприклад, якщо припустити, що ви почали стикатися на північ:

Слідуючи R2, L3 залишає вас на 2 блоки Сходу та 3 квартали на північ, або на 5 блоках. R2, R2, R2 залишає вас на 2 блоки через південь від початкового положення, що знаходиться в 2 кварталах. R5, L5, R5, R3 залишає вас за 12 кварталів.

Технічні деталі

Ви можете вибрати роздільник між рухами (наприклад: "\ n", "," або ","). Ви повинні дати відповідь як ціле число в базі 10.

Не дублікат!

Це не дублікат з кількох причин:

  • Рухи неоднакові. Ось вони - обертання , а не напрямки.
  • Я хочу, щоб відстань на Манхеттені, а не евклідова.

3
Ви повинні включити опис того, яка відстань на Манхеттені у вашому питанні. Просто розміщення посилання є своєрідним клейким.
Габріель Бенамі

2
Це зовсім інакше! У нас тільки ротації!
Лабо

1
@Labo Я згоден Справа не лише в тому, що відповідь тут - на відстані Манхеттена, тоді як інша - на евклідовій відстані. Це рух у стилі черепахи, в той час як інший вказує напрямки компасів NSEW (те, що він називає їх UDLR, не має значення.)
Level River St

2
Будь ласка, використовуйте пісочницю в майбутньому, щоб отримати зворотній зв'язок щодо ваших проблем, перш ніж надсилати їх на головний сайт.
Мего

2
@Labo Це добре, ми не сподіваємось, що нові користувачі дізнаються про всі додатки та мінуси цього веб-сайту негайно. Це просто ніжне пропозиція наступного разу. :)
Mego

Відповіді:


4

Python 3, 109 99 104 101 байт

Це проста відповідь, яка використовує складні числа, із введенням у вигляді рядка, розділеного пробілом, або рядка, розділеного новим рядком. Пропозиції з гольфу вітаються!

Редагувати: -13 байт завдяки Лабо. +5 байт для перетворення в int.

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') заощадить 2 байти :)
Labo

Не робіть функції, читання з введення змушує вас зберегти більше символів!
Лабо

Призначте 2 змінні в одному рядку, щоб зберегти 2 байти: d = p = 0
Labo

Я знову пограв у ваші відповіді, і це складає 99 символів! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo Я не впевнений, що ви можете редагувати специфікацію таким чином, що може визнати недійсними відповіді, але дозвольте мені задати деякі моди.
Шерлок9

2

PHP, 93 байти

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

зламатися

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 байт

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)

Відстежує струм xі yкоординати. При повороті замість оновлення напрямку обертає значення струму так, що рух завжди знаходиться в х-позитивному напрямку. Складні номери були надто дорогими, щоб дістати координати.


1

Python 2, 103 102 байти

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

Введення - це рядок з обмеженим простором напрямками, наприклад "R5 L5 R5 R3".
Виводить відстань на Манхеттені між початковим місцем та пунктом призначення.

Як?

Починається біля походження складної площини l=0;

З кумулятивним лічильником повороту на чверть c=0;

Для кожної інструкції iобертання аналізується шляхом порівняння першого символу напрямку до символу 'N'і cвідповідно коригується.

Відстань, яку потрібно пройти, проаналізовано, int(i[1:])і інструкція виконана, зробивши стільки кроків розміром з блоків у напрямку, заданому, приймаючи cенергію 0+1jс 1j**c.

Кінцева відстань Манхеттена - це сума абсолютних відстаней від початку в двох напрямках - уявному та реальному; досягнуто сabs(l.imag)+abs(l.real)


1
@ Sherlock9 - О, гм відповідь відповіді. Збережіть 2 байти, перейшовши на Python 2 і використовуючи, cmpяк моя відповідь, дайте мені знати, і я видалю.
Джонатан Аллан

0

JavaScript (ES2016), 98 100

2 байти збережено thx @Neil

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

100 байт для ES6

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)

Менше гольфу

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)

Тест (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 спочатку становила 106 байт; копіювання вашої проміжної змінної врятувало мені 3 байти; перехід від матчу до вашої заміни врятував мені 2 байти, а копіювання вашої обробки напряму та відстані одночасно врятувало мені остаточний байт, в результаті чого: 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, завдяки c<'R'||3і n*=~-(d&2)трюкам .
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.