Przenieś sztukę ASCII do trzeciego wymiaru

11

W tym wyzwaniu musisz przenieść grafikę ASCII (zwykle 2D) do 3D!

W jaki sposób?

lubię to,

X X DD 
 X  D D
X X DD 

do...

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

Wtedy Jak robimy to ?

Biorąc pod uwagę sztukę ascii i Npowtórz te Nczasy.

  • dla każdej postaci (nazwiemy to A):
  • niech Bbędzie postacią, która ma dokładnie 1 prawo i 1 w górę odA
  • jeśli Bjest spacją lub jest niezdefiniowany:
  • ustawiony Bna A.

Okular

  • Pierwszym wejściem może być ciąg znaków ze znakami nowej linii lub lista ciągów reprezentujących grafikę 2D ASCII.
  • Możesz użyć %END%do oznaczenia końca danych wejściowych, ale nie jest to wymagane.
  • Drugie wejście będzie N . Będzie to dodatnia liczba całkowita.
  • wszystkie linie ciągów będą tej samej długości.

Przykłady

Wejście: ("###\n###",1)

Wynik:

 ###
####
###

Zasady

Obowiązują podstawowe zasady .

również, jeśli masz pytania, pamiętaj o zadaniu w komentarzach!


źródło
Możesz wyjaśnić, że „puste” odnosi się do spacji (U + 0020) lub do niczego.
Leaky Nun
@LeakyNun Czy to już naprawione?
Czy dozwolone są dodatkowe białe znaki?
Leaky Nun
Tak, są dozwolone.
1
Czy mogę założyć, że długość każdej linii będzie taka sama? (Czy mogę wstępnie uzupełnić wejście spacjami po prawej stronie?)
Leaky Nun

Odpowiedzi:

18

Perl, 81 bajtów

Kod 75 bajtów + 6 dla -i -n0.
Pamiętaj, że \eznaki są ASCII, \x1bale \esą używane do ułatwienia testowania.

Należy pamiętać, że to rozwiązanie wykorzystuje sekwencje specjalne ANSI i wymaga zgodnego terminala, a także -iargumentu wiersza poleceń do podania liczby „wymiarów”, które chcesz.

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

Stosowanie:

W terminalu zgodnym z systemem Linux uruchom PS1=najpierw, aby upewnić się, że monit nie zastąpi wyświetlanego obrazu.

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
Dom Hastings
źródło
8

CJam, 25 24 bajtów

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

Nienazwany blok, który oczekuje listy ciągów i liczby powtórzeń na stosie i zamiast tego pozostawia nową listę ciągów.

Sprawdź to tutaj.(Zawiera opakowanie testowe, które dla wygody odczytuje ciąg STDIN).

Wyjaśnienie

{       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.
  }
}*
Martin Ender
źródło
5
Dziesięć roflcopterów! goo.gl/PEK4iB
Dlaczego nie Sdziała na początkowej przestrzeni? Czy dozwolone jest także używanie zmiennych (które mogły zostać nadpisane) w funkcji?
Luis Mendo
@LuisMendo Snie działa, ponieważ fzamiast tego będzie mapowany na tym ciągu. Jeśli chodzi o funkcje, uważam, że w „normalnych” językach istnieje również wiele funkcji przesyłanych w oparciu o globale, które nie są modyfikowane między wywołaniami.
Martin Ender
Dzięki. Zapomniałem, że postać w CJam to nie to samo, co ciąg jednoznakowy
Luis Mendo
1
Możesz zapisać jeden bajt, używając Convex, ponieważ ma on-char operatora transliteracji zamiast dwóch- znaków : convex.tryitonline.net/… (wtyczka bezwstydna)
GamrCorps
4

APL, 49 bajtów

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

Wejście: wektor wektorów znaków. Przykład:

      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   

