Kelimeleri yürü!


33

Benim düşünceme göre standart metin sıkıcıdır. Bu nedenle yeni bir yazı standardı ve yürüme sözleri öneririm!

Yürüyen kelimeler

Yürüyen kelimeler, belirli karakterlere cevap verecek kelimelerdir. Bu meydan okuma amacıyla tetik karakterlerdir [u, d, r, l]dan up down right left.

Metin yazdırırken böyle bir karakterle karşılaştığınızda, metnin yönünü taşırsınız.
Örneğin, metin şöyle abcdefsonuçlanır:

abcd
   e
   f

kurallar

  • Hem büyük UDRLhem küçük harf udrlyön değiştirmeli, ancak büyük harf çıktıda korunmalıdır
  • Girdi yalnızca yazdırılabilir karakterleri içerecek (0-9, A-Z, a-z, !@#%^&*() etc...), yeni satırları olmayacak!
  • Metin ne zaman çarpışacak olursa, o konumdaki eski karakterin üzerine yazacaktır.
  • Çıktı, modaya uygun herhangi bir konuda kullanıcıya sunulmalıdır, ancak tek bir çıktı olmalıdır (satır dizisi yok)
  • İzleyen ve önde gelen yeni hatlara izin verilir
  • Sondaki boşluklara izin verilir
  • Standart boşluklar uygulanır

Test durumları

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
                                       !

Bu , bayt cinsinden en kısa kod kazanır!


4
Bu formatın ciddi bir veri kaybı sorunu var ...: p
Mukul Kumar

Baştaki / sondaki alanlara izin veriliyor mu?
Arnauld,

@Arnauld Karakterlerin pozisyonlarını bozmadıkları sürece. Yani en muhtemel sadece sondaki boşluklar
Bassdrop Cumberwubwubwub 14:16

1
Kelimenin çıktısı golfkendiliğinden nasıl görünür?
gabe3886 14:16

Yanıtlar:


4

Kömür , 29 27 20 19 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı bir versiyonudur. Açıklama:

FS«

Giriş karakterleri üzerinde döngü yapın.

F№rdlu↧ι

Geçerli harf bir yöndeyse ...

≔ιω

sonra geçerli yürüyüş yönünü güncelleyin.

✳∨ωrι

Herhangi bir yön ayarlanmadıysa, karakteri geçerli yürüme yönünde yazdırın, varsayılan olarak sağa çevirin.


1
@ Veskah olması gerekiyordu . Bunun için üzgünüm.
Neil

7

Dyalog APL , 63 bayt

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

⎕IO←0v16'dan kullanımlar ve özellikleri ( @)

n←≢s←⍞Ham girdi sve uzunluğun

⍴∘'',⍨2×n 2n x 2n boşluk matrisi oluşturmak

s@(...)matrisi sbelirtilen (çiftleri) indeks karakterleriyle değiştirmek

Endeksler nasıl hesaplanır:

¯1↓s son karakterini bırakmak s

'rdluRDLU'⍳'kodlamak 'r', 0 olarak 'd'1, vb; 8 gibi diğer karakterler

0, 0 hazırlamak

(8∘≠⍴¨⊢) her 8'i boş bir listeye, diğerleri ise 1 element listesine dönüştürün

,⍨\kümülatif takas edilmiş birleştirme ( abcd-> a ba cba dcba)

⊃¨ her birinden ilk

0j1* hayali sabiti ben gücüne

+\ birikimli meblağlar

11 9∘○¨her birinin gerçek ve hayali kısmı; menzilde kodları olsun -n...n

n+ onları büyük matris üzerinde ortala


3

Pyth, 68 65 bayt

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

Test odası

Bu, giriş okuması olarak güncellenen ve daha sonra yazdırılan bir çift koordinat tarafından indekslenen bir sözlük kullanır. Aynı zamanda akıllı bir golf hilesi ton kullanır.

İşte yazmadan önce, yorumlayıcı -mbayrağını kullanarak boşluk ve şeritleri çalıştırmadan önce bunları kullanarak yazdı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 Bayt

Düzenleme: @steenbergh sayesinde 51 bayt kaydedildi

Güzel değil, ama işe yarıyor ...

golfed:

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

Açıklama:

İki boyutlu bir dizi ve dizinin dkonumunu düzeltme yönünde arttırmak için değer kullanır, burada d değerleri şunlardır:

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

Ölçek:

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

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

İkinci anahtarı tamamen kaldırabilirsiniz. Yazdığınız ilk anahtarda d=0;, bu ifadeyi ikinci anahtar case 0:ifadesindeki ifadeyle değiştirin ve diğer durumlara benzer yapın ve ikinci bir anahtara ihtiyacınız olmayabilir. Son olarak bu ifadeyi kaldırın a[y,x]=s[i]ve üstüne yazın ilk anahtarın
Mukul Kumar,

@MukulKumar Güzel fikir, işe alamıyorum. Başlangıçta bir anahtarla yapmaya çalıştım. Mevcut çift anahtar konfigürasyonunda kalmak zorunda! :)
Pete Arden

