ChevronsをSolidusesに変換する


23

スペース、改行、山かっこのみを含む文字列を取り込むプログラムを作成します:<>chevrons)。出力スペース、改行、およびスラッシュの列:/\soliduses形状入力に対応する)が、元の入力の各列の間に挿入されたスペースの列と、4分の1回転時計回りに回転(美学のために)。

たとえば、入力が次の場合:

<>

出力は次のようになります。

/\
\/

入力がこれである場合:

><<<>
 <><

出力は次のようになります。

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

入力がこれである場合:

>>  <<
<>  <>
  <
  ><

出力は次のようになります。

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

最後の2つの例の元の入力行の間にスペースの単一の列があることに注意してください。

入力を通常の方法(コマンドライン、stdin)で取得して出力を出力する完全なプログラムを作成するか、出力を出力または返す文字列引数を使用して関数を作成します。

入力の空白の先頭および末尾の空の行または列は、出力に存在する必要はありません。さらに、結果の形状が正しい限り、出力の任意の場所に任意の量の先頭および/または末尾のスペースおよび/または改行が存在する可能性があります。言い換えると、アスキーアートの翻訳は問題ではなく、形状とそれらの相互関係だけが重要です

オプションで、入力の末尾に改行があると想定することもできます。

バイト単位の最短コードが優先されます。


入力が長方形で、末尾に空白があると仮定できますか?
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, ...)私がこれまで持っていた最も素晴らしい使用法の1つにならなければなりません。出力は、完全な長方形にパディングされます。

2番目の例を見てみましょう。

><<<>
 <><

map(None,*s.split("\n"))貧乏人のを実行しますzip_longest

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

2行目が1行目より短いことに注意してくださいNone。通常、これは問題になりますが、何らかの理由で、ほとんどすべてがPython 2に匹敵します。特に

>>> None < ""
True

つまり、式1-cmp(c,"<")はそれぞれ0, 1, 2forを返すため">", "<", None、文字列スライストリックを使用してのいずれかを抽出でき"\/", "/\", " "ます。これを使用して、2文字のグループをスペースで結合して、出力を1行ずつ印刷します。


+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")

注意:

これは、指定された文字列にすべての行が同じ長さである(つまり、スペースが埋め込まれている)場合にのみ機能します

説明:

a Seq[String]とanのタプルの初期値を持つfoldを使用していますIntSeq.empty[String]imをfoldの短い方Seq("").init後に書き込むのではなく)、foldは文字列のコレクションで動作し、各文字列は元の入力の行で、すべての行倍になります。ここでのトリックは、charのモジュロをテストすることでした。以降'<'値が60であり、'>'値はモジュロ4をテスト、62であり、折り目もフリッピング運ぶ理由だと、0または2をもたらすInt0に設定すると、0と2の間で反転2-i。すべての奇数ラインをマップする必要がある'>''/'して'<'まで'\\'、すべての偶数ラインをマップする必要があります'>''\\'と'<'します'/'。これが私がテストする理由ですc%4==i1石で2羽の鳥を叩きます。フォールドは文字列の初期シーケンスを逆に「再構築」し、その後(最後の行を削除した後)、シーケンスを転置します(これが、すべての文字列が正確に同じ長さでなければならない理由です)。暗黙的な関係があるため_.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.