切碎我的ASCII艺术


14

假设我有一些ASCII艺术:

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

来源

但我想重点关注此操纵杆的电缆,因为我实际上想要一张通往小门的花园小径的图片。

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

我可以逐行复制,可以使用带有块选择模式的文本编辑器,或者...可以编写一些代码!

因此,我的代码需要五个参数:

  • 一种ASCII艺术,一个换行符分隔的字符串。
  • 左上角的X轴(从左列开始为1索引,为正整数)
  • 左上角的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索引吗?
TF

8
此外,在测试用例1中,Y应为bew 15,在TC 2中X应为3
TFeld 18'Oct

2
我们可以假设输入被填充为带有空格的矩形吗?
DLosc

6
那正是我看到ascii艺术,花园小径时想到的。我什么都没想到...
Jo King

3
在测试用例中,似乎许多X和Y值都不正确(也许有些索引是0 ?!)-至少:Garden Path的Y应该为15;DB图标的X应为3
乔纳森·艾伦

Answers:


22

画布,1 字节

在这里尝试!

它以高度,宽度,Y,X和ASCII艺术作品作为输入。

尽管关于Canvas中的ASCII美术对象的几乎所有内容都是0索引的,但出于某种原因却是1索引的。¯\ _(ツ)_ /¯


来自画布的预期答案:D(mb木炭有类似的东西)
Dead Possum 18'Oct

这是什么法术!
AJFaraday

@AJFaraday我的意思是,您是否不希望为ASCII艺术操作专门制作的语言没有内置语言来获取ascii艺术的特定部分?:p
dzaima


4

木炭,7个字节

δJθηTζε

在线尝试!链接是详细版本的代码。接受0索引的坐标。说明:

δ

打印ASCII文字。

Jθη

跳到所需矩形的左上角。

Tζε

将画布修剪到所需的尺寸。


3

-n,21字节

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

在线尝试!

或者,如果允许使用0索引...

Pip -n17个字节

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

在线尝试!

说明

将所有五个参数作为命令行参数。

                   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

尝试一下

多亏了Kamil Drakari,节省了2个字节

9字节(如果不是出于解决方案使用基于1的索引的不必要要求)。

·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,并通过0索引另外节省2个字节。可能值得等待第二个,因为OP尚未弄清0索引是否可以接受,还是固定了测试用例。
卡米尔·德拉卡里

好的@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”之前。

十六进制转储:

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尾8.28(在Ubuntu 18.04上)允许+NUM格式,而TIO上的GNU尾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 art。

{[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

[R,62个字节

对于R中的文本挑战而言,也许是出乎意料的简短解决方案,因为我们不需要将整个文本实际读入矩阵。

function(x,y,w,h)write(substr(readLines()[y+1:h-1],x,x+w-1),1)

在线尝试!


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艺术上的下一行以后。

说明

这段代码使用\ / \ />的自修改功能,方法是将ascii art放置在代码本身中,最终看起来像这样:

码

然后,它从代码中获取指定矩形中的字符并将其输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.