Принесите искусство 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
  • if Bявляется пробелом или не определено:
  • установить Bна A.

Спекуляции

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

Примеры

Входные данные: ("###\n###",1)

Выход:

 ###
####
###

правила

Применяются основные правила .

Также, если у вас есть вопросы, обязательно задавайте их в комментариях!


Возможно, вы захотите уточнить, что «пусто» относится к пробелу (U + 0020) или ничего.
Утренняя монахиня

@ LeakyNun Это исправлено сейчас?

Допускаются ли дополнительные пробелы?
Утренняя монахиня

Да, это разрешено.

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

Ответы:


18

Perl, 81 байт

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

Обратите внимание, что в этом решении используются escape-последовательности 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, так как он имеет оператор транслитерации с одним символом вместо символа с двумя символами : convx.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 от символа к целому числу
  • (32∘≠×⊣) заменить пространства (32) нулями
  • ...⍣⍺⊣ применить ⍺ (левый аргумент) умножить на функцию слева
  • s←0⍪⍵,0 граница с нулями сверху и справа аргумент
  • 1⊖¯1⌽ повернуть 1 вверх и 1 вправо
  • s+(s=0)× сумма к оригиналу смещенной версии, но только сверху нулей оригинала
  • 32⌈ превращает нули в 32
  • ⎕UCS от целого числа до символа

4

MATL , 24 байта

:"ct32>*TTYatFTEqYSy~*+c

Формат ввода

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

Так что другой пример

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

Вывод содержит дополнительные пробелы, которые разрешены вызовом.

Попробуйте онлайн!


Если в качестве входных данных допустим массив двумерных символов (я дважды спрашивал об операторе ...), то первый 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

@ven ;не является обычным ;языком программирования.
Утренняя монахиня

;переменная
Утренняя монахиня

ах пит перегружает ;лямбды ...
Ven

@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

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Последовательность выхода, \e[1Cперемещает курсор вперед (вправо) 1 место и \e[<n>Aперемещает его вверх nлинию. По сути, этот код печатает «слои» задом наперед, заменяя пробелы forwardпоследовательностью, чтобы избежать перезаписи других слоев пробелом.


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