Manhattan urutan rotasi urutan

9

Saya pikir ini akan menjadi tantangan yang bagus: http://adventofcode.com/2016/day/1

Deskripsi tugas

Diberikan urutan rotasi dan jarak mengikuti pola (L | R) [1-9] [0-9] *, berikan jarak manhattan antara titik awal dan titik akhir, yaitu jumlah minimum gerakan vertikal dan horizontal pada sebuah kotak.

Contohnya

Misalnya, jika kami menganggap Anda mulai menghadap ke Utara:

Mengikuti R2, L3 membuat Anda 2 blok Timur dan 3 blok Utara, atau 5 blok jauhnya. R2, R2, R2 membuat Anda 2 blok karena Selatan dari posisi awal Anda, yang berjarak 2 blok. R5, L5, R5, R3 membuat Anda tinggal 12 blok jauhnya.

Rincian teknis

Anda dapat memilih pemisah di antara gerakan (misalnya: "\ n", ",", atau ","). Anda harus memberikan jawaban sebagai bilangan bulat di basis 10.

Bukan duplikat!

Ini bukan duplikat karena berbagai alasan:

  • Bergerak tidak sama. Ini rotasi , bukan arah.
  • Saya ingin jarak Manhattan, bukan euclidian.
Labo
sumber
3
Anda harus memasukkan deskripsi jarak Manhattan dalam pertanyaan Anda. Memposting tautan saja agak norak.
Gabriel Benamy
2
Ini sangat berbeda ! Kami hanya memiliki rotasi!
Labo
1
@ Labo saya setuju. Ini bukan hanya tentang fakta bahwa jawabannya di sini adalah di jarak Manhattan sedangkan yang lainnya adalah di jarak Euclidean. Ini memiliki gerakan gaya kura-kura sementara yang lain menentukan arah kompas NSEW (fakta bahwa itu menyebut mereka UDLR tidak relevan.)
Level River St
2
Silakan gunakan Sandbox di masa depan untuk mendapatkan umpan balik tentang tantangan Anda sebelum mempostingnya ke situs utama.
Mego
2
@ Labo Tidak apa-apa, kami tidak mengharapkan pengguna baru untuk mengetahui semua seluk beluk situs ini dengan segera. Itu hanya saran lembut untuk kali berikutnya. :)
Mego

Jawaban:

4

Python 3, 109 99 104 101 byte

Ini adalah jawaban sederhana yang menggunakan bilangan kompleks, dengan input sebagai string yang dipisahkan oleh spasi atau string yang dipisahkan dengan baris baru. Selamat datang saran bermain golf!

Sunting: -13 bytes berkat Labo. +5 byte untuk mengonversi ke 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)))

Tidak melakukanolf

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
sumber
1-2 * (r [0] <'R') akan menghemat 2 byte :)
Labo
Jangan membuat fungsi, membaca dari input membuat Anda menghemat lebih banyak karakter!
Labo
Tetapkan 2 variabel di baris yang sama untuk menghemat 2 byte: d = p = 0
Labo
Saya bermain golf lagi jawaban Anda dan itu membuat 99 karakter! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo
2
@ Labo Saya tidak yakin Anda dapat mengedit spesifikasi dengan cara yang akan membatalkan jawaban yang ada, tetapi izinkan saya bertanya beberapa mod.
Sherlock9
2

PHP, 93 byte

while($m=$argv[++$i])${chr(80|3&$d+=(P<$m)-(M>$m))}+=substr($m,1);echo abs($P-$R)+abs($Q-$S);

kerusakan

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

Python 2, 86 byte

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)

Melacak arus xdan ykoordinat. Saat memutar, alih-alih memperbarui arah, putar nilai saat ini sehingga gerakan selalu ke arah x-positif. Bilangan kompleks terlalu mahal untuk mengekstrak koordinat dari.

Tidak
sumber
1

Python 2, 103 102 byte

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

Input adalah string arah yang dibatasi ruang, mis "R5 L5 R5 R3".
Mencetak jarak Manhattan antara lokasi awal dan tujuan.

Bagaimana?

Dimulai pada asal-usul bidang kompleks, l=0;

Dengan seperempat-hak kumulatif gilirannya counter, c=0;

Untuk setiap instruksi,, irotasi yang diuraikan adalah dengan membandingkan karakter pertama dari arah ke karakter 'N', dan cdisesuaikan.

Jarak untuk melakukan perjalanan diuraikan dengan int(i[1:])dan instruksi diberlakukan dengan mengambil banyak langkah ukuran blok ke arah yang diberikan dengan mengambil ckekuatan 0+1jdengan 1j**c.

Jarak akhir Manhattan adalah jumlah jarak absolut dari titik asal dalam dua arah - imajiner dan nyata; tercapai denganabs(l.imag)+abs(l.real)

Jonathan Allan
sumber
1
@ Sherlock9 - Oh, um jawab konvergensi. Simpan 2 byte dengan beralih ke Python 2 dan menggunakan cmpseperti jawaban saya, beri tahu saya dan saya akan menghapus.
Jonathan Allan
0

JavaScript (ES2016), 98 100

2 byte disimpan thx @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 byte untuk 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)

Kurang golf

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)

Tes (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
sumber
1
Jawaban ES6 saya awalnya 106 byte; menyalin variabel perantara Anda menyelamatkan saya 3 byte; beralih dari kecocokan ke pengganti Anda menyelamatkan saya 2 byte, dan menyalin pemrosesan Anda arah dan jarak pada saat yang sama menyelamatkan saya byte terakhir, menghasilkan ini 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):, yang sekarang dua byte lebih pendek dari jawaban ES6 Anda, berkat c<'R'||3dan n*=~-(d&2)trik .
Neil