Манхэттенское расстояние вращения

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.

Не дубликат!

Это не дубликат по нескольким причинам:

  • Ходы не одинаковы. Здесь они - вращения , а не направления.
  • Я хочу расстояние до Манхэттена, а не евклидиан.
Labo
источник
3
Вы должны включить описание того, что расстояние Манхэттен в вашем вопросе. Просто опубликовать ссылку довольно сложно.
Габриэль Бенами
2
Это очень разные! У нас есть только вращения!
Labo
1
@ Лабо, я согласен. Речь идет не только о том факте, что ответ здесь на расстоянии Манхэттена, тогда как другой находится на евклидовом расстоянии. У этого есть движение стиля черепахи, в то время как другое указывает направления компаса NSEW (факт, что это называет их UDLR, не имеет значения.)
Уровень Река St
2
Пожалуйста, используйте Песочницу в будущем, чтобы получить отзывы о своих проблемах, прежде чем публиковать их на главном сайте.
Мего
2
@Labo Это нормально, мы не ожидаем, что новые пользователи сразу узнают все подробности этого сайта. Это просто мягкое предложение в следующий раз. :)
Mego

Ответы:

4

Python 3, 109 99 104 101 байт

Это простой ответ, который использует комплексные числа, с вводом в виде строки, разделенной пробелом, или строки, разделенной новой строкой. Предложения по игре в гольф приветствуются!

Изменить: -13 байт благодаря Labo. +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))
Sherlock9
источник
1-2 * (r [0] <'R') сэкономит вам 2 байта :)
Labo
Не создавайте функции, чтение из ввода заставит вас сохранить больше символов!
Labo
Назначьте 2 переменные в одной строке, чтобы сохранить 2 байта: d = p = 0
Labo
Я снова играю в гольф ваш ответ, и он составляет 99 символов! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo
2
@Labo Я не уверен, что вы можете отредактировать спецификацию таким образом, чтобы сделать недействительными существующие ответы, но позвольте мне спросить некоторые моды.
Sherlock9
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
Titus
источник
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координаты. При повороте вместо обновления направления вращается текущее значение, так что движение всегда происходит в положительном направлении х. Комплексные числа были слишком дороги, чтобы извлечь координаты.

XNOR
источник
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
@ Шерлок9 - Ой, сходимся. Сохраните 2 байта, переключившись на Python 2 и используя, cmpкак мой ответ, дайте мне знать, и я удалю.
Джонатан Аллан
0

JavaScript (ES2016), 98 100

2 байта сохранены, спасибо @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>

edc65
источник
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)уловкам ,
Нил