Manhattan'da dolaşıyorum, otelimden ne kadar uzaktayım?


27

Gereksiz ve kıvrımlı hikaye

Manhattan'da dolaşıyorum , blok ötede duruyorum ve ayaklarım yoruluyor ve eve dönmek istiyor.

Trafik oldukça kötü, ama neyse ki çok zenginim ve otelde beklemede olan bir helikopterim var. Ancak uçuş için ne kadar yakıt harcayacaklarını bilmeleri ve otele olan uzaklığımı bilmeleri gerekiyor. Hangi blokları yürüdüğümü hatırladım ve onlara hangi rotayı kullandığımı söyleyebilirim. Bu mesafenin kesin olması gerekiyor, eğer çok kısalarsa geri kazanamayacağız, çok uzun ve kullanamadığım yakıtı aldım.

Bana, beni almak için uçuşlarında seyahat etmek zorunda kalacakları mesafeye çevirmek için bir program yazabilir misiniz?

Şartname:

Bana bir işlev yaz:

  1. Keyfi bir ızgaraya göre yürüdü blokların bir listesini veya dizesini kabul eder:
    • U p, D kendi, L eft ve R ı .
    • Büyük veya küçük harf olabilir - örneğin. kullanmak uyerine kullanmak için daha kısa ise Udevam edin.
    • Geçersiz bir yönün tanımsız bir davranışı var - örneğin. X yönü bir arızaya neden olabilir.
  2. Menşe noktasından düz çizgi mesafesinin iki katı olan bir şamandıra / ondalık / çift döndürür.

Gösterim ve açıklama için:

Yolculuğum

Olarak Yolculuğum aynı kolaylıkla kaydedilmiş olabilir "luluu..."veya ['l','u','l'...]ancak yukarı, aşağı, Sol, Sağ olarak kaydedilmelidir.


15
Helikopter sahibi olmak için yeterince zenginsiniz, ancak biraz daha fazla yakıt almanızın önemi var mı? : O
Fez Vrasta

8
@fezvrasta çünkü cimriyim.

7
Manhattan mesafesi hakkında bunu yaparak kafamı karıştırmak için bir yol.
Kendall Frey

25
Doğru cevap "Önemli değil. Zengin bir adamsınız, bu yüzden cebinize uzanıyor, 20 dolarlık bir tomar çekiyorsunuz ve taksinin dikkatini çekmek için havada sallıyorsunuz; sonra sizi soyup kanlı bir kağıda döken bir anaokulu haydutları grubu tarafından ayarlanmış, daha sonra kitlesel bir panik ve salgına neden olmak için terörizmle suçlanan, bir kitlesel panik ve pandemiye neden olmak için terörle suçlanan tutuklanırsınız. kaldırım, mahkum, cezaevine gönderildi ve senden gerçekten çok hoşlanan, Brutus takma adı verilen bir hücre arkadaşı ile kilitlendi . New York'a hoş geldiniz! "
Bob Jarvis - Monica,

2
@McKay Ben zaten bir haritadaki talimatlar olarak yorumluyorum (zaten "ileri" ve "geri" olacaktı) ve mesafe ölçüsü, "başlangıç ​​noktasından iki kat uzaklıktaki düz çizgi mesafesinin" oldukça belirgin değil. manhattan mesafesi).
FireFly

Yanıtlar:


32

J, 17 karakter

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

Gerçeği kullanır, yetkilerin juygun yönleri temsil etmesi.

  • 'urdl'i. string almak ve endeksleri hesaplamak ('u' için 0, 'r' için 1, ...)
  • 0j1^Karşılık gelen gücü kullanarak karmaşık düzlemde yöne dönüşür j.
  • +/ tek adımları özetler
  • 2*| iki kat modülü

Örnek:

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

5
İyi iş. Kazanmak için matematik bilgisi. :-)
Gareth

Bu "uzatılmamış" ASCII'yi yapın ve sonra sadece 15 bayt (çünkü sekizinci bit kullanmazsınız).
Timtech

11

Python 2.7 56 58 56 51 48