a[y,x]=s[i]ilk değiştirmeden önce yazdın mı
Mukul Kumar,

2
Kullanabilir switch(s[i].toLowerCase())(veya c # eşdeğeridir ...) ve sonra tüm büyük harfleri kaldırabilirsiniz. Bazı baytları kurtarmalı.
steenbergh

1
@steenbergh Teşekkürler, orada büyük tasarruf! Hayır, doğrudan yapamazsınız ToUpper()çünkü bu bir chardeğil string. Seçenekler ya s[i].ToString().ToUpper()ya char.ToUpper(s[i])- - Sanırım charbiraz daha kısa. Şerefe :)
Pete Arden

3

JavaScript (ES6), 218 220 232

Düzenleme I kullanıyordum uve tüst ve en soldaki pozisyonuna takip etmek, ama fark thiç gerekli değildir

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

Daha az golf oynadı

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
}             

Ölçek

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 bayt

Grimy sayesinde 3 bayt kurtarıldı

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

Çevrimiçi deneyin!

açıklama

ā                        # 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
"gelin" bir sözlük kelimesidir. -1 . EDIT: bunu -2 yapın .
Grimmy

@Grimy: Sözlüğün burada kullanılıp kullanılamayacağını merak ettim, ama bu çok akıllıca!
Emigna


2

Javascript, 4̶6̶6̶, 455, 433 Bayt

Düzenlemeler: 11 Bayt, kullanıcı 1000000000 10 ya da öylesine kaydedilmiş, kullanıcı sayesinde kaydedildi2428118 Ayrıca, bazı gereksiz noktalı virgüller de kaldırıldı.

Bunun daha fazla golf oynayabileceğinden çok eminim ama başaramadım. Ben hala her şey yeni, bu yüzden herhangi bir tavsiye çok takdir edilir :)

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

}

Ben az ya da çok yaklaşımını aldım:

  • Çıktısını depolamak için bir dizi var
  • Dizideki bir sonraki karakterin x ve y konumunu hesapla
  • Koordinatlar dizinin dışında olacaksa, diziyi bu yönde uzatın. Ya bu satırın sonuna iterek ya da fazladan boşluk ya da tamamen başka bir satır ekleyerek.
  • Dizi [y] [x] = geçerli karakter yap
  • elde edilen diziyi yazdır

Siteye Hoşgeldiniz! JavaScript konusunda uzman değilim ama bu oldukça iyi görünüyor.
Buğday Sihirbazı,

Hoşgeldiniz! 11 bayttan tasarruf ['r','u','l','d']ederek"ruld"
0 '

Ayrıca z=programın başlangıcında ihtiyacınız yok
0 '

Bahşiş için teşekkürler! JS beni rahatlıkla şaşırtmaktan asla vazgeçmiyor.
Jhal

Örneğin, bazı baytları kaydetmek için şablon sabitleri çeşitli yerlerde kullanabilirsiniz a.split`` .
user2428118

2

Python 3, 314 309 290 268 Bayt

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

Bazı ilginç sonuçlarla programımı programımın girişi olarak çalıştırmayı denedim. Hah, bunu yorumlamayı dene Python!

Tıraş 5 bayt - Jack Bates'a övgü.

23 bayt, kundor tarafından fırlatıldı

Not: Farklı editörler kullandığım için baytımla ilgili bazı ölçüm hataları olduğunu düşünüyorum. Ancak, sonuncusunun doğru olduğundan oldukça eminim.


Sen değiştirerek 5 byte kaldırabilirsiniz 'r':(1,0)ile 'r':dve en boşluk kaldırarak w[a] for. Ayrıca bu delilik !!! Bu ne kadar zaman aldı?

@JackBates İş arasında bir gün. Biraz takıntı alıyorum.
Lord Ratte

Hepimiz değil miyiz? Kodlamanın tamamı bu!

Tüm X,Y=map(...)çizgiyi değiştirebileceğine inanıyorum X,Y=zip(*m). Burada çalışıyor. ( *mAnahtarlarının bir listesini açar ve zip onları iki tuple olarak yeniden gruplandırır.)
Nick Matteo

