นำศิลปะ ASCII มาสู่มิติที่ 3


11

ในการท้าทายนี้คุณจะต้องนำศิลปะ ASCII (ซึ่งโดยปกติจะเป็น 2D) มาเป็น 3D!

อย่างไร?

แบบนี้,

X X DD 
 X  D D
X X DD 

ถึง...

  X X DD 
 X X DD D
X X DDDD 
 X XDDD
X X DD

แล้วทำอย่างไรที่เราทำว่า ?

รับ ascii art Nแล้วทำซ้ำNครั้งนี้

  • สำหรับตัวละครทุกตัว (เราจะเรียกสิ่งนี้A):
  • ปล่อยให้Bเป็นตัวละครที่ถูกต้อง 1 และ 1 ขึ้นมาจากA
  • ถ้าBเป็นช่องว่างหรือไม่ได้กำหนด:
  • ตั้งค่าการBA

รายละเอียด

  • อินพุตแรกสามารถเป็นสตริงที่มีอักขระขึ้นบรรทัดใหม่หรือรายการของสตริงที่แทน art ASCII 2D
  • คุณได้รับอนุญาตให้ใช้%END%แท็กจุดสิ้นสุดการป้อนข้อมูล แต่ไม่จำเป็น
  • Nการป้อนข้อมูลที่สองจะเป็น มันจะเป็นจำนวนเต็มบวก
  • บรรทัดทั้งหมดของสตริงจะมีความยาวเท่ากัน

ตัวอย่าง

การป้อนข้อมูล: ("###\n###",1)

เอาท์พุท:

 ###
####
###

กฎระเบียบ

ใช้กฎพื้นฐานของ

นอกจากนี้หากคุณมีคำถามโปรดถามในความคิดเห็น!


คุณอาจต้องการชี้แจงว่า "blank" หมายถึง space (U + 0020) หรืออะไรก็ตาม
Leun Nun

@LeakyNun ตอนนี้ได้รับการแก้ไขแล้วหรือยัง

อนุญาตให้ใช้ช่องว่างพิเศษหรือไม่
Leun Nun

ใช่สิ่งเหล่านั้นได้รับอนุญาต

1
ฉันสามารถสมมติว่าความยาวของแต่ละบรรทัดจะเท่ากันได้หรือไม่ (ฉันสามารถป้อนข้อมูลล่วงหน้าด้วยช่องว่างด้านขวาได้หรือไม่?)
Leun Nun

คำตอบ:


18

Perl, 81 ไบต์

75 รหัสไบต์ + -i -n06
โปรดทราบว่า\eตัวละครเป็น ASCII \x1bแต่\eใช้เพื่อความสะดวกในการทดสอบ

โปรดทราบว่าโซลูชันนี้ใช้ลำดับการหลบหนีของ ANSI และต้องใช้เทอร์มินัลที่ใช้งานร่วมกันได้รวมถึงการใช้-iอาร์กิวเมนต์บรรทัดคำสั่งเพื่อส่งผ่านจำนวน 'ส่วนข้อมูล' ที่คุณต้องการ

$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I

การใช้งาน:

ในเทอร์มินัลที่ทำงานร่วมกับ Linux ได้ให้รันPS1=ก่อนเพื่อให้แน่ใจว่าพรอมต์ของคุณจะไม่เขียนทับภาพที่แสดง

perl -i10 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< ' 
ROFL:ROFL:ROFL:ROFL
         _^___
 L    __/   [] \    
LOL===__        \ 
 L      \________]
         I   I
        --------/
'

          ROFL:ROFL:ROFL:ROFL
         ROFL:ROFL:ROFL:ROFL
        ROFL:ROFL:ROFL:ROFL
       ROFL:ROFL:ROFL:ROFL\
      ROFL:ROFL:ROFL:ROFL\_]
     ROFL:ROFL:ROFL:ROFL\_]
    ROFL:ROFL:ROFL:ROFL\_]/
   ROFL:ROFL:ROFL:ROFL\_]/
  ROFL:ROFL:ROFL:ROFL\_]/
 ROFL:ROFL:ROFL:ROFL\_]/
   LOL==___^___]_\_\_]/
  LOL==__/ \_[]_\_\_]/
 LOL===__ \______\_]/
  L      \________]/
          I---I---/
         --------/

perl -i3 -n0e '$n=s/^//mg-1;s/ /\e[1C/g;print(s/^/\e[${^I}C/grm."\e[${n}A"),--$^I for($_)x$^I' <<< 'X X DD
 X  D D
X X DD
'
   X X DD
  X X DD D
 X X DDDD
  X XDDD
 X X DD

8

CJam, 25 24 ไบต์

