ASCII sanatını 3. boyuta taşıyın


11

Bu meydan okumada, ASCII sanatını (genellikle 2D'dir) 3D'ye getirmelisiniz!

Nasıl?

bunun gibi,

X X DD 
 X  D D
X X DD 

için ...

  X X DD 
 X X DD D
X X DDDD 
 X XDDD
X X DD

Sonra nasıl yaparız o ?

Ascii sanatı göz önüne alındığında ve Nbu Nkez tekrarlayın .

  • her karakter için (buna diyeceğiz A):
  • Izin vermek Btam 1 doğru ve 1 yukarı karakterA
  • eğer Bbir boşluk veya tanımlanmamış:
  • set Biçin A.

gözlük

  • İlk girdi, satırsonu karakterleri olan bir dize veya 2D ASCII resmini temsil eden dizelerin bir listesi olabilir.
  • %END%Girişin sonunu etiketlemek için kullanmanıza izin verilir , ancak bu gerekli değildir.
  • İkinci giriş olacaktır N. Pozitif bir tamsayı olacaktır.
  • dizelerin tüm çizgileri aynı uzunlukta olacaktır.

Örnekler

Giriş: ("###\n###",1)

Çıktı:

 ###
####
###

kurallar

Temel kuralları geçerlidir.

Ayrıca, Sorularınız varsa, yorumlarda sorun emin olun!


"Boş" kelimesinin boşluğa (U + 0020) veya hiçbir şeye karşılık gelmediğini açıklığa kavuşturmak isteyebilirsiniz.
Leaky Nun

@LeakyNun Şimdi düzeltildi mi?

Ek boşluklara izin veriliyor mu?
Leaky Nun

Evet, bunlara izin verilir.

1
Her bir çizginin uzunluğunun aynı olacağını varsayabilir miyim? (Girişi sağ taraftaki boşluklarla önceden doldurabilir miyim?)
Leaky Nun

Yanıtlar:


18

Perl, 81 bayt

75 bayt kodu + 6 için -i -n0. Karakterlerin ASCII
olduğunu, ancak test kolaylığı için kullanıldığını unutmayın.\e\x1b\e

Lütfen bu çözümün ANSI kaçış dizileri kullandığını ve uyumlu bir terminal gerektirdiğini ve ayrıca -iistediğiniz 'boyut' sayısını iletmek için komut satırı argümanını kullandığını unutmayın.

$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I

Kullanımı:

Linux uyumlu bir terminalde, PS1=isteminizin görüntülenen görüntünün üzerine yazmamasını sağlamak için önce çalıştırın .

perl -i10 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< ' 
ROFL:ROFL:ROFL:ROFL
         _^___
 L    __/   [] \    
LOL===__        \ 
 L      \________]
         I   I
        --------/
'

          ROFL:ROFL:ROFL:ROFL
         ROFL:ROFL:ROFL:ROFL
        ROFL:ROFL:ROFL:ROFL
       ROFL:ROFL:ROFL:ROFL\
      ROFL:ROFL:ROFL:ROFL\_]
     ROFL:ROFL:ROFL:ROFL\_]
    ROFL:ROFL:ROFL:ROFL\_]/
   ROFL:ROFL:ROFL:ROFL\_]/
  ROFL:ROFL:ROFL:ROFL\_]/
 ROFL:ROFL:ROFL:ROFL\_]/
   LOL==___^___]_\_\_]/
  LOL==__/ \_[]_\_\_]/
 LOL===__ \______\_]/
  L      \________]/
          I---I---/
         --------/

perl -i3 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< 'X X DD
 X  D D
X X DD
'
   X X DD
  X X DD D
 X X DDDD
  X XDDD
 X X DD

8

CJam, 25 24 bayt

