เดินคำ!


33

ฉันคิดว่าข้อความมาตรฐานน่าเบื่อหน่าย ดังนั้นฉันจึงเสนอมาตรฐานการเขียนใหม่คำพูดที่เดินได้!

เดินคำ

เดินคำเป็นคำที่จะตอบสนองต่อตัวละครบางอย่าง สำหรับวัตถุประสงค์ของการท้าทายนี้ตัวละครทริกเกอร์ที่มีจาก[u, d, r, l]up down right left

เมื่อใดก็ตามที่คุณพบอักขระเช่นนี้เมื่อพิมพ์ข้อความคุณจะย้ายทิศทางของข้อความ
ตัวอย่างเช่นข้อความabcdefจะส่งผลให้:

abcd
   e
   f

กฎระเบียบ

  • ทั้งตัวพิมพ์ใหญ่UDRLและตัวพิมพ์เล็กudrlควรเปลี่ยนทิศทาง แต่ควรเก็บเคสไว้ในเอาต์พุต
  • ข้อมูลที่ป้อนจะมีอักขระที่พิมพ์ได้(0-9, A-Z, a-z, !@#%^&*() etc...)เท่านั้นไม่มีการขึ้นบรรทัดใหม่!
  • เมื่อใดก็ตามที่ข้อความจะชนกันมันจะเขียนทับตัวละครเก่าที่ตำแหน่งนั้น
  • ควรแสดงผลลัพธ์ให้กับผู้ใช้ในทุกเรื่องที่เป็นที่นิยม แต่ควรเป็นเอาต์พุตเดี่ยว (ไม่ต้องเรียงแถว)
  • อนุญาตให้ขึ้นบรรทัดใหม่และลากขึ้นบรรทัดใหม่ได้
  • อนุญาตให้เว้นวรรคต่อท้าย
  • ช่องโหว่มาตรฐานใช้

กรณีทดสอบ

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
                                       !

นี่คือรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!


4
รูปแบบนี้มีปัญหาการสูญเสียข้อมูลอย่างรุนแรง ... : p
Mukul Kumar

อนุญาตให้นำหน้า / ต่อท้ายช่องว่างได้หรือไม่
Arnauld

@Annauld ตราบใดที่พวกเขาไม่รบกวนตำแหน่งของตัวละครที่พวกเขาเป็น ดังนั้นน่าจะเป็นเพียงแค่ช่องว่างต่อท้าย
Bassdrop Cumberwubwubwub

1
ผลลัพธ์ของคำจะgolfดูด้วยตัวเองอย่างไร
gabe3886

2
@ gabe3886gfl
Bassdrop Cumberwubwubwub

คำตอบ:


4

Charcoal , 29 27 20 19 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

FS«

วนซ้ำอักขระที่ป้อนเข้า

F№rdlu↧ι

หากจดหมายปัจจุบันเป็นทิศทาง ...

≔ιω

จากนั้นอัปเดตทิศทางการเดินปัจจุบัน

✳∨ωrι

พิมพ์ตัวอักษรในทิศทางการเดินปัจจุบันเริ่มต้นไปทางขวาหากยังไม่ได้กำหนดทิศทาง


1
@Veskah ถูกควรจะเป็น ขอโทษสำหรับเรื่องนั้น.
Neil

7

Dyalog APL , 63 ไบต์

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

การใช้งาน⎕IO←0และคุณสมบัติต่างๆจาก v16 ( @)

n←≢s←⍞อินพุตดิบsและความยาวของมันn

⍴∘'',⍨2×n สร้างเมทริกซ์ของช่องว่าง 2n คูณ 2n

s@(...)แก้ไขเมทริกซ์ด้วยอักขระของsที่ดัชนี (คู่) ที่ระบุ

วิธีคำนวณดัชนี:

¯1↓s ปล่อยถ่านสุดท้ายของ s

'rdluRDLU'⍳'เข้ารหัส'r'เป็น 0, 'd'เป็น 1, ฯลฯ ตัวอักษรอื่น ๆ เป็น 8

0, เติม 0

(8∘≠⍴¨⊢) เปลี่ยนทุก 8 ให้เป็นรายการที่ว่างเปล่าและอื่น ๆ ทั้งหมดเป็นรายการ 1 องค์ประกอบ

,⍨\การต่อข้อมูลที่สลับกันแบบสะสม ( abcd-> a ba cba dcba)

⊃¨ ครั้งแรกจากแต่ละ

0j1* ค่าคงตัวจินตภาพ i ต่ออำนาจของ

+\ ผลรวมสะสม

11 9∘○¨ส่วนจริงและจินตภาพจากแต่ละ; รับ coords ในช่วง-n...n

n+ จัดศูนย์กลางไว้ที่เมทริกซ์ขนาดใหญ่


3

Pyth, 68 65 ไบต์

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

ชุดทดสอบ

สิ่งนี้ใช้พจนานุกรมจัดทำดัชนีโดยพิกัดหนึ่งคู่ที่อัปเดตเป็นอินพุตที่อ่านแล้วพิมพ์ออกมาในตอนท้าย นอกจากนี้ยังใช้เทคนิคการตีกอล์ฟที่ชาญฉลาดมากมาย

นี่คือวิธีที่ฉันเขียนโดยใช้-mธงของล่ามเพื่อตัดช่องว่างและความคิดเห็นก่อนเรียกใช้:

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 Bytes

แก้ไข: บันทึกแล้ว 51 ไบต์ขอบคุณ @steenbergh

มันไม่สวย แต่ใช้งานได้ ...

แข็งแรงเล่นกอล์ฟ:

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

คำอธิบาย:

ใช้อาร์เรย์สองมิติและdค่าเพื่อเพิ่มตำแหน่งของอาร์เรย์ในทิศทางการแก้ไขโดยที่ค่า d คือ:

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

ทดสอบ:

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

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

คุณสามารถลบสวิตช์ที่สองอย่างสมบูรณ์ในสวิตช์แรกที่คุณเขียนd=0;แทนที่คำสั่งนี้โดยคำสั่งในคำสั่งสวิตช์ที่สองcase 0:และทำคล้ายกับกรณีอื่น ๆ และคุณอาจไม่ต้องการสวิตช์ที่สองและสุดท้ายลบคำสั่งนี้a[y,x]=s[i]และเขียนมันไว้ด้านบน ของสวิตช์แรก
Mukul Kumar

@ MukulKumar เป็นความคิดที่ดีฉันไม่สามารถทำงานได้ ฉันพยายามที่จะทำมันในสวิตช์เดียวในตอนแรก ต้องอยู่ในการกำหนดค่าดูอัลสวิทช์ปัจจุบัน! :)
Pete Arden