Jak to działa:

  • ↑⍵ zamienia argument w macierz znaków
  • ⎕UCS od char do liczby całkowitej
  • (32∘≠×⊣) zastąp spacje (32) zerami
  • ...⍣⍺⊣ zastosuj ⍺ (lewy argument) razy funkcję po lewej
  • s←0⍪⍵,0 obramowanie z zerami na górze i po prawej stronie argumentu
  • 1⊖¯1⌽ obróć 1 w górę i 1 w prawo
  • s+(s=0)× sumuje do oryginału wersję przesuniętą, ale tylko nad zerami oryginału
  • 32⌈ zamienia zera w 32s
  • ⎕UCS od liczby całkowitej do znaku
lstefano
źródło
4

MATL , 24 bajty

:"ct32>*TTYatFTEqYSy~*+c

Format wejściowy to

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

Innym przykładem jest

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

Dane wyjściowe zawierają dodatkowe białe znaki, co jest dozwolone przez wyzwanie.

Wypróbuj online!


Jeśli tablica znaków 2D jest akceptowalna jako dane wejściowe (poprosiłem OP dwa razy ...), pierwszy cmożna usunąć, więc 23 bajty :

:"t32>*TTYatFTEqYSy~*+c

Format wejściowy w tym przypadku to (wszystkie ciągi mają jednakową długość, co może wymagać poprawnego wypełnienia spacjami):

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

Wypróbuj online!


Wyjaśnienie

:        % 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
Luis Mendo
źródło
3

Wypukły , 23 bajty

Liczba bajtów zakłada kodowanie CP-1252.

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

Nienazwany blok, który oczekuje listy ciągów i liczby powtórzeń na stosie i zamiast tego pozostawia nową listę ciągów.

Wypróbuj online!

Jest to bezpośredni port mojej odpowiedzi CJam na wypukłą (która jest w dużej mierze oparta na CJam). Jedyną różnicą jest to, że Convex używa Ëzamiast ertransliteracji, oszczędzając jeden bajt. Dzięki GamrCorps za poinformowanie mnie o tym.

Martin Ender
źródło
2

Pyth, 54 33 bajty

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

Zestaw testowy.

Leaky Nun
źródło
dlaczego potrzebujesz dwóch ;?
Ven
@ven ;nie jest powszechny ;w językach programowania.
Leaky Nun
;jest zmienną.
Leaky Nun
ah pyth przeciążenia ;w lambdas ...
Ven
@ven Gdy pojawi się wraz z Pyth, należałoby użyć I, .?, V, F, ;, (jednoznacznych wypowiedzi) bardzo mniej, a oni zostaną zastąpione ?, m, u, F, M, L, R, #, ...
Dziurawy Nun
2

JavaScript (ES6), 128 bajtów

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

Akceptuje i zwraca tablicę ciągów, przygotowuje dodatkowy wiersz dla wyniku, zapewnia, że ​​każdy wiersz zawiera co najmniej spację, dzieli je wszystkie na znaki, zapętla, chociaż próbuje skopiować znaki do powyższego wiersza i kolumny po prawej, a następnie rekurencyjnie wywołuje się, aby zakończyć pętlę.

Neil
źródło
2

Python 2, 116 bajtów

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

Niedługo będę grać w golfa.

Lynn
źródło
Czy na pewno lambdanie jest krótszy?
wizzwizz4
Potrzebuję tam przydziału e. Ponadto, execjest stwierdzenie, więc to nie może być w lambda.
Lynn,
Dobrze. Tylko się upewniam.
wizzwizz4
2

Rubinowy, 95 bajtów

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

Każdy <Esc> jest dosłownie znakiem ESC (0x1b ).

Stosowanie

Przypisz lambda do zmiennej np 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

Nie golfił

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

forwardSekwencja ucieczki, \e[1Cprzemieszcza kursor do przodu (w prawo) powierzchni 1 i \e[<n>Aprzesuwa go nlinii. Zasadniczo kod ten drukuje „warstwy” od tyłu do przodu, zastępując spacje forwardsekwencją, aby uniknąć zastąpienia innych warstw spacją.

Jordania
źródło
1
Przypadkowo umieściłeś f=przed ->w wersji golfowej. Usuń go dla -2 bajtów.
wizzwizz4