Я гуляю по Манхеттену, як далеко я від свого готелю?


27

Непотрібна і перекручена історія

Я гуляю по Манхеттену, блок за блоком, і ноги втомилися і хочу повернутися додому.

Трафік досить поганий, але, на щастя, я дуже багатий, і у мене в готелі в режимі очікування вертоліт. Але мені потрібно, щоб вони знали, скільки пального потрібно запакувати для польоту, і для цього вони повинні знати мою пряму відстань від готелю. Я пам’ятав, по яких блоках я ходив, і можу сказати, яким маршрутом я пройшов. Ця відстань повинна бути точною, хоча вони занадто короткі, ми не повернемо її занадто довго, і я купив пальне, яке я не можу використовувати.

Чи можете ви написати мені програму, щоб перетворити це на відстань, яку їм доведеться проїхати під час свого польоту, щоб знайти мене?

Специфікація:

Напишіть мені функцію, яка:

  1. Приймає список або рядок пройдених блоків відносно довільної сітки:
    • U p, D власне, L eft і R ight.
    • Може бути верхній або нижній регістр - наприклад. якщо його коротше використовувати, uа не Uйти вперед.
    • Неправильний напрямок має невизначену поведінку - наприклад. напрямок X може спричинити збій.
  2. Повертає поплавок / десятковий / подвійний, що вдвічі більше відстані прямої лінії від точки початку.

Для ілюстрації та уточнення:

Моя подорож

Моя поїздка могла б так само легко , як було записано , "luluu..."або , ['l','u','l'...]але він повинен бути записаний як вгору, вниз, вліво, вправо.


15
Ви досить багаті, щоб мати вертоліт, але вам байдуже, чи купується додаткове паливо? : O
Фес Враста

8
@fezvrasta, бо я скупий.

7
Шлях возитися з головою, не роблячи це про відстань на Манхеттені.
Кендалл Фрей

25
Правильна відповідь - це не має значення. Ти багатий хлопець, тому ти дотягуєшся до кишені, витягуєш ватру 20 доларів і махаєш нею в повітрі, щоб привернути увагу кабіни; потім нападають на групу дитячих злочинців, які грабують вас і б'ють до кривавої м'якоті. Потім вас заарештовують за засмічення та публічне бродяжництво, звинувачують у тероризмі за спробу викликати масову паніку та пандемію, поширюючи тілесне поховання серед громадськості тротуар, засуджений, відправлений до в'язниці і зачинений у співкамерника на прізвисько Брут, який по- справжньому вам подобається.
Боб Джарвіс - Відновіть Моніку

2
@McKay Я так чи інакше трактую це як мапу на карті (інакше, мабуть, це буде "вперед" і "назад"), і міра відстані є досить однозначною "вдвічі більше відстані прямої від точки початку", так відстань на Манхеттені).
FireFly

Відповіді:


32

J, 17 символів

2*|+/0j1^'urdl'i.

Використовує той факт, що повноваження jпредставляють належні вказівки.

  • 'urdl'i. взяти рядок і обчислити індекси (0 для 'u', 1 для 'r', ...)
  • 0j1^перетворюється на напрямок у складній площині, використовуючи відповідну потужність j.
  • +/ підсумовує окремі кроки
  • 2*| двократний модуль

Приклад:

> 2*|+/0j1^'urdl'i.'uuuudrrrl'
7.2111

5
Хороша робота. Знання з математики на виграш. :-)
Гарет

Зробіть цей "не розширений" ASCII, і тоді це лише 15 байт (тому що ви не використовуєте восьмий біт).
Timtech

11

Пітон 2,7 56 58 56 51 48

Маючи вкрадений номер один дим у Скруджа Макдука , я пощастив і тепер маю більше багатства, ніж Скрудж.

y=lambda s:2*abs(sum(1j**(ord(i)%15)for i in s))

Python 2.7 - 61 53 50 (нечутливий до регістру)

y=lambda s:2*abs(sum(1j**(ord(i)%16%9)for i in s))

