ASCIIアートを切り刻む


14

ASCIIアートがあるとしましょう:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

ソース

しかし、実際にはドアにつながる庭の小道の写真が欲しいので、このジョイスティックのケーブルに焦点を合わせたいと思います。

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

行ごとにコピーしたり、ブロック選択モードでテキストエディターを使用したり、コードを記述したりできます。

したがって、私のコードには5つの引数が必要です。

  • ASCIIアートの一部、改行で区切られた文字列。
  • 左上隅のX軸(1-indexed、左の列から正の整数)
  • 左上隅のY軸(1インデックス、最上行から正の整数)
  • 結果の画像の幅(正の整数)
  • 結果の画像の高さ(正の整数)

テストケース

ASCIIイメージ:

          ___
        ,"---".
        :     ;
         `-.-'
          | |
          | |
          | |
       _.-\_/-._
    _ / |     | \ _
   / /   `---'   \ \
  /  `-----------'  \
 /,-""-.       ,-""-.\
( i-..-i       i-..-i )
|`|    |-------|    |'|
\ `-..-'  ,=.  `-..-'/
 `--------|=|-------'
          | |
          \ \
           ) ) hjw
          / /
         ( (

庭の道

  • X:10
  • Y:15
  • 幅:5
  • 高さ:7

結果:

 ,=.
-|=|-
 | |
 \ \
  ) )
 / /
( (

DBアイコン

  • X:3
  • Y:12
  • 幅:6
  • 高さ:4

出力:

,-""-.
i-..-i
|    |
`-..-'

エイリアンエルダー

  • X:9
  • Y:1
  • 幅:7
  • 高さ:10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

署名

  • X:16
  • Y:19
  • 幅:3
  • 高さ:1
hjw

ルール

  • 便利な方法で出力できます。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

8
XとYを0インデックスとして取得できますか?
TFeld

8
また、テストケース1では、YBEWべき15、及びTC 2に、Xあるべきである3
TFeld

2
入力がスペースのある長方形に埋め込まれていると仮定できますか?
DLosc

6
それはまさにそのアスキーアート、庭の小道を見たときに私が考えていたものです。私は...まったく、何を考えていなかった
ジョー・キング

3
XとYの値の多くは、テストケースで正しくないようです(いくつかは0がインデックス付けされていますか?!)-少なくとも:Garden PathのYは15でなければなりません。DBアイコンのXは3でなければなりません
ジョナサン・アラン

回答:


22

キャンバス、1 バイト

ここで試してみてください!

入力として、高さ、幅、Y、X、およびASCIIアートを順番に受け取ります。

CanvasのASCIIアートオブジェクトに関するほとんどすべてのインデックスは0 ですが、何らかの理由で1がインデックス付けされています。¯\ _(ツ)_ /¯


キャンバスからの期待される答え:D(mb木炭に似たようなものがあります)
デッドポッサム

これはどのような魔術です!
AJFaraday

@AJFaradayつまり、ASCIIアートの操作用に特別に作成された言語には、ASCIIアートの特定の部分を取得するためのビルトインがないと期待しませんか?:p
dzaima


4

、7バイト

δJθηTζε

オンラインでお試しください!リンクは、コードの詳細バージョンです。0インデックスのコーディネータを取ります。説明:

δ

ASCIIアートを印刷します。

Jθη

目的の四角形の左上隅にジャンプします。

Tζε

キャンバスを希望のサイズにトリミングします。


3

ピップ -n、21バイト

_@>--b@<dM(a^n--c+,e)

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

または、0インデックスが許可されている場合...

ピップ-n17バイト

_@>b@<dM(a^nc+,e)

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

説明

5つの引数すべてをコマンドライン引数として受け取ります。

                   a-e are the 5 cmdline args; n is newline
         a^n       Split a on newlines
              ,e   Range(e)
            c+     Add c to each element
        (       )  Use the resulting range(c,c+e) to slice into the list of lines
       M           To each line, map this function:
_                   The line
 @>b                Slice, keeping indices b and greater
    @<d             Slice, keeping indices less than d
                   Print, joining on newlines (-n flag)

上記の解決策は、入力が完全な長方形である、つまり線がすべて同じ長さであると仮定しています。それ以外の場合は、余分な2バイトが必要です(-l代わりに使用-n):

(Z(a^nZDsb+,d)c+,e)      0-indexed, 19 bytes
(Z(a^nZDs--b+,d)--c+,e)  1-indexed, 23 bytes


3

Japt -R13 11バイト

·tWÉY ®tVÉX

それを試してみてください

カミル・ドラカリのおかげで2バイト節約

ソリューションが1ベースのインデックス作成を使用するという不必要な要件がない場合、9バイト。

·tWY ®tVX

説明

                :Implicit input of string U and integers V=X, W=Y, X=Width & Y=Height