Dört bayttan tasarruf etmek için for döngüsünü bir satıra da koyabilirsiniz.
Nick Matteo,

2

PHP, 238 223 205 204 bayt

Jörg tarafından kaydedilen 12 bayt ( striposyerine preg_match), izleyen yeni hat yerine 1 byte + parantez, yön değiştirmeden golfe atılan 16 + parantez, 1 yerine üçlü daha 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]??" ";

Pipe ile çalıştırın php -nR '<code>'veya çevrimiçi deneyin .

Yıkmak

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
Eğer bu hakkın strspn($r[$y+=$e][$x+=$d]=$c,udlruDLR)regex kullanmak yerine bazı baytları kaydetmesi gerektiğini görürsem, ´stripos (_ulrd, $ r [$ y + = $ e] [$ x + = $ d] = $ c) `strspn 'in $argnkaydettiği kadar iyi olmalı 3 Bayt
Jörg Hülsermann

@ JörgHülsermann Beni takip mi ediyorsun? : D Haklısın.
Titus,

Bugün hiç kimse görevini düzenlememiş ve ben de cevabınızı gördüm ve kısaltabileceğinizi gördüm. Üzgünüz, iyileştirmenin JS cevabını yenebilmeniz için o kadar iyi olmadığını düşünüyorum. Cevaplarınızda bazı baytlar bulabilirsem bu mutlu ve gurur vericidir, ancak bu davaları
aramıyorum

@ JörgHülsermann Endişelenme; 12'nize ek olarak başka bir 21 bayt daha buldum. Beni tekrar ziyaret ettiğin için teşekkürler.
Titus,

Yüzde 10'dan fazlası güzel
Jörg Hülsermann

2

Java 10, 288 286 280 263 bayt

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

@Grimy sayesinde -17 bayt .

Açıklama:

Burada dene. (NOT: Çıktıyı biraz daha kompakt hale getirmek için tüm sondaki boşlukları / yeni satırları kaldırırım . Gerçek sonucu görmek için -metod .replaceAll("(m?)\\s+$","")içindeki kaldırmaktan çekinmeyin 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:0olabilir5-d/14
Grimmy

1
Ve aynı damarda, d==82?1:d==76?-1:0olabilir3-(d^16)/23
Grimmy

@Grimy Teşekkürler. Bu iki parçanın bir şekilde golf oynayabileceğini biliyordum, ancak bu bit / aritmetik dönüşümlerde oldukça kötüyüm, bu yüzden denemekten rahatsız olmadım. -17 bayt için teşekkürler! :)
Kevin Cruijssen

1

Perl, 204 + 3 = 207 bayt

İçin +3 -F

Boşluk kodun bir parçası değildir ve okunaklı olması için sağlanmıştır.

%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 mücadelesine olan çözümüme benzer şekilde, yol boyunca her adım için x, y koordinatlarını içeren, x ve y koordinatlarının maksimum ve minimum değerlerini depolanan bir karmaşa oluşturdum, sonra her şeyi geçirip yazdırdım.

Eğer çaresizsem , ilk fordöngünün son üç satırını bir veya iki bayt kurtarabilecek tek bir iğrenç ifadeye dönüştürebilirim, ancak tamamen okunamayan bir sonuç için sabırsızlanıyorum.


1

Excel VBA, 205 bayt

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'in mevcut cevaplarla rekabet edebilme becerisine şaşırdım. İşe yarıyor wve zyönünü takip ediyor.


başlangıç ​​pozisyonu 70 yeterli olmayabilir. Ayrıca, önde gelen alanlara izin verilmez
edc65

1

SmileBASIC, 148 146 bayt

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

Fonksiyonu çağır, W "text",vx,vyvx ve vy başlangıçtaki yöndür (varsayılan 1,0'dır).


X veya Y, 0'dan küçük olduğunda ne olur?
edc65,

Şimdi imleç ekrandan çıktığında tüm metni kaydırır.
12Me21

0

Swift 3, 283 bayt

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

Uyarı

Daha uzun giriş için daha büyük ekran gerekir. Çıktının, meydan okuma kuralları tarafından kabul edilebilir olduğunu anladığım gibi, "boş" satır / sütunlar için bir işlemi yoktur.

farfaralık

  • Newline, printsux için varsayılan sonlandırıcıdır
  • Bilinen bir dizi dizi oluşturmanın basit bir yolu puanı yok etti.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.