Піднесіть мистецтво ASCII до 3-го виміру


11

У цьому виклику ви повинні принести ASCII мистецтво (як правило, 2D) в 3D!

Як?

подобається це,

X X DD 
 X  D D
X X DD 

до ...

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

Тоді як ми робимо що ?

Враховуючи мистецтво ascii і N, повторіть цей Nраз.

  • для кожного персонажа (ми це назвемо A):
  • нехай Bбуде персонаж, який рівно 1 справа і 1 вгоруA
  • якщо Bпробіл або не визначено:
  • встановити Bв A.

Технічні характеристики

  • Першим входом може бути рядок з символами нового рядка або список рядків, що представляють 2D-зображення ASCII.
  • Ви можете використовувати %END%теги для завершення введення, але це не потрібно.
  • Другий вхід буде N. Це буде додатне ціле число.
  • всі лінії пасм будуть однакової довжини.

Приклади

Вхід: ("###\n###",1)

Вихід:

 ###
####
###

Правила

Діють основні правила .

також, Якщо у вас є питання, обов’язково запитайте в коментарях!


Ви можете уточнити, що "порожній" відноситься до простору (U + 0020) або нічого.
Leaky Nun

@LeakyNun Це виправлено зараз?

Чи дозволені додаткові пробіли?
Leaky Nun

Так, це дозволено.

1
Чи можу я припустити, що довжина кожного рядка буде однаковою? (Чи можу я попередньо прокласти вклад з пробілами праворуч?)
Leaky Nun

Відповіді:


18

Perl, 81 байт

75 байт код + 6 для -i -n0.
Зауважте, що \eсимволи є ASCII, \x1bале \eвони використовуються для зручності тестування.

Зауважте, що це рішення використовує послідовності відходу ANSI і вимагає сумісного терміналу, а також використовує -iаргумент командного рядка для передачі кількості потрібних параметрів.

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

Використання:

У терміналі, сумісному з Linux, запустіть PS1=спочатку, щоб переконатися, що запит не перезапише відображене зображення.

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 байти

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

Неназваний блок, який очікує списку рядків та кількості повторень у стеці та залишає натомість новий список рядків.

Тестуйте це тут. (Включає тестову обгортку, яка для зручності читає рядок з STDIN.)

Пояснення

{       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
Десять рофлкоптерів! goo.gl/PEK4iB

Чому не Sпрацює для початкового простору? Також, чи дозволяється використовувати змінні (які, можливо, були перезаписані) у функції?
Луїс Мендо

@LuisMendo Sне працює, оскільки тоді fбуде замість цього рядка відображення. Що стосується функцій, я вважаю, що в "звичайних" мовах також є багато поданих функцій, які покладаються на глобальні точки, які не підроблені між викликами.
Мартін Ендер

Дякую. Я забув, що персонаж у CJam - це не те, що односимвольний рядок
Луїс Мендо

1
Ви можете зберегти один байт, скориставшись Convex, оскільки він має одночаровий оператор транслітерації замість двочарового : conwex.tryitonline.net/… (безсоромний штекер)
GamrCorps

4

APL, 49 байт

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

Введення: вектор векторів символів. Приклад:

      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   

Як це працює:

  • ↑⍵ перетворює аргумент у матрицю символів
  • ⎕UCS від char до цілого числа
  • (32∘≠×⊣) підставити пробіли (32) нулями
  • ...⍣⍺⊣ застосувати ⍺ (лівий аргумент) разів функцію зліва
  • s←0⍪⍵,0 межа з нулями вгорі та праворуч аргументом
  • 1⊖¯1⌽ обертати 1 вгору і 1 вправо
  • s+(s=0)× підсумовувати до оригіналу зміщену версію, але лише зверху нулів оригіналу
  • 32⌈ повертає нулі в 32s
  • ⎕UCS від цілого числа до знака

4

MATL , 24 байти

:"ct32>*TTYatFTEqYSy~*+c

Формат вводу є

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

Тож інший приклад є

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

Вихід містить додатковий пробіл, який дозволено викликом.

Спробуйте в Інтернеті!


Якщо двовимірний масив char прийнятний як вхідний (я два рази просив ОП ...), перший cможна видалити, тому 23 байти :

:"t32>*TTYatFTEqYSy~*+c

Формат вводу в цьому випадку такий (усі рядки мають однакові довжини, що може зажадати прокладки з пробілами):

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

Спробуйте в Інтернеті!


Пояснення

:        % 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

Опукла , 23 байти

Кількість байтів передбачає кодування CP-1252.

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

Неназваний блок, який очікує списку рядків та кількості повторень у стеці та залишає натомість новий список рядків.

Спробуйте в Інтернеті!

Це прямий порт моєї відповіді CJam на Convex (який базується на CJam). Єдина відмінність полягає в тому, що Convex використовує Ëзамість erтранслітерації, зберігаючи один байт. Завдяки GamrCorps за те, що повідомив мені про це.


2

Pyth, 54 33 байт

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

Тестовий набір.


навіщо тобі два ;?
Вен

@ven ;не звичайний ;для мов програмування.
Leaky Nun

;є змінною.
Leaky Nun

ах pyth перевантаженнях ;в лямбда ...
Вен

@ven Коли ви отримуєте разом з Pyth, ви будете використовувати I, .?, V, F, ;, (явні затвердження) дуже менше, і вони будуть замінені ?, m, u, F, M, L, R, #, ...
Дірявий Nun

2

JavaScript (ES6), 128 байт

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

Приймає та повертає масив рядків, попередньо додає додатковий рядок для виводу, гарантує, що кожен рядок містить принаймні пробіл, розбиває їх на всі символи, петлі, хоча намагаються скопіювати символи у рядок вище та стовпець праворуч, потім рекурсивно закликає себе завершити цикл.


2

Python 2, 116 байт

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

Я незабаром пограю в гольф.


Ви впевнені, що lambdaце не коротше?
wizzwizz4

Мені потрібно призначення eтам. Крім того, execце твердження, тому воно не може бути в лямбді.
Лінн

Гаразд. Просто переконуюсь.
wizzwizz4

2

Рубін, 95 байт

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

Кожен <Esc>є буквальним символом ESC ( 0x1b).

Використання

Призначте лямбду змінній, наприклад 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

Безумовно

->(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виходу \e[1C, переміщує курсор вперед (праворуч) 1 пробіл і \e[<n>Aпереміщує його вгору по nлініях. В основному те, що робить цей код, - це надрукувати "шари" назад на фронт, замінюючи пробіли forwardпослідовністю, щоб уникнути перезапису інших шарів пробілом.


1
Ви випадково поставили f=перед ->"гольф-версією". Видаліть його на -2 байти.
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.