·               :Split U on newlines
 t              :Slice
  WÉ            : From 0-based index W-1
    Y           : To length Y
      ®         :Map
       t        :  Substring
        VÉ      :   From 0-based index V-1
          X     :   To length X
                :Implicitly join with newlines and output

私のテストでは、あなたが保存することができます2バイトのスライスを切り替えることによりt、および他の2つのバイト 0インデックスによると。OPはインデックス付け0が受け入れられるかどうかを明確にしていないか、テストケースを修正していないので、2番目のものを待つ価値があるかもしれません。
カミルドラカリ

素晴らしいもの、@ KamilDrakari- tメソッドが配列でも機能することを完全に忘れていました。
シャギー


2

J、45バイト

f=:4 :0
'a b c d'=.x-#:10
y{~<(a+i.b);c+i.d
)

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

ノート: Jは、左と右の最大2つの引数を受け入れます。右の引数はASCIIアート文字列、左の引数はUHXW値のリストです

改行をシミュレートし、関数呼び出しには文字列を配列に変換するコードがあります。


2

V、16バイト

ÀGÀ|<C-v>@cl@djyHVGp

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

入力にはスペースが埋め込まれ、完全な長方形になることが期待されます。また、「Y」入力は「X」の前に来ます。

Hexdump:

00000000: c047 c07c 1640 636c 4064 6a79 4856 4770  .G.|.@cl@djyHVGp

2

C(gcc)118 109バイト

入力にはギザギザの行を含めることができます。y範囲に存在する場合、改行が印刷されます。

提案してくれたceilingcatに感謝します。

f(s,x,y,w,h,a,b,c)char*s;{for(b=1,a=0;*s;a=c?!b++:a,s++)((c=*s==10)|++a>=x&a-x<w)&b>=y&b-y<h-c&&putchar(*s);}

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




1

Bash + coreutils、37

cut -b$1-$[$1+$3-1]|tail +$2|head -$4

興味深いことに、GNU tail 8.28(Ubuntu 18.04)では、 +NUMフォーマットますが、TIOのGNU tail 8.29ではこのために2バイト余分に必要-n+NUMです。

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

私はこれをすべて行うのはsed短いかもしれないと思ったが、50バイトではそうではない:

sed -nr "$2,$[$2+$4-1]s/.{$[$1-1]}(.{,$3}).*/\1/p"

1

K4バイト

解決:

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w}

例:

q)ASCII:("          ___";"        ,\"---\".";"        :     ;";"         `-.-'";"          | |";"          | |";"          | |";"       _.-\\_/-._";"    _ / |     | \\ _";"   / /   `---'   \\ \\";"  /  `-----------'  \\";" /,-\"\"-.       ,-\"\"-.\\";"( i-..-i       i-..-i )";"|`|    |-------|    |'|";"\\ `-..-'  ,=.  `-..-'/";" `--------|=|-------'";"          | |";"          \\ \\";"           ) ) hjw";"          / /";"         ( (")
q)k){[a;x;y;w;h]a .-1+(y;x)+!:'h,w}[ASCII;10;15;5;7]
" ,=. "
"-|=|-"
" | | "
" \\ \\ "
"  ) )"
" / / "
"( (  "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;3;12;6;4]
",-\"\"-."
"i-..-i"
"|    |"
"`-..-'"
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;9;1;7;10]
"  ___  "
",\"---\"."
":     ;"
" `-.-' "
"  | |  "
"  | |  "
"  | |  "
".-\\_/-."
"|     |"
" `---' "
q)k){[a;x;y;w;h].[a;-1+(y;x)+!:'h,w]}[ASCII;16;19;3;1]
"hjw"

説明:

1インデックスの入力を取得して、x / y座標を生成し、ASCIIアートにインデックスを付けます。

{[a;x;y;w;h]a .-1+(y;x)+!:'h,w} / the solution
{[a;x;y;w;h]                  } / lambda taking 5 inputs, a(scii), x, y, w(idth), h(eight)
                           h,w  / concatenate height and width, e.g. 7 5
                        !:'     / range til each, e.g. (0 1 2 3 4 5 6;0 1 2 3 4)
                  (y;x)+        / add list y x to it, e.g. (15 16 17 18 19 20 21;10 11 12 13 14)
               -1+              / subtract 1, e.g. (14 15 16 17 18 19 20;9 10 11 12 13)
            a .                 / index into a at these coordinates


1

\ / \ />、123バイト

j:j8+}j+}j}pppp80x
{:}i:0(?v:a=?x@s1+:
~~~~1+0!/000y
yp:qqqq~
q{y?=p:+1q:}}g$q:pp:
1}x}p}ap:q~q+1{{y!?:-
ys{{
~!u.*2(0:;!?h

入力はスペース区切り入力変数の単一のラインで構成されxyw、およびh、以降次の行にアスキーアート続きます。

説明

このコードは、コード自体にasciiアートを配置することで自己修正する\ / \ />の機能を使用しており、最終的には次のようになります。

コード

次に、コードから指定された長方形の文字を取得して出力します。

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