Je me promène à Manhattan, à quelle distance de mon hôtel?

27

L'histoire inutile et alambiquée

Je me promène dans Manhattan, bloc par bloc et mes pieds sont fatigués et veulent rentrer chez eux.

La circulation est assez mauvaise, mais heureusement je suis très riche et j'ai un hélicoptère en attente à l'hôtel. Mais j'ai besoin qu'ils sachent la quantité de carburant à emporter pour le vol et pour cela ils ont besoin de connaître ma distance directe de l'hôtel. Je me suis souvenu des blocs sur lesquels j'ai marché et je peux leur dire quel chemin j'ai emprunté. Cette distance doit être précise cependant, si elles sont trop courtes, nous ne reviendrons pas trop longtemps et j'ai acheté du carburant que je ne peux pas utiliser.

Pouvez-vous m'écrire un programme pour convertir cela en la distance qu'ils devront parcourir sur leur vol pour me chercher?

Spécification:

Écrivez-moi une fonction qui:

  1. Accepte une liste ou une chaîne de blocs parcourus par rapport à une grille arbitraire:
    • U p, D own, L eft et R ight.
    • Peut être en majuscule ou en minuscule - par exemple. si son plus court à utiliser uau lieu d' Ualler de l'avant.
    • Une direction invalide a un comportement indéfini - par exemple. une direction de X peut provoquer une panne.
  2. Renvoie un flottant / décimal / double qui est deux fois la distance en ligne droite du point d'origine.

Pour illustration et clarification:

Mon voyage

Mon voyage aurait pu tout aussi bien être enregistré que "luluu..."ou ['l','u','l'...]mais il doit être enregistré en Haut, Bas, Gauche, Droite.


la source
15
Vous êtes assez riche pour avoir un hélicoptère, mais vous vous souciez si du carburant supplémentaire est acheté? : O
Fez Vrasta
8
@fezvrasta parce que je suis avare.
7
Façon de me déranger la tête en ne faisant pas la distance de Manhattan.
Kendall Frey
25
La bonne réponse est «Ça n'a pas d'importance. Vous êtes un gars riche, alors vous mettez la main dans votre poche, sortez une liasse de 20 $ et agitez-la en l'air pour attirer l'attention d'un chauffeur de taxi; vous êtes puis attaqué par un groupe de voyous de la maternelle qui vous volent et vous battent à une pulpe sanglante. Vous êtes ensuite arrêté pour détritus et vagabondage public, accusé de terrorisme pour avoir tenté de provoquer une panique de masse et une pandémie en répandant votre suintement corporel sur un public trottoir, condamné, envoyé en prison et enfermé avec un compagnon de cellule surnommé Brutus qui vous aime vraiment . Bienvenue à New York! "
Bob Jarvis - Reinstate Monica
2
@McKay, je l'interprète comme des directions sur une carte, de toute façon (sinon ce serait probablement "en avant" et "en arrière"), et la mesure de distance est plutôt univoque "deux fois la distance en ligne droite du point d'origine", donc pas distance de Manhattan).
FireFly

Réponses:

32

J, 17 caractères

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

Utilise le fait que les pouvoirs de jreprésentent les directions appropriées.

  • 'urdl'i. prendre une chaîne et calculer des indices (0 pour 'u', 1 pour 'r', ...)
  • 0j1^se transforme dans la direction du plan complexe en utilisant la puissance correspondante de j.
  • +/ résume les étapes simples
  • 2*| deux fois le module

Exemple:

> 2*|+/0j1^'urdl'i.'uuuudrrrl'
7.2111
Howard
la source
5
Bon travail. Connaissances mathématiques pour la victoire. :-)
Gareth
Faites cet ASCII "non étendu", puis ce n'est que 15 octets (parce que vous n'utilisez pas le huitième bit).
Timtech
11

Python 2,7 56 58 56 51 48

Avec le numéro un volé de Scrooge McDuck , j'ai fait fortune et j'ai maintenant plus de richesse que Scrooge.

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

Python 2.7 - 61 53 50 (insensible à la casse)

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

