Ande as palavras!

33

É na minha humilde opinião que o texto padrão é chato. Portanto, proponho um novo padrão de escrita, palavras ambulantes!

Palavras ambulantes

Palavras ambulantes são aquelas que respondem a certos caracteres. Para o propósito deste desafio, os personagens de gatilho são [u, d, r, l]de up down right left.

Sempre que encontrar esse caractere ao imprimir texto, você moverá a direção do texto.
Por exemplo, o textoabcdef resultará em:

abcd
   e
   f

Regras

  • Maiúsculas UDRL e minúsculas udrldevem mudar a direção, mas a caixa deve ser preservada na saída
  • A entrada conterá apenas caracteres imprimíveis (0-9, A-Z, a-z, !@#%^&*() etc...) , sem novas linhas!
  • Sempre que o texto colidir, ele substituirá o caractere antigo nessa posição
  • A saída deve ser apresentada ao usuário em qualquer assunto da moda, mas deve ser uma saída única (sem matriz de linhas)
  • Novas linhas à direita e à direita são permitidas
  • Espaços à direita são permitidos
  • Aplicam-se brechas padrão

Casos de teste

empty input => empty output or a newline

u =>
u

abc =>
abc

abcd =>
abcd

abcde =>
abcd
   e

abcdde =>
abcd
   d
   e

codegolf and programming puzzles =>
   cod
     e
     g
     o
dna fl    sel
            z
p           z
rogramming pu

ABCDELFUGHI =>
 I
AHCD
 G E
 UFL

It is in my humble opinion that standard text is boring. Therefore I propose a new writing standard, walking words! =>
dnats taht noinipo el
a                   b
rd                  m
       It is in my hu
 t
 e
 x
 t

 i
 s

 b
 o
 ring. Therefore I propose a new writing stand
                                             a
                                             rd
                                              ,

                                              w
                                              a
                                      rdw gnikl
                                       s
                                       !

Este é o , o código mais curto em bytes vence!

Bassdrop Cumberwubwubwub
fonte
4
Este formato tem um problema de perda de dados grave ...: p
Mukul Kumar
São permitidos espaços à esquerda / à direita?
precisa
@ Arnauld Desde que eles não perturbem a posição dos personagens que são. Então, provavelmente, apenas espaços à direita
Bassdrop Cumberwubwubwub
1
Como seria a saída da palavra golfpor si só?
gabe3886
2
@ gabe3886gfl
Bassdrop Cumberwubwubwub

Respostas:

4

Carvão , 29 27 20 19 bytes

FS«F№rdlu↧ι≔ιω✳∨ωrι

Experimente online! Link é a versão detalhada do código. Explicação:

FS«

Faça um loop sobre os caracteres de entrada.

F№rdlu↧ι

Se a letra atual é uma direção ...

≔ιω

atualize a direção atual a pé.

✳∨ωrι

Imprima o caractere na direção atual a pé, padronizando para a direita se nenhuma direção ainda tiver sido definida.

Neil
fonte
1
@Veskah O deveria ser um . Me desculpe por isso.
Neil
7

Dyalog APL , 63 bytes

s@(n+11 9∘○¨+\0j1*⊃¨,⍨\(8∘≠⍴¨⊢)0,'rdluRDLU'⍳¯1↓s)⍴∘'',⍨2×n←≢s←⍞

usos ⎕IO←0e recursos da v16 ( @)

n←≢s←⍞entrada bruta se seu comprimenton

⍴∘'',⍨2×n crie uma matriz de espaços 2n por 2n

s@(...)alterar a matriz com os caracteres snos índices (pares de) especificados

como os índices são calculados:

¯1↓s solte o último caractere de s

'rdluRDLU'⍳'codificar 'r'como 0, 'd'como 1, etc; outros caracteres como 8

0, preceder um 0

(8∘≠⍴¨⊢) transforme cada 8 em uma lista vazia, todos os outros em uma lista de 1 elemento

,⍨\concatenações trocadas cumulativas ( abcd-> a ba cba dcba)

⊃¨ primeiro de cada

0j1* constante imaginária i ao poder de

+\ somas acumuladas

11 9∘○¨parte real e imaginária de cada um; obter cordas na faixa -n...n

n+ centre-os na grande matriz

ngn
fonte
3

Pitão, 68 65 bytes

KUJ,00ImXH~+VJ=@as_BM_MBU2Kx"rdlu"rd0dzjcsm.x@Hd;*Fm=Z}hdedSMCHlZ

