Distanza di Manhattan della sequenza di rotazione


9

Ho pensato che sarebbe stata una bella sfida: http://adventofcode.com/2016/day/1

Descrizione del compito

Data una sequenza di rotazioni e distanze seguendo il modello (L | R) [1-9] [0-9] *, indica la distanza di manhattan tra i punti iniziale e finale, ovvero il numero minimo di spostamenti verticali e orizzontali su una griglia.

Esempi

Ad esempio, se assumiamo che tu abbia iniziato ad affrontare il nord:

Dopo R2, L3 ti lascia 2 blocchi a est e 3 blocchi a nord, o 5 blocchi di distanza. R2, R2, R2 ti lascia 2 blocchi a sud della posizione iniziale, che si trova a 2 blocchi di distanza. R5, L5, R5, R3 ti lascia a 12 isolati di distanza.

Dettagli tecnici

Puoi scegliere il separatore tra le mosse (ad es. "\ N", "," o ","). Devi dare la risposta come intero nella base 10.

Non un duplicato!

Non è un duplicato per diversi motivi:

  • Le mosse non sono le stesse. Qui sono rotazioni , non direzioni.
  • Voglio la distanza di Manhattan, non l'euclide.

3
Dovresti includere una descrizione di quale sia la distanza di Manhattan nella tua domanda. Solo pubblicare un link è un po 'pacchiano.
Gabriel Benamy,

2
È molto diverso! Abbiamo solo rotazioni!
Labo,

1
@Labo sono d'accordo. Non si tratta solo del fatto che la risposta qui è a distanza di Manhattan, mentre l'altra è a distanza euclidea. Questo ha un movimento in stile tartaruga mentre l'altro specifica le direzioni della bussola NSEW (il fatto che li chiama UDLR è irrilevante.)
Level River St

2
Si prega di utilizzare Sandbox in futuro per ottenere un feedback sulle sfide prima di pubblicarle sul sito principale.
Mego

2
@Labo Va bene, non ci aspettiamo che i nuovi utenti conoscano immediatamente tutti i dettagli di questo sito. È solo un suggerimento gentile per la prossima volta. :)
Mego

Risposte:


4

Python 3, 109 99 104 101 byte

Questa è una risposta semplice che utilizza numeri complessi, con input come una stringa separata da spazio o una stringa separata da nuova riga. Suggerimenti di golf benvenuti!

Modifica: -13 byte grazie a Labo. +5 byte per la conversione in un 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') ti farà risparmiare 2 byte :)
Labo

Non fare una funzione, la lettura dall'input ti fa risparmiare più caratteri!
Labo,

Assegna 2 variabili nella stessa riga per salvare 2 byte: d = p = 0
Labo

Ho di nuovo golfato la tua risposta e fa 99 caratteri! pastie.org/private/hm7lejqosdqnkgo000u7q
Labo

2
@Labo Non sono sicuro che puoi modificare le specifiche in modo da invalidare le risposte esistenti, ma lasciami chiedere alcune modifiche.
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);

abbattersi

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

Tiene traccia della corrente xe delle ycoordinate. Quando si gira, invece di aggiornare la direzione, ruota il valore corrente in modo che il movimento sia sempre nella direzione x positiva. I numeri complessi erano troppo costosi per estrarre le coordinate.


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

L'input è una stringa di direzioni delimitate da spazi, ad es "R5 L5 R5 R3".
Stampa la distanza di Manhattan tra la posizione di partenza e la destinazione.

Come?

Inizia all'origine del piano complesso l=0,;

Con un contatore di giro cumulativo quarto di destra c=0,;

Per ogni istruzione, ila rotazione viene analizzata confrontando il primo carattere della direzione con il carattere 'N'e cviene regolata di conseguenza.

La distanza da percorrere viene analizzata int(i[1:])e l'istruzione viene attuata eseguendo molti passi di dimensioni di blocchi nella direzione indicata prendendo la cpotenza di 0+1jcon 1j**c.

La distanza finale di Manhattan è la somma delle distanze assolute dall'origine nelle due direzioni: immaginaria e reale; raggiunto conabs(l.imag)+abs(l.real)


1
@ Sherlock9 - Oh, um risposta alla convergenza. Salva 2 byte passando a Python 2 e usando cmpcome la mia risposta, fammi sapere e cancellerò.
Jonathan Allan,

0

JavaScript (ES2016), 98 100

2 byte salvati grazie a @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 per 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)

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

Test (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
La mia risposta ES6 era originariamente 106 byte; la copia della variabile intermedia mi ha salvato 3 byte; passare dalla partita alla tua sostituzione mi ha salvato 2 byte, e copiando la tua elaborazione la direzione e la distanza allo stesso tempo mi ha salvato un byte finale, risultando in questo: 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)che ora è due byte più corto della tua risposta ES6, grazie ai trucchi c<'R'||3e n*=~-(d&2).
Neil,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.