la mise en oeuvre

>>> 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
Abhijit
la source
Je reçois IndexError: list index out of range. Quelle forme doit avoir l'entrée?
plannapus
@plannapus: J'ai ajouté une section de mise en œuvre
Abhijit
Ah et ça %5ne l' était pas %8. Ok, ça a plus de sens maintenant :)
plannapus
5

APL (29)

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

par exemple

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

Explication:

  • +/'URDL'∘.=⍵: voir la fréquence à laquelle les caractères URDLapparaissent dans l'argument
  • -⌿2 2⍴: soustraire la Uvaleur de la Dvaleur et la Rvaleur de la Lvaleur
  • 2 0j2×: multipliez la valeur verticale par 2et la valeur horizontale par2i
  • +/: somme
  • |: ordre de grandeur
marinus
la source
4

Rubis 1.9+ (67)

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

Exemple

f["DRUULULLULL"] => 10.0
f["UUUUDRRRL"] => 7.211102550927978
daniero
la source
3

perl6: 44 caractères

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb obtient une ligne d'entrée et se divise en caractères
  • <U R L D> est une liste de mots, de caractères dans ce cas
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), donc il zippe 2 listes l'une dans l'autre, créant une liste de parcelles qui %()se transforme en hachage
  • <<**>>fait par paire **, étendant la liste plus courte pour s'adapter à la plus longue. Il se trouve que la liste plus courtei
  • [+]additionne tous les éléments d'une liste, absprend le module pour les nombres complexes

Oui, j'ai supprimé tous les espaces possibles.

Ayiko
la source
2

Python 2.7 - 65

Agréable et court, il utilise des nombres complexes pour traverser l'avion:

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

Accessoires à DSM et Abhijit dans d'autres questions qui m'ont montré l'utilisation de 1jpour calculer cela.


la source
Peut 1jêtre écrit comme j, -1jcomme -j? De plus, cela gère-t-il les entrées supérieure et inférieure, ou uniquement supérieure?
DavidC
1
Oncle Scrooze , je te déteste. Vous devriez au moins laisser un peu d'argent à vos neveux.
Abhijit
1
@DavidCarraher: Non, vous ne pouvez pas. Il serait impossible de faire la différence entre la variable jet l'unité imaginairej
Abhijit
N'avez-vous pas dit qu'il était censé produire deux fois la distance? en essayant avec UUUUDRRRL j'obtiens 3.606 avec cette fonction au lieu de 7.21.
plannapus
4
Vous pouvez enregistrer 2 caractères supplémentaires, en multipliant les constantes par 2au lieu de multiplier le résultat final.
Abhijit
2

Mathematica 92 49

Calle mérite tout le crédit pour la rationalisation du code.

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

Exemple

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

7.2111

DavidC
la source
1
Vous faites beaucoup de travail qui n'est pas requis par le PO, f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]suffira.
J'obtiens 2 Norm[(2. + 2. I) + "U" + "X"]comme sortie pour votre code.
DavidC
1
Oui, mais l'OP dit que c'est OK d'échouer avec une telle entrée. C'est ainsi que moi et tout le monde l'interprétons. Je ne peux pas lire ces autres langues, mais vous verrez qu'elles codent souvent en dur pour u, r, l et d.
D'accord. Je l'ai. Merci d'avoir fait remarquer cela.
DavidC
Si vous remplacez deux paires de parenthèses restantes par @s, vous obtenez deux autres caractères de moins.
shrx
2

PHP, 67

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

Exemple:

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

>float(7.211102550928)
Boann
la source
2

Julia, 45 ans

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

A volé l' iastuce des pouvoirs. Tous les caractères sauf d ont également des valeurs qui fonctionnent comme des pouvoirs acceptables pour i.

gggg
la source
1

J, 29 caractères

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

Fonctionne uniquement avec les directions minuscules et des caractères autres que r, u, let le dfera de donner une mauvaise réponse.

Usage:

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

Explication:

'ruld'i.'uuuudrrrl'La forme dyadique de i.trouve l'index des éléments de l'argument de droite dans l'argument de gauche. Dans ce cas:

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

/:~ trie cette liste par ordre croissant:

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

#/.~ compte le nombre d'occurrences de chaque nombre:

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

_2[\ le coupe en 2 rangées:

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

-/ soustrait le bas du haut

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

+&.*:emprunte une astuce à une autre réponse J que j'ai vue ce matin , et évalue les éléments, puis les additionne, puis effectue une racine carrée. Voir sous&. documentation:

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

+: double le résultat:

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

R, 86 74 56 caractères

Ok, c'est en fait beaucoup plus court avec des nombres imaginaires:

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

Usage:

> 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

Ancienne solution à 74 caractères avec xy coords:

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

Usage:

> 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

Prend l'entrée en tant que stdin, doit être en minuscules et séparé par des espaces. Utilisez les coordonnées xy à partir de (0,0).

plannapus
la source
1

k ( 50 49)

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

Exemple

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

Java, 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);}}

J'ai supposé que chaque "U" était "1 en haut", donc deux unités en haut seraient "UU"

Modifier: commutateur échangé pour 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);}}

Déplacé pour l'itérateur

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

Ne prend plus l'entrée comme chaîne, mais plutôt un tableau de directions

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);}}
James Webster
la source
D'après ce que je comprends du mémoire, vous n'avez besoin que d'une fonction, pas d'un programme complet.
Boann
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))

Le @s est la chaîne d'entrée de type varchar (max)

duanxn
la source
1

ES6, 77 69

Définition:

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

Usage:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • Accepte une chaîne OU un tableau (en minuscules)
  • N'utilise pas de nombres imaginaires
  • Cela n'aurait pas été possible seulement 3 jours avant que OP ne pose la question ; c'est-à-dire qu'il ne fonctionne que dans Firefox 27+ (et peut-être aussi Chrome avec des trucs expérimentaux activés, je n'ai pas testé :) !!

(Inspiré en partie par la réponse de Boann.)

Noyo
la source
Je veux vraiment faire quelque chose de délicat pour se débarrasser du retour, comme transformer le tout en une expression booléenne qui est simplement évaluée et renvoyée automatiquement, mais je ne suis pas sûr qu'il existe un moyen de le faire à moins que je puisse remplacer la fordéclaration par un expression (un corps de fonction flèche contenant des instructions nécessite les crochets et le retour explicite, les corps qui ne sont que des expressions ne le font pas) ..
Noyo
1

JavaScript - 142 caractères - pas d'évaluation ()

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}

où a est une chaîne comme 'uudrrl'

utiliser comme ça -

a='uudrrl'
r(a)

Testez dans la console du navigateur.

var x = "luluurrrrurd"
r(x)
8.48528137423857
rahulroy9202
la source
1

C # - 90 caractères

Frais de 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();

Où entrée est une chaîne valide.

>string input = "LULUURRRRURD";

>8.48528137423857
tdink
la source
0

Befunge-93 (65)

Il a 65 caractères non blancs (217 avec des blancs, bien que cela puisse être réduit par une disposition plus compacte (pour 69/176 caractères)). Il faut une certaine libéralité avec le format de sortie, mais est indéniablement précis. Ne semble pas valoir la peine d'implémenter / voler une implémentation de racine carrée.

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

echo 'UUDLLUU' | ./befungee.py ../man sorties 2√13 (en fait, l'implémentation semble avoir un problème avec l'ASCII étendu).

Joel Bosveld
la source
0

Matlab, 51 caractères

Ma soumission Matlab ne fonctionne qu'avec des lettres capitales. C'était amusant! La partie la plus difficile a été de convertir la chaîne en un tableau de nombres complexes à additionner.

Une fonction:

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

Usage:

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

     1
>>
Hannesh
la source
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
Xin
la source
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)}

Exemple:

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

>7.211102550927978
Boann
la source
0

C, 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

warrenm
la source
0

JavaScript (pas ES6, pas d'évaluation) - 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}

Tester:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
iefserge
la source