Впровадження

>>> from random import sample
>>> y=lambda s:2*abs(sum((-1j)**(ord(i)%15)for i in s))
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
20.0
>>> path=sample('RLUD'*1000, 100)
>>> y(path)
34.058772731852805

Я отримую IndexError: list index out of range. Яку форму повинен мати вхід?
планнапус

@plannapus: Я додав розділ про реалізацію
Abhijit

Ах , і це було %5НЕ %8. Ок, тепер має більше сенсу :)
plannapus

5

APL (29)

{|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵}

напр

     {|+/2 0j2×-⌿2 2⍴+/'URDL'∘.=⍵} 'UUUUDRRRL'
7.211102551

Пояснення:

  • +/'URDL'∘.=⍵: подивіться, як часто символи URDLтрапляються в аргументі
  • -⌿2 2⍴: відняти Uзначення від Dзначення, а Rзначення - від Lзначення
  • 2 0j2×: помножте вертикальне значення на 2і горизонтальне значення на2i
  • +/: сума
  • |: величина

4

Рубін 1.9+ (67)

f=->s{2*(((g=s.method :count)[?U]-g[?D])**2+(g[?R]-g[?L])**2)**0.5}

Приклад

f["DRUULULLULL"] => 10.0
f["UUUUDRRRL"] => 7.211102550927978

3

perl6: 44 символів

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb отримує один рядок введення та розбивається на символи
  • <U R L D> - це список слів, символів у цьому випадку
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), тож він перетворює 2 списки один на одного, створюючи список посилок, який %()перетворюється на хеш
  • <<**>>робить попарно **, розширюючи коротший список, щоб підходити довше. Коротший список буває лише такимi
  • [+]підсумовує всі елементи списку, absприймає модуль для складних чисел

Так, я видалив усі можливі пробіли.


2

Пітон 2,7 - 65

Хороший і короткий, для використання кроків до площини використовуються складні числа:

x=lambda s:2*abs(sum([[1,-1,1j,-1j]['RLUD'.index(i)]for i in s]))

Реквізити до DSM та Abhijit в інших питаннях, які показали мені використання 1jдля обчислення цього.


Можна 1jзаписати як j, -1jяк -j? Також, чи обробляє це верхній і нижній вхід, або лише верхній?
DavidC

1
Дядько Скруз , я вас ненавиджу. Ви повинні хоча б залишити трохи грошей для племінників.
Абхіджіт

1
@DavidCarraher: Ні, ти не можеш. jj
Розрізнити

Ви не сказали, що він повинен був випустити вдвічі більше відстані? при спробі з UUUUDRRRL я отримую 3.606 з цією функцією замість 7.21.
планнапус

4
Можна зберегти ще 2 символи, множивши константи, 2замість того, щоб множити кінцевий результат.
Абхіджіт

2

Математика 92 49

Calle заслуговує повної заслуги за впорядкування коду.

f@l_:=2 N@Norm[Tr[l/.{"r"→1,"l"→-1,"u"→I,"d"→-I}]]

Приклад

f[{"u", "u", "u", "u", "d", "r", "r", "r", "l"}]

7.2111


1
Ви робите багато роботи, якої не вимагає ОП, f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]вистачить.

Я отримую 2 Norm[(2. + 2. I) + "U" + "X"]як вихід для вашого коду.
DavidC

1
Так, але ОП каже, що з таким входом все нормально. Саме так я і всі інші трактую це. Я не можу прочитати ці інші мови, але ви побачите, що вони часто жорсткі коди для u, r, l та d.

Добре. Зрозумів. Дякуємо, що вказали на це.
DavidC

Якщо замінити дві пари в дужках на @s, ви отримаєте ще два символи менше.
shrx

2

PHP, 67

function f($a){foreach($a as$d)@$$d++;return 2*hypot($U-$D,$L-$R);}

Приклад:

<?php
var_dump(f(array('U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L')));

>float(7.211102550928)

2

Юлія, 45 років

