Konwertuj Chevrons na Soliduses

23

Napisz program, który pobiera ciąg zawierający tylko spacje, znaki nowej linii i kątowników: <, >( jodełkowe ). Wyjście ciąg miejsc, nowej linii, a ukośnikami: /, \( soliduses ), których kształty odpowiadają wejściu, lecz obrócony o jedną czwartą obrotu w kierunku ruchu wskazówek zegara, za pomocą kolumny z przestrzeni wstawione pomiędzy każdy rząd pierwotnego wejścia (estetyki).

Na przykład, jeśli dane wejściowe to:

<>

Wynik byłby następujący:

/\
\/

Jeśli dane wejściowe są następujące:

><<<>
 <><

Wynik byłby następujący:

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

Jeśli dane wejściowe są następujące:

>>  <<
<>  <>
  <
  ><

Wynik byłby następujący:

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

Zauważ, że w dwóch ostatnich przykładach jest jedna kolumna spacji między oryginalnymi wierszami wejściowymi.

Możesz napisać pełny program, który pobiera dane wejściowe w dowolny zwykły sposób (wiersz poleceń, standardowe wyjście) i wypisuje dane wyjściowe, lub możesz napisać funkcję z argumentem łańcuchowym, która wypisuje lub zwraca dane wyjściowe.

Puste początkowe i końcowe wiersze lub kolumny białych znaków na wejściu nie muszą być obecne na wyjściu. Dodatkowo, może być dowolna ilość wiodących i / lub końcowych spacji i / lub nowych linii w danych wyjściowych, w dowolnych lokalizacjach, o ile uzyskane kształty są prawidłowe. Innymi słowy, tłumaczenie sztuki ascii nie ma znaczenia, jedynie kształty i ich wzajemne relacje .

Możesz opcjonalnie założyć, że wejście ma końcowy znak nowej linii.

Najkrótszy kod w bajtach wygrywa.

Hobby Calvina
źródło
Czy możemy założyć, że dane wejściowe są prostokątne i mają końcowe białe znaki?
orlp 17.07.15
@orlp Nie. Możesz założyć końcowy znak nowej linii, ale niekoniecznie jest prostokątny.
Calvin's Hobbies,

Odpowiedzi:

4

CJam, 35 bajtów

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

Wypróbuj online tutaj

Optymalizator
źródło
Miałem prawie dokładnie ten sam kod, ale bez tej sprytnej $sztuczki wciąż miał 37 bajtów ...
Dennis
Ta $sztuczka już wiele razy uratowała mi życie;)
Optymalizator
3

CJam, 37 bajtów

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
2

Python 2, 105 bajtów

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

Ze wszystkich niewłaściwych powodów musi to być jedno z najmilszych zastosowań map(None, ...), jakie do tej pory miałem. Wyjście wyrównuje się nawet do idealnego prostokąta.

Weźmy drugi przykład:

><<<>
 <><

map(None,*s.split("\n"))wykonuje biedaka zip_longest, dając:

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

Zauważ, że druga linia jest krótsza niż pierwsza, więc otrzymujemy Nonena końcu. Zwykle byłby to problem, ale z jakiegoś powodu prawie wszystko jest porównywalne w Pythonie 2, w szczególności

>>> None < ""
True

Oznacza to, że wyrażenie 1-cmp(c,"<")powraca 0, 1, 2do ">", "<", Noneodpowiednio, pozwalając nam korzystać ciąg krojenia sztuczki, aby wyodrębnić jeden "\/", "/\", " ". Korzystając z tego, drukujemy wynik linii po linii, łącząc grupy 2-znakowe ze spacjami.

Sp3000
źródło
+1 To jest rozwiązanie, które zobaczyłem w mojej głowie, gdy czytam pytanie, nie powinno dziwić, że już tu było: P
Kade
1

Scala, 201 188 180 znaków

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

Uwaga:

działa to tylko wtedy, gdy podany ciąg ma wszystkie linie o równej długości (tj. wypełnione spacjami)

wyjaśnienie:

Używam fold z początkową wartością krotki Seq[String]ai an Int(zamiast pisać Seq.empty[String]im pisząc krótszy Seq("")i .initpo fold), fold działa na kolekcji ciągów, każdy ciąg jest linią na oryginalnym wejściu, a każda linia jest podwojony. sztuczka polegała na przetestowaniu modulo char. ponieważ '<'wartość wynosi 60, a '>'wartość 62, testowanie dla modulo 4, da 0 lub 2. dlatego też fold zawiera także Intzestaw przerzucania na 0 i przerzucany między 0 a 2 za pomocą 2-i. każda linia nieparzysta powinna być odwzorowana '>'na '/'i '<'do '\\', a każda linia parzysta powinna być odwzorowana '>'na '\\'i '<'do '/'. dlatego testujęc%4==ii uderz 2 ptaki 1 kamieniem. fold „odbudowuje” początkową sekwencję ciągów w odwrotnej kolejności, a następnie (po upuszczeniu ostatniego wiersza) transponuję sekwencję (dlatego wszystkie ciągi muszą mieć dokładnie taką samą długość). z powodu zaangażowanych implikacji, muszę _.mkStringw każdej linii (poprzednio kolumna), a następnie mkString("\n")dla ostatecznego wyniku.

Gilad Hoch
źródło
0

Perl - 119

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

Najpierw @ljest przypisywany jako lista list reprezentujących znaki w każdym wierszu wprowadzania z wierszami w odwrotnej kolejności. Następnie przechodzi przez kolumny znaków, zastępując nawiasy kątowe odpowiednimi ukośnikami, łącząc elementy ze spacjami i drukując połączone ukośniki jako linię.

faubi
źródło