Posiekaj moją sztukę ASCII

14

Powiedzmy, że mam trochę grafiki ASCII:

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

( Źródło )

Chcę jednak skupić się na kablu tego joysticka, ponieważ tak naprawdę chcę zdjęcia ścieżki ogrodowej prowadzącej do drzwi.

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

Mógłbym kopiować wiersz po wierszu, mogłem użyć edytora tekstu z trybem wyboru bloku lub ... mogłem napisać kod!

Zatem mój kod potrzebuje pięciu argumentów:

  • Kawałek sztuki ASCII, ciąg oddzielony znakiem nowej linii.
  • Oś X lewego górnego rogu (indeksowana 1, z lewej kolumny, dodatnia liczba całkowita)
  • Oś Y lewego górnego rogu (1-indeksowana, od górnego rzędu, dodatnia liczba całkowita)
  • Szerokość powstałego obrazu (dodatnia liczba całkowita)
  • Wysokość uzyskanego obrazu (dodatnia liczba całkowita)

Przypadki testowe

Obraz ASCII:

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

Ścieżka ogrodowa

  • X: 10
  • Y: 15
  • Szerokość: 5
  • Wysokość: 7

Wynik:

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

Ikona DB

  • X: 3
  • Y: 12
  • Szerokość: 6
  • Wysokość: 4

Wynik:

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

Alien Elder

  • X: 9
  • Y: 1
  • Szerokość: 7
  • Wysokość: 10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

Podpis

  • X: 16
  • Y: 19
  • Szerokość: 3
  • Wysokość: 1
hjw

Zasady

AJFaraday
źródło
8
Czy możemy wziąć X i Y jako indeksowane 0?
TFeld
8
Również w testcase 1, Ypowinny BEW 15, aw TC 2, Xpowinny być3
TFeld
2
Czy możemy założyć, że dane wejściowe są wypełnione prostokątem ze spacjami?
DLosc
6
Właśnie o tym myślałem, kiedy zobaczyłem tę sztukę ascii, ścieżkę ogrodową. W ogóle nie myślałem o niczym innym ...
Jo King,
3
Wydaje się, że wiele wartości X i Y jest niepoprawnych w przypadkach testowych (może niektóre mają indeksowane 0 ?!) - przynajmniej: Y ścieżki ogrodowej powinno wynosić 15; X ikony DB powinno wynosić 3.
Jonathan Allan

Odpowiedzi:

22

Płótno , 1 bajt

Wypróbuj tutaj!

Jako dane wejściowe przyjmuje wysokość, szerokość, Y, X i grafikę ASCII, w tej kolejności.

Chociaż prawie wszystko w obiektach artystycznych ASCII w Canvas jest indeksowane na 0, z jakiegoś powodu jest indeksowane na 1. ¯ \ _ (ツ) _ / ¯

dzaima
źródło
Oczekiwana odpowiedź z płótna: D (węgiel drzewny ma coś podobnego)
Dead Possum
Co to za czary!
AJFaraday
@AJFaraday Mam na myśli, czy nie spodziewałbyś się, że język stworzony specjalnie do manipulacji sztuką ASCII nie będzie miał wbudowanej funkcji pozwalającej uzyskać określoną część sztuki ascii? : p
dzaima
7

Python 2 , 64 62 bajtów

lambda I,x,y,w,h:[l[x-1:][:w]for l in I.split('\n')[y-1:][:h]]

Wypróbuj online!


Jeśli Xi Ymoże być0 zindeksować:

Python 2 , 56 bajtów

lambda I,x,y,w,h:[l[x:x+w]for l in I.split('\n')[y:y+h]]

Wypróbuj online!

TFeld
źródło
4

Węgiel drzewny , 7 bajtów

δJθηTζε

Wypróbuj online! Link jest do pełnej wersji kodu. Przyjmuje współrzędne 0-indeksowane. Wyjaśnienie:

δ

Wydrukuj grafikę ASCII.

Jθη

Przejdź do lewego górnego rogu żądanego prostokąta.

Tζε

Przytnij płótno do pożądanego rozmiaru.

Neil
źródło
3

Pip -n , 21 bajtów

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

Wypróbuj online!

Lub jeśli dozwolone jest indeksowanie 0 ...

Pip -n, 17 bajtów :

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

Wypróbuj online!

Wyjaśnienie

Pobiera wszystkie pięć argumentów jako argumenty wiersza polecenia.

                   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)