Suíte de teste

Isso usa um dicionário, indexado por um par de coordenadas, que é atualizado conforme a entrada é lida e depois impresso no final. Ele também usa uma tonelada de truques de golfe inteligentes.

Aqui está como eu escrevi, usando a -mflag do intérprete para remover o espaço em branco e os comentários antes de executar:

KUJ,00                 ; Initialize J to [0, 0] and K to [0, 1].
                       ; J is the current location, K is the current direction.
I                      ; If the following is truthy, which will be when the input
                       ; is nonempty,
  m                    ; Map d over z, the input.
  XH                   ; Assign to H (a hash table, initially empty)
    ~+VJ               ; At location J, then update J by adding elementwise
      =@               ; K (Next variable is implicit), which is set to
        as_BM_MBU2K    ; [0, 1], bifurcated on mapped negation, then mapped on
                       ; reversal bifuraction with the old value of K appended.
                       ; e.g. [[0, 1], [1, 0], [0, -1], [-1, 0], K]
        x"rdlu"rd0     ; indexed at location equal to the index of the lowercase
                       ; of the current character into "rdlu", -1 if missing.
    d                  ; Insert the current character with that key.
  z                    ; map over z.
jc                     ; Join on newlines the result of chopping into a rectangle
  sm                   ; the concatenation of the map
    .x@Hd;             ; Lookup the character at the given location,
                       ; if none then ' '
    *Fm                ; Locations are the cartesian product of the map
      =Z}hded          ; Inclusive range from the head of each list to 
                       ; the end of each list
                       ; Saved in Z for later
      SMCH             ; Transpose the list of keys, and sort the x and y values
                       ; separately.
  lZ                   ; Width of the rectangle should equal the number of
                       ; x values, which is the length of the last entry.
isaacg
fonte
3

C #, 525 474 bytes

Edit: Saved 51 Bytes graças a @steenbergh

Não é bonito, mas funciona ...

Golfe:

string W(string s){var l=s.Length;var a=new char[2*l+1,2*l+1];int x=2*l/2;int y=2*l/2;int d=0;for(int i=0;i<l;i++){switch(char.ToUpper(s[i])){case'U':d=3;break;case'D':d=1;break;case'L':d=2;break;case'R':d=0;break;}a[y,x]=s[i];switch(d){case 0:x+=1;break;case 1:y+=1;break;case 2:x-=1;break;case 3:y-=1;break;}}string o="";for(int i=0;i<2*l+1;i++){string t="";for(int j=0;j<2*l+1;j++)t+=a[i,j]+"";o+=t==string.Join("",Enumerable.Repeat('\0',2*l+1))?"":(t+"\r\n");}return o;}

Ungolfed:

public string W(string s)
{
  var l = s.Length;
  var a = new char[2 * l + 1, 2 * l + 1];
  int x = 2 * l / 2;
  int y = 2 * l / 2;
  int d = 0;
  for (int i = 0; i < l; i++)
  {
    switch (char.ToUpper(s[i]))
    {
      case 'U':
        d = 3;
        break;
      case 'D':
        d = 1;
        break;
      case 'L':
        d = 2;
        break;
      case 'R':
        d = 0;
        break;
    }
    a[y, x] = s[i];
    switch (d)
    {
      case 0:
        x += 1;
        break;
      case 1:
        y += 1;
        break;
      case 2:
        x -= 1;
        break;
      case 3:
        y -= 1;
        break;
    }
  }
  string o = "";
  for (int i = 0; i < 2 * l + 1; i++)
  {
    string t = "";
    for (int j = 0; j < 2 * l + 1; j++)
      t += a[i, j] + "";
    o += t == string.Join("", Enumerable.Repeat('\0', 2 * l + 1)) ? "" : (t + "\r\n");
  }
  return o;
}

Explicação:

Usa uma matriz bidimensional e o dvalor para incrementar a posição da matriz na direção da correção, em que os valores de d são:

0 => RIGHT
1 => DOWN
2 => LEFT
3 => UP

Teste:

var walkTheWords = new WalkTheWords();
Console.WriteLine(walkTheWords.W("codegolf and programming puzzles"));

                            cod                              
                              e                              
                              g                              
                              o                              
                         dna fl    sel                       
                                     z                       
                         p           z                       
                         rogramming pu  