{{' 1$f+La@+..{sS@er}}*}

บล็อกที่ไม่มีชื่อที่ต้องการรายการสตริงและจำนวนการทำซ้ำในสแต็กและปล่อยรายการสตริงใหม่แทน

ทดสอบที่นี่ (รวมถึง wrapper ทดสอบที่อ่านสตริงจาก STDIN เพื่อความสะดวก)

คำอธิบาย

{       e# Repeat this block N times...
  '     e#   Push a space character.
  1$    e#   Copy the current grid.
  f+    e#   Prepend the space to each line of the grid.
  La    e#   Push [[]].
  @+    e#   Pull up the other copy of the grid and prepend the [].
        e#   We've now got two copies of the grid, one shifted right by
        e#   a cell and one shifted down by a cell. We now want to replace
        e#   spaces in the latter with the corresponding character in the
        e#   former.
  ..{   e#   For each pair of characters in corresponding positions...
    s   e#     Turn the character in the down-shifted grid into a string.
    S   e#     Push " ".
    @   e#     Pull up the character from the right-shifted grid.
    er  e#     Replace spaces with that character.
  }
}*

5
สิบ roflcopters! goo.gl/PEK4iB

เหตุใดจึงไม่Sทำงานสำหรับพื้นที่เริ่มต้น นอกจากนี้ยังอนุญาตให้ใช้ตัวแปร (ซึ่งอาจถูกเขียนทับ) ในฟังก์ชันหรือไม่
Luis Mendo เมื่อ

@LuisMendo Sไม่ทำงานเพราะfจะทำแผนที่เหนือสตริงนั้นแทน ฟังก์ชั่นใหม่ผมเชื่อว่าในภาษา "ปกติ" นอกจากนี้ยังมีฟังก์ชั่นมากมายที่ส่งผลให้อาศัยกลมซึ่งไม่ได้ถูกดัดแปลงระหว่างการเรียกใช้
Martin Ender

ขอบคุณ ฉันลืมไปว่าตัวละครใน CJam นั้นไม่เหมือนกับสตริงตัวละครตัว
Luis Mendo

1
คุณสามารถบันทึกหนึ่งไบต์โดยใช้ Convex เนื่องจากมีตัวดำเนินการตัวแปลแบบตัวอักษรเดียวแทนที่จะเป็นแบบสองตัวอักษร: convex.tryitonline.net/ (ปลั๊กไร้ยางอาย)
GamrCorps

4

APL, 49 ไบต์

{⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵}

อินพุต: เวกเตอร์ของอักขระเวกเตอร์ ตัวอย่าง:

      2 {⎕UCS 32⌈{s+(s=0)×1⊖¯1⌽s←0⍪⍵,0}⍣⍺⊣(32∘≠×⊣)⎕UCS↑⍵} 'X X DD' ' X  D D' 'X X DD'
  X X DD 
 X X DD D
X X DDDD 
 X XDDD  
X X DD   

มันทำงานอย่างไร:

  • ↑⍵ เปลี่ยนอาร์กิวเมนต์เป็นเมทริกซ์ของตัวอักษร
  • ⎕UCS จากถ่านถึงจำนวนเต็ม
  • (32∘≠×⊣) แทนที่ช่องว่าง (32) ด้วยศูนย์
  • ...⍣⍺⊣ ใช้⍺ (อาร์กิวเมนต์ซ้าย) คูณฟังก์ชันทางซ้าย
  • s←0⍪⍵,0 เส้นขอบด้วยเลขศูนย์ที่ด้านบนและด้านขวาอาร์กิวเมนต์
  • 1⊖¯1⌽ หมุน 1 ขึ้นและ 1 ไปทางขวา
  • s+(s=0)× หาผลรวมของเวอร์ชั่นเดิมที่เลื่อนไป แต่อยู่ด้านบนของเลขศูนย์ของต้นฉบับ
  • 32⌈ เปลี่ยนค่าศูนย์เป็น 32s
  • ⎕UCS จากจำนวนเต็มเป็นอักขระ

4

MATL 24 ไบต์

:"ct32>*TTYatFTEqYSy~*+c

รูปแบบอินพุตคือ

2
{'X X DD', ' X  D D', 'X X DD'}

ตัวอย่างอื่นคือ

1
{'###', '###'}

การส่งออกมีช่องว่างพิเศษซึ่งได้รับอนุญาตจากความท้าทาย

ลองออนไลน์!


หากอาร์เรย์ char 2D เป็นที่ยอมรับเป็นอินพุต (ฉันถาม OP สองครั้ง ... ) cสามารถลบอันแรกได้ดังนั้น23 ไบต์ :

:"t32>*TTYatFTEqYSy~*+c

รูปแบบการป้อนข้อมูลในกรณีนี้คือ (สตริงทั้งหมดมีความยาวเท่ากันซึ่งอาจต้องใช้ช่องว่างภายในขวาด้วยช่องว่าง):

2
['X X DD '; ' X  D D'; 'X X DD ']

ลองออนไลน์!


คำอธิบาย

:        % Input number n implicitly. Generate [1 2 ... n]
"        % For loop: repeat n times
  c      %   Convert to char array. In the first iteration it inputs a cell array of
         %   strings implicitly and converts to a 2D char array, right-padding with
         %   spaces. In the next iterations it does nothing, as the top of the stack
         %   is already a 2D char array
  t32>*  %   Convert characters below 32 into 0
  TT     %   Push array [1 1]
  Ya     %   Pad the 2D char array with one zero in the two directions (up/down,
         %   left/right), on both sides
  t      %   Duplicate
  FTEq   %   Push array [-1 1]
  YS     %   Circularly shift the 2D char array one unit up and one unit right
  y      %   Push a copy of the non-shifted 2D array
  ~      %   Logical negate: nonzero entries become 0, zero entries become 1. This
         %   will be used as a mask for entries that need to be changed. Since the
         %   values at those entries are zero, we can simply add the new values. We do
         %   that by multiplying the mask by the shifted array and adding to the
         %   non-shifted array
  *      %   Multiply element-wise
  +      %   Add element-wise
  c      %   Convert the 2D array back to char
         % End for
         % Implicitly display

3

นูน 23 ไบต์

จำนวนไบต์ถือว่าการเข้ารหัส CP-1252

{{' 1$f+La@+..{sS@Ë}}*}

บล็อกที่ไม่มีชื่อที่ต้องการรายการสตริงและจำนวนการทำซ้ำในสแต็กและปล่อยรายการสตริงใหม่แทน

ลองออนไลน์!

นี่เป็นพอร์ตโดยตรงของคำตอบ CJam ของฉันต่อ Convex (ซึ่งยึดตาม CJam อย่างมาก) ข้อแตกต่างคือนูนใช้Ëแทนerการทับศัพท์บันทึกหนึ่งไบต์ ขอบคุณ GamrCorps ที่ให้ฉันรู้เกี่ยวกับมัน


2

Pyth, 54 33 ไบต์

ju+++dhG.bsmh|-d;;.t,Y+dNdtGGeG.*

ชุดทดสอบ


ทำไมคุณต้องสอง;?
Ven

@ven ;ไม่ปกติ;ในภาษาการเขียนโปรแกรม
Leun Nun

;เป็นตัวแปร
Leun Nun

อา overloads pyth ;ใน lambdas ...
Ven

@ven เมื่อคุณได้รับพร้อมกับ Pyth คุณจะใช้I, .?, V, F, ;, (งบอย่างชัดเจน) น้อยมากและพวกเขาจะถูกแทนที่ด้วย?, m, u, F, M, L, R, #...
รั่วนูน

2

JavaScript (ES6), 128 ไบต์

f=(a,n)=>n?f((a=[``,...a].map(s=>[...s||` `])).map((b,i)=>i--&&b.map((c,j)=>a[i][++j]>' '?0:a[i][j]=c))&&a.map(b=>b.join``),n-1):a

ยอมรับและส่งกลับอาร์เรย์ของสตริงเตรียมแถวพิเศษสำหรับเอาท์พุทให้แน่ใจว่าแต่ละแถวมีช่องว่างอย่างน้อยหนึ่งช่องแยกมันทั้งหมดเป็นอักขระลูปแม้ว่าจะพยายามคัดลอกอักขระไปยังแถวด้านบนและคอลัมน์ทางด้านขวาจากนั้น เรียกตัวเองซ้ำเพื่อให้วนซ้ำ


2

Python 2, 116 ไบต์

S=' '
def f(a,d):e=[S*len(`a`)];exec"a=[''.join(t[t[1]>S]for t in zip(S+x,y+S))for x,y in zip(a+e,e+a)];"*d;return a

ฉันจะตีกอล์ฟนี้อีกไม่นาน


คุณแน่ใจหรือว่าlambdaไม่สั้นกว่านี้?
wizzwizz4

ฉันต้องการการมอบหมายจากeในนั้น นอกจากนี้ยังexecเป็นคำสั่งดังนั้นจึงไม่สามารถอยู่ในแลมบ์ดา
ลินน์

ตกลง. แค่ทำให้แน่ใจ
wizzwizz4

2

Ruby, 95 ไบต์

->a,n{n.downto(0){|i|f="<Esc>[1C"
$><<a.gsub(/^/,f*i).gsub(" ",f)+(i>0?"<Esc>[#{a.lines.size-1}A":"")}}

แต่ละ<Esc>ตัวมีตัวอักษร ESC ตามตัวอักษร ( 0x1b)

การใช้

funcกําหนดแลมบ์ดาไปเช่นตัวแปร

art = <<END
X X DD
 X  D D
X X DD
END

func[art, 2]
# Prints:
#   X X DD
#  X X DD D
# X X DDDD
#  X XDDD
# X X DD

Ungolfed

->(art, num) {
  num.downto(0) do |i|
    forward = "\e[1C"
    $> << art.gsub(/^/, forward * i).gsub(" ", forward) +
            (i > 0 ? "\e[#{art.lines.size - 1}A" : "")
  end
}

forwardลำดับหนี\e[1Cย้ายเคอร์เซอร์ไปข้างหน้า (ขวา) 1 พื้นที่และ\e[<n>Aย้ายมันขึ้นnบรรทัด โดยพื้นฐานสิ่งที่รหัสนี้ทำคือพิมพ์ "เลเยอร์" กลับไปข้างหน้าแทนที่ช่องว่างด้วยforwardลำดับเพื่อหลีกเลี่ยงการเขียนทับเลเยอร์อื่นด้วยช่องว่าง


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