Scrooge McDuck'tan çalınan Number One Dime ile servetimi kazandım ve şimdi Scrooge'dan daha fazla servete sahibim.

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

Python 2.7 - 61 53 50 (büyük / küçük harfe duyarsız)

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

uygulama

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

Ben alıyorum IndexError: list index out of range. Girdi hangi formda olmalıdır?
plannapus

@plannapus: Bir uygulama bölümü ekledim
Abhijit

Ah ve %5değildi %8. Tamam şimdi daha mantıklı geliyor :)
plannapus

5

APL (29)

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

Örneğin

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

Açıklama:

  • +/'URDL'∘.=⍵: Argümanda karakterlerin ne sıklıkta URDLgerçekleştiğini görün
  • -⌿2 2⍴: Udeğeri Ddeğerden ve Rdeğeri Ldeğerden çıkar
  • 2 0j2×: dikey değeri 2ve yatay değeri çarp2i
  • +/: toplam
  • |: büyüklük

4

Yakut 1,9+ (67)

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

Örnek

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

3

perl6: 44 karakter

2*abs [+] i <<**>>%(<U R D L>Z ^4){get.comb}
  • get.comb bir satır girdi alır ve karakterlere böler
  • <U R L D> kelimelerin listesi, bu durumda karakter
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), böylece 2 listeyi birbirine göre sıkıştırır %()ve karma haline dönüşen parsellerin bir listesini çıkarır.
  • <<**>>çiftler halinde yapar **daha uzun sığdırmak için kısa listeyi uzanan,. Daha kısa liste sadece oluri
  • [+]Bir listenin tüm elemanlarını abstoplar, karmaşık sayılar için modülü alır

Evet, olası tüm boşlukları kaldırdım.


2

Python 2,7 - 65

Güzel ve kısa olanı, bu, uçağın içinden geçmek için karmaşık sayıları kullanır:

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

Bunu 1jhesaplamak için bana kullanımını gösteren diğer sorularda DSM ve Abhijit'e destek .


Can 1jolarak yazılabilir j, -1jolarak -j? Ayrıca, bu üst ve alt girişleri mi, yoksa yalnızca üstleri mi tutar?
DavidC

1
Scrooze Amca , senden nefret ediyorum. En azından yeğenlerin için biraz para bırakmalısın.
Abhijit

1
@DavidCarraher: Hayır, yapamazsın. Değişken jile hayali birim arasındaki farkı ayırt etmek imkansız olurduj
Abhijit

İki kat mesafenin çıkması gerektiğini söylememiş miydiniz ? UUUUDRRRL ile çalışırken bu fonksiyonla 7.21 yerine 3.606 alıyorum.
plannapus

4
2Son sonucu çarpmak yerine sabitleri çarparak 2 karakter daha kazanabilirsiniz .
Abhijit

2

Mathematica 92 49

Calle, kodu düzenlemek için tam krediyi hak ediyor.

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

Örnek

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

7,2111


1
OP'nin gerektirmediği çok fazla iş yapıyorsunuz f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]], yeterli olacaktır.

2 Norm[(2. + 2. I) + "U" + "X"]Kodunuzun çıktısı olarak alıyorum .
DavidC

1
Evet, ancak OP böyle bir girişte başarısız olmanın doğru olduğunu söylüyor. Ben ve herkesin böyle yorumlaması. Bu diğer dilleri okuyamıyorum, ancak sık sık u, r, l ve d kodları olduğunu göreceksiniz.

Tamam. Anladım. Gösterdiğin için teşekkürler.
DavidC

Kalan iki parantez çiftini @s ile değiştirirseniz, iki karakter daha az elde edersiniz.
shrx

2

PHP, 67

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

Örnek:

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

>float(7.211102550928)

2

Julia, 45

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

Stole igüçler hüner. Ayrıca d dışındaki tüm karakterler, kabul edilebilir güçler olarak çalışan değerlere sahiptir i.


1

J, 29 karakter

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

Sadece küçük harf yönleri ve dışında herhangi bir karakterle birlikte çalışır r, u, lve dyanlış cevap vermek için neden olacaktır.

