Yolu takip et


18

Zor olan yolu takip etmektir (çizmek):

  • ^n - n satır yukarı
  • vn - n satır aşağı
  • >n - sağa doğru n karakter pozisyonu
  • <n - n karakter konumu bıraktı

  • nsıfırdan büyük bir tamsayıdır (örn >-2. gibi bir komut alamazsınız ).
  • Komutlar arasında ayırıcı yoktur, iyi biçimlendirilmiş girdi şu şekilde görünür: >5v8<10^3başka bir giriş biçimine izin verilmez.
  • Komut sayısı sınırsızdır.
  • Daha fazla karakterin girdiye girmesi gerekmez.

Örnekler.

  1. Girdi boş bir dizedir, çıktı:

    *
    
  2. Girdi >3ya <3: ya da : Bunun çıktıda herhangi bir fark yaratmadığına dikkat edin:

    ****
    
  3. Benzer için ^3ve v3:

    *
    *
    *
    *
    
  4. Giriş:, >1v2çıkış:

    **
     *
     *
    
  5. Giriş:, ^4>3v2<1çıkış:

    ****
    *  *
    * **
    *
    *
    
  6. Geri dönüp aynı yolu kullanırsanız, yeni bir şey çizmeyin. Örneğin>5<5

    ******
    
  7. ... yeni bir şey çizmemenize rağmen, açık bir şekilde pozisyonu değiştiriyorsun. Dolayısıyla, girdiniz şöyle görünürse >4<2v3, çıktı:

    *****
      *
      *
      *
    
  8. Bu daha karmaşık bir örnektir: 1) yol kendini kesebilir 2) son komutun son üç adımı tüm yolu sağa kaydırır. Giriş:, v6>4^3<7çıkış:

       *
       *
       *
    ********
       *   *
       *   *
       *****
    
  9. Giriş :

    ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
    

    Çıktı:

    *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
    *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
    *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
    *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **
    *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
    *******************************************************************************************
    

6
Bugün bu zorluğu gönderdiniz, bu uygun bir test durumu olacağını düşünüyorum: ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1.
insertusernameburada

Muhtemelen referans uygulaması sağlayabilir misiniz?
LegionMammal978

Bu aslında bir dupe değil mi? Lütfen karar verin: D
nicael

@nicael: Öyle olmadığını söyleyebilirim; G / Ç farklıdır ve yollar diğerinde geçemez gibi görünüyor. Bence bu, farklı golf stratejilerine izin verecek şekilde daha basit. Ancak aniden bunları tek başıma tekrar açabileceğimin farkında değildim, sadece oy kullandığımı sanıyordum.
marinus

@marinus Tamam o zaman. Yani, ilgili: Yarr! Gizli hazineye bir harita! .
nicael

Yanıtlar:


2

MATL , 71 bayt

1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c

Geçerli sürümü kullanır (6.0.0)Dilin / derleyicinin . Matlab ve Octave'de çalışır.

EDIT (21 Haziran 2016): dilde yapılan değişiklikler nedeniyle, kodun geçerli sürümde (16.0.0) çalışması için birkaç değişiklik yapılması gerekiyor. Şunları yapabilirsiniz çevrimiçi denemek gerekli değişiklikleri dahil olmak üzere.

Örnekler

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^4>3v2<1
    ****
    *  *
    * **
    *   
    *  

>> matl
 > 1thj'.\d+'XX"@Z)XK6L)U:"K1)XK118=K94=-K62=K60=-hv]]YstY)X<1--lqg10*32+c
 > 
> ^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1
  *   *  *****  *****  *****  *   *     *** *  ******  *     *    *   *  ******  *****  *****
  *   *  *   *  *   *  *   *  *   *     * * *  *       *  *  *    *   *  *       *   *  *   *
  *****  *****  *****  *****  *****     * * *  ******  ** * **    *****  ******  *****  *****
  *   *  *   *  *      *        *       * * *  *        * * *       *    *       *   *  **   
  *   *  *   *  *      *        *       * ***  ******   *****       *    ******  *   *  *  **
  ******************************************************************************************* 

açıklama

Programın dört ana adımı vardır:

  1. Giriş dizesini okuyun ve bileşenlerine bölün.
  2. Her satırın uygun yönde bir birim yer değiştirmesini açıkladığı 2 sütunlu bir matris oluşturun. Örneğin, [0 -1]bir adım sola işaret eder. İlk satır yolun başlangıcıdır,[1 1]
  3. İlk boyut boyunca bu matrisin kümülatif toplamını hesaplayın. Şimdi her satır a *. Minimum değere normalleştir1
  4. 1Adım 3'teki matrisle gösterilen koordinatlarda ve 0diğer durumlarda yeni bir matris oluşturun . Bu daha sonra bir char matrisine dönüştürülür.

Kod:

1th                         % row vector [1 1]. Initiallize matrix of step 2
j                           % (step 1) read input string 
'.\d+'XX                    % split into components. Creates cell array of substrings
"                           % (step 2) for each component
   @Z)XK                    % unbox to obtain substring and copy
   6L)U:                    % obtain number and build vector of that size
   "                        % repeat as many times as that number
      K1)                   % paste substring. Get first character: '^', 'v', '>', '<'
      XK118=K94=-           % vertical component of unit displacement: -1, 0 or 1
      K62=K60=-             % horizontal component of unit displacement: -1, 0 or 1
      h                     % concatenate horizontally
      v                     % append vertically to existing matrix
   ]                        % end
]                           % end
Ys                          % (step 3) cumulative sum along first dimension
tY)X<1--                    % normalize to minimum value 1
lqg                         % (step 4) build matrix with 0/1
10*32+c                     % replace 0 by space and 1 by asterisk

