PowerShell, 84 bytes
param([char]$a,$b)($b[($c=$b.length)..0],$b[0..$c])[$a%7-eq6]-join("","`n")[90-lt$a]
Isso será uma bobagem completa para pessoas não familiarizadas com o PowerShell. Vamos passar por isso.
Recebe entrada param([char]$a,$b), com um elenco explícito para caractere $a. O restante do programa é uma declaração. Começaremos com o primeiro semestre, até o -join.
Estamos criando uma nova matriz dinâmica (...,...)e fazendo a indexação nela $a%7-eq6. Os valores ASCII para ve >são 116e 62, respectivamente, e 116%7 = 62%7 = 6, e essas são as duas direções que "aumentam" para baixo e para a direita. Então, se isso -eqé$true , vamos dar o segundo valor, o que é $b[0..$c], ou uma matriz de caracteres de $baté o final . Nós obtemos o valor $cdo primeiro valor, $b[($c=$b.length)..0]que é selecionado se o caractere de entrada é ^ou <( ou seja, ele passa a string para trás). Importante notar que, mesmo que o segundo valor seja selecionado, o $cvalor ainda será calculado e armazenado, para que possamos reutilizá-lo como um atalho como esse.
Então, agora temos uma variedade de caracteres indo para frente ou para trás. Em seguida, -joinesses caracteres são combinados com o resultado de outro índice de matriz dinâmica. Desta vez, selecionamos com base se o valor ASCII para$a está abaixo 90(realmente muitos valores funcionariam, selecionei este apenas porque). Como >e <ambos têm um valor abaixo 90, o -lté $false, então selecionamos a string vazia ""e, portanto, o array de caracteres é simplesmente concatenado. Caso contrário, selecionamos o caractere de nova linha "`n"para associar o conjunto de caracteres a novas linhas.
Essa sequência resultante é deixada no pipeline e a saída é implícita.
Exemplo
PS C:\Tools\Scripts\golfing> .\orthogonal-orientation.ps1 "^" "TimmyD"
D
y
m
m
i
T