f(l)=2*abs(sum([im^(c=='d'?3:c) for c in l]))

Вкрали iтрюк до повноважень. Також всі символи, крім d, мають значення, які працюють як прийнятні повноваження для i.


1

J, 29 символів

+:+&.*:/-/_2[\#/.~/:~'ruld'i.

Працює тільки з більш низькими напрямками справ і будь-якими іншими , ніж символами r, u, l, і dзмусить його дати неправильну відповідь.

Використання:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

Пояснення:

'ruld'i.'uuuudrrrl'Дядічна форма i.знаходить індекс елементів з правого аргументу в лівому аргументі. В цьому випадку:

   'ruld'i.'uuuudrrrl'
1 1 1 1 3 0 0 0 2

/:~ сортує цей список у порядку зростання:

   /:~'ruld'i.'uuuudrrrl'
0 0 0 1 1 1 1 2 3

#/.~ підраховує кількість подій кожного числа:

   #/.~/:~'ruld'i.'uuuudrrrl'
3 4 1 1

_2[\ подрібнити його на 2 ряди:

   _2[\#/.~/:~'ruld'i.'uuuudrrrl'
3 4
1 1

-/ відняти знизу зверху

   -/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
2 3

+&.*:запозичив трюк з іншої відповіді J, яку я бачив сьогодні вранці , і квадратирував предмети, потім підсумовує їх, потім виконує квадратний корінь. Дивіться в&. документації:

   +&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
3.60555

+: подвоює результат:

   +:+&.*:/-/_2[\#/.~/:~'ruld'i.'uuuudrrrl'
7.2111

1

R, 86 74 56 символів

Гаразд, це насправді набагато коротше з уявними числами:

2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))

Використання:

> 2*Mod(sum(sapply(scan(,""),switch,u=1i,d=-1i,l=-1,r=1)))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

Старе рішення на 74 символи з xy-коордами:

2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))

Використання:

> 2*sqrt(sum(rowSums(sapply(scan(,""),switch,u=0:1,d=0:-1,l=-1:0,r=1:0))^2))
1: u u u u d r r r l
10: 
Read 9 items
[1] 7.211103

Якщо введення приймається як stdin, воно має бути розділене великим регістром та пробілом. Використовуйте координати xy, починаючи з (0,0).


1

k ( 50 49)

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}

Приклад

{2*sqrt x$x:0 0f+/("udlr"!(1 0;-1 0;0 -1;0 1))@x}"uuuudrrrl"
7.211103

1

Ява, 185, 203 , 204 , 217 , 226

class A{public static void main(String[] a){int x=0,y=0;for(int i=0;i<a[0].length();i++) switch(a[0].charAt(i)){case'U':y++;break;case'D':y--;break;case'L':x++;break;case'R':x--;}System.out.print(Math.hypot(x,y)*2);}}

Я припускав, що кожне "U" було "1 вгору", тож дві одиниці вгору були б "UU"

