ระยะทางแมนฮัตตันของลำดับการหมุน


9

ฉันคิดว่านี่จะเป็นความท้าทายที่ดี: http://adventofcode.com/2016/day/1

คำอธิบายงาน

กำหนดลำดับการหมุนและระยะทางตามรูปแบบ (L | R) [1-9] [0-9] * ให้ระยะทางแมนฮัตตันระหว่างจุดเริ่มต้นและจุดสิ้นสุดนั่นคือจำนวนน้อยที่สุดของการเคลื่อนที่ในแนวตั้งและแนวนอนบน ตาราง

ตัวอย่าง

ตัวอย่างเช่นหากเราคิดว่าคุณเริ่มหันหน้าไปทางทิศเหนือ:

การติดตาม R2, L3 จะทำให้คุณ 2 บล็อกตะวันออกและ 3 บล็อกเหนือหรือ 5 บล็อก R2, R2, R2 ปล่อยให้คุณ 2 ช่วงตึกทางใต้ของตำแหน่งเริ่มต้นของคุณซึ่งอยู่ห่างออกไป 2 ช่วงตึก R5, L5, R5, R3 ทำให้คุณอยู่ห่างออกไป 12 ช่วงตึก

รายละเอียดทางเทคนิค

คุณสามารถเลือกตัวคั่นระหว่างการเคลื่อนไหว (เช่น: "\ n", "," หรือ ",") คุณต้องให้คำตอบเป็นจำนวนเต็มในฐาน 10

ไม่ซ้ำ!

มันไม่ซ้ำกันด้วยเหตุผลหลายประการ:

  • การเคลื่อนไหวไม่เหมือนกัน นี่คือการหมุนไม่ใช่ทิศทาง
  • ฉันต้องการระยะทางแมนฮัตตันไม่ใช่แบบยุคลิด

3
คุณควรระบุคำอธิบายว่าระยะทางแมนฮัตตันในคำถามของคุณเป็นอย่างไร เพียงโพสต์ลิงค์เป็นชนิดไม่มีรสนิยมที่ดี
Gabriel Benamy

2
มันแตกต่างกันมาก! เรามีการหมุนเท่านั้น!
Labo

1
@ Labo ฉันเห็นด้วย มันไม่ได้เกี่ยวกับความจริงที่ว่าคำตอบที่นี่อยู่ในระยะทางแมนฮัตตันในขณะที่อีกคำตอบอยู่ในระยะทางแบบยุคลิด สิ่งนี้มีการเคลื่อนไหวของเต่าขณะที่อีกอันหนึ่งระบุทิศทางเข็มทิศ NSEW (ความจริงที่ว่ามันเรียกว่า UDLR นั้นไม่เกี่ยวข้อง)
Level River St

2
โปรดใช้แซนด์บ็อกซ์ในอนาคตเพื่อรับข้อเสนอแนะเกี่ยวกับความท้าทายของคุณก่อนโพสต์ลงในเว็บไซต์หลัก
Mego

2
@Labo ไม่เป็นไรเราไม่ได้คาดหวังให้ผู้ใช้ใหม่รู้ถึงรายละเอียดทั้งหมดของไซต์นี้ทันที มันเป็นคำแนะนำที่อ่อนโยนสำหรับครั้งต่อไป :)
Mego

คำตอบ:


4

Python 3, 109 99 104 101 ไบต์

นี่เป็นคำตอบง่ายๆที่ใช้จำนวนเชิงซ้อนโดยอินพุตเป็นสตริงที่คั่นด้วยช่องว่างหรือสตริงที่คั่นด้วยบรรทัดใหม่ ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ!

แก้ไข: -13 ไบต์ขอบคุณ Labo +5 ไบต์สำหรับการแปลงเป็น 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)))

Ungolfing

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

1-2 * (r [0] <'R') จะช่วยให้คุณประหยัด 2 ไบต์ :)
Labo

อย่าทำฟังก์ชั่นการอ่านจากอินพุตทำให้คุณประหยัดตัวอักษรได้มากขึ้น!
Labo

กำหนดตัวแปร 2 ตัวในบรรทัดเดียวกันเพื่อบันทึก 2 ไบต์: d = p = 0
Labo

ฉันตีกอล์ฟคำตอบของคุณอีกครั้งและทำ 99 ตัวอักษร! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo ฉันไม่แน่ใจว่าคุณสามารถแก้ไขข้อมูลจำเพาะในแบบที่จะทำให้คำตอบที่มีอยู่เป็นโมฆะ แต่ให้ฉันถาม mods บางอย่าง
Sherlock9

2

PHP, 93 ไบต์

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

ทำให้พังถล่ม

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

2

Python 2, 86 ไบต์

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)

ติดตามกระแสxและyพิกัด เมื่อหมุนแทนการอัพเดททิศทางหมุนค่าปัจจุบันเพื่อให้การเคลื่อนที่อยู่ในทิศทางบวกเสมอ จำนวนเชิงซ้อนมีค่าใช้จ่ายสูงเกินไปที่จะดึงพิกัดออก


1

Python 2, 103 102 ไบต์

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

"R5 L5 R5 R3"การป้อนข้อมูลเป็นสตริงของพื้นที่ทิศทางคั่นด้วยเช่น
พิมพ์ระยะห่างจากแมนฮัตตันระหว่างตำแหน่งเริ่มต้นและปลายทาง

อย่างไร?

เริ่มต้นที่ต้นกำเนิดของเครื่องบินซับซ้อนl=0;

ด้วยตัวนับผลัดกันเลี้ยวขวาไตรมาสc=0;

สำหรับแต่ละคำสั่งiการหมุนจะถูกแยกโดยการเปรียบเทียบอักขระตัวแรกของทิศทางกับตัวอักษร'N'และcปรับตามนั้น

ระยะทางในการเดินทางจะแยกกับint(i[1:])และการเรียนการสอนคือตราโดยการที่หลายบล็อกขนาดขั้นตอนในทิศทางที่กำหนดโดยการcใช้พลังงานของวันด้วย0+1j1j**c

ระยะทางแมนฮัตตันสุดท้ายคือผลรวมของระยะทางสัมบูรณ์จากแหล่งกำเนิดในสองทิศทาง - จินตนาการและจริง ทำได้ด้วยabs(l.imag)+abs(l.real)


1
@ Sherlock9 - โอ้เอ่อตอบคอนเวอร์เจนซ์ บันทึก 2 ไบต์โดยเปลี่ยนเป็น Python 2 และใช้cmpเหมือนคำตอบของฉันแจ้งให้เราทราบและฉันจะลบ
Jonathan Allan

0

JavaScript (ES2016), 98 100

บันทึก 2 ไบต์ขอบคุณ @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ไบต์สำหรับ 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)

น้อย golfed

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)

ทดสอบ (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>


1
คำตอบ ES6 ของฉันเดิมคือ 106 ไบต์; การคัดลอกตัวแปรกลางของคุณช่วยฉัน 3 ไบต์; เปลี่ยนจากการแข่งขันที่จะมาแทนที่บันทึกฉัน 2 ไบต์ของคุณและคัดลอกของคุณประมวลผลทิศทางและระยะทางในเวลาเดียวกันบันทึกฉันไบต์สุดท้ายส่งผลให้ในนี้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)ซึ่งขณะนี้ทั้งสองไบต์สั้นกว่าคำตอบ ES6 ของคุณขอบคุณc<'R'||3และn*=~-(d&2)เทคนิค .
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.