Son örnek için işe yarıyor mu?
nicael

Ne hoş! Evet öyle. Cevabımı dahil etmek için cevabımı düzenledim
Luis Mendo

8

JavaScript (ES6), 204 211 210

Düzenle 1 Hata düzeltme - geçersiz giriş için '*' çıkışı
Düzenle 2 x ve y farkına göre yönün daha basit kod çözülmesi

İşte benim özellikleri cevaplamak için revize hazine haritası , benim cevap .

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]=m,p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=[m='*']),p.join`
`)

Daha az golf ve daha fazla veya daha az açıklama

f=m=>(
  x=y=0, // starting position
  p=['*'], // output string array (initialized with minimum output)
  m.replace( /\D(\d+)/g, 
  (d,z) => // execute the following for each group direction/length. Length in z, direction in d[0]
  {
    while( z--)  // repeat for the len
    {
      // check d to change values of x and y
      // all the comparison are with > and <, not equal
      // so that they work with the whole d, not just d[0]
      d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,
      // now if x or y are < 0 then p must be adjusted  
      p = ~x 
        ? ~y
          ? p // both x and y are >= 0, p is not changed
          : [y = 0, ...p] // y < 0, shift p by on adding a 0 element and set y to 0
        : p.map(r=> ' ' + r, x = 0); // x < 0, add a space to the left for each row in p and set x to 0
      r = p[y] || ''; // get current row in r
      for( ; !r[x]; ) // if the current row is empty or too short
        r += ' '; // ... add spaces up to position x
      // set character in x position
      r = [...r], // the shorter way is converting to array ...
      r[x] = '*', // setting the element
      p[y] = r.join`` // and the back to string using join
    }
  }),
  p.join`\n` // return output array as a newline separated string
}

Ölçek

F=m=>(m.replace(/\D(\d+)/g,(d,z)=>{for(;z--;r=[...r],r[x]='*',p[y]=r.join``)for(d<'>'?--x:d<'^'?++x:d<'v'?--y:++y,p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0),r=p[y]||'';!r[x];)r+=' '},x=y=0,p=['*']),p.join`
`)

// TEST
console.log = x => O.textContent += x + '\n';

console.log(F('')+'\n')

console.log(F('v6>4^3<7')+'\n')

console.log(F('^2v2>3<3v3>4^5v5>3^5>4v2<4v3>4^3v3>3^5>4v2<4v3>7^5>4v2<4v3>9^3<2^2v2>4^2v2<2v3>8^5>2v4>2^4v5<3>6^5>5<5v2>5<5v2>5<4v1>8^3<1^2v2>1v2>2^3v3>2^2>1^2v2<1v3<3>11^3<2^2v2>4^2v2<2v3>5^5>5<5v2>5<5v2>5<4v1>7^5>4v2<4v3>4^3v3>3^5>4v2<3v1<1v2>3^1>1v1'))
<pre id=O></pre>


Mükemmel çalışıyor gibi görünüyor.
nicael

Tek bir istisna dışında: giriş boş olduğunda, gereksinim yazmaktır *.
nicael

Tarayıcıları ES6'yı yorumlamakta sorun yaşayanlara: jsfiddle.net/2vrrd1wt .
nicael

@nicael fark ettiğiniz için teşekkürler. 1 bayt için sabit
edc65

1

Perl, 174 bayt

@M=(['*']);pop=~s/(.)(\d+)/($z=ord$1)&64?($y+=$z&8?-1:1)<0&&unshift@M,[$y++]:($x+=($z&2)-1)<0?@M=map{[$x=0,@$_]}@M:0,$M[$y][$x]='*'for1..$2/gre;print map{map{$_||$"}@$_,$/}@M

Komut satırı bağımsız değişkeni olarak girdi bekliyor. Argümanı alıntıladığınızdan emin olun!
Misal:perl 177.pl "<1^2>3v4<5^6>7v8<9^10>11"

Biraz okunabilir:

@M=(['*']);                                 # output origin/starting position

pop=~                                       # apply regex to cmdline arg
s!(.)(\d+)!                                 # match $1=direction, $2=count

    ($z=ord$1)                              # get ASCII code for char
    &64                                     # 'v^' have this bit set, '<>' don't

        ?                                   # adjust y:
            ($y += $z&8 ? -1 : 1)           # '^' has bit set, 'v' doesn't
            < 0 &&                          # negative y?
            unshift @M, [$y++]              # prepend row; abuse [] for $y++ saving 3 bytes

        :                                   # adjust x:
            ($x+= ($z&2) -1 )               # '>' has bit set: 2-1=1, '<' hasn't: 0-1=-1
            < 0 ?                           # negative x?
                @M = map{ [$x=0,@$_] } @M   # prepend column, reset x
                :0                          # '?:0' shorter than '&&()'
        ,                                   # oh, and also:
        $M[$y][$x]='*'                      # output current position.

    for 1..$2                               # iterate count
!grex;                                      

print map{ map{$_||$"} @$_, $/ } @M         # iterate rows/cols, print '*' or space

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.