Перетворіть шеврони на солідусів


23

Напишіть програму , яка приймає в рядок , що містить тільки прогалини, переклади рядків, а кутові дужки: <, >( шеврони ). Вихідна рядок прогалин, переклад рядка, а коса риска: /, \( soliduses ) , чиї форми відповідають входу, але повернута на чверть оборот по годинниковою стрілкою, з колоною просторів , вставлених між кожним рядком вихідного входу (для естетики).

Наприклад, якщо вхід такий:

<>

Вихід був би таким:

/\
\/

Якщо вхід такий:

><<<>
 <><

Вихід був би таким:

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

Якщо вхід такий:

>>  <<
<>  <>
  <
  ><

Вихід був би таким:

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

Зверніть увагу, як існує два стовпці пробілів між початковими рядками введення в останніх двох прикладах.

Ви можете написати повну програму, яка приймає введення будь-яким звичним способом (командний рядок, stdin) і друкує вихід, або ви можете написати функцію з аргументом рядка, яка друкує або повертає результат.

Порожні провідні та кінцеві рядки або стовпці пробілів на вході не повинні бути присутніми у висновку. Крім того, у виході може бути будь-яка кількість провідних та / або проміжних просторів та / або нових рядків у будь-яких місцях, якщо отримані фігури є правильними. Іншими словами, переклад мистецтва ascii не має значення, робляться лише форми та їх відношення один до одного .

Ви можете додатково припустити, що вхід має зворотний новий рядок.

Виграє найкоротший код у байтах.


Чи можемо ми вважати, що вхід прямокутний та має пробіли пробілів?
orlp

@orlp. Ні. Ви можете припустити, що складається з нового рядка, але він не обов'язково прямокутний.
Захоплення Кальвіна

Відповіді:



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-знакові групи з пробілами.


+1 Це рішення, яке я побачив у голові, коли я читав питання, не варто дивуватися, це вже було тут: P
Каде

1

Scala, 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")

Примітка:

це працює лише в тому випадку, якщо наданий рядок має всі рядки з однаковою довжиною (тобто, прокладені пробілами)

пояснення:

Я використовую fold з початковим значенням кортежу a Seq[String]і an Int(замість того, щоб писати Seq.empty[String]ім написання коротшого Seq("")та .initпісля згину), складка працює над колекцією рядків, кожен рядок - це рядок у вихідному введенні, і кожен рядок подвоюється. хитрість тут полягала в тестуванні на модуль символу. оскільки '<'значення дорівнює 60, а '>'значення 62 - тестування на модуль 4 дасть 0 або 2. тому складка також має перевернутий Intнабір до 0. і перевернути між 0 і 2 с 2-i. кожен непарний рядок повинен відображатись '>'до '/'і '<'до '\\', а кожен парний рядок повинен відображатись '>'до '\\'<'до '/'. ось чому я тестую наc%4==iі вдарив 2 птахи 1 каменем. складка "відновлює" початкову послідовність рядків у зворотному напрямку, а потім (після відкидання останнього рядка) перекладаю послідовність (саме тому всі рядки повинні бути точно однакової довжини). через пов'язані імпліцити, мені потрібно в _.mkStringкожному рядку (раніше стовпець), а потім mkString("\n")для остаточного виводу.


0

Perl - 119

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

По-перше, @lпризначається як список списків, що представляють символи в кожному рядку введення з рядками у зворотному порядку. Потім він прокручується через стовпці символів, замінюючи кутові дужки відповідними косою рисою, з'єднуючи елементи з пробілами та друкуючи приєднані риски у вигляді рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.