แปลง Chevrons เป็น Soliduses


23

เขียนโปรแกรมที่ใช้ในสตริงที่มีช่องว่างเฉพาะบรรทัดใหม่และวงเล็บเหลี่ยม: <, >( เครื่องหมายบั้ง ) เอาท์พุทสตริงของช่องว่างการขึ้นบรรทัดใหม่และทับ: /, \( โซลิด ) ที่มีรูปร่างสอดคล้องกับอินพุตแต่หมุนหนึ่งในสี่รอบตามเข็มนาฬิกาโดยมีคอลัมน์ของช่องว่างที่แทรกระหว่างแต่ละแถวของอินพุตต้นฉบับ (เพื่อความสวยงาม)

ตัวอย่างเช่นหากอินพุตคือ:

<>

ผลลัพธ์จะเป็นดังนี้:

/\
\/

หากอินพุตคือ:

><<<>
 <><

ผลลัพธ์จะเป็นดังนี้:

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

หากอินพุตคือ:

>>  <<
<>  <>
  <
  ><

ผลลัพธ์จะเป็นดังนี้:

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

สังเกตว่ามีช่องว่างคอลัมน์เดียวระหว่างแถวอินพุตต้นฉบับในสองตัวอย่างสุดท้ายอย่างไร

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

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

คุณอาจเลือกที่จะสมมติว่าอินพุตมีการขึ้นบรรทัดใหม่

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


เราอาจสมมติว่าอินพุตเป็นรูปสี่เหลี่ยมผืนผ้าและมีช่องว่างต่อท้ายหรือไม่
orlp

@ หรือเลขที่คุณสามารถขึ้นบรรทัดใหม่ต่อท้าย แต่มันไม่จำเป็นต้องเป็นรูปสี่เหลี่ยมผืนผ้า
งานอดิเรกของ Calvin

คำตอบ:


4

CJam, 35 ไบต์

qN/_s,S*f+{iD%[S3*" \/"_$]=}f%W%zN*

ลองออนไลน์ได้ที่นี่


ผมมีเกือบตรงรหัสเดียวกัน แต่ไม่ว่าฉลาด$เคล็ดลับมันก็ยัง 37 ไบต์ยาว ...
เดนนิส

ว่า$เคล็ดลับที่มีการบันทึกไว้เป็นจำนวนมากในชีวิตของฉันครั้งแล้ว;)
เพิ่มประสิทธิภาพ

3

CJam, 37 ไบต์

qN/_z,S*f{+"< >""/\    \/ "3/er}W%zN*

ลองใช้ออนไลน์ในล่าม CJam

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

qN/                                   e# Read from STDIN and split at linefeeds.
   _z,                                e# Zip a copy and push the results length.
                                      e# This computes the maximum line length.
      S*                              e# Repeat " " that many times.
        f{                     }      e# For each line:
                                      e#   Push the string of spaces.
          +                           e#   Append it to the line.

           "< >""/\    \/ "3/         e#   Push "< >" and ["/\ " "   " "\/ "].
                             er       e#   Perform transliteration.
                                W%z   e# Reverse the lines and zip.
                                      e# This rotates by 90 degrees.
                                   N* e# Join, separating by linefeeds.  

2

Python 2, 105 ไบต์

def f(s):
 for row in map(None,*s.split("\n")):print" ".join("\/ /\ "[1-cmp(c,"<")::3]for c in row[::-1])

ด้วยเหตุผลที่ผิดทั้งหมดนี้เป็นหนึ่งในการใช้งานที่อร่อยที่สุดที่map(None, ...)ฉันเคยมีมา เอาท์พุทแม้กระทั่งแผ่นสี่เหลี่ยมที่สมบูรณ์แบบ

ลองมาตัวอย่างที่สอง:

><<<>
 <><

map(None,*s.split("\n"))ทำการของคนยากจนzip_longestให้:

[('>', ' '), ('<', '<'), ('<', '>'), ('<', '<'), ('>', None)]

สังเกตว่าบรรทัดที่สองนั้นสั้นกว่าครั้งแรกอย่างไรเพื่อให้ได้Noneที่ท้าย โดยทั่วไปจะเป็นปัญหา แต่ด้วยเหตุผลบางอย่างเกือบทุกอย่างจะเปรียบเทียบได้ใน Python 2 และโดยเฉพาะ

>>> None < ""
True

ซึ่งหมายความว่าการแสดงออกของ1-cmp(c,"<")ผลตอบแทน0, 1, 2สำหรับตามลำดับช่วยให้เราสามารถใช้เคล็ดลับสตริงหั่นเพื่อแยกหนึ่ง">", "<", None "\/", "/\", " "เมื่อใช้สิ่งนี้เราจะพิมพ์บรรทัดเอาต์พุตโดยบรรทัดเข้าร่วมกลุ่ม 2 char ด้วยช่องว่าง


+1 นี่คือวิธีแก้ปัญหาที่ฉันเห็นในหัวเมื่อฉันอ่านคำถามไม่ควรแปลกใจที่มันมีอยู่แล้วที่นี่: P
Kade

1

สกาลา201 188 180 ตัวอักษร

(s:String)(Seq("")0/:s.lines.flatMap(l⇒Seq(l,l))){case((v,i),l)(l.map(c⇒if(Set('>','<')(c))if(c%4==i)'/'else'\\'else c)+:v,2-i)}._1.init.transpose.map(_.mkString).mkString("\n")

บันทึก:

ใช้ได้เฉพาะในกรณีที่สตริงที่ให้มีทุกบรรทัดที่มีความยาวเท่ากัน (เช่นมีเบาะด้วยช่องว่าง)

คำอธิบาย:

ฉันกำลังใช้โฟลด์โดยมีค่าเริ่มต้นเป็น tuple ของ a Seq[String]และa Int(แทนที่จะเขียนการSeq.empty[String]เขียนที่สั้นกว่าSeq("")และ.initหลังจากการพับ) การพับจะทำงานกับชุดของสตริงสตริงแต่ละอันจะเป็นบรรทัดในอินพุตดั้งเดิมและทุกบรรทัด เป็นสองเท่า เคล็ดลับที่นี่เพื่อทดสอบโมดูโลของถ่าน ตั้งแต่'<'ค่าคือ 60 และ'>'ค่า 62, การทดสอบแบบโมดูโล 4 จะให้ผลผลิตเป็น 0 หรือ 2. ที่ว่าทำไมพับยังดำเนินการพลิกIntตั้งค่าเป็น 0 และพลิกระหว่าง 0 และ 2-i2 ทุกเส้นคี่ควร map '>'ไป'/'และ'<'ไป'\\'และทุกบรรทัดควรแม้ map '>'ไป'\\และจะ'<' '/'นี่คือเหตุผลที่ฉันทดสอบc%4==iและตีนก 2 ตัวด้วยหิน 1 ก้อน พับ "สร้างใหม่" ลำดับเริ่มต้นของสตริงในสิ่งที่ตรงกันข้ามแล้ว (หลังจากวางบรรทัดสุดท้าย) ฉันโอนย้ายลำดับ (นี่คือเหตุผลที่สตริงทั้งหมดจะต้องมีความยาวเท่ากันแน่นอน) เนื่องจากการ implicits ที่เกี่ยวข้องฉันจำเป็นต้อง_.mkStringในแต่ละบรรทัด (คอลัมน์ก่อนหน้า) และจากนั้นmkString("\n")สำหรับผลลัพธ์สุดท้าย


0

Perl - 119

@l=map[/./g],reverse<>;do{print;$_=join(' ',map({'<'=>'/\\','>'=>'\/'}->{$_->[$b]}||'  ',@l))."\n";$b++;}while(/[^ 
]/)

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

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