Saya berjalan keliling manhattan, seberapa jauh saya dari hotel saya?


27

Kisah yang tidak perlu dan berbelit-belit

Saya berjalan di manhattan, blok demi blok dan kaki saya sudah lelah dan ingin kembali ke rumah.

Lalu lintasnya sangat buruk, tapi untungnya saya sangat kaya dan saya memiliki helikopter di hotel. Tapi saya ingin mereka tahu berapa banyak bahan bakar untuk mengemas penerbangan dan untuk itu mereka perlu tahu jarak langsung saya dari hotel. Saya ingat blok mana yang saya jalani dan bisa memberi tahu mereka rute apa yang saya ambil. Namun jarak ini harus tepat, jika terlalu pendek, kita tidak akan bisa kembali, terlalu lama dan saya sudah membeli bahan bakar yang tidak bisa saya gunakan.

Dapatkah Anda menulis saya sebuah program untuk mengubahnya menjadi jarak yang harus mereka tempuh dalam penerbangan mereka untuk menjemput saya?

Spesifikasi:

Tulis saya fungsi yang:

  1. Menerima daftar atau rangkaian blok yang berjalan relatif ke kisi sembarang:
    • U p, D sendiri, L eft dan R ight.
    • Dapat berupa huruf besar atau kecil - mis. jika lebih pendek untuk digunakan udaripada Umaju.
    • Arah yang tidak valid memiliki perilaku yang tidak ditentukan - mis. arah X dapat menyebabkan kegagalan.
  2. Mengembalikan float / desimal / ganda yang dua kali jarak garis lurus dari titik asal.

Untuk ilustrasi dan klarifikasi:

Perjalananku

Perjalanan saya bisa saja direkam dengan mudah "luluu..."atau ['l','u','l'...]tetapi harus dicatat sebagai Atas, Bawah, Kiri, Kanan.


15
Anda cukup kaya untuk memiliki helikopter tetapi Anda peduli jika ada bahan bakar tambahan yang dibeli? : O
Fez Vrasta

8
@ fezvrasta karena saya pelit.

7
Cara mengacaukan kepalaku dengan tidak membuat jarak Manhattan seperti ini.
Kendall Frey

25
Jawaban yang benar adalah, "Tidak masalah. Kamu orang kaya, jadi kamu merogoh kantongmu, mengeluarkan seharga $ 20, dan melambaikannya di udara untuk menarik perhatian seorang sopir taksi; kamu adalah kemudian diatur oleh sekelompok preman TK yang merampok Anda dan memukul Anda hingga menjadi bubur berdarah.Anda kemudian ditangkap karena membuang sampah sembarangan dan gelandangan publik, didakwa dengan terorisme karena berusaha menyebabkan kepanikan massal dan pandemi dengan menyebarkan cairan tubuh Anda di depan umum trotoar, dihukum, dikirim ke penjara, dan dikurung dengan teman satu selnya dijuluki Brutus yang mengambil nyata keinginan kuat untuk Anda. Selamat datang di New York!"
Bob Jarvis - Reinstate Monica

2
@ Maccay Saya menafsirkannya sebagai arah pada peta, (kalau tidak mungkin akan "maju" dan "kembali"), dan ukuran jarak agak tidak ambigu "dua kali jarak garis lurus dari titik asal", jadi tidak ada jarak manhattan).
FireFly

Jawaban:


32

J, 17 karakter

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

Menggunakan fakta, bahwa kekuatan jmewakili arah yang tepat.

  • 'urdl'i. ambil string dan hitung indeks (0 untuk 'u', 1 untuk 'r', ...)
  • 0j1^berubah menjadi arah di bidang kompleks menggunakan kekuatan yang sesuai j.
  • +/ merangkum langkah-langkah tunggal
  • 2*| dua kali modulus

Contoh:

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

5
Pekerjaan yang baik. Pengetahuan matematika untuk menang. :-)
Gareth

Buat ASCII "non-extended" ini dan kemudian hanya 15 byte (karena Anda tidak menggunakan bit kedelapan).
Timtech

11

Python 2.7 56 58 56 51 48

Dengan Dime Nomor Satu yang dicuri dari Scrooge McDuck , saya membuat kekayaan saya dan sekarang memiliki lebih banyak kekayaan daripada Gober.

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

