Boustrophedonise

35

Powiązane, ale bardzo różne.

Bustrofedon jest tekst, gdzie co drugi wiersz piśmie jest obrócony lub odwrócony, przy odwróconej litery.

W tym wyzwaniu po prostu odwrócimy co drugą linię, ale pozostawimy nietknięte rzeczywiste znaki. Możesz wybrać, które wiersze mają zostać odwrócone, o ile są to wszystkie pozostałe.

Możesz wziąć tekst w dowolnym odpowiednim formacie, o ile obsługujesz zero lub więcej wierszy drukowalnego ASCII, każdy o zerowej lub większej liczbie znaków.

Przykłady:

["Here are some lines","of text for you","to make a","boustrophedon"]:

["Here are some lines","uoy rof txet fo","to make a","nodehportsuob"] or ["senil emos era ereH","of text for you","a ekam ot","boustrophedon"]


["My boustrophedon"]:

["My boustrophedon"] or ["nodehportsuob yM"]

[]:  
[]

["Some text","","More text","","","Last bit of text"]:

["Some text","","More text","","","txet fo tib tsaL"] or ["txet emoS","","txet eroM","","","Last bit of text"]
Adám
źródło
Nie mogę zrozumieć, czy powroty i dane wejściowe muszą być wierszami oddzielonymi tekstem, czy może to być plik lub lista wierszy.
sergiol,
@sergiol Obowiązują domyślne zasady we / wy PPCG .
Adám,
Czy mój kod może zachowywać się niespójnie, tzn. Czasami zacznie się cofanie od pierwszej linii, a czasem od drugiej?
Erik the Outgolfer,
2
@EriktheOutgolfer Tak, zapytałem o to wcześniej i sformułowanie „Możesz wybrać, które wiersze odwrócić, o ile są to wszystkie pozostałe”. zostało faktycznie zmienione na to, co jest teraz, aby uczynić je wystarczająco ogólnym dla takiego zachowania.
Martin Ender,
1
@totallyhuman Tak, zgodnie z OP.
Adám

Odpowiedzi:

20

APL (Dyalog Classic) , 4 bajty

⊢∘⌽\

Dane wejściowe to wektor wektorów znaków.

to funkcja odwracająca wektor (gdy jest stosowana monadycznie).

to „ dex ” - funkcja, która zwraca właściwy argument. Po skomponowaniu ( ) z inną funkcją f, zmusza ją do bycia monadyczną, ponieważ A ⊢∘f Bjest równoważna A ⊢ (f B)i dlatego f B.

\jest operatorem skanowania . g\A B C ...jest wektorem A (A g B) (A g (B g C)) ...gdzieg stosuje się go stopniowo (notacja infix). Podstawiając ⊢∘⌽do gniego upraszcza się do:

A (A ⊢∘⌽ B) (A ⊢∘⌽ (B ⊢∘⌽ C)) ...
A (⌽B) (⌽⌽C) ....
A (⌽B) C ....

Cofnięcia na pozycjach parzystych (lub nieparzystych, w zależności od tego, jak liczyć) anulują się.

Wypróbuj online!

ngn
źródło
4
To dosłownie ]&|.&.>/\dla tych, którzy potrafią czytać J.
FrownyFrog,
2
To jest naprawdę sprytne.
Erik the Outgolfer,
13

Haskell , 26 bajtów

zipWith($)l
l=id:reverse:l

Wypróbuj online! Przykład użycia: zipWith($)l ["abc","def","ghi"]plony["abc","fed","ghi"] .

Wyjaśnienie:

l to nieskończona lista funkcji na przemian id funkcją bytu a reversefunkcją.

Główna funkcja zamków li lista wejść z aplikacją funkcji $, czyli dane wejściowe, ["abc", "def", "ghi"]które otrzymujemy [id$"abc", reverse$"def", id$"ghi"].

Laikoni
źródło
11

Łuska , 4 bajty

z*İ_