Pete Arden
fonte
você pode remover o segundo interruptor completely.In primeiro interruptor de onde você escreve d=0;, substitua esta declaração pela declaração em segundo interruptor case 0:declaração e fazer semelhante a outros casos e você pode não precisar de um segundo switch.And finalmente remover esta declaração a[y,x]=s[i]e gravá-lo no topo do primeiro interruptor.
Mukul Kumar
@MukulKumar Boa ideia, não consigo fazê-lo funcionar. Eu tentei fazê-lo em um switch inicialmente. Ele precisa permanecer na configuração atual do comutador duplo! :)
Pete Arden
você escreveu a[y,x]=s[i]antes da primeira troca?
Mukul Kumar 14/11
2
Você pode usar switch(s[i].toLowerCase())(ou qual é o equivalente em c # ...) e remover todas as maiúsculas. Deve salvar alguns bytes.
amigos estão
1
@steenbergh Obrigado, grandes economias por lá! Não, você não pode diretamente ToUpper()porque não é charum string. As escolhas são s[i].ToString().ToUpper()ou char.ToUpper(s[i])- acho que a charmais curta. Cheers :) #
22416 Pete Arden #
3

JavaScript (ES6), 218 220 232

Editar Eu estava usando ue tpara acompanhar a posição superior e mais à esquerda, mas percebi que isso tnão é necessário.

w=>[...w].map(c=>u=(((g[y]=g[y]||[])[x]=c,n=parseInt(c,36)|0)-21&&n-27?a=n-13?n-30?a:!(b=-1):!(b=1):(b=0,a=n/3-8),y+=b,x+=a)<u?x:u,a=1,b=0,x=y=u=w.length,g=[])+g.map(r=>[...r.slice(u)].map(c=>z+=c||' ',z+=`
`),z='')&&z

Menos golfe

w=>{
  a = 1, b = 0;
  x = y = u = w.length;
  g = [];
  [...w].map(c => (
    r = g[y]||[],
    r[x] = c,
    g[y] = r,
    n = parseInt(c,36)|0,
    n-21 && n-27 ? n-13 && n-30?0 : (a=0, b=n-13?-1:1) : (b=0, a=n/3-8),
    x += a, u = x<u? x : u,
    y += b
  ))
  z=''
  g.map(r=>[...r.slice(u)].map(c=>z += c||' ', z += '\n'))
  return z
}             

Teste

F=
w=>[...w].map(c=>u=(((g[y]=g[y]||[])[x]=c,n=parseInt(c,36)|0)-21&&n-27?a=n-13?n-30?a:!(b=-1):!(b=1):(b=0,a=n/3-8),y+=b,x+=a)<u?x:u,a=1,b=0,x=y=u=w.length,g=[])+g.map(r=>[...r.slice(u)].map(c=>z+=c||' ',z+=`
`),z='')&&z

function update() {
  w=I.value
  O.textContent=F(w)
}

update()
#I {width:90%}
<input id=I value='It is in my humble opinion that standard text is boring. Therefore I propose a new writing standard, walking words!' oninput='update()'>
<pre id=O></pre>

edc65
fonte
3

05AB1E , 27 26 25 23 22 bytes

Economizou 3 bytes graças ao Grimy

ā¤‹>Šε’uχ’slkDÈiV}Y}Λ

Experimente online!

Explicação

ā                        # push [1 ... len(input)]
 ¤‹                      # check each number if its less than the max
   >                     # increment
                         # results in a list as long as the input where each number is 2 
                         # apart from the last one, this is the lengths to draw
    Š                    # move 2 copies of the input to the top of the stack
                         # the first one is the string to draw
     ε              }    # for each char in the second copy
      ’uχ’slk           # get the chars index in "ubridal"
              D          # duplicate
               Èi }      # if the index is even
                 V       # store it in Y
                   Y     # push Y (initially 2)
                         # this gives us the list of directions
                     Λ   # draw everything on the canvas
Emigna
fonte
1
"noivas" é uma palavra do dicionário. -1 . EDIT: faça isso -2 .
Grimmy
@Grimy: Gostaria de saber se o dicionário poderia ser usado aqui, mas isso é realmente inteligente!
Emigna
22
Grimmy
2

Javascript, 4̶6̶6̶, 455, 433 bytes

Edições: 11 bytes salvos, graças ao usuário 1000000000 10 ou mais salvos, graças ao user2428118 Também foram removidos alguns pontos e vírgulas desnecessários.

Tenho certeza de que isso pode ser ainda mais jogado, mas não consegui administrá-lo. Eu ainda sou novo, então qualquer conselho é muito apreciado :)

