ทำตัวเอียงศิลปะ ASCII


32

เมื่อกำหนดอินพุตของรูปภาพศิลปะ ASCII ให้ส่งออกศิลปะ ASCII ที่ทำเป็นตัวเอียง

หากต้องการเอียงศิลปะ ASCII ให้ทำดังนี้:

  1. แทรกศูนย์เว้นวรรคก่อนบรรทัดสุดท้ายหนึ่งช่องว่างก่อนบรรทัดที่สองสุดท้ายช่องว่างสองช่องก่อนบรรทัดที่สามสุดท้าย ฯลฯ

  2. ลบช่องว่างนำหน้าพิเศษใด ๆ ที่อาจสร้างขึ้น นั่นคือถ้าแต่ละบรรทัดมีnช่องว่างก่อนหน้านั้นอย่างน้อยให้ลบnช่องว่างออกจากจุดเริ่มต้นของแต่ละบรรทัด

  3. แทนที่ทั้งหมด\s กับ|ทุก|วินาทีที่มี/และทุกวินาทีกับ/ _รักษาที่มีอยู่_เดิม

    อินพุตรับประกันว่ามีเฉพาะอักขระ\|/_และช่องว่าง

ตัวอย่างเช่นการป้อนข้อมูล

/\/\/\    /\/\/\      /\/\/\    /\/\/\
 /\    /\  /\    /\  /\        /\
  /\/\/\    /\/\/\    /\        /\  /\/\
   /\        /\        /\        /\    /\
    /\        /\          /\/\/\    /\/\/\

จะต้องส่งออก

_|_|_|    _|_|_|      _|_|_|    _|_|_|
_|    _|  _|    _|  _|        _|
_|_|_|    _|_|_|    _|        _|  _|_|
_|        _|        _|        _|    _|
_|        _|          _|_|_|    _|_|_|

ซึ่งจะให้ไว้เป็นอินพุตเอาต์พุต

    _/_/_/    _/_/_/      _/_/_/    _/_/_/
   _/    _/  _/    _/  _/        _/
  _/_/_/    _/_/_/    _/        _/  _/_/
 _/        _/        _/        _/    _/
_/        _/          _/_/_/    _/_/_/

ซึ่งจะส่งออก

        ______    ______      ______    ______
      __    __  __    __  __        __
    ______    ______    __        __  ____
  __        __        __        __    __
__        __          ______    ______

อินพุตและเอาต์พุตอาจเป็นสตริงเดี่ยว (ที่มีบรรทัดใหม่ต่อท้ายเผื่อเลือก) หรืออาร์เรย์ของบรรทัด

เนื่องจากนี่คือรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ

กรณีทดสอบเพิ่มเติม:

|||||
  /////
 \\\\\
   _____
 /////
  _____
|||||
 _____


________
________


(นั่นคืออินพุตของสตริงว่างส่งผลให้เกิดเอาต์พุตของสตริงว่าง)


เราสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกเสริมลงในสี่เหลี่ยมหรือไม่?
Martin Ender

2
ช่องว่างต่อท้ายยอมรับได้ในแต่ละบรรทัดเอาต์พุตหรือไม่
Luis Mendo

@ MartinBüttnerใช่คุณทำได้
Doorknob

@DonMuesli ช่องว่างต่อท้ายไม่เป็นไรไม่มีช่องว่างนำหน้า
Doorknob

เราจะรับอินพุตเป็นอาร์เรย์สี่เหลี่ยม (เมทริกซ์) ได้ไหม
Adám

คำตอบ:


6

CJam, 43 38 ไบต์

qN/W%eeSf.*:sW%z_{S-}#>zN*"\|/__"_(+er

ต้องใช้อินพุทเป็นแผ่นรองลงในสี่เหลี่ยมผืนผ้า

ลองออนไลน์!

คำอธิบาย