Python 2.7 - 61 53 50 (tidak sensitif huruf besar / kecil)

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

Pelaksanaan

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

Saya mendapatkan IndexError: list index out of range. Bentuk apa yang harus dimiliki input?
plannapus

@plannapus: Saya telah menambahkan bagian implementasi
Abhijit

Ah dan ternyata %5tidak %8. Oke, sekarang lebih masuk akal :)
plannapus

5

APL (29)

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

misalnya

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

Penjelasan:

  • +/'URDL'∘.=⍵: lihat seberapa sering karakter URDLmuncul dalam argumen
  • -⌿2 2⍴: kurangi Unilai dari Dnilai, dan Rnilai dari Lnilai
  • 2 0j2×: kalikan nilai vertikal dengan 2dan nilai horizontal dengan2i
  • +/: jumlah
  • |: besarnya

4

Ruby 1.9+ (67)

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

Contoh

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 mendapat satu baris input dan dibagi menjadi karakter
  • <U R L D> adalah daftar kata, karakter dalam hal ini
  • (1,2,3) Z (4,5,6)== (1,2), (2,5), (3,6), jadi ritsleting 2 daftar menjadi satu sama lain, membuat daftar parsel yang %()berubah menjadi hash
  • <<**>>tidak berpasangan **, memperpanjang daftar yang lebih pendek agar lebih panjang. Daftar pendek hanya terjadii
  • [+]menjumlahkan semua elemen daftar, absmengambil modulus untuk bilangan kompleks

Ya, saya menghapus semua ruang yang memungkinkan.


2

Python 2.7 - 65

Bagus dan pendek, ini menggunakan bilangan kompleks untuk melewati pesawat:

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

Alat peraga untuk DSM dan Abhijit dalam pertanyaan lain yang menunjukkan kepada saya penggunaan 1juntuk menghitung ini.


Dapat 1jditulis sebagai j, -1jseperti -j? Juga, apakah ini menangani input atas dan bawah, atau hanya atas?
DavidC

1
Paman Scrooze , aku membencimu. Anda setidaknya harus meninggalkan sejumlah uang untuk keponakan Anda.
Abhijit

1
@ Davidvidarraher: Tidak, kamu tidak bisa. Tidak mungkin untuk membedakan antara variabel jdan unit imajinerj
Abhijit

Bukankah Anda mengatakan itu seharusnya output dua kali jarak? ketika mencoba dengan UUUUDRRRL saya mendapatkan 3,606 dengan fungsi ini bukannya 7.21.
plannapus

4
Anda dapat menyimpan 2 karakter lebih banyak, dengan mengalikan konstanta dengan 2alih-alih mengalikan hasil akhir.
Abhijit

2

Mathematica 92 49

Calle layak mendapatkan kredit penuh untuk merampingkan kode.

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

Contoh

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

7.2111


1
Anda sedang melakukan banyak pekerjaan yang tidak diminta oleh OP, f@l_ := 2 N@Norm[Tr[l /. {"r" -> 1, "l" -> -1, "u" -> I, "d" -> -I}]]cukuplah.

Saya mendapatkan 2 Norm[(2. + 2. I) + "U" + "X"]sebagai output untuk kode Anda.
DavidC

1
Ya, tetapi OP mengatakan OK untuk gagal dengan input tersebut. Begitulah cara saya dan semua orang menafsirkannya. Saya tidak dapat membaca bahasa-bahasa lain ini, tetapi Anda akan melihat bahwa mereka sering kali meng-hardcode untuk u, r, l dan d.

Baik. Oke. Terima kasih telah menunjukkannya.
DavidC

Jika Anda mengganti dua pasang kurung yang tersisa dengan @s, Anda mendapatkan dua karakter lebih sedikit.
shrx

2

PHP, 67

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

Contoh:

<?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]))

Mencuri itrik kekuatan. Juga semua karakter kecuali d memiliki nilai yang berfungsi sebagai kekuatan yang dapat diterima i.


1

J, 29 karakter

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

Hanya bekerja dengan arah huruf kecil dan karakter lain selain r, u, l, dan dakan menyebabkan untuk memberikan jawaban yang salah.

Pemakaian:

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

Penjelasan:

