Zerhacke meine ASCII-Kunst


14

Nehmen wir an, ich habe ASCII-Kunst:

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

( Quelle )

Aber ich möchte mich auf das Kabel dieses Joysticks konzentrieren, weil ich eigentlich ein Bild von einem Gartenweg haben möchte, der zu einer Tür führt.

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

Ich könnte Zeile für Zeile kopieren, einen Texteditor mit Blockauswahlmodus verwenden oder ... ich könnte Code schreiben!

Mein Code benötigt also fünf Argumente:

  • Ein Stück ASCII-Kunst, eine durch Zeilenumbrüche getrennte Zeichenfolge.
  • Die X-Achse der oberen linken Ecke (1-indiziert, aus der linken Spalte, positive ganze Zahl)
  • Die Y-Achse der oberen linken Ecke (1-indiziert, von der oberen Reihe, positive ganze Zahl)
  • Breite des resultierenden Bildes (positive ganze Zahl)
  • Höhe des resultierenden Bildes (positive ganze Zahl)

Testfälle

ASCII-Bild:

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

Gartenweg

  • X: 10
  • Y: 15
  • Breite: 5
  • Höhe: 7

Ergebnis:

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

DB-Symbol

  • X: 3
  • Y: 12
  • Breite: 6
  • Höhe: 4

Ausgabe:

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

Alien Elder

  • X: 9
  • Y: 1
  • Breite: 7
  • Höhe: 10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

Unterschrift

  • X: 16
  • Y: 19
  • Breite: 3
  • Höhe: 1
hjw

Regeln

  • Die Ausgabe kann auf jede bequeme Weise erfolgen .
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

8
Können wir X und Y als 0-indiziert annehmen?
TFeld

8
Auch in Testfall 1, Ysollte BEW 15und in TC 2, Xsollte3
TFeld

2
Können wir annehmen, dass die Eingabe in ein Rechteck mit Leerzeichen aufgefüllt ist?
DLosc

6
Genau daran habe ich gedacht, als ich diese Kunst sah, einen Gartenweg. Ich habe an nichts anderes gedacht ...
Jo King

3
Es scheint, dass viele der X- und Y-Werte in den Testfällen falsch sind (vielleicht sind einige mit 0 indiziert ?!) - zumindest: Y von Garden Path sollte 15 sein; X von DB Icon sollte 3 sein.
Jonathan Allan

Antworten:


22

Canvas , 1 Byte

Probieren Sie es hier aus!

Es werden Höhe, Breite, Y, X und ASCII-Zeichen in dieser Reihenfolge als Eingaben verwendet.

Obwohl fast alles an ASCII-Kunstobjekten in Canvas 0-indiziert ist, ist es aus irgendeinem Grund 1-indiziert. ¯ \ _ (ツ) _ / ¯


Erwartete Antwort von Leinwand: D (mb Holzkohle haben etwas ähnliches)
Dead Possum

Was ist das für eine Zauberei!
AJFaraday

@AJFaraday Ich meine, würden Sie nicht erwarten, dass eine Sprache, die speziell für ASCII-Kunst-Manipulationen entwickelt wurde, kein eingebautes Programm hat, um einen bestimmten Teil einer ASCII-Kunst zu erhalten? : p
dzaima


4

Kohle , 7 Bytes

δJθηTζε

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt 0-indizierte Koordinaten auf. Erläuterung:

δ

Drucken Sie die ASCII-Grafik.

Jθη

Springe zur oberen linken Ecke des gewünschten Rechtecks.

Tζε

Schneiden Sie die Leinwand auf die gewünschte Größe.


3

Pip -n , 21 Bytes

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

Probieren Sie es online!

Oder wenn 0-Indizierung erlaubt ist ...

Pip -n, 17 Bytes :

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

Probieren Sie es online!

Erläuterung

Nimmt alle fünf Argumente als Befehlszeilenargumente an.

                   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)

Die obigen Lösungen setzen auch voraus, dass die Eingabe ein perfektes Rechteck ist - dh die Linien sind alle gleich lang. Andernfalls werden 2 zusätzliche Bytes benötigt ( -lanstelle von verwenden -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 Bytes

·tWÉY ®tVÉX

Versuch es

Dank Kamil Drakari konnten 2 Bytes eingespart werden

9 Byte, wenn nicht für die unnötige Anforderung, dass Lösungen eine 1-basierte Indizierung verwenden.

·tWY ®tVX

Erläuterung

                :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

In meinen Tests können Sie 2 Bytes sparen, indem Sie den Slice auf tund weitere 2 Bytes durch Indizierung auf 0 schalten . Es kann sich lohnen, auf den zweiten zu warten, da OP nicht geklärt hat, ob eine Indexierung von 0 akzeptabel ist, oder die Testfälle behoben hat.
Kamil Drakari

Schön, @KamilDrakari - habe komplett vergessen, dass die tMethode auch auf Arrays funktioniert.
Shaggy


2

J , 45 Bytes

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

Probieren Sie es online!

Anmerkungen: J akzeptiert bis zu 2 Argumente, links und rechts. Das rechte Argument ist die ASCII-Zeichenfolge, das linke eine Liste von UHXW-Werten

Ich simuliere die Newline und der Funktionsaufruf hat einen Code, um den String in ein Array umzuwandeln.


2

V , 16 Bytes

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

Probieren Sie es online!

Es wird erwartet, dass die Eingabe mit Leerzeichen aufgefüllt wird, um ein perfektes Rechteck zu bilden. Außerdem steht der 'Y'-Eingang vor dem' X '.

Hexdump:

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

2

C (gcc) , 118-109 Bytes

Die Eingabe kann gezackte Linien enthalten: Neue Linien werden gedruckt, wenn sie im y-Bereich liegen.

Danke an ceilingcat für den Vorschlag.

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

Probieren Sie es online!




1

Bash + Coreutils, 37

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

Interessanterweise erlaubt GNU Tail 8.28 (unter Ubuntu 18.04) das +NUMFormatieren, während GNU Tail 8.29 unter TIO dafür 2 zusätzliche Bytes benötigt -n+NUM.

Probieren Sie es online!

Ich dachte, dies alles in sedzu tun könnte kürzer sein, aber bei 50 Bytes ist es nicht:

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

1

K4 , 31 Bytes

Lösung:

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

Beispiele:

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"

Erläuterung:

Nehmen Sie die 1-indizierte Eingabe, generieren Sie die x / y-Koordinaten und indizieren Sie sie in 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 Bytes

Vielleicht überraschend kurze Lösung für eine Textaufforderung in R, weil wir nicht den gesamten Text in eine Matrix einlesen müssen.

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

Probieren Sie es online!


1

\ / \ /> , 123 Bytes

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

Eingabe besteht aus einer einzigen Zeile von Leerzeichen getrennten Eingangsvariablen x, y, w, und h, weiter von der ASCII Art auf der nächsten Zeile folgte.

Erläuterung

Dieser Code nutzt die Fähigkeit von \ / \ />, sich selbst zu ändern, indem die ASCII-Grafik im Code selbst platziert wird. Dies sieht dann so aus:

Code

Anschließend werden die Zeichen im angegebenen Rechteck aus dem Code entfernt und ausgegeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.