Efficient Typing on a Game Boy
JavaScript (ES6), 147 bytes

s=&gt;s.replace(/./g,c=&gt;(q=p,p="AHOVBIPWCJQXDKRYELSZFMY.GNU ".indexOf(c),"&lt;&lt;&lt;&gt;&gt;&gt;".substring(3,((p&gt;&gt;2)+10-(q&gt;&gt;2))%7)+["","v","vv","^"][p-q&amp;3]+"."),p=0)


An interesting behaviour of substring is that it exchanges the arguments if the second is less than the first. This means that if I calculate the optimal number of left/right presses as a number between -3 and 3, I can add 3, and take the substring of &lt;&lt;&lt;&gt;&gt;&gt; starting at 3 and I will get the correct number of arrows. Meanwhile the down/up presses are simply handled by looking up an array using a bitwise and of the difference in rows with 3; this way is slightly shorter as there are fewer array elements.