qN/     e# Read input, split into lines.
W%      e# Reverse lines.
ee      e# Enumerate them (pairing each line with its index starting from 0).
Sf.*    e# Turn each index i into i spaces.
:s      e# Flatten each pair into a single string, prepending the spaces.
W%      e# Reverse the lines again.
z_      e# Transpose the character grid, duplicate it.
{S-}#   e# Find the first row index that contains non-spaces.
>       e# Discard that many rows.
zN*     e# Transpose back and join with linefeeds.
"\|/__" e# Push this string.
_(+     e# Make a copy that's rotated one character to the left, i.e. "|/__\".
er      e# Perform character transliteration mapping from the first string to the second.

บันทึกย่อ แต่ฉันลองตัวอย่าง PCCG จากคำถามให้ป้อนผลลัพธ์แต่ละรายการกลับเข้าสู่โปรแกรม แต่ไม่มีการขยายไปยังสี่เหลี่ยมผืนผ้า ทำงานได้ดี
alexwlchan

@alexwlchan ใช่แล้วการเว้นวรรคต่อท้ายเกินขอบเขตสี่เหลี่ยมผืนผ้านั้นไม่สำคัญ (แต่ไม่จำเป็นต้องเก็บรักษาไว้) แต่ถ้าคุณใช้ตัวอย่าง PPCG ดั้งเดิมของตัวเองตัวอย่างเช่นและลบช่องว่างท้ายในGการเปลี่ยนแปลงจะยุบลงไปด้านบน
Martin Ender

4

Pyth, 32

jCf|Z=Z-Td.t_.e+*kd.rb"\|/__"_Qd

ลองที่นี่หรือเรียกใช้ชุดทดสอบ

แต่ละบรรทัดมีช่องว่างต่อท้ายหลายช่อง ทำงานโดยใช้.rการหมุนที่มีอยู่แล้วในแต่ละบรรทัดของสตริง การหมุนใช้อักขระแต่ละตัวในสตริงที่ตรงกับหนึ่งในอาร์กิวเมนต์อื่น"\|/__"และแทนที่ด้วยอักขระถัดไป การขีดเส้นใต้สองครั้งจะช่วยป้องกันการเกิดเครื่องหมายแบ็กสแลช สตริงยังมีเบาะตามดัชนีของพวกเขา

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


4

MATL , 38 33 29 ไบต์

P"NZ"@Y:'\|/' '|/_'XEh]XhPcYv

บรรทัดเอาต์พุตมีช่องว่างต่อท้ายเพื่อให้ตรงกับบรรทัดที่ยาวที่สุด (ซึ่งได้รับอนุญาตจากการท้าทาย)

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

คำอธิบาย

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

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

P             % implicitly input cell array of strings. Flip it (reverse order)
"             % for each
  NZ"         %   string with as many spaces as elements there are on the stack
  @Y:         %   push current input string
  '\|/'       %   push string: origin for replacement
  '|/_'       %   push string: target for replacement
  XE          %   replace
  h           %   concatenate string with spaces and modified-character string
]             % end for each
Xh            % collect all processed strings in a cell array
P             % flip back to restore original order
c             % convert to 2D char array
Yv            % remove trailing spaces common to all rows. Implicitly display

2

JavaScript (ES6), 171 149 148 ไบต์

a=>a.map(s=>(t=' '.repeat(--i)+s,l=t.match` *`[0].length,n=l<n?l:n,t),n=i=a.length).map(s=>s.slice(n).replace(/./g,c=>"|/__ "["\\|/_ ".indexOf(c)]))

ยอมรับและส่งคืนบรรทัดเป็นอาร์เรย์ของสตริง

แก้ไข: บันทึกแล้ว 22 ไบต์ด้วย @ user81655 บันทึก 1 ไบต์โดยตระหนักว่าอินพุตถูก จำกัด ไว้ที่ 5 ตัวอักษร\|/_และช่องว่าง


replaces สามารถรวมกันเป็น.replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]), match(/ */)สามารถmatch` *`, สองคนแรกmapที่สามารถรวมกันเป็นa.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),...วงเล็บด้านนอก ( (a=...)) ตอนนี้สามารถถอดออกได้ 149 ไบต์:a=>a.map(s=>(t=' '.repeat(--i)+s,(l=t.match` *`[0].length)<n?n=l:l,t),n=i=a.length).map(s=>s.slice(n).replace(/[\\|/]/g,m=>"|/_"["\\|/".indexOf(m)]))
81655

@ user81655 ว้าวขอบคุณมาก! (จากนั้นฉันก็ค่อนข้างนิสัยเสียด้วยการเล่นไบต์ของคุณreplace)
Neil

2

Dyalog APL (เวอร์ชั่นที่เก่ากว่า), 23 48 ไบต์

การปรับช่องว่างมีราคาแพง:

{{⍵↓⍨0,⌊/+/∧\' '=⍵}(⍳≢⍵)⌽'|/ _'['\| '⍳(∊,⊢,∊)⍵]}

นี้ต้อง⎕ML←0ซึ่งเป็นค่าเริ่มต้นจนกระทั่งเมื่อเร็ว ๆ

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