Chevronları Solidus'a Dönüştür


23

Sadece boşluk, yeni satır, ve açı parantezleri içeren bir dize alır bir program yazın: <, >( chevrons ). Çıkış boşluklar, yeni satır ve eğik çizgi bir dizge: /, \( soliduses , şekilleri girişine tekabül) ancak bir çeyrek tur saat yönünde döndürülür, orijinal giriş her satır arasına yerleştirilen alanların bir sütun (estetik).

Örneğin, giriş bu ise:

<>

Çıktı şöyle olurdu:

/\
\/

Girdi şuysa:

><<<>
 <><

Çıktı şöyle olurdu:

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

Girdi şuysa:

>>  <<
<>  <>
  <
  ><

Çıktı şöyle olurdu:

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

Son iki örnekte orijinal giriş satırları arasında tek bir boşluk sütununun olduğuna dikkat edin.

Girdiyi herhangi bir şekilde alan (komut satırı, stdin) alıp çıktıyı basan tam bir program yazabilir veya çıktıyı basan ya da döndüren bir dizge argümanına sahip bir işlev yazabilirsiniz.

Girişteki boş satırların ve sondaki satırların veya boşlukların sütunlarının çıktıda bulunması gerekmez. Ek olarak, elde edilen şekiller doğru olduğu sürece herhangi bir yerde çıktıda herhangi bir sayıda öncü ve / veya sondaki boşluk ve / veya yeni satır olabilir. Başka bir deyişle, bilim sanatının çevirisi önemli değil, sadece şekiller ve birbirleriyle olan ilişkileri önemlidir .

İsteğe bağlı olarak, girişin sonunda yeni bir satır sonu olduğunu varsayabilirsiniz.

Bayt cinsinden en kısa kod kazanır.


Girişin dikdörtgen olduğunu ve izleyen boşlukların olduğunu varsayabilir miyiz?
orlp

@orlp Hayır. İzleyen bir yeni satır varsayalım, ancak mutlaka dikdörtgen değil.
Calvin'in Hobileri

Yanıtlar:



3

CJam, 37 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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 bayt

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

Yanlış nedenlerden ötürü, bu map(None, ...)şimdiye kadar sahip olduğum en güzel kullanımlardan biri olmalı . Çıktı bile mükemmel bir dikdörtgen oluşturur.

İkinci örneği ele alalım:

><<<>
 <><

map(None,*s.split("\n"))fakir bir adam gerçekleştirir zip_longest:

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

İkinci çizginin birinciden daha kısa olduğuna dikkat edin None, sonunda sona erelim. Normalde bu bir sorun olacağını, ancak için bazı nedenden hemen her şeyi Python 2'de karşılaştırılabilir ve özellikle

>>> None < ""
True

İfadesi olduğunu bu araçlar 1-cmp(c,"<")döner 0, 1, 2için ">", "<", Nonesırasıyla bize birini çıkarmak için dize dilimleme hile kullanmak için izin "\/", "/\", " ". Bunu kullanarak, çıktı satırını satır basar, 2 karakter grubunu boşluklarla birleştiririz.


+1 Bu, soruyu okuduğumda kafamda gördüğüm çözüm, zaten burada olması şaşırtıcı olmamalıydı: P
Kade

1

Scala, 201 188 180 karakter

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

Not:

bu, yalnızca sağlanan dize eşit uzunlukta tüm çizgilere sahipse çalışır (yani boşluklarla doldurulmuş)

açıklama:

A Seq[String]ve a değerinin başlangıç ​​değeri olan bir kat kullanıyorum Int( Seq.empty[String]daha kısa Seq("")ve .initsondan sonra yazmak yerine ), kat dizeleri bir koleksiyon üzerinde çalışır, her dize orijinal girişteki bir çizgidir ve her satır iki katına çıkarıldı. Buradaki püf noktası char modulo'sunu test etmek oldu. çünkü '<'değer 60 ve '>'değer modülo 4 için test, 62, katlama da saygısız taşıyan neden olduğunu 0 veya 2 verecektir Int0 olarak grubu ile, 0 ile 2 arasında ters çevrilmiş 2-i. Her garip çizgi haritalandırmalıdır '>'için '/'ve '<'için '\\'ve her hatta çizgi haritalandırmalıdır '>'için '\\'ve '<'için '/'. bu yüzden test ediyorumc%4==ive 1 taşla 2 kuşa çarptı. kat, ilk dizelerin sırasını tersten "yeniden oluşturur" ve sonra (son çizgiyi bıraktıktan sonra) diziyi aktarırım (bu yüzden tüm dizelerin aynı uzunlukta olması gerekir). dahil edilen örtükler nedeniyle, _.mkStringher satırda (daha önce sütun) ve sonra mkString("\n")son çıktı için ihtiyacım var.


0

Perl - 119

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

Birincisi, @lgirişin her satırındaki karakterleri ters sırayla gösteren temsil eden listelerin bir listesi olarak atanır. Ardından, karakter parantezlerini döndürür, köşeli parantezleri karşılık gelen eğik çizgilerle değiştirir, elemanları boşluklarla birleştirir ve birleştirilen eğik çizgileri bir çizgi olarak basar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.