สับศิลปะ 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

ผลลัพธ์:

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

ไอคอน DB

  • 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และใน TC 2 Xควรเป็น3
TFeld

2
เราสามารถสมมติว่าอินพุตนั้นถูกเติมลงในสี่เหลี่ยมที่มีช่องว่างได้หรือไม่?
DLosc

6
นั่นคือสิ่งที่ฉันคิดว่าเมื่อฉันเห็นศิลปะ ASCII เส้นทางสวน ฉันไม่ได้คิดถึงเรื่องอื่นเลย ...
King Jo

3
ดูเหมือนว่าค่า X และ Y จำนวนมากนั้นไม่ถูกต้องในกรณีทดสอบ (อาจมีบางดัชนีที่ 0 หรือไม่?) - อย่างน้อย: Y ของ Garden Path ควรเป็น 15; X of DB ไอคอนควรเป็น 3
Jonathan Allan

คำตอบ:


22

Canvas , 1 ไบต์

ลองที่นี่!

โดยใช้ความสูงความกว้าง Y, X และ ASCII เป็นอินพุตในลำดับนั้น

แม้ว่าเกือบทุกอย่างเกี่ยวกับวัตถุศิลปะ ASCII ใน Canvas จะได้รับการจัดทำดัชนี 0 แต่ก็มีการจัดทำดัชนี1 รายการด้วยเหตุผลบางประการ ¯ \ _ (ツ) _ / ¯


คำตอบที่คาดหวังจากผืนผ้าใบ: D (mb ถ่านมีบางอย่างที่คล้ายกัน)
Dead Possum

เวทมนตร์คืออะไร!
AJFaraday

@AJFaraday ฉันหมายถึงคุณจะไม่คาดหวังว่าภาษาที่สร้างขึ้นโดยเฉพาะสำหรับการดัดแปลง ASCII-art ไม่ได้มีบิวท์อินเพื่อรับส่วนเฉพาะของ ascii-art? : p
dzaima


4

ถ่าน 7 ไบต์

δJθηTζε

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด รับค่าพิกัด Coordintaes 0 คำอธิบาย:

δ

พิมพ์ศิลปะ ASCII

Jθη

ข้ามไปที่มุมซ้ายบนของสี่เหลี่ยมที่ต้องการ

Tζε

ตัดแต่งผ้าใบตามขนาดที่ต้องการ


3

Pip -n , 21 ไบต์

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

ลองออนไลน์!

หรือถ้าอนุญาตให้สร้างดัชนี 0 ได้ ...

Pip -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 ไบต์ขอบคุณKamil Drakari

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 นั้นเป็นที่ยอมรับหรือแก้ไขกรณีทดสอบ
Kamil Drakari

เป็นคนดี @KamilDrakari - ลืมtวิธีการทำงานในอาร์เรย์ได้อย่างสมบูรณ์เช่นกัน
Shaggy


2

J , 45 ไบต์

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

ลองออนไลน์!

Notes: 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 tail 8.28 (บน Ubuntu 18.04) อนุญาตให้+NUMฟอร์แมตในขณะที่ GNU tail 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

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 ในบรรทัดถัดไปเป็นต้นไป

คำอธิบาย

รหัสนี้ใช้ความสามารถของ \ / \ /> ในการปรับเปลี่ยนด้วยตนเองโดยการใส่ ASCII Art ลงในโค้ดของตัวเองซึ่งจะมีลักษณะดังนี้:

รหัส

จากนั้นจะคว้าตัวอักขระในสี่เหลี่ยมผืนผ้าที่ระบุออกจากรหัสและส่งออกมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.