Kullanımı:

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

Açıklama:

'ruld'i.'uuuudrrrl'İkili form i., sol argümandaki sağ argümandaki öğelerin dizinini bulur. Bu durumda:

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

/:~ bu listeyi artan düzende sıralar:

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

#/.~ Her sayının oluşum sayısını sayar:

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

_2[\ 2 sıraya böler:

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

-/ alttan üstten çıkar

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

+&.*:Bu sabah gördüğüm başka bir J cevabından bir numara ödünç aldım ve eşyaları kareler, sonraları toplar, sonra da karekök yapar. Bkz altında&. dokümantasyon:

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

+: sonucu iki katına çıkarır:

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

1

R, 86 74 56 karakter

Tamam, aslında hayali sayılarla gerçekten daha kısa:

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

Kullanımı:

> 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

Xy kodlu 74 karakterde eski çözüm:

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

Kullanımı:

> 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

Girdileri stdin olarak alır, küçük harf ve boşlukla ayrılmış olmaları gerekir. (0,0) ile başlayan xy koordinatlarını kullanın.


1

K ( 50 49)

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

Örnek

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

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

Her "U" nın "1" olduğunu ve iki ünitenin "UU" olacağını varsaydım.

Düzenleme: ifs için anahtarını değiştirdi

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

Yineleyici için taşındı

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

Artık dizge yerine girdi almak yerine yön dizisi almaz.

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

Kısa olanı anlıyorum, sadece bir işleve ihtiyacınız var, tüm bir programa değil.
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))

@S, varchar (max) türündeki giriş dizesidir


1

ES6, 77 69

Tanım:

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

Kullanımı:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • String OR dizisini kabul eder (küçük harf)
  • Hayali sayıları kullanmaz
  • OP soruyu yayınlamasından sadece 3 gün önce mümkün olmazdı ; yani, yalnızca Firefox 27+ ile çalışır (ve belki de deneysel özelliklerin etkin olduğu Chrome, test edilmemiş :)!

(Boann'ın cevabından kısmen esinlenmiştir.)


Geri dönüşden kurtulmak için gerçekten zor bir şey yapmak istiyorum, her şeyi otomatik olarak değerlendirilen ve geri dönen bir boole ifadesine dönüştürmek gibi, ancak forifadeyi bazılarıyla değiştiremeden bunu yapmanın bir yolu olmadığından emin değilim. İfade (ifadeleri içeren bir ok işlevi gövdesi, köşeli ayraçlar ve açık dönüş gerektirir, yalnızca ifadeler olan gövdeler gerekmez) ..
Noyo

1

JavaScript - 142 karakter - değerlendirme yok ()

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}

burada a 'uudrrl' gibi bir dizedir

böyle kullan -

a='uudrrl'
r(a)

Tarayıcı konsolunda test edin.

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

90 karakter

LINQPad'den yeni.

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

Giriş geçerli bir dizedir.

>string input = "LULUURRRRURD";

>8.48528137423857

0

Befunge-93 (65)

65 boşluk olmayan karaktere sahiptir (daha beyaz bir yerleşimle 217, ancak daha kompakt bir düzenle azaltılabilir (69/176 karakter için)). Çıktı formatı ile biraz serbestlik gerektirir, ancak inkar edilemez doğrudur. Karekök uygulaması uygulamak / çalmak için harcanan çabaya değmez.

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

echo 'UUDLLUU' | ./befungee.py ../man 2√13 çıktılar (aslında uygulama olsa da genişletilmiş ASCII ile ilgili bir sorun var)


0

Matlab, 51 karakter

Matlab gönderim, yalnızca büyük harflerle çalışır. Bu eğlenceli bir şeydi! En zor kısım, dizeyi toplanacak karmaşık sayılar dizisine dönüştürmekti.

İşlev:

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

Kullanımı:

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

Örnek:

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

>7.211102550927978

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


0

JavaScript (ES6 yok, değerlendirme yok) - 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}

Ölçek:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
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.