'ruld'i.'uuuudrrrl'Bentuk i.angka dua dari menemukan indeks item dari argumen kanan dalam argumen kiri. Pada kasus ini:

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

/:~ urutkan daftar ini menjadi urutan menaik:

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

#/.~ menghitung jumlah kemunculan setiap angka:

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

_2[\ potong menjadi 2 baris:

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

-/ kurangi bagian bawah dari atas

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

+&.*:meminjam trik dari jawaban J lain yang kulihat pagi ini , dan menguadratkan item-item itu, lalu menjumlahkannya, lalu melakukan root kuadrat. Lihat di bawah&. dokumentasi:

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

+: gandakan hasilnya:

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

1

R, 86 74 56 karakter

Ok itu sebenarnya jauh lebih pendek dengan angka imajiner memang:

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

Pemakaian:

> 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

Solusi lama pada 74 karakter dengan xy coords:

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

Pemakaian:

> 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

Mengambil input sebagai stdin, harus lebih kecil dan dipisahkan dengan ruang. Gunakan koordinat xy mulai dari (0,0).


1

k ( 50 49)

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

Contoh

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

Saya berasumsi bahwa setiap "U" adalah "1 ke atas", jadi dua unit ke atas adalah "UU"

Sunting: sakelar yang diganti untuk seandainya

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

Pindah untuk iterator

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

Tidak lagi menggunakan input sebagai string, melainkan array arah

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

Pemahaman saya tentang brief tersebut adalah bahwa Anda hanya membutuhkan suatu fungsi, bukan keseluruhan program.
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 adalah string input dari tipe varchar (max)


1

ES6, 77 69

Definisi:

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

Pemakaian:

>>> f('uuuudrrrl')
7.211102550927979
>>> f( 'uuuudrrrl'.split('') )
7.211102550927979
  • Menerima string ATAU array (huruf kecil)
  • Tidak menggunakan angka imajiner
  • Tidak akan mungkin hanya 3 hari sebelum OP memposting pertanyaan ; artinya, itu hanya berjalan di Firefox 27+ (dan mungkin juga Chrome dengan hal-hal eksperimental yang diaktifkan, belum diuji :) !!

(Terinspirasi sebagian oleh jawaban Boann.)


Saya benar-benar ingin melakukan sesuatu yang rumit untuk menghilangkan pengembalian, seperti mengubah semuanya menjadi ekspresi boolean yang baru saja dievaluasi dan dikembalikan secara otomatis, tetapi saya tidak yakin ada cara untuk melakukan ini kecuali saya dapat mengganti forpernyataan dengan beberapa ekspresi (badan fungsi panah yang berisi pernyataan memerlukan tanda kurung dan kembali eksplisit, tubuh yang hanya ekspresi tidak) ..
Noyo

1

JavaScript - 142 karakter - tanpa 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}

di mana a adalah string seperti 'uudrrl'

gunakan seperti ini -

a='uudrrl'
r(a)

Tes di konsol browser.

var x = "luluurrrrurd"
r(x)
8.48528137423857

1

C # - 90 karakter

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

Di mana input adalah string yang valid.

>string input = "LULUURRRRURD";

>8.48528137423857

0

Befunge-93 (65)

Ini memiliki 65 karakter non-spasi (217 dengan spasi, meskipun itu dapat dikurangi dengan tata letak yang lebih kompak (untuk 69/176 karakter)). Dibutuhkan beberapa kebebasan dengan format output, tetapi tidak dapat disangkal akurat. Tampaknya tidak sepadan dengan upaya untuk mengimplementasikan / mencuri implementasi akar kuadrat.

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

echo 'UUDLLUU' | ./befungee.py ../man output 2√13 (sebenarnya implementasi tampaknya memiliki masalah dengan ASCII yang diperluas meskipun).


0

Matlab, 51 karakter

Pengajuan Matlab saya, hanya berfungsi dengan huruf captial. Ini menyenangkan! Bagian tersulit adalah mengubah string menjadi array angka kompleks untuk dijumlahkan.

Fungsi:

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

Pemakaian:

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

Contoh:

<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 (tanpa ES6, tanpa 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}

Uji:

console.log(f('uuuudrrrl'));     // 7.211102550927978 
console.log(f('luluurrrrurd'));  // 8.48528137423857
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.