Powyższe rozwiązania zakładają również, że wejście jest idealnym prostokątem - tzn. Linie mają tę samą długość. W przeciwnym razie potrzebne są 2 dodatkowe bajty (użyj -lzamiast -n):

(Z(a^nZDsb+,d)c+,e)      0-indexed, 19 bytes
(Z(a^nZDs--b+,d)--c+,e)  1-indexed, 23 bytes
DLosc
źródło
3

Japt -R , 13 11 bajtów

·tWÉY ®tVÉX

Spróbuj

2 bajty zapisane dzięki Kamilowi ​​Drakari

9 bajtów, jeśli nie niepotrzebne wymaganie, aby rozwiązania korzystały z indeksowania 1.

·tWY ®tVX

Wyjaśnienie

                :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
Kudłaty
źródło
W moich testach możesz zapisać 2 bajty , przełączając plasterek nat , a kolejne 2 bajty , indeksując 0. Być może warto poczekać na drugą, ponieważ OP nie wyjaśniło, czy indeksowanie 0 jest dopuszczalne, ani nie naprawiło przypadków testowych.
Kamil Drakari
Fajny, @KamilDrakari - całkowicie zapomniałem, że tmetoda działa również na tablicach.
Kudłaty
2

J , 45 bajtów

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

Wypróbuj online!

Uwagi: J akceptuje maksymalnie 2 argumenty, lewy i prawy. Prawym argumentem jest ciąg znaków ASCII, lewy - lista wartości UHXW

Symuluję znak nowej linii, a wywołanie funkcji zawiera kod do konwersji ciągu znaków na tablicę.

Galen Iwanow
źródło
2

V , 16 bajtów

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

Wypróbuj online!

Oczekuje się, że dane wejściowe zostaną wypełnione spacjami, aby były idealnym prostokątem. Również wejście „Y” znajduje się przed „X”.

Hexdump:

00000000: c047 c07c 1640 636c 4064 6a79 4856 4770  .G.|.@cl@djyHVGp
James
źródło
2

C (gcc) , 118 109 bajtów

Dane wejściowe mogą zawierać postrzępione linie: nowe linie są drukowane, jeśli istnieją w zakresie y.

Dzięki pułapkowi cat za sugestię.

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);}

Wypróbuj online!

ErikF
źródło
1

Galaretka , 11 bajtów

Ỵṫ€¥ṫḣ€ḣ4ƭ/

Wypróbuj online!

Przyjmuje ASCII-art jako wieloliniowy ciąg r Pythona (aby uniknąć problemów z odwrotnymi ukośnikami).

Erik the Outgolfer
źródło
1

Haskell , 61 bajtów

(x#y)w h=unlines.map(take w.drop(x-1)).take h.drop(y-1).lines

Wypróbuj online!

Trwa argumentów w kolejności: x, y, w, h, s.

całkowicie ludzki
źródło
58 bajtów: Wypróbuj online!
Laikoni
1

Bash + coreutils, 37

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

Co ciekawe, ogon GNU 8.28 (na Ubuntu 18.04) zezwala na +NUMformat, podczas gdy ogon GNU 8.29 na TIO wymaga do tego 2 dodatkowych bajtów -n+NUM.

Wypróbuj online!

Myślałem, że wykonanie tego wszystkiego sedmoże być krótsze, ale przy 50 bajtach nie jest to:

sed -nr "$2,$[$2+$4-1]s/.{$[$1-1]}(.{,$3}).*/\1/p"
Cyfrowa trauma
źródło
1

K4 , 31 bajtów

Rozwiązanie:

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

Przykłady:

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"

Wyjaśnienie:

Weź 1-indeksowane dane wejściowe, wygeneruj współrzędne x / y i zindeksuj do sztuki 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
streetster
źródło
1

R , 62 bajty

Być może zaskakująco krótkie rozwiązanie problemu tekstowego w R, ponieważ nie musimy tak naprawdę czytać całego tekstu w matrycy.

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

Wypróbuj online!

J.Doe
źródło
1

\ / \ /> , 123 bajty

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

Wejście składa się z jednej linii zmiennych wejściowych spacjami x, y,w , ih , a następnie ASCII w następnym wierszu naprzód.

Wyjaśnienie

Ten kod wykorzystuje zdolność \ / \ /> do samodzielnej modyfikacji poprzez umieszczenie grafiki ascii w samym kodzie, co ostatecznie wygląda następująco:

kod

Następnie pobiera znaki z określonego prostokąta z kodu i wysyła go.

torcado
źródło