Ubah Chevron menjadi Soliduses

23

Menulis sebuah program yang mengambil dalam sebuah string yang berisi spasi saja, baris baru, dan kurung sudut: <, >( chevrons ). Output string ruang, baris, dan garis miring: /, \( soliduses ) yang bentuk sesuai dengan masukan, tapi diputar seperempat gilirannya searah jarum jam, dengan kolom ruang disisipkan di antara setiap baris dari input asli (untuk estetika).

Misalnya, jika inputnya adalah ini:

<>

Outputnya akan seperti ini:

/\
\/

Jika inputnya ini:

><<<>
 <><

Outputnya akan seperti ini:

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

Jika inputnya ini:

>>  <<
<>  <>
  <
  ><

Outputnya akan seperti ini:

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

Perhatikan bagaimana ada satu kolom spasi di antara baris input asli dalam dua contoh terakhir.

Anda dapat menulis program lengkap yang mengambil input dengan cara biasa (baris perintah, stdin) dan mencetak output, atau Anda dapat menulis fungsi dengan argumen string, yang mencetak atau mengembalikan output.

Baris atau kolom spasi dan spasi kosong di input tidak perlu ada di output. Selain itu, mungkin ada jumlah ruang memimpin dan / atau trailing dan / atau baris baru dalam output, di lokasi mana pun, selama bentuk yang dihasilkan benar. Dengan kata lain, terjemahan seni ascii tidak penting, hanya bentuk dan hubungannya satu sama lain .

Anda dapat secara opsional menganggap input memiliki baris baru.

Kode terpendek dalam byte menang.

Hobi Calvin
sumber
Bolehkah kita menganggap inputnya berbentuk persegi panjang, dan memiliki spasi kosong?
orlp
@ orlp Tidak. Anda dapat mengasumsikan baris baru, tetapi tidak harus persegi panjang.
Hobi Calvin

Jawaban:

4

CJam, 35 byte

qN/_s,S*f+{iD%[S3*" \/"_$]=}f%W%zN*

Cobalah online di sini

Pengoptimal
sumber
Saya memiliki kode yang hampir persis sama, tetapi tanpa $trik pintar itu, panjangnya masih 37 byte ...
Dennis
Itu $trik telah menyelamatkan hidup saya banyak kali sudah;)
Optimizer
3

CJam, 37 byte

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

Cobalah online di juru bahasa CJam .

Bagaimana itu bekerja

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.  
Dennis
sumber
2

Python 2, 105 byte

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

Untuk semua alasan yang salah, ini harus menjadi salah satu kegunaan terbaik yang map(None, ...)saya miliki sejauh ini. Output genap untuk menyempurnakan persegi panjang.

Mari kita ambil contoh kedua:

><<<>
 <><

map(None,*s.split("\n"))melakukan yang miskin zip_longest, memberikan:

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

Perhatikan bagaimana baris kedua lebih pendek dari yang pertama, jadi kita dapatkan Nonedi akhir. Biasanya ini akan menjadi masalah, tetapi untuk beberapa alasan hampir semuanya sebanding dengan Python 2, dan khususnya

>>> None < ""
True

Ini berarti bahwa ekspresi 1-cmp(c,"<")kembali 0, 1, 2untuk ">", "<", Nonemasing - masing, memungkinkan kita untuk menggunakan trik pengiris string untuk mengekstrak salah satunya "\/", "/\", " ". Dengan ini, kami mencetak garis keluaran per baris, bergabung dengan grup 2-char dengan spasi.

Sp3000
sumber
+1 Ini adalah solusi yang saya lihat di kepala saya ketika saya membaca pertanyaan, tidak perlu terkejut itu sudah ada di sini: 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")

catatan:

ini hanya berfungsi jika string yang disediakan memiliki semua garis dengan panjang yang sama (mis. diisi dengan spasi)

penjelasan:

Saya menggunakan lipatan dengan nilai awal tuple dari Seq[String]dan Int(bukannya menulis Seq.empty[String]im menulis lebih pendek Seq("")dan .initsetelah flip), lipatan beroperasi pada kumpulan string, masing-masing string adalah garis dalam input asli, dan setiap baris dua kali lipat. triknya di sini adalah untuk menguji modulo dari char. karena '<'nilainya 60, dan '>'nilainya 62, menguji modulo 4, akan menghasilkan 0 atau 2. itu sebabnya lipatan juga membawa Intset flipping ke 0. dan membalik antara 0 dan 2 dengan 2-i. setiap garis ganjil harus memetakan '>'ke '/'dan '<'ke '\\', dan setiap garis genap harus memetakan '>'ke '\\dan '<'ke '/'. Inilah sebabnya saya mengujic%4==idan pukul 2 burung dengan 1 batu. lipatan "membangun kembali" urutan awal string secara terbalik, dan kemudian (setelah menjatuhkan baris terakhir), saya mengubah urutan urutan (inilah sebabnya mengapa semua string harus memiliki panjang yang sama persis). karena implisit yang terlibat, saya harus _.mkStringdi setiap baris (sebelumnya kolom), dan kemudian mkString("\n")untuk hasil akhir.

gilad hoch
sumber
0

Perl - 119

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

Pertama, @lditugaskan sebagai daftar daftar yang mewakili karakter pada setiap baris input dengan garis dalam urutan terbalik. Kemudian loop melalui kolom karakter, menggantikan kurung sudut dengan garis miring yang sesuai, bergabung dengan elemen dengan spasi, dan mencetak garis miring bergabung sebagai garis.

faubi
sumber