z=a=>{b=c=0;j=[[]];d='';a.split``.forEach(g=>{h=g.toLowerCase();if('ruld'.includes(h)){d=h}f=x=>new Array(x[0].length).fill` `;switch(d){case 'l':if(!b){j.forEach(e => e.unshift` `);++b}j[c][b--]=g;break;case 'u':if(!c){j.unshift(f(j));++c}j[c--][b]=g;break;case 'd':if(c == j.length-1){j.push(f(j))}j[c++][b]=g;break;default:if(b==(j[0].length-1)){j.forEach(row=>row.push` `)}j[c][b++] = g;break}});j.forEach(x=>console.log(x.join``))}
<input id="a"> </input>
<input type="submit" onclick="z(document.getElementById('a').value);"/>

Ungolfed:

z=a=>{
b=c=0;
j=[[]];
d='';
a.split``.forEach(g=>{
    h=g.toLowerCase();
    if('ruld'.includes(h)){d=h;}
    f=x=>new Array(x[0].length).fill` `;
    switch(d){
        case 'l':
            if(!b){
                j.forEach(e => e.unshift` `);
                ++b;
            }
            j[c][b--] = g;
            break;
        case 'u':
            if(!c){
                j.unshift(f(j));
                ++c;
            }
            j[c--][b] = g;
            break;
        case 'd':
            if(c == j.length-1){
                j.push(f(j));
            }
            j[c++][b] = g;
            break;
        default:
            if(b == (j[0].length-1)){
                j.forEach(row=>row.push` `);
            }
            j[c][b++] = g;
            break;
    }
});
j.forEach(x => console.log(x.join``));

}

Eu mais ou menos adotei a abordagem de:

  • Tenha uma matriz para armazenar a saída
  • Calcular a posição x e y do próximo caractere na matriz
  • Se as coordenadas estiverem fora da matriz, estenda a matriz nessa direção. Empurrando e espaço extra no final dessa linha ou adicionando outra linha completamente.
  • Criar matriz [y] [x] = caractere atual
  • imprima a matriz resultante
Jhal
fonte
Bem vindo ao site! Eu não sou especialista em JavaScript, mas isso parece muito bom.
Assistente de trigo
Bem vinda! Você pode salvar 11 bytes substituindo ['r','u','l','d']por"ruld"
0
Além disso, você não precisa do z=no início do seu programa
0
Obrigado pela dica! JS nunca deixa de me surpreender com sua conveniência.
Jhal
Você pode usar literais de modelo em vários locais para salvar alguns bytes, por exemplo a.split`` .
precisa saber é o seguinte
2

Python 3, 314 309 290 268 Bytes

x=y=0
d,m=(1,0),{}
q={'u':(0,-1),'d':(0,1),'l':(-1,0),'r':d}
for c in input():m[x,y]=c;d=q.get(c.lower(),d);x,y=x+d[0],y+d[1]
X,Y=zip(*m)
O,P=min(X),min(Y)
r,p=0,print
exec("t=~~O;exec(\"p(m.get((t,r+P),' '),end='');t+=1;\"*-~abs(max(X)-O));r+=1;p();"*-~abs(max(Y)-P))

Eu tentei executar o meu programa como entrada para o meu programa com alguns resultados interessantes. Hah, tente interpretar isso, Python!

Raspado 5 bytes - elogios a Jack Bates.

23 bytes levados embora pela Kundor

Nota: Acho que houve algum erro de medição nos meus bytes devido ao uso de editores diferentes. No entanto, tenho certeza de que o último está correto.

Lord Ratte
fonte
Você pode remover 5 bytes substituindo 'r':(1,0)por 'r':de removendo o espaço em w[a] for. Também isso é loucura !!! Quanto tempo isso levou?
@JackBates Um dia, entre o trabalho. Eu fico um pouco obsessivo.
Lord Ratte
Não todos nós? Esse é o objetivo da codificação!
Eu acredito que você pode substituir toda essa X,Y=map(...)linha por X,Y=zip(*m). Trabalha aqui. ( *mDescompacta a uma lista de suas chaves, e zip reagrupa-los para duas tuplas.)
Nick Matteo
Você também pode colocar o loop for em uma linha para salvar quatro bytes.
Nick Matteo
2

PHP, 23822320420 bytes

12 bytes salvos por Jörg (em striposvez de preg_match), 1 byte + chaves levando à frente da nova linha à direita, 16 + chaves jogadas a partir da mudança de direção, mais 1 com ternário em vez deif .