คุณเขียนa[y,x]=s[i]ก่อนเปลี่ยนครั้งแรกหรือไม่
Mukul Kumar

2
คุณสามารถใช้switch(s[i].toLowerCase())(หรืออะไรคือ c # ที่เทียบเท่า ... ) จากนั้นลบตัวพิมพ์ใหญ่ทั้งหมด ควรบันทึกบางไบต์
steenbergh

1
@ steenbergh ขอบคุณออมที่สำคัญมี! ไม่มีคุณไม่สามารถโดยตรงToUpper()เพราะมันเป็นไม่ได้เป็นchar stringตัวเลือกนั้นมีอย่างใดอย่างหนึ่งs[i].ToString().ToUpper()หรือchar.ToUpper(s[i])- ฉันคิดว่าตัวเลือกcharนั้นสั้นกว่าเล็กน้อย ไชโย :)
Pete Arden

3

JavaScript (ES6), 218 220 232

แก้ไขฉันใช้uและtติดตามตำแหน่งบนสุดและซ้ายสุด แต่ฉันรู้ว่าtไม่จำเป็นเลย

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

น้อย golfed

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
}             

ทดสอบ

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 ไบต์

บันทึก 3 ไบต์ขอบคุณGrimy

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

ลองออนไลน์!

คำอธิบาย

ā                        # 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
"เจ้าสาว" เป็นคำในพจนานุกรม -1 . แก้ไข: ให้ที่-2
Grimmy

@Grimy: ฉันสงสัยว่าพจนานุกรมสามารถใช้ที่นี่ได้หรือไม่ แต่นั่นฉลาดจริงๆ!
Emigna


2

Javascript, 4̶6̶6̶, 455, 433 ไบต์

การแก้ไข: 11 ไบต์บันทึกขอบคุณผู้ใช้ 1000000000 10 หรือมากกว่านั้นบันทึกขอบคุณ user2428118 ลบเซมิโคลอนที่ไม่จำเป็นออกไปด้วย

ฉันค่อนข้างมั่นใจว่านี่สามารถเล่นกอล์ฟต่อไปได้ แต่ฉันไม่สามารถจัดการได้ ฉันยังคงเป็นสิ่งใหม่ทั้งหมดดังนั้นคำแนะนำใด ๆ ที่ชื่นชมมาก :)

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

}

