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

それでは、どうすればそれができますか?

アスキーアートとを指定するとN、このN回数を繰り返します。

  • すべてのキャラクター(これをA)と呼びます:
  • let Bは、正確に1つ右から1つ上の文字ですA
  • 場合はB空白であるか定義されていません。
  • に設定BAます。

スペック

  • 最初の入力は、改行文字を含む文字列または2D ASCIIアートを表す文字列のリストです。
  • %END%入力終了のタグ付けに使用できますが、これは必須ではありません。
  • 2番目の入力はになりますN。正の整数になります。
  • 文字列のすべての行は同じ長さになります。

入力: ("###\n###",1)

出力:

 ###
####
###

ルール

基本的な規則が適用されます。

また、質問がある場合は、コメントで質問してください!


「空白」はスペース(U + 0020)を指すか、何もないことを明確にすることができます。
リーキー修道女

@LeakyNun今修正されていますか?

余分な空白は許可されますか?
リーキー修道女

はい、許可されています。

1
各行の長さが同じであると仮定できますか?(入力の右側にスペースを事前
Nun

回答:


18

Perl、81バイト

75バイトのコード+の6 -i -n0。文字はASCIIですが、テストを簡単にするために使用されることに
注意してください。\e\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
10個のロコプター!goo.gl/PEK4iB

なぜS初期スペースでは機能しないのですか?また、関数で変数(上書きされた可能性があります)を使用できますか?
ルイスメンドー

@LuisMendo Sは機能しませんf。その場合、代わりにその文字列をマッピングするからです。「通常の」言語では、関数は再呼び出しの間で改ざんされていないグローバルに依存する多くの関数サブミッションもあると思います。
マーティンエンダー

ありがとう。CJamの文字が1文字の文字列と同じではないことを忘れていました
ルイスメンドー

1
それは代わりに、二文字の1文字のTRANSLITERATE演算子を持っているとして、あなたは凸を使用して1つのバイトを保存することができます:convex.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)をゼロで置き換えます
  • ...⍣⍺⊣ apply⍺(左の引数)に左の関数を掛ける
  • 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
{'###', '###'}

出力には、チャレンジで許可されている余分な空白が含まれています。

オンラインでお試しください!


2D char配列が入力として受け入れられる場合(私はOPを2回尋ねました...)、最初の配列を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が音訳のË代わりにer1バイトを節約することです。GamrCorpsについて教えてくれてありがとう。


2

Pyth、54 33バイト

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

テストスイート。


なぜ2つ必要なの;
ヴェン

@ven ;;、プログラミング言語では普通ではありません。
リーキー修道女

;変数です。
リーキー修道女

ああ、ラムダのpythオーバーロード;...
Ven

@venあなたはPythと仲良くすると、あなたが使用することになりI.?VF;、(明示的な文)が非常に少なく、彼らは置き換えられます?muFMLR#、...
漏れ尼僧

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ステートメントなので、ラムダにすることはできません。
リン

OK。念のため。
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.