Конвертировать Шевроны в Солидусы


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
Kade

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]im пишу короче Seq("")и .initпосле сгиба), сгиб работает с набором строк, каждая строка является строкой в ​​исходном вводе, и каждая строка в два раза. Хитрость заключалась в том, чтобы проверить по модулю символа. так как '<'значение равно 60, а '>'значение равно 62, тестирование по модулю 4 даст 0 или 2. поэтому фолд также имеет переворачивание, Intустановленное на 0, и переворачивание между 0 и 2 с помощью 2-i. каждая нечетная строка должна отобразить '>'в '/'и '<'к '\\', и каждый даже линия должна отобразить '>'на '\\'<'к '/'. Вот почему я проверяюc%4==iи ударил 2 зайцев одним выстрелом. складка «перестраивает» исходную последовательность строк в обратном порядке, а затем (после удаления последней строки) я переставляю последовательность (поэтому все строки должны иметь одинаковую длину). из-за вовлеченных последствий мне нужно в _.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.