ASCII sanatımı doğrayın


14

Diyelim ki bazı ASCII sanatı var:

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

( Kaynak )

Ama bu oyun çubuğunun kablosuna odaklanmak istiyorum, çünkü aslında bir kapıya giden bir bahçe yolunun resmini istiyorum.

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

Satırdan sonra satır kopyalayabilirim, blok seçim modu ile bir metin editörü kullanabilirim veya ... Bazı kodlar yazabilirim!

Yani, kodumun beş argümana ihtiyacı var:

  • Bir parça ASCII sanatı, satırsonu ayrılmış bir dize.
  • Sol üst köşenin X ekseni (1 dizinli, sol sütundan, pozitif tam sayı)
  • Sol üst köşenin Y ekseni (1 sıralı, üst sıradan, pozitif tam sayı)
  • Ortaya çıkan görüntünün genişliği (pozitif tam sayı)
  • Ortaya çıkan görüntünün yüksekliği (pozitif tamsayı)

Test Durumları

ASCII görüntüsü:

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

Bahçe yolu

  • X: 10
  • Y: 15
  • Genişlik: 5
  • Yükseklik: 7

Sonuç:

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

DB simgesi

  • X: 3
  • Y: 12
  • Genişlik: 6
  • Yükseklik: 4

Çıktı:

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

Uzaylı Yaşlı

  • X: 9
  • Y: 1
  • Genişlik: 7
  • Yükseklik: 10
  ___
,"---".
:     ;
 `-.-'
  | |
  | |
  | |
.-\_/-.
|     |
 `---'

İmza

  • X: 16
  • Y: 19
  • Genişlik: 3
  • Yükseklik: 1
hjw

kurallar


8
X ve Y'yi 0 dizinli olarak alabilir miyiz?
TFeld

8
Ayrıca, testcase 1'de, YbeW'in gerektiğini 15ve TC 2'de, Xolmalı3
TFeld

2
Girdinin boşluklu bir dikdörtgene doldurulduğunu varsayabilir miyiz?
DLosc

6
Bu ascii sanatını, bir bahçe yolunu gördüğümde tam olarak düşündüm. Başka bir şey düşünmedim ...
Jo King

3
Test durumlarında X ve Y değerlerinin birçoğu yanlış görünüyor (belki bazıları 0 indekslenmiş ?!) - en azından: Y Bahçe Yolu 15 olmalıdır; DB Icon X, 3 olmalıdır.
Jonathan Allan

Yanıtlar:


22

Tuval , 1 bayt

Burada deneyin!

Yükseklik, genişlik, Y, X ve ASCII resimlerini girdi olarak bu sırayla alır.

Canvas'taki ASCII sanat nesneleri hakkında hemen hemen her şey 0 dizinli olsa da, bir nedenden dolayı 1 dizinli. ¯ \ _ (ツ) _ / ¯


Tuvalden beklenen cevap: D (mb odun kömürü benzer bir şeye sahip)
Dead Possum

Bu ne büyücülük!
AJFaraday

@AJFaraday ASCII-art manipülasyonu için özel olarak yapılmış bir dilin bir ascii-sanatın belirli bir parçasını elde etmek için yerleşik bir dil olmasını istemez miydiniz? : p
dzaima


4

Kömür , 7 bayt

δJθηTζε

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. 0 indeksli koordinat alır. Açıklama:

δ

ASCII resmini yazdırın.

Jθη

İstediğiniz dikdörtgenin sol üst köşesine atlayın.

Tζε

Tuvali istediğiniz boyuta getirin.


3

Pip -n , 21 bayt

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

Çevrimiçi deneyin!

Veya, 0 dizinine izin verilirse ...

Pip -n, 17 bayt :

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

Çevrimiçi deneyin!

açıklama

Beş argümanın tümünü komut satırı argümanları olarak alır.

                   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)

Yukarıdaki çözümler ayrıca girişin mükemmel bir dikdörtgen olduğunu varsayar - yani, hatların hepsi aynı uzunluktadır. Aksi takdirde, 2 ekstra bayt gerekir ( -lyerine kullanın -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 bayt

·tWÉY ®tVÉX

Dene

Kamil Drakari sayesinde 2 bayt kurtardı

Çözümlerin 1 tabanlı indeksleme kullanması için gerekli değilse 9 bayt.

·tWY ®tVX

açıklama

                :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

Benim testlerde, sen kaydedebilirsiniz 2 bayt için dilim geçiş yaparak tve başka 2 bayt 0 endeksleme tarafından. OP 0 indekslemenin kabul edilebilir olup olmadığını netleştirmediği veya test senaryolarını düzeltmediği için ikincisinde beklemeye değer olabilir.
Kamil Drakari

Güzel, @KamilDrakari - tamamen tdiziler üzerinde yöntem çalışma unuttum .
Shaggy


2

J , 45 bayt

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

Çevrimiçi deneyin!

Notlar: J , sol ve sağ olmak üzere 2 bağımsız değişkeni kabul eder. Sağ argüman ASCII sanat dizesi, soldaki - UHXW değerlerinin listesi

Ben newline simüle ve fonksiyon çağrısı dizeye bir diziye dönüştürmek için bir kodu vardır.


2

V , 16 bayt

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

Çevrimiçi deneyin!

Girişin, mükemmel bir dikdörtgen olması için boşluklarla doldurulması beklenir. Ayrıca, 'Y' girişi 'X'den önce gelir.

HexDump:

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

2

C (gcc) , 118 109 bayt

Giriş tırtıklı çizgiler içerebilir: satır aralıkları y aralığında varsa basılır.

Öneri için ceilingcat'e teşekkürler.

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

Çevrimiçi deneyin!




1

Bash + coreutils, 37

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

İlginç bir şekilde, GNU kuyruğu 8.28 (Ubuntu 18.04'te) +NUMformata izin verirken, TIO'daki GNU kuyruğu 8.29 bunun için 2 ekstra bayt gerektirir -n+NUM.

Çevrimiçi deneyin!

Bunu yapmanın seddaha kısa olabileceğini düşündüm , ancak 50 baytta değil:

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

1

K4 , 31 bayt

Çözüm:

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

Örnekler:

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"

Açıklama:

1 indeksli girişi alın, x / y koordinatlarını oluşturun ve ascii sanatına indeksleyin.

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

Belki de R'deki bir metin meydan okumasına şaşırtıcı derecede kısa bir çözüm, çünkü tüm metni bir matrise gerçekten okumamız gerekmiyor.

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

Çevrimiçi deneyin!


1

\ / \ /> , 123 bayt

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

Giriş alanı ayrılmış giriş değişkenlerinin tek bir hat oluşmaktadır x, y, wve h, ileriye sonraki satırda ASCII teknikte takip eder.

açıklama

Bu kod, ascii resmini kodun kendisine yerleştirerek kendi kendini değiştirme yeteneğini kullanır ve sonuç olarak şöyle görünür:

kod

Daha sonra belirtilen dikdörtgendeki karakterleri koddan alır ve çıktısını verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.