Зроби моє мистецтво 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
Крім того, у випробуванні 1 Yмає бути приведено 15, а в TC 2 Xмає бути3
TFeld

2
Чи можемо ми припустити, що вхід підкладається до прямокутника з пробілами?
DLosc

6
Саме це я і подумав, коли побачив це мистецтво ассії, садову доріжку. Я ні про що інше не думав ...
Джо Кінг,

3
Здається, у тестових випадках багато значень X і Y є невірними (можливо, деякі з них індексуються 0 ?!) - принаймні: Y Садового шляху має бути 15; X Icon DB повинен бути 3.
Джонатан Аллан

Відповіді:


22

Полотно , 1 байт

Спробуйте тут!

Вибір, ширина, Y, X та ASCII в якості вхідних даних приймаються в такому порядку.

Хоча майже все про арт-об’єкти ASCII на Canvas є 0-індексованим, чомусь є 1-індексованим. ¯ \ _ (ツ) _ / ¯


Очікувана відповідь з полотна: D (у вугілля mb є щось подібне)
Dead Possum

Що це за чаклунство!
AJFaraday

@AJFaraday Я маю на увазі, чи не очікуєте ви, що мова, спеціально створена для ASCII-маніпуляцій мистецтвом, не має вбудованої, щоб отримати конкретну частину мистецтва ascii? : 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 індексація прийнятна, чи виправлена ​​тестова справа.
Каміль Дракарі

Хороший, @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

Bash + coreutils, 37

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

Цікаво, що хвіст GNU 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

К4 , 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 координати та індекси в 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

Введення складається з одного рядка розділених пробілами вхідних змінних x, y, w, іh , потім ASCII Art на наступному рядку вперед.

Пояснення

Цей код використовує здатність \ / \ /> до самовиправлення, розміщуючи мистецтво ascii в самому коді, що в кінцевому підсумку виглядає так:

код

Потім він захоплює символи у вказаному прямокутнику від коду та виводить його.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.