将人字形转换为固线


23

编写一个仅包含空格,换行符和尖括号的字符串的程序:<>chevrons)。输出一串空格,换行符和斜杠:/\((soliduses),其形状与输入相对应,但顺时针旋转四分之一圈,并在原始输入的每一行之间插入一列空格(出于美观目的)。

例如,如果输入为:

<>

输出将是这样的:

/\
\/

如果输入是这样的:

><<<>
 <><

输出将是这样的:

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

如果输入是这样的:

>>  <<
<>  <>
  <
  ><

输出将是这样的:

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

请注意,在最后两个示例中,原始输入行之间如何有一列空格。

您可以编写一个完整的程序,该程序以任何常用方式(命令行,stdin)获取输入并打印输出,或者您可以编写一个带有字符串参数的函数来打印或返回输出。

输入中不需要空格的前导行和尾随行或列在输出中出现。另外,只要结果形状正确,输出中的任何位置都可以有任意数量的前导和/或尾随空格和/或换行符。换一种说法, ascii艺术的翻译并不重要,只有形状及其相互之间的关系才重要

您可以选择假设输入的末尾有换行符。

以字节为单位的最短代码获胜。


我们可以假设输入为矩形,并且具有尾随空格吗?
orlp

@orlp否。您可以假定尾随换行符,但不一定是矩形。
加尔文的嗜好

Answers:



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在最后得到了a 。通常这是一个问题,但是由于某些原因,几乎所有东西在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")

注意:

仅当提供的字符串的所有行的长度相等(即用空格填充)时,此方法才有效

说明:

我使用倍的元组的初始值Seq[String]和一个Int(而不是写Seq.empty[String]即时写入较短的Seq("").init折叠后),折叠于字符串的集合进行操作,每串是在原始输入线,每线翻了一番。这里的技巧是测试字符的模数。因为'<'值是60,而'>'值是62,所以测试4模时将得出0或2。这就是为什么首屏同时将翻转Int设置为0,并使用在0和2之间翻转的原因2-i。每个奇数行应该映射'>''/''<''\\',和每个偶数行应该映射'>''\\“和'<''/'。这就是为什么我测试c%4==i并用1颗石头击中2只鸟。折叠将反向重建字符串的初始序列,然后(在删除最后一行之后)转置序列(这就是为什么所有字符串的长度必须完全相同的原因)。由于涉及隐式,我需要_.mkString在每一行(以前是列)上,然后mkString("\n")进行最终输出。


0

Perl-119

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

首先,@l被分配为一个列表列表,这些列表代表输入的每一行上的字符,并以相反的顺序显示各行。然后,它遍历字符列,用相应的斜杠替换尖括号,将元素与空格连接在一起,并将连接的斜杠打印为一行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.