{{' 1$f+La@+..{sS@er}}*}

Dizelerin listesini ve yığındaki yineleme sayısını bekleyen ve bunun yerine yeni bir dizeler listesi bırakan adsız bir blok.

Burada test edin. (Kolaylık sağlamak için STDIN dizesini okuyan bir test sarıcısı içerir.)

açıklama

{       e# Repeat this block N times...
  '     e#   Push a space character.
  1$    e#   Copy the current grid.
  f+    e#   Prepend the space to each line of the grid.
  La    e#   Push [[]].
  @+    e#   Pull up the other copy of the grid and prepend the [].
        e#   We've now got two copies of the grid, one shifted right by
        e#   a cell and one shifted down by a cell. We now want to replace
        e#   spaces in the latter with the corresponding character in the
        e#   former.
  ..{   e#   For each pair of characters in corresponding positions...
    s   e#     Turn the character in the down-shifted grid into a string.
    S   e#     Push " ".
    @   e#     Pull up the character from the right-shifted grid.
    er  e#     Replace spaces with that character.
  }
}*

5
On adet roflcopter! goo.gl/PEK4iB

Neden Silk alan için çalışmıyor ? Ayrıca, bir işlevde değişkenlerin (üzerine yazılmış olabilir) kullanılmasına izin verilir mi?
Luis Mendo

@LuisMendo Sişe yaramaz, çünkü fbunun yerine bu dizeyi eşler . Yeniden işlevler, inanıyorum ki, "normal" dillerde, aynı zamanda invokasyonlar arasında kurcalamayan küresellere dayanan birçok işlev gönderimi vardır.
Martin Ender

Teşekkürler. CJam'daki bir karakterin tek karakterli bir dize ile aynı olmadığını unuttum
Luis Mendo

1
Convex'i kullanarak iki bayt yerine tek karakterli transliterat operatörü olduğu için bir bayt kaydedebilirsiniz: convex.tryitonline.net/… (utanmaz fiş)
GamrCorps

4

APL, 49 bayt

{⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵}

Girdi: karakter vektörleri vektörü. Misal:

      2 {⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵} 'X X DD' ' X  D D' 'X X DD'
  X X DD 
 X X DD D
X X DDDD 
 X XDDD  
X X DD   

Nasıl çalışır:

  • ↑⍵ argümanı karakter matrisine dönüştürür
  • ⎕UCS karakterden tam sayıya
  • (32∘≠×⊣) boşlukları (32) sıfırlarla değiştir
  • ...⍣⍺⊣ soldaki fonksiyonun ⍺ (sol argüman) çarpımını uygula
  • s←0⍪⍵,0 üstte ve sağda sıfırlarla argüman
  • 1⊖¯1⌽ 1 yukarı ve 1 sağa döndür
  • s+(s=0)× kaydırılan sürümü orijinaline toplama, ancak yalnızca orijinalin sıfırlarının üstünde
  • 32⌈ sıfırları 32'lere çevirir
  • ⎕UCS tamsayıdan karaktere

4

MATL , 24 bayt

:"ct32>*TTYatFTEqYSy~*+c

Girdi biçimi:

2
{'X X DD', ' X  D D', 'X X DD'}

Yani diğer örnek

1
{'###', '###'}

Çıktı, meydan okuma tarafından izin verilen ekstra boşluk içeriyor.

Çevrimiçi deneyin!


Bir 2D karakter dizisi giriş olarak kabul edilebilirse (OP'ye iki kez sordum ...), ilki ckaldırılabilir, böylece 23 bayt :

:"t32>*TTYatFTEqYSy~*+c

Bu durumda giriş biçimi (tüm dizelerin boşluklarla sağ doldurmayı gerektirebilecek eşit uzunlukları vardır):

2
['X X DD '; ' X  D D'; 'X X DD ']

Çevrimiçi deneyin!


açıklama

:        % Input number n implicitly. Generate [1 2 ... n]
"        % For loop: repeat n times
  c      %   Convert to char array. In the first iteration it inputs a cell array of
         %   strings implicitly and converts to a 2D char array, right-padding with
         %   spaces. In the next iterations it does nothing, as the top of the stack
         %   is already a 2D char array
  t32>*  %   Convert characters below 32 into 0
  TT     %   Push array [1 1]
  Ya     %   Pad the 2D char array with one zero in the two directions (up/down,
         %   left/right), on both sides
  t      %   Duplicate
  FTEq   %   Push array [-1 1]
  YS     %   Circularly shift the 2D char array one unit up and one unit right
  y      %   Push a copy of the non-shifted 2D array
  ~      %   Logical negate: nonzero entries become 0, zero entries become 1. This
         %   will be used as a mask for entries that need to be changed. Since the
         %   values at those entries are zero, we can simply add the new values. We do
         %   that by multiplying the mask by the shifted array and adding to the
         %   non-shifted array
  *      %   Multiply element-wise
  +      %   Add element-wise
  c      %   Convert the 2D array back to char
         % End for
         % Implicitly display

3

Dışbükey , 23 bayt

Bayt sayısı CP-1252 kodlamasını varsayar.

{{' 1$f+La@+..{sS@Ë}}*}

Dizelerin listesini ve yığındaki yineleme sayısını bekleyen ve bunun yerine yeni bir dizeler listesi bırakan adsız bir blok.

Çevrimiçi deneyin!

Bu benim Convex (ağır CJam dayalı) CJam cevabım doğrudan bir bağlantı noktasıdır. Tek fark, Convex'in bir bayt kaydederek harf çevirisi Ëyerine kullandığıdır er. Bana bunu bildirdiği için GamrCorps'a teşekkürler.


2

Pyth, 54 33 bayt

ju+++dhG.bsmh|-d;;.t,Y+dNdtGGeG.*

Test odası.


neden ikiye ihtiyacınız var ;?
Ven

@ven programlama dillerinde ;olağan değildir ;.
Leaky Nun

;bir değişkendir.
Leaky Nun

ah pyth aşırı yükler ;lambdas içinde ...
Ven

Eğer Pyth birlikte olsun @ven şunları kullanırsınız I, .?, V, F, ;, (açık ifadeleri) çok daha az ama değiştirilecektir ?, m, u, F, M, L, R, #, ...
Çatlak Nun

2

JavaScript (ES6), 128 bayt

f=(a,n)=>n?f((a=[``,...a].map(s=>[...s||` `])).map((b,i)=>i--&&b.map((c,j)=>a[i][++j]>' '?0:a[i][j]=c))&&a.map(b=>b.join``),n-1):a

Bir dizi diziyi kabul eder ve döndürür, çıktı için fazladan bir satır ekler, her satırın en az boşluk içerdiğinden emin olur, hepsini karakterlere böler, karakterleri yukarıdaki satıra ve sütunu sağa kopyalamaya çalışırken döngüler, ardından döngüyü tamamlamak için özyinelemeli olarak kendini çağırır.


2

Python 2, 116 bayt

S=' '
def f(a,d):e=[S*len(`a`)];exec"a=[''.join(t[t[1]>S]for t in zip(S+x,y+S))for x,y in zip(a+e,e+a)];"*d;return a

Daha yakında golf oynayacağım.


Daha lambdakısa olmadığından emin misiniz ?
wizzwizz4

eOradaki görevlendirmeye ihtiyacım var. Ayrıca, execbir açıklama, bu yüzden bir lambda olamaz.
Lynn

Tamam. Sadece emin olmak için.
wizzwizz4

2

Ruby, 95 bayt

->a,n{n.downto(0){|i|f="<Esc>[1C"
$><<a.gsub(/^/,f*i).gsub(" ",f)+(i>0?"<Esc>[#{a.lines.size-1}A":"")}}

Her <Esc>biri değişmez ESC karakteridir ( 0x1b).

kullanım

Lambda'yı örneğin bir değişkene atayın func.

art = <<END
X X DD
 X  D D
X X DD
END

func[art, 2]
# Prints:
#   X X DD
#  X X DD D
# X X DDDD
#  X XDDD
# X X DD

Ungolfed

->(art, num) {
  num.downto(0) do |i|
    forward = "\e[1C"
    $> << art.gsub(/^/, forward * i).gsub(" ", forward) +
            (i > 0 ? "\e[#{art.lines.size - 1}A" : "")
  end
}

forwardÇıkış sırası, \e[1Cileri imleç (sağ) 1 uzay ve hareket \e[<n>Ahamle o kadar nsatırları. Temel olarak bu kodun yaptığı şey forward, diğer katmanların üzerine bir boşluk bırakılmasını önlemek için boşlukları sırayla değiştirerek "katmanları" önden arkaya yazdırmaktır .


1
Yanlışlıkla bir koyun f=önce ->golfed versiyonu. -2 bayt için çıkarın.
wizzwizz4
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.