Pobiera i zwraca listę ciągów znaków (interpreter domyślnie dołącza wynik do nowej linii przed wydrukowaniem). Pierwszy ciąg znaków jest odwrócony. Wypróbuj online!

Wyjaśnienie

z*İ_  Implicit input.
  İ_  The infinite list [-1,1,-1,1,-1,1..
z     Zip with input
 *    using multiplication.

W Husk pomnożenie łańcucha przez liczbę powtarza go wiele razy, a także odwraca go, jeśli liczba jest ujemna.

Zgarb
źródło
6

JavaScript (ES6), Firefox, 43 bajty

Ta wersja narusza algorytm sortowania Firefoksa . Generuje śmieci w Chrome i wcale nie zmienia ciągów w Edge.

a=>a.map((s,i)=>[...s].sort(_=>i&1).join``)

Przypadki testowe

Lub wypróbuj online! (Pająk Małpa)


JavaScript (ES6), 45 bajtów

a=>a.map(s=>(a^=1)?s:[...s].reverse().join``)

Przypadki testowe

Arnauld
źródło
6

APL (Dyalog Unicode) , 10 bajtów

⌽¨@{2|⍳≢⍵}

Działa w obie strony:

Wypróbuj online! z⎕IO←1

Wypróbuj online! z⎕IO←0

Jak to działa:

⌽¨@{2|⍳≢⍵}  tacit prefix fn
   {   ≢⍵}  Length of the input
           generate indexes from 1 (or 0 with IO0)
    2|      mod 2; this generates a boolean vector of 0s (falsy) and 1s (truthy)
  @         apply to the truthy indexes...
⌽¨          reverse each element
J. Sallé
źródło
6

Perl 5, 17 + 2 (-pl) = 19 bajtów

linie nieparzyste odwrócone

$_=reverse if$.%2

nawet linie odwrócone

$_=reverse if$|--

Po komentarzu @ Martina: dane wejściowe muszą mieć końcowy kanał.

spróbuj online

Nahuel Fouilleul
źródło
4

05AB1E , 5 4 bajtów

εNFR

Wypróbuj online!

Wyjaśnienie

ε     # apply to each element (row)
 NF   # index times do:
   R  # reverse
Emigna
źródło
3

K (oK) , 17 14 bajtów

Rozwiązanie:

@[;&2!!#x;|]x:

Wypróbuj online!

Przykład:

@[;&2!!#x;|]x:("this is";"my example";"of the";"solution")
("this is"
"elpmaxe ym"
"of the"
"noitulos")

Wyjaśnienie:

Zastosuj reverseprzy nieparzystych indeksach listy danych wejściowych:

@[;&2!!#x;|]x: / the solution
            x: / store input as variable x
@[;      ; ]   / apply @[variable;indices;function] (projection)
          |    / reverse
       #x      / count (length) of x, e.g. 4
      !        / til, !4 => 0 1 2 3
    2!         / mod 2, 0 1 2 3 => 0 1 0 1       
   &           / where true, 0 1 0 1 => 1 3

Uwagi:

  • wyłączony &(#x)#0 1dla, &2!!#xaby zapisać 3 bajty
streetster
źródło
3

Aluminium , 66 bajtów

hdqqkiddzhceyhhhhhdaeuzepkrlhcwdqkkrhzpkzerlhcwqopshhhhhdaosyhapzw

Wypróbuj online!

FLAG: h
hq
  CONSUME A LINE
  qk
  iddzhceyhhhhhdaeuze
  pk
  rlhcw
  REVERSE STACK CONDITIONALLY
  dqkkrhzpkzerlhcwqops

  OUTPUT A NEWLINE
  hhhhhdao
syhapzw
Conor O'Brien
źródło
2
@totallyhuman To właściwie mój język.
Conor O'Brien,
2

R , 85 bajtów

for(i in seq(l<-strsplit(readLines(),"")))cat("if"(i%%2,`(`,rev)(l[[i]]),"\n",sep="")

Wypróbuj online!

Wejście ze standardowego wejścia i wyjście na standardowe wyjście.

Każda linia musi być zakończona znakiem linii / powrotu karetki / CRLF i jest drukowana z odpowiednią nową linią. Tak więc dane wejściowe muszą mieć końcowy kanał.

Giuseppe
źródło
2

Galaretka , 5 4 bajtów

U¹ƭ€

Wypróbuj online!

Dzięki HyperNeutrino za -1 bajty! (właściwie dlatego, że nigdy nie wiedziałem, jak to ƭdziała z powodu braku dokumentacji, tym razem miałem szczęście)

użytkownik202729
źródło
Próbowałem ¦z m(7 bajtów). s2U2¦€;/ma również 7 bajtów.
user202729,
2

T-SQL, 65 bajtów

Nasze standardowe reguły wprowadzania pozwalają SQLowi wprowadzać wartości z wcześniej istniejącej tabeli , a ponieważ SQL jest z natury nieuporządkowany, tabela musi mieć numery wierszy, aby zachować oryginalną kolejność tekstu.

Zdefiniowałem tabelę z kolumną tożsamości, abyśmy mogli po prostu wstawiać wiersze tekstu sekwencyjnie (nie liczone do całkowitej liczby bajtów):

CREATE TABLE t 
    (i int identity(1,1)
    ,a varchar(999))

Aby wybrać i odwrócić naprzemienne wiersze:

SELECT CASE WHEN i%2=0THEN a
ELSE reverse(a)END
FROM t
ORDER BY i

Zauważ, że mogę zaoszczędzić 11 bajtów, wykluczając ORDER BY i, i że prawdopodobnie zwróci listę w oryginalnej kolejności dla dowolnej rozsądnej długości (z pewnością tak jest w przypadku 4-liniowego przykładu). Ale SQL gwarantuje to tylko wtedy, gdy dołączysz ORDER BY, więc gdybyśmy mieli, powiedzmy, 10 000 wierszy, na pewno byśmy tego potrzebowali.

BradC
źródło
2

Perl 6 , 44 bajtów

lines.map: ->\a,$b?{a.put;.flip.put with $b}

Spróbuj

lines               # get the input as a list of lines
.map:
-> \a, $b? {        # $b is optional (needed if there is an odd number of lines)
  a.put;            # just print with trailing newline
  .flip.put with $b # if $b is defined, flip it and print with trailing newline
}
Brad Gilbert b2gills
źródło
2

Rozdzielany przecinkami:

Stax , 12 bajtów

ü«äì╠▒╕█╬pεû

Uruchom i debuguj

wejście: ABC, def, GHI, jkl, MNO, pqr, STU

Znak nowej linii:

Stax , 8 bajtów

Çε÷┘)¼M@

Uruchom i debuguj

wkład:

ABC
def
GHI
jkl
MNO
pqr
STU

dane wyjściowe dla obu:

CBA
def
IHG
jkl
ONM
pqr
UTS
182764125216
źródło
1

Właściwie 7 bajtów

;r'R*♀ƒ

Wyjaśnienie:

;r'R*♀ƒ
;r       range(len(input))
  'R*    repeat "R" n times for n in range
     ♀ƒ  call each string as Actually code with the corresponding input element as input (reverse each input string a number of times equal to its index)

Wypróbuj online!

Mego
źródło
1

Alice , 13 bajtów

M%/RM\
d&\tO/

Wypróbuj online!

Wprowadź za pomocą oddzielnych argumentów wiersza polecenia. Odwraca pierwszą linię (i każdą kolejną po niej).

Wyjaśnienie

       At the beginning of each loop iteration there will always be zero
       on top of the stack (potentially as a string, but it will be
       converted to an integer implicitly once we need it).
M      Push the number of remaining command-line arguments, M.
%      Take the zero on top of the stack modulo M. This just gives zero as
       long as there are arguments left, otherwise this terminates the
       program due to the division by zero.
/      Switch to Ordinal mode.
t      Tail. Implicitly converts the zero to a string and splits off the
       last character. The purpose of this is to put an empty string below
       the zero, which increases the stack depth by one.
M      Retrieve the next command-line argument and push it as a string.
/      Switch back to Cardinal mode.
d      Push the stack depth, D.
&\R    Switch back to Ordinal mode and reverse the current line D times.
O      Print the (possibly reversed) line with a trailing linefeed.
\      Switch back to Cardinal mode.
       The instruction pointer loops around and the program starts over
       from the beginning.
Martin Ender
źródło
1

Standardowy ML (MLton) , 51 bajtów

fun$(a::b::r)=a::implode(rev(explode b)):: $r| $e=e

Wypróbuj online!Przykład użycia: $ ["abc","def","ghi"]plony["abc","fed","ghi"] .

Wyjaśnienie:

$to funkcja rekurencyjna na liście ciągów znaków. Zajmuje dwa ciągi ai bz listy, utrzymuje niezmieniony pierwszy i drugi odwraca przekształcając ciąg do listy znaków ( explode), odwrócenie (lista rev) i obracając ją z powrotem do łańcucha ( implode).

Laikoni
źródło
+1, za mało rozwiązań ML imo
jfh
1

Siatkówka , 18 bajtów

{O$^`\G.

*2G`
2A`

Wypróbuj online! Objaśnienie: Pierwszy stopień odwraca pierwszą linię, a następnie drugi stopień drukuje pierwsze dwie linie, po czym trzeci etap usuwa je. Cały program powtarza się, dopóki nie zostanie nic. Jedna końcowa nowa linia może zostać usunięta kosztem wiodącej ;.

Neil
źródło
1

Wolfram Language (Mathematica) , 33 bajty

Fold[StringReverse@*Append,{},#]&

Wypróbuj online!

Jak to działa

StringReverse@*Append, po podaniu listy ciągów i innego ciągu jako danych wejściowych dodaje ciąg na końcu listy, a następnie odwraca wszystkie ciągi.

Foldwprowadzenie danych wejściowych w odniesieniu do powyższego oznacza, że:

  • Odwróć pierwszą linię.
  • Dodaj drugą linię na końcu i odwróć obie.
  • Dodaj trzecią linię na końcu i odwróć wszystkie trzy.
  • Dodaj czwartą linię na końcu i odwróć wszystkie cztery.
  • I tak dalej, aż zabraknie nam linii.

Każda linia zostaje odwrócona jeden raz mniej niż poprzednia linia, więc linie zmieniają kierunek.

Misza Ławrow
źródło
1

CJam , 11 bajtów

{2/Waf.%:~}

Wypróbuj online! (Literały tablicowe CJam używają spacji do oddzielania elementów)

Wyjaśnienie:

{              Begin block, stack: ["Here are some lines" "of text for you" "to make a" "boustrophedon"]
 2/            Group by 2:         [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]]
   W           Push -1:            [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]] -1
    a          Wrap in array:      [["Here are some lines" "of text for you"] ["to make a" "boustrophedon"]] [-1]
     f.%       Vectorized zipped array reverse (black magic):
                                   [["senil emos era ereH" "of text for you"] ["a ekam ot" "boustrophedon"]]
        :~     Flatten:            ["senil emos era ereH" "of text for you" "a ekam ot" "boustrophedon"]
          }

Wyjaśnienie części Waf.%„czarnej magii”:

  • Wjest zmienną wstępnie zainicjowaną do -1. aowija element w tablicy, to Wajest [-1].
  • %wyskakuje liczba ni tablica ai bierze każdy nth element tablicy. Gdy njest ujemne, również odwraca go, co oznacza, że W%odwraca tablicę.
  • .następnie operacji binarnego zastosowanie tej operacji do odpowiednich elementów tablicy, to [1 2 3] [4 5 6] .+jest[5 7 9] . Jeśli jedna tablica jest dłuższa od drugiej, elementy są przechowywane bez modyfikacji, co oznacza, żeWa.% odwraca pierwszy element tablicy.
  • fa następnie operacja binarna pobierze element ze stosu, a następnie będzie działał jak: {<that element> <that operation>}%przejdzie przez każdy element w tablicy, popchnie swój element, popchnie element najpierw wyskakujący ze stosu, uruchom operację, a następnie zbierze wyniki z powrotem do tablicy. Oznacza to, że Wa.f%odwraca pierwszy element każdego elementu w tablicy.
Esolanging Fruit
źródło
1

V , 4 bajty

òjæ$

Wypróbuj online!

ò      ' <M-r>ecursively (Until breaking)
 j     ' Move down (breaks when we can't move down any more)
  æ$   ' <M-f>lip the line to the end$
nmjcman101
źródło
1

Swift , 90 85 82 72 bajty

-10 bajtów dzięki @ Mr.Xcoder

func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+‌​[$1]})}
Herman L.
źródło
Możesz użyć printdeklaracji typu zwrotu i upuścić ją:func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+[$1]})}
Pan Xcoder
1

Rubinowy , 19 + 2 = 21 bajtów

+2 bajty dla -nlflag.

$.%2<1&&$_.reverse!

Wypróbuj online!

Wyjaśnienie

Praktycznie identyczny z odpowiedzią na Perl 5 , chociaż nie widziałem tej, kiedy to pisałem.

W przypadku białych znaków kod wygląda następująco:

$. % 2 < 1 && $_.reverse!

Ta -popcja sprawia, że ​​Ruby skutecznie otacza skrypt w pętli w następujący sposób:

while gets
  # ...
  puts $_
end

Zmienna specjalna $_zawiera ostatni odczytany wiersz getsi $.zawiera numer wiersza.

-lUmożliwia automatyczną linię końcową obróbkę, która automatycznie wywołuje chop!w każdym wierszu wejściowym, który usuwa The \nzanim go odwrócić.

Jordania
źródło
1

GNU sed , 31 + 1 = 32 bajty

+1 bajt dla -rflagi.

G
:
s/(.)(.*\n)/\2\1/
t
s/.//
N

Wypróbuj online!

Wyjaśnienie

G                   # Append a newline and contents of the (empty) hold space
:
  s/(.)(.*\n)/\2\1/   # Move the first character to after the newline
  t                   # If we made the above substitution, branch to :
s/.//               # Delete the first character (now the newline)
N                   # Append a newline and the next line of input
Jordania
źródło
1

Węgiel , 9 bajtów

EN⎇﹪ι²⮌SS

Wypróbuj online! Link jest do pełnej wersji kodu. Uwaga: Węgiel drzewny nie zna długości listy, więc dodałem ją jako dodatkowy element. Wyjaśnienie:

 N          First value as a number
E           Map over implicit range
    ι       Current index
     ²      Literal 2
   ﹪        Modulo
  ⎇         Ternary
       S    Next string value
      ⮌     Reverse
        S   Next string value
            Implicitly print array, one element per line.
Neil
źródło
1

Befunge-93, 48 bajtów

 <~,#_|#*-+92:+1:
#^_@  >:#,_"#"40g!*40p91+,~:1+

Wypróbuj online

Drukuje pierwszy wiersz w odwrotnej kolejności. Ma końcowy znak nowej linii.

Zasadniczo działa na przemian między drukowaniem, gdy pobiera dane wejściowe, a przechowywaniem danych wejściowych na stosie. Kiedy osiągnie nowy wiersz lub koniec wejścia, drukuje stos, drukuje nowy wiersz i modyfikuje znak na 0,4, aby był znakiem # lub brakiem zmiany trybu. Jeśli to był koniec wprowadzania, zakończ program

Jo King
źródło