Расколоть мое искусство 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

Результат:

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

Значок БД

  • 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
Кроме того , в TestCase 1, Yдолжны BEW 15, а в ТК 2, Xдолжно быть3
TFeld

2
Можем ли мы предположить, что ввод дополнен прямоугольником с пробелами?
DLosc

6
Это именно то, о чем я подумала, когда увидела это искусство, садовую дорожку. Я больше ни о чем не думал ...
Джо Кинг,

3
Кажется, что многие значения X и Y неверны в тестовых случаях (может быть, некоторые проиндексированы 0 ?!) - по крайней мере: Y из Garden Path должно быть 15; X значка DB должен быть 3.
Джонатан Аллан

Ответы:


22

Холст , 1 байт

Попробуй это здесь!

Он принимает высоту, ширину, Y, X и искусство ASCII в качестве входных данных в указанном порядке.

Хотя почти все в арт-объектах ASCII в Canvas 0-проиндексировано, по какой-то причине 1-индексировано. ¯ \ _ (ツ) _ / ¯


Ожидаемый ответ от холста: D (мб древесного угля есть что-то похожее)
Мертвый Опоссум

Что это за колдовство!
AJFaraday

@AJFaraday Я имею в виду, разве вы не ожидаете, что язык, специально созданный для манипуляции с ASCII-искусством, не будет иметь встроенного, чтобы получить определенную часть ascii-art? : p
dzaima


4

Уголь , 7 байт

δJθηTζε

Попробуйте онлайн!Ссылка на подробную версию кода. Принимает 0-индексированные координаты. Объяснение:

δ

Распечатать ASCII арт.

Jθη

Перейти в верхний левый угол нужного прямоугольника.

Tζε

Обрежьте холст до нужного размера.


3

Пип -n , 21 байт

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

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

Или, если 0-индексация разрешена ...

Пип -n, 17 байт :

_@>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 -R , 13 11 байт

·tWÉY ®tVÉX

Попытайся

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, и еще 2 байта на индексирование 0. Возможно, стоит подождать со вторым, так как 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».

HexDump:

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

2

C (gcc) , 118 109 байт

Входные данные могут содержать неровные линии: новые строки печатаются, если они существуют в y-диапазоне.

Благодарю потолочный кот за предложение.

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

удар + coreutils, 37

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

Интересно, что GNU tail 8.28 (в Ubuntu 18.04) позволяет +NUM форматирование, тогда как хвостовая часть GNU 8.29 в TIO требует для этого 2 дополнительных байта -n+NUM.

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

Я думал, что все это sedможет быть короче, но на 50 байтов это не так:

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

1

K4 , 31 байт

Решение:

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

р , 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

Ввод состоит из одной строки разделенных пробелами входных переменных x, y, w, иh , затем ASCII Art на следующей строке вперед.

объяснение

Этот код использует способность \ / \ /> к самоизменению, помещая ascii art в сам код, который в итоге выглядит следующим образом:

код

Затем он берет символы в указанном прямоугольнике из кода и выводит его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.