Редагувати: змінити перемикач для ifs

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();i++){int c=a[0].charAt(i);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

Перейшов на ітератор

class A{public static void main(String[]a){int x=0,y=0;for(int i=0;i<a[0].length();){int c=a[0].charAt(i++);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

Більше не приймає введення як рядок, а масив напрямків

class A{public static void main(String[]a){int x=0,y=0;for(String s:a){char c=s.charAt(0);if(c=='U')y++;if(c=='D')y--;if(c=='L')x++;if(c=='R')x--;}System.out.print(Math.hypot(x,y)*2);}}

Моє розуміння короткого запису полягало в тому, що вам потрібна лише функція, а не ціла програма.
Боан

1

T-SQL, 158

IF PATINDEX('%[^UDLR]%', @s)=0 select 2*sqrt(power(LEN(REPLACE(@s,'U',''))-LEN(REPLACE(@s,'D','')),2)+power(LEN(REPLACE(@s,'L',''))-LEN(REPLACE(@s,'R','')),2))

@S - це вхідний рядок типу varchar (max)


1

ES6, 77 69

Визначення:

f=s=>{u=d=l=r=0;for(c of s)eval(c+'++');return 2*Math.hypot(u-d,l-r)}

Використання:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • Приймає рядок АБО масив (малі літери)
  • Не використовує уявні числа
  • Не було б можливим лише за 3 дні до того, як ОП опублікувало питання ; тобто працює лише у Firefox 27+ (а може бути, і Chrome із включеними експериментальними речами, не перевірений :) !!

(Натхненна частково відповіддю Боана.)


Я дійсно хочу зробити щось складне, щоб позбутися повернення, як перетворити всю річ на булевий вираз, який просто оцінюється і повертається автоматично, але я не впевнений, що є спосіб зробити це, якщо я не можу замінити forвислів на якийсь вираз (орган функції стрілки, що містить висловлювання, вимагає дужок і явного повернення; тіла, які є просто виразами, не роблять) ..
Нойо

1

JavaScript - 142 символи - немає eval ()

function r(a){return Math.sqrt(Math.pow(a.match(/u/g).length-a.match(/d/g).length,2)+Math.pow(a.match(/l/g).length-a.match(/r/g).length,2))*2}

де a - рядок типу "uudrrl"

використовувати так -

a='uudrrl'
r(a)

Тест в консолі браузера.

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

C # - 90 символів

Свіжий від LINQPad.

int x=0,y=0;input.Max(i=>i==85?y++:i==82?x++:i==68?y--:x--);(Math.Sqrt(x*x+y*y)*2).Dump();

Де вхід - це дійсний рядок.

>string input = "LULUURRRRURD";

>8.48528137423857

0

Befunge-93 (65)

Він має 65 символів, що не містять пробілів (217 з пробілом, хоча це можна зменшити більш компактним розташуванням (для 69/176 символів)). Це вимагає певної ліберальності з вихідним форматом, але це, безперечно, точно. Здається, не варто докладати зусиль для впровадження / викрадення реалізації квадратного кореня.

v                  >$:*\:*+88*4*5-2.,.@
               >3-:|
           >6-:|
       >8-:|
>~"D"-:|
       $   $   $   $
           \   \
       1   1   1   1
       -   -   +   +
           \   \
^      <   <   <   <

echo 'UUDLLUU' | ./befungee.py ../man виходи 2√13 (хоча реальна реалізація має проблеми з розширеним ASCII).


0

Матлаб, 51 персонаж

Моє подання Matlab, працює лише з великих літер. Це було весело! Найважче було перетворити рядок у масив складних чисел, які підсумовуються.

Функція:

f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))

Використання:

>> f=@(s)abs(sum(fix((s-76.5)/8.5)+((s-79)*i/3).^-99))
>> f('UURDL')
ans =

     1
>>

0

Javascript, 136

function z(a){var x=a.split('u').length-a.split('d').length;var y=a.split('r').length-a.split('l').length;return Math.sqrt(x*x+y*y)*2;};
document.write(z('uuuudrrrwl'));
7.211102550927978

0

JavaScript, 89

function f(a){U=D=L=R=0;for(d in a)eval(a[d]+'++');return 2*Math.sqrt((U-=D)*U+(L-=R)*L)}

Приклад:

<script>
document.write(f(['U', 'U', 'U', 'U', 'D', 'R', 'R', 'R', 'L']));
</script>

>7.211102550927978

0

С, 120

float d(char *p){int v=0,h=0;while(*p){v+=*p=='U'?1:*p=='D'?-1:0,h+=*p=='R'?1:*p=='L'?-1:0,++p;}return 2*sqrt(v*v+h*h);}

d("LULUURRRRURD") -> 8.485281


0

JavaScript (немає ES6, немає eval) - 131

f=function(h){for(i=0,a=[0,,0,0,0];i<h.length;++i)++a[(h.charCodeAt(i)>>2)-25];x=a[0]-a[4];y=a[2]-a[3];return Math.sqrt(x*x+y*y)*2}

Тест:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.