ฉันใช้วิธีของ:

  • มีอาร์เรย์สำหรับเก็บเอาต์พุต
  • คำนวณตำแหน่ง x และ y ของตัวละครถัดไปในอาร์เรย์
  • หากพิกัดกำลังจะอยู่ด้านนอกของอาร์เรย์ให้ขยายอาร์เรย์ไปในทิศทางนั้น ไม่ว่าจะด้วยการกดและเพิ่มพื้นที่ว่างบนปลายแถวนั้นหรือเพิ่มแถวอื่นทั้งหมด
  • ทำให้อาร์เรย์ [y] [x] = ตัวละครปัจจุบัน
  • พิมพ์อาร์เรย์ผลลัพธ์

ยินดีต้อนรับสู่เว็บไซต์! ฉันไม่ใช่ผู้เชี่ยวชาญใน JavaScript แต่นี่ดูดีทีเดียว
ข้าวสาลีตัวช่วยสร้าง

ยินดีต้อนรับ! คุณสามารถบันทึก 11 ไบต์โดยแทนที่['r','u','l','d']ด้วย"ruld"
0 '

นอกจากนี้คุณไม่จำเป็นต้องใช้z=ตอนเริ่มต้นโปรแกรมของคุณ
0 '

ขอบคุณสำหรับทิป! JS ไม่หยุดที่จะประหลาดใจกับความสะดวกสบายของฉัน
Jhal

a.split`` คุณสามารถใช้ตัวอักษรแม่แบบที่หลายสถานที่ที่จะบันทึกไบต์บางส่วนเช่น
user2428118

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

ฉันลองใช้งานโปรแกรมเป็นอินพุตของโปรแกรมด้วยผลลัพธ์ที่น่าสนใจ หืมลองตีความดูสิว่า Python!

Shaved 5 bytes - ชมเชยกับ Jack Bates

23 ไบต์ดึงออกโดย kundor

หมายเหตุ: ฉันคิดว่ามีข้อผิดพลาดบางอย่างในการวัดด้วยไบต์ของฉันเนื่องจากใช้ตัวแก้ไขที่แตกต่างกัน อย่างไรก็ตามฉันค่อนข้างแน่ใจว่าล่าสุดถูกต้อง


คุณสามารถลบ 5 ไบต์โดยการแทนที่'r':(1,0)ด้วยและโดยการเอาพื้นที่ที่'r':d w[a] forนอกจากนี้ยังเป็นบ้า !!! คุณใช้เวลานานแค่ไหน

@JackBates วันในระหว่างการทำงาน ฉันได้รับการครอบงำเล็กน้อย
ลอร์ด Ratte

เราทุกคนไม่ได้เหรอ? นั่นคือจุดรวมของการเข้ารหัส!

ผมเชื่อว่าคุณสามารถเปลี่ยนที่ทั้งสอดคล้องกับX,Y=map(...) X,Y=zip(*m)ทำงานที่นี่ ( *mปลดมันไปที่รายการของกุญแจและซิปจัดกลุ่มใหม่พวกมันเป็นสองสิ่ง)
Nick Matteo

นอกจากนี้คุณยังสามารถใส่ for loop ในหนึ่งบรรทัดเพื่อบันทึกสี่ไบต์
Nick Matteo

2

PHP, 238 223 205 204 ไบต์

12 ไบต์บันทึกไว้โดยJörg ( striposแทนpreg_match) 1 ไบต์ + จัดฟันโดยนำแทนการขึ้นบรรทัดใหม่ต่อท้าย 16 + จัดฟันแข็งแรงเล่นกอล์ฟจากการเปลี่ยนแปลงของทิศทางมากขึ้นด้วย ternary 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]??" ";

ทำงานเป็นท่อที่มีphp -nR '<code>'หรือลองออนไลน์