for($m=$d=1;$o=ord($c=$argn[$i++]);$m=min($m,$x),$n=max($n,$x))stripos(_ulrd,$r[$y+=$e][$x+=$d]=$c)?$d=($e=[1,-1][$o&11])?0:$o%4-1:0;ksort($r);foreach($r as$s)for($i=$m-print"\n";$i++<$n;)echo$s[$i]??" ";

Executar como tubo com php -nR '<code>' ou experimente online .

demolir

for($m=$d=1;                    # init max index and x-offset to 1
    $o=ord($c=$argn[$i++]);     # loop through characters
    $m=min($m,$x),$n=max($n,$x))    # 3. adjust min and max x offset
    stripos(_ulrd,
        $r[$y+=$e][$x+=$d]=$c       # 1. move cursor; add character to grid
    )?                              # 2. if direction change
        $d=(
            $e=[1,-1][$o&11]            # set y direction
        )
        ?0:$o%4-1                       # set x direction
    :0;

ksort($r);              # sort rows by index
foreach($r as$s)        # loop through rows
    for($i=$m-print"\n";    # print newline, reset $i
        $i++<$n;)           # loop $i from min index to max index
        echo$s[$i]??" ";        # print character, space if empty
Titus
fonte
1
Se eu strspn($r[$y+=$e][$x+=$d]=$c,udlruDLR)vir esse direito, deve salvar alguns bytes em vez de usar o regex, ´stripos (_ulrd, $ r [$ y + = $ e] [$ x + = $ d] = $ c) `deve ser melhor como strspn $argnsalvar 3 bytes
Jörg Hülsermann
@ JörgHülsermann Você está me perseguindo? : D Você está certo.
Titus
Ninguém editou sua postagem hoje e vi sua resposta e vi que você pode torná-la mais curta. Lamentamos que a melhoria não seja tão grande que você possa vencer a resposta do JS. Faz feliz e orgulhoso se eu posso encontrar alguns bytes em suas respostas, mas eu não pesquisar nestes casos
Jörg Hülsermann
@ JörgHülsermann Não se preocupe; Encontrei outros 21 bytes além do seu 12. Obrigado por me fazer revisitar isso.
Titus
Mais de 10% é legal
Jörg Hülsermann 9/17
2

Java 10, 288 286 280 263 bytes

s->{int l=s.length(),x=l,y=l,d=82,A=x,B=y;var r=new char[l+=l][l];for(var c:s.toCharArray()){A=x<A?x:A;B=y<B?y:B;r[x][y]=c;c&=~32;d="DLRU".contains(""+c)?c:d;x+=5-d/14;y+=3-(d^16)/23;}s="";for(x=A;x<l;x++,s+="\n")for(y=B;y<l;y++)s+=r[x][y]<1?32:r[x][y];return s;}

-17 bytes graças a @Grimy .

Explicação:

Experimente aqui. (OBSERVAÇÃO: removo todos os espaços à direita / novas linhas para tornar a saída um pouco mais compacta. Sinta-se à vontade para remover .replaceAll("(m?)\\s+$","")o testmétodo no método para ver o resultado real.)

s->{                              // Method with String as both parameter and return-type
  int l=s.length(),               //  Length of input String
      x=l,y=l,                    //  x,y coordinates, starting at `l`,`l`
      d=82,                       //  Direction, starting towards the right
      A=x,B=y;                    //  Min x & y values to remove leading spaces at the end
  var r=new char[l+=l][l];        //  character-matrix, with size `l`+`l` by `l`+`l`
  for(var c:s.toCharArray()){     //  Loop over the characters of the input String:
    A=x<A?x:A;                    //   Adjust minimum x `A` if necessary
    B=y<B?y:B;                    //   Adjust minimum y `B` if necessary
    r[x][y]=c;                    //   Fill x,y with the current character
    c&=~32;                       //   Make character uppercase if it isn't yet
    d="DLRU".contains(""+c)?c:d;  //   Change the direction if necessary
    x+=5-d/14;                    //   Set the next x coordinate based on the direction
    y+=3-(d^16)/23;}              //   Set the next y coordinate based on the direction
  s="";                           //  After the loop: create an empty result-String
  for(x=A;x<l;x++,                //  Loop `x` in the range [`A`, `l`):
      s+="\n")                    //    And append a new-line after every iteration
    for(y=B;y<l;y++)              //   Inner loop `y` in the range [`B`, `l`):
      s+=r[x][y]<1?               //    If the cell at x,y is empty:
          32                      //     Append a space to the result-String
         :r[x][y];                //    Else: append the character to the result-String
  return s;}                      //  After the nested loop: teturn result-String
Kevin Cruijssen
fonte
1
d<69?1:d>84?-1:0pode ser5-d/14
Grimmy
1
E na mesma linha, d==82?1:d==76?-1:0pode ser3-(d^16)/23
Grimmy
@ Grimy Obrigado. Eu sabia que essas duas partes poderiam de alguma forma ser jogadas de golfe, mas sou muito ruim nessas transformações bit a bit / aritméticas, então não me incomodei em tentar. Obrigado pelos -17 bytes! :)
Kevin Cruijssen
1

Perl, 204 + 3 = 207 bytes

+3 para -F

O espaço em branco não faz parte do código e é fornecido para legibilidade.

%p=(d,1,l,2,u,3,r,$x=$y=0);
for(@F){
    $m{"$x,$y"}=$_;
    $g=$p{lc$_}if/[dlur]/i;
    $g%2?($y+=2-$g):($x+=1-$g);
    ($a>$x?$a:$b<$x?$b:$x)=$x;
    ($c>$y?$c:$d<$y?$d:$y)=$y
}
for$k($c..$d){
    print($m{"$_,$k"}||$")for$a..$b;
    say""
}

Semelhante à minha solução para o desafio do Fizz Buzz, eu crio um hash com coordenadas x, y para cada etapa do caminho, mantendo os máximos e mínimos das coordenadas x e y armazenadas, depois passo e imprimo tudo.

Se estiver desesperado , talvez consiga transformar as três últimas linhas do primeiro forloop em uma única declaração nojenta que possa salvar um byte ou dois, mas não estou ansioso pelo resultado completamente ilegível.

Gabriel Benamy
fonte
1

Excel VBA, 205 bytes

Sub t(a)
Z=1:x=70:y=x:For i=1 To Len(a)
s=Mid(a,i,1):Cells(y,x).Value=s:Select Case LCase(s)
Case "l":Z=-1:w=0
Case "d":Z=0:w=1
Case "r":Z=1:w=0
Case "u":Z=0:w=-1
End Select:x=x+Z:y=y+w:Next:End Sub

Estou meio surpreso com a capacidade do Excel de competir com as respostas existentes. Funciona porque we zacompanha a direção.

steenbergh
fonte
posição inicial 70 pode não ser suficiente. Além disso, espaços à esquerda não são permitidos
edc65
1

SmileBASIC, 148 146 bytes

DEF W M,S,T
WHILE""<M
A=INSTR(@DLURdlur,M[0])*PI()/2IF A>0THEN S=COS(A)T=SIN(A)
X=CSRX+S
Y=CSRY+T?SHIFT(M);
SCROLL-!X,-!Y
LOCATE!X+X,Y+!Y
WEND
END

Chame a função com W "text",vx,vy, em que vx e vy é a direção no início (o padrão é 1,0)

12Me21
fonte
O que acontece quando X ou Y é menor que 0?
edc65
Agora ele rolará todo o texto quando o cursor sair da tela.
12Me21
0

Swift 3, 283 bytes

func w(a:String){var t=a.characters,d=t.count,c=Array(repeating:Array(repeating:" ",count:d*2),count:d*2),i=d,j=d,l=["d":(1,0),"u":(-1,0),"l":(0,-1),"r":(0,1)],e=(0,1)
t.map{c[i][j]="\($0)"
e=l["\($0)".lowercased()] ?? e
i+=e.0
j+=e.1}
c.map{$0.map{print($0,terminator:"")};print()}}

Ungolfed

func w(a:String){
    var t=a.characters,d=t.count,c=Array(repeating:Array(repeating:" ",count:d*2),count:d*2),i=d,j=d,l=["d":(1,0),"u":(-1,0),"l":(0,-1),"r":(0,1)],e=(0,1)
    t.map{
        c[i][j]="\($0)"
        e=l["\($0)".lowercased()] ?? e
        i+=e.0
        j+=e.1
    }
    c.map{
        $0.map{
            print($0,terminator:"")
        };
        print()
    }
}

Atenção

Entrada mais longa requer tela maior. A saída não tem tratamento para linhas / colunas "vazias", como eu entendi que é aceitável pelas regras do desafio.

Rant

  • Nova linha sendo o terminador padrão para print sux
  • Nenhuma maneira simples de criar uma matriz de tamanho conhecido destruiu a pontuação.
Otávio
fonte