Đi bộ từ!


33

Theo ý kiến ​​khiêm tốn của tôi, văn bản tiêu chuẩn là nhàm chán. Vì vậy, tôi đề xuất một tiêu chuẩn viết mới, đi bộ từ!

Lời nói đi bộ

Từ đi bộ là những từ sẽ đáp ứng với các nhân vật nhất định. Với mục đích của thử thách này, các nhân vật kích hoạt là [u, d, r, l]từ up down right left.

Bất cứ khi nào bạn gặp một ký tự như vậy khi in văn bản, bạn sẽ di chuyển hướng của văn bản.
Ví dụ: văn bản abcdefsẽ dẫn đến:

abcd
   e
   f

Quy tắc

  • Cả chữ hoa UDRLvà chữ thường udrlnên thay đổi hướng, nhưng trường hợp nên được giữ nguyên ở đầu ra
  • Đầu vào sẽ chỉ chứa các ký tự có thể in (0-9, A-Z, a-z, !@#%^&*() etc...), không có dòng mới!
  • Bất cứ khi nào văn bản sẽ va chạm, nó sẽ ghi đè lên ký tự cũ ở vị trí đó
  • Đầu ra phải được trình bày cho người dùng trong bất kỳ vấn đề thời trang nào, nhưng nó phải là một đầu ra duy nhất (không có mảng dòng)
  • Trailing và hàng đầu mới được cho phép
  • Không gian lưu trữ được cho phép
  • Áp dụng sơ hở tiêu chuẩn

Các trường hợp thử nghiệm

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
                                       !

Đây là , mã ngắn nhất tính bằng byte thắng!


4
Định dạng này có vấn đề mất dữ liệu nghiêm trọng ...: p
Mukul Kumar

Được không gian hàng đầu / dấu được cho phép?
Arnauld

@Arnauld Miễn là họ không làm phiền vị trí của các nhân vật. Vì vậy, rất có thể chỉ là dấu cách
Bassdrop Cumberwubwubwub

1
Làm thế nào đầu ra của từ golfnhìn chính nó?
gabe3886

2
@ gabe3886gfl
Bassdrop Cumberwubwubwub

Câu trả lời:


4

Than , 29 27 20 19 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

FS«

Lặp lại các ký tự đầu vào.

F№rdlu↧ι

Nếu thư hiện tại là một hướng ...

≔ιω

sau đó cập nhật hướng đi bộ hiện tại.

✳∨ωrι

In ký tự theo hướng đi bộ hiện tại, mặc định sang phải nếu chưa có hướng nào được đặt.


1
@Veskah Đáng lẽ phải là a . Xin lỗi vì điều đó.
Neil

7

APL Dyalog , 63 byte

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

sử dụng ⎕IO←0và các tính năng từ v16 ( @)

n←≢s←⍞đầu vào thô svà chiều dài của nón

⍴∘'',⍨2×n tạo ma trận 2n x 2n không gian

s@(...)sửa đổi ma trận với các ký tự stại các chỉ số (cặp) được chỉ định

làm thế nào các chỉ số được tính toán:

¯1↓s thả char cuối cùng của s

'rdluRDLU'⍳'mã hóa 'r'thành 0, 'd'như 1, v.v; ký tự khác là 8

0, trả trước 0

(8∘≠⍴¨⊢) biến mỗi 8 thành một danh sách trống, tất cả những thứ khác thành một danh sách 1 yếu tố

,⍨\tích lũy hoán đổi hoán đổi ( abcd-> a ba cba dcba)

⊃¨ đầu tiên từ mỗi

0j1* hằng số tưởng tượng i với sức mạnh của

+\ tổng tích lũy

11 9∘○¨phần thực và tưởng tượng từ mỗi phần; nhận coords trong phạm vi -n...n

n+ tập trung chúng vào ma trận lớn


3

Pyth, 68 65 byte

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

Bộ kiểm tra

Cái này sử dụng một từ điển, được lập chỉ mục bởi một cặp tọa độ, được cập nhật dưới dạng đọc đầu vào, sau đó được in ở cuối. Nó cũng sử dụng một tấn các thủ thuật đánh golf thông minh.

Đây là cách tôi viết nó, sử dụng -mcờ của trình thông dịch để xóa khoảng trắng và các bình luận trước khi chạy:

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.

3

C #, 525 474 byte

Chỉnh sửa: Đã lưu 51 Byte nhờ @steenbergh

Nó không đẹp, nhưng nó hoạt động ...

Chơi gôn

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;}

Ung dung:

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;
}

Giải trình:

Sử dụng một mảng hai chiều và dgiá trị để tăng vị trí của mảng theo hướng hiệu chỉnh, trong đó các giá trị d là:

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

Kiểm tra:

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

                            cod                              
                              e                              
                              g                              
                              o                              
                         dna fl    sel                       
                                     z                       
                         p           z                       
                         rogramming pu  

bạn có thể loại bỏ hoàn toàn công tắc thứ hai. Trong công tắc đầu tiên nơi bạn viết d=0;, thay thế câu lệnh này bằng câu lệnh trong case 0:câu lệnh chuyển đổi thứ hai và thực hiện tương tự với các trường hợp khác và bạn có thể không cần công tắc thứ hai. Cuối cùng hãy xóa câu lệnh này a[y,x]=s[i]và viết nó lên trên của công tắc đầu tiên.
Mukul Kumar

@MukulKumar Ý tưởng hay, tôi không thể làm cho nó hoạt động được. Tôi đã cố gắng để làm điều đó trong một chuyển đổi ban đầu. Nó phải ở trong cấu hình chuyển đổi kép hiện tại của nó! :)
Pete Arden

bạn đã viết a[y,x]=s[i]trước khi chuyển đổi đầu tiên?
Mukul Kumar

2
Bạn có thể sử dụng switch(s[i].toLowerCase())(hoặc những gì tương đương với c # ...) và sau đó xóa tất cả các chữ hoa. Nên lưu một số byte.
steenbergh

1
@steenbergh Cảm ơn, tiết kiệm lớn đấy! Không, bạn không thể trực tiếp ToUpper()vì nó charkhông phải là a string. Các lựa chọn là s[i].ToString().ToUpper()hoặc char.ToUpper(s[i])- Tôi nghĩ rằng charcái đó ngắn hơn một chút. Chúc mừng :)
Pete Arden

3

JavaScript (ES6), 218 220 232

Chỉnh sửa Tôi đã sử dụng utđể theo dõi vị trí trên cùng và bên trái, nhưng tôi nhận ra rằng tkhông cần thiết chút nào

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

Ít chơi gôn

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
}             

Kiểm tra

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>


3

05AB1E , 27 26 25 23 22 byte

Đã lưu 3 byte nhờ Grimy

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

Hãy thử trực tuyến!

Giải trình

ā                        # 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

1
"Cô dâu" là một từ trong từ điển. -1 . EDIT: làm cho -2 .
Grimmy

@Grimy: Tôi tự hỏi nếu từ điển có thể được sử dụng ở đây, nhưng điều đó thực sự thông minh!
Emigna


2

Javascript, 4̶6̶6̶, 455, 433 byte

Chỉnh sửa: Đã lưu 11 byte, nhờ người dùng 1000000000 10 hoặc hơn, nhờ người dùng2428118 Cũng xóa một số dấu chấm phẩy không cần thiết.

Tôi khá chắc chắn rằng điều này có thể được chơi gôn hơn nữa, nhưng tôi không thể quản lý nó. Tôi vẫn còn hoàn toàn mới, vì vậy mọi lời khuyên đều được đánh giá cao :)

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);"/>

Ung dung:

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

}

Tôi ít nhiều đã sử dụng cách tiếp cận của:

  • Có một mảng để lưu trữ đầu ra
  • Tính vị trí x và y của ký tự tiếp theo trong mảng
  • Nếu tọa độ sắp ở ngoài mảng, hãy mở rộng mảng theo hướng đó. Hoặc bằng cách đẩy và thêm không gian vào cuối hàng đó hoặc thêm một hàng khác hoàn toàn.
  • Tạo mảng [y] [x] = ký tự hiện tại
  • in mảng kết quả

Chào mừng đến với trang web! Tôi không phải là một chuyên gia về JavaScript nhưng điều này có vẻ khá tốt.
Thuật sĩ lúa mì

Chào mừng bạn Bạn có thể lưu 11 byte bằng cách thay thế ['r','u','l','d']bằng"ruld"
0 '

Ngoài ra, bạn không cần z=khi bắt đầu chương trình của mình
0 '

Cảm ơn vì tiền hỗ trợ! JS không bao giờ hết ngạc nhiên với sự tiện lợi của nó.
Jhal

Bạn có thể sử dụng văn bản mẫu ở một số nơi để lưu một số byte, ví dụ a.split`` .
dùng2428118

2

Python 3, 314 309 290 268 byte

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

Tôi đã thử chạy chương trình của tôi như là đầu vào cho chương trình của tôi với một số kết quả thú vị. Hah, hãy thử diễn giải điều đó, Python!

Cạo 5 byte - lời khen cho Jack Bates.

23 byte bị đánh bại bởi kundor

Lưu ý: Tôi nghĩ rằng có một số lỗi đo lường với byte của tôi do sử dụng các trình soạn thảo khác nhau. Tuy nhiên, tôi khá chắc chắn rằng cái mới nhất là chính xác.


Bạn có thể xóa 5 byte bằng cách thay thế 'r':(1,0)bằng 'r':dvà xóa khoảng trắng tại w[a] for. Ngoài ra điều này là điên rồ !!! Điều này đã làm bạn mất bao lâu?

@JackBates Một ngày, giữa công việc. Tôi có một chút ám ảnh.
Lord Ratte

Không phải tất cả chúng ta sao? Đó là toàn bộ quan điểm của tiền mã hóa!

Tôi tin rằng bạn có thể thay thế toàn bộ X,Y=map(...)dòng với X,Y=zip(*m). Hoạt động ở đây. ( *mgiải nén nó vào danh sách các khóa của nó và zip tập hợp chúng lại thành hai bộ.)
Nick Matteo

Bạn cũng có thể đặt vòng lặp for trên một dòng để lưu bốn byte.
Nick Matteo

2

PHP, 238 223 205 204 byte

12 byte được lưu bởi Jörg ( striposthay vì preg_match), 1 byte + niềng răng bằng cách dẫn thay vì theo dõi dòng mới, 16 + niềng răng được thay đổi từ hướng thay đổi, thêm 1 lần với ternary thay vì if.

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]??" ";

Chạy như ống với php -nR '<code>'hoặc thử trực tuyến .

phá vỡ

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

1
Nếu tôi thấy điều này đúng strspn($r[$y+=$e][$x+=$d]=$c,udlruDLR)thì nên lưu một số byte thay vì sử dụng regex, ´strstripos (_ulrd, $ r [$ y + = $ e] [$ x + = $ d] = $ c) `nên tốt hơn vì strspn $argnlưu 3 Byte
Jörg Hülsermann

@ JörgHülsermann Bạn đang theo dõi tôi? : D Bạn có thể đúng.
Tít

Không ai đã chỉnh sửa bài viết của anh ấy hôm nay và tôi đã thấy câu trả lời của bạn và tôi thấy rằng bạn có thể làm cho nó ngắn hơn. Xin lỗi về việc cải tiến không tuyệt vời đến mức bạn có thể đánh bại câu trả lời của JS. Thật hạnh phúc và tự hào nếu tôi có thể tìm thấy một số byte trong câu trả lời của bạn nhưng tôi không tìm kiếm trường hợp này
Jörg Hülsermann

@ JörgHülsermann Don miếngt lo lắng; Tôi đã tìm thấy 21 byte khác ngoài 12. Cảm ơn vì đã khiến tôi xem lại điều này.
Tít

Hơn 10 phần trăm là tốt
Jörg Hülsermann

2

Java 10, 288 286 280 263 byte

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 byte nhờ @Grimy .

Giải trình:

Hãy thử nó ở đây. (LƯU Ý: Tôi xóa tất cả các dấu cách / dòng mới để làm cho đầu ra nhỏ gọn hơn một chút. Hãy thoải mái loại bỏ .replaceAll("(m?)\\s+$","")trong test-method để xem kết quả thực tế.)

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

1
d<69?1:d>84?-1:0có thể5-d/14
Grimmy

1
Và trong cùng một tĩnh mạch, d==82?1:d==76?-1:0có thể là3-(d^16)/23
Grimmy

@Grimy Cảm ơn. Tôi biết hai phần đó bằng cách nào đó có thể được chơi gôn, nhưng tôi khá tệ ở những phép biến đổi bit / số học đó, vì vậy tôi không buồn thử. Cảm ơn vì -17 byte! :)
Kevin Cruijssen

1

Perl, 204 + 3 = 207 byte

+3 cho -F

Khoảng trắng không phải là một phần của mã và được cung cấp cho mức độ dễ đọc.

%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""
}

Tương tự như giải pháp của tôi cho thử thách Fizz Buzz, tôi tạo hàm băm với tọa độ x, y cho mỗi bước trên đường đi, giữ mức tối đa và tối thiểu của tọa độ x và y được lưu trữ, sau đó lặp qua và in mọi thứ ra.

Nếu tôi tuyệt vọng, tôi có thể biến ba dòng cuối cùng của forvòng lặp đầu tiên thành một câu lệnh kinh tởm duy nhất có thể tiết kiệm một hoặc hai byte, nhưng tôi không mong đợi kết quả hoàn toàn không thể đọc được.


1

VBA Excel, 205 byte

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

Tôi hơi ngạc nhiên về khả năng của Excel để cạnh tranh với các câu trả lời hiện có. Nó hoạt động bởi vì wztheo dõi hướng.


vị trí bắt đầu 70 có thể không đủ. Hơn nữa, không gian hàng đầu không được phép
edc65

1

SmileBASIC, 148 146 byte

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

Gọi hàm với W "text",vx,vy, trong đó vx và vy là hướng khi bắt đầu (mặc định là 1,0)


Điều gì xảy ra khi X hoặc Y nhỏ hơn 0?
edc65

Bây giờ nó sẽ cuộn tất cả các văn bản khi con trỏ đi ra khỏi màn hình.
12Me21

0

Swift 3, 283 byte

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

Bị đánh cắp

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

Cảnh báo

Đầu vào dài hơn sẽ yêu cầu màn hình lớn hơn. Đầu ra không có cách xử lý cho hàng / cột "trống" vì tôi hiểu rằng có thể chấp nhận được bởi các quy tắc của thử thách.

Rant

  • Dòng mới là bộ kết thúc mặc định cho printsux
  • Không có cách đơn giản để tạo ra một mảng có chiều dài đã biết phá hủy điểm số.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.