ทำให้พังถล่ม

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
หากฉันเห็นสิทธินี้strspn($r[$y+=$e][$x+=$d]=$c,udlruDLR)ควรบันทึกบางไบต์แทนการใช้ regex,´stripos (_ulrd, $ r [$ y + = $ e] [$ x + = $ d] = $ c) `ควร e ดีกว่า strspn $argnบันทึก 3 Bytes
JörgHülsermann

@ JörgHülsermannคุณแอบตามฉันหรือเปล่า : D คุณถูกต้อง
Titus

ไม่มีใครแก้ไขโพสต์ของเขาในวันนี้และฉันได้เห็นคำตอบของคุณและฉันเห็นว่าคุณสามารถทำให้มันสั้นลง ขออภัยเกี่ยวกับการปรับปรุงที่ไม่ดีมากจนคุณสามารถเอาชนะคำตอบของ JS ได้ มันทำให้มีความสุขและภูมิใจถ้าฉันสามารถหาจำนวนไบต์ในคำตอบของคุณ แต่ฉันไม่ได้ค้นหากรณีนี้
JörgHülsermann

@ JörgHülsermannไม่ต้องกังวล ฉันพบอีก 21 ไบต์นอกเหนือจาก 12 ของคุณขอบคุณที่ทำให้ฉันกลับมาอีกครั้ง
ติตัส

ดีกว่าร้อยละ 10
JörgHülsermann

2

Java 10, 288 286 280 263 ไบต์

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 ไบต์ขอบคุณที่@Grimy

คำอธิบาย:

ลองที่นี่ (หมายเหตุ: ฉันลบช่องว่างต่อท้าย / บรรทัดใหม่ทั้งหมดเพื่อให้เอาต์พุตมีขนาดกะทัดรัดขึ้นเล็กน้อยรู้สึกอิสระที่จะลบ.replaceAll("(m?)\\s+$","")ในวิธีการtestเพื่อดูผลลัพธ์ที่แท้จริง)

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:0สามารถ5-d/14
Grimmy

1
และในหลอดเลือดดำเดียวกันd==82?1:d==76?-1:0สามารถ3-(d^16)/23
Grimmy

@Grimy ขอบคุณ ฉันรู้ว่าทั้งสองส่วนนั้นสามารถเล่นกอล์ฟได้ แต่ฉันค่อนข้างแย่ที่การแปลงบิต / เลขคณิตเหล่านั้นดังนั้นฉันจึงไม่ต้องพยายาม ขอบคุณสำหรับ -17 ไบต์! :)
Kevin Cruijssen

1

Perl, 204 + 3 = 207 ไบต์

+3 สำหรับ -F

ช่องว่างไม่ได้เป็นส่วนหนึ่งของรหัสและมีไว้เพื่อให้อ่านง่าย

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

เช่นเดียวกับโซลูชันของฉันสำหรับความท้าทายของ Fizz Buzz ฉันสร้างแฮชที่มีพิกัด x, y สำหรับทุกขั้นตอนตลอดทางรักษาค่าสูงสุดและต่ำสุดของพิกัด x และ y ที่เก็บไว้จากนั้นวนซ้ำและพิมพ์ทุกอย่างออกมา

หากฉันหมดหวังฉันอาจเปลี่ยนสามบรรทัดสุดท้ายของforลูปแรกให้เป็นคำสั่งที่น่าขยะแขยงที่อาจบันทึกไบต์หรือสอง แต่ฉันไม่หวังว่าจะได้ผลลัพธ์ที่อ่านไม่ได้ทั้งหมด


1

Excel VBA ขนาด 205 ไบต์

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

ฉันแปลกใจที่ความสามารถของ Excel ในการแข่งขันกับคำตอบที่มีอยู่ มันทำงานได้เพราะwและzติดตามทิศทาง


ตำแหน่งเริ่มต้น 70 อาจไม่เพียงพอ นอกจากนี้ไม่อนุญาตให้ใช้ช่องว่างนำ
edc65

1

SmileBASIC, 148 146 ไบต์

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

เรียกใช้ฟังก์ชันด้วยW "text",vx,vyโดยที่ vx และ vy คือทิศทางที่จุดเริ่มต้น (ค่าเริ่มต้นคือ 1,0)


จะเกิดอะไรขึ้นเมื่อ X หรือ Y น้อยกว่า 0
edc65

ตอนนี้มันจะเลื่อนข้อความทั้งหมดเมื่อเคอร์เซอร์ไปที่นอกจอ
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()
    }
}

การเตือน

อินพุตที่ยาวขึ้นจะต้องใช้หน้าจอที่ใหญ่ขึ้น ผลลัพธ์ไม่มีการจัดการกับแถว / คอลัมน์ "ว่าง" เนื่องจากฉันเข้าใจว่าเป็นที่ยอมรับโดยกฎของการท้าทาย

พูดจาโผงผาง

  • ขึ้นบรรทัดใหม่ว่าเป็นเทอร์มิเนเตอร์เริ่มต้นสำหรับprintsux
  • ไม่มีวิธีง่ายๆในการสร้างอาร์เรย์ของความยาวที่เป็นที่รู้จักทำลายคะแนน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.