Бустрофедоніс


35

Пов'язані, але дуже різні.

Бустрофедон є текст , в якому кожна друга лінія письма перевертається або повернути назад, з перевернутим буквами.

У цьому виклику ми просто повернемо будь-який інший рядок, але фактичні символи, які використовуються, залишимо недоторканими. Ви можете обрати рядки, які потрібно реверсувати, якщо це буде кожен інший.

Ви можете приймати текст у будь-якому відповідному форматі до тих пір, поки ви підтримуєте нульовий або більше рядків для друку ASCII, кожен з яких має нуль або більше символів.

Приклади:

["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"]

Не можу зрозуміти, чи потрібно повертати і вводити рядки, розділені текстом, або це файл або список рядків.
серхіол


Чи може мій код поводитись непослідовно, тобто іноді починати перевертати з першого рядка, а іноді і з другого?
Erik the Outgolfer

2
@EriktheOutgolfer Так, я запитав про це раніше і формулювання "Ви можете вибрати, які рядки потрібно реверсувати, доки це буде кожен інший". насправді було змінено на теперішнє, щоб зробити його загальним для такої поведінки.
Мартін Ендер

1
@totallyhuman Так, згідно з ОП.
Adám

Відповіді:


20

APL (Dyalog Classic) , 4 байти

⊢∘⌽\

Вхід - вектор векторів символів.

- це функція, яка повертає вектор (коли застосовується монадично).

є " dex " - функція, яка повертає правильний аргумент. Коли він складається ( ) з іншою функцією, fвін змушує останню бути монадичною як A ⊢∘f Bеквівалентну A ⊢ (f B)і тому f B.

\є оператором сканування . g\A B C ...- вектор, A (A g B) (A g (B g C)) ...де gзастосовується діадично (інфікція позначень). Підставляючи ⊢∘⌽для gнього спрощується:

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

Повороти на парних позиціях (або непарних, залежно від того, як ви рахуєте) скасовуються.

Спробуйте в Інтернеті!


4
Це буквально ]&|.&.>/\для тих, хто може прочитати Дж.
FrownyFrog

2
Це справді розумно.
Ерік Аутгольфер

13

Haskell , 26 байт

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

Спробуйте в Інтернеті! Приклад використання: zipWith($)l ["abc","def","ghi"]врожайність ["abc","fed","ghi"].

Пояснення:

l- це нескінченний перелік функцій, що чергуються між idфункцією сутності та reverseфункцією.

Основна функція zip lта список вводу з додатком функції $, тобто для отриманого ["abc", "def", "ghi"]нами вводу [id$"abc", reverse$"def", id$"ghi"].


11

Лушпиння , 4 байти

z*İ_

Бере і повертає список рядків (інтерпретатор неявно приєднується до результату новими рядками перед друком). Перший рядок є зворотним. Спробуйте в Інтернеті!

Пояснення

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

У Husk множення рядка на число повторює це багато разів, також перетворюючи його, якщо число від’ємне.


6

JavaScript (ES6), Firefox, 43 байти

Ця версія зловживає алгоритмом сортування Firefox . Він створює сміття в Chrome і зовсім не змінює рядки в Edge.

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

Тестові справи

Або спробуйте в Інтернеті! (SpiderMonkey)


JavaScript (ES6), 45 байт

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

Тестові справи


6

APL (Dyalog Unicode) , 10 байт

⌽¨@{2|⍳≢⍵}

Працює обома способами:

Спробуйте в Інтернеті! з⎕IO←1

Спробуйте в Інтернеті! з⎕IO←0

Як це працює:

⌽¨@{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




3

K (oK) , 17 14 байт

Рішення:

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

Спробуйте в Інтернеті!

Приклад:

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

Пояснення:

Застосувати reverseза непарними індексами списку введення:

@[;&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

Примітки:

  • загасив &(#x)#0 1для , &2!!#xщоб зберегти 3 байта





2

R , 85 байт

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

Спробуйте в Інтернеті!

Введення від stdin та вихід до stdout.

Кожен рядок повинен бути завершений подачею лінії / повернення перевезення / CRLF, і він друкується відповідним новим рядком. Отже, на входах потрібно мати зворотну передачу ліній.



2

T-SQL, 65 байт

Наші стандартні правила введення дозволяють SQL вводити значення з попередньо існуючої таблиці , а оскільки SQL за своєю суттю не упорядкований, таблиця повинна мати номери рядків для збереження вихідного текстового порядку.

Я визначив таблицю зі стовпцем ідентичності, тому ми можемо просто вставляти рядки тексту послідовно (не рахуються до загального байту):

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

Отже, для вибору та обернення змінних рядків:

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

Зауважте, що я можу зберегти 11 байт, виключивши ORDER BY i, і це, ймовірно, поверне список у початковому порядку на будь-яку розумну довжину (це, безумовно, це стосується 4-рядкового прикладу). Але SQL гарантує його лише у тому випадку, якщо ви включите ORDER BY, так якби у нас, скажімо, було 10 000 рядків, нам це б точно знадобилося.


2

Perl 6 , 44 байти

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

Спробуй це

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
}



1

Аліса , 13 байт

M%/RM\
d&\tO/

Спробуйте в Інтернеті!

Введіть через окремі аргументи командного рядка. Перевертає перший рядок (і кожен другий рядок після цього).

Пояснення

       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.

1

Стандартний ML (MLton) , 51 байт

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

Спробуйте в Інтернеті! Приклад використання: $ ["abc","def","ghi"]врожайність ["abc","fed","ghi"].

Пояснення:

$це функція, що повторюється над списком рядків. Він займає два рядки aі bзі списку, зберігає перший без змін, а другий перетворює, перетворюючи рядок у список символів ( explode), перевертаючи список ( rev) та повертаючи його назад у рядок ( implode).


+1, недостатньо ML-рішень imo
jfh

1

Сітківка , 18 байт

{O$^`\G.

*2G`
2A`

Спробуйте в Інтернеті! Пояснення: Перший етап обертає перший рядок, потім другий етап друкує перші два рядки, після чого третій етап видаляє їх. Потім вся програма повторюється, поки не залишиться нічого. Один нижній рядок може бути видалений за ціною провідних ;.


1

Мова Вольфрама (Mathematica) , 33 байти

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

Спробуйте в Інтернеті!

Як це працює

StringReverse@*Append, коли дається список рядків та інша рядок як вхід, додає рядок до кінця списку, а потім перевертає всі рядки.

FoldЩо стосується вищевказаних засобів, ми:

  • Переверніть перший рядок.
  • Додайте другий рядок до кінця та оберніть їх обома.
  • Додайте третій рядок до кінця і переверніть усі три.
  • Додайте четвертий рядок до кінця і переверніть усі чотири.
  • І так далі, поки у нас не вичерпаються рядки.

Кожен рядок перевертається в один раз менше попереднього рядка, тому лінії чергують напрямок.


1

CJam , 11 байт

{2/Waf.%:~}

Спробуйте в Інтернеті!(Літерали масиву CJam використовують пробіли для розділення елементів)

Пояснення:

{              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"]
          }

Пояснення до частини Waf.%"чорної магії":

  • Wє змінною, попередньо ініціалізованою до -1. aзагортає елемент у масив, так і Waє [-1].
  • %з'являється число nі масив aі приймає кожен nелемент масиву. Коли nвід'ємне значення, воно також реверсує його, тобто W%перетворює масив.
  • .після чого двійкова операція застосовує цю операцію до відповідних елементів масиву, так [1 2 3] [4 5 6] .+є [5 7 9]. Якщо один масив довший за інший, елементи зберігаються без модифікації, тобто Wa.%перетворює перший елемент масиву.
  • fслідом за двійковою операцією дістане елемент із стека, а потім діятиме як {<that element> <that operation>}%, тобто пройде кожен елемент у масиві, натисне його елемент, висуне спочатку елемент, що вискочив із стека, запустить операцію, а потім збирає результати назад у масив. Це означає, що Wa.f%повертає перший елемент кожного елемента в масиві.


1

Свіфт , 90 85 82 72 байт

-10 байт завдяки @ Mr.Xcoder

func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+‌​[$1]})}

Ви можете використовувати printта func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+[$1]})}
видаляти

1

Ruby , 19 + 2 = 21 байт

+2 байти для -nlпрапорів.

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

Спробуйте в Інтернеті!

Пояснення

Практично ідентичний відповіді Perl 5 , хоча я цього не бачив, коли писав це.

З пробілів код виглядає так:

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

Цей -pпараметр дозволяє Рубі ефективно обгортати ваш сценарій у такий цикл:

while gets
  # ...
  puts $_
end

Спеціальна змінна $_містить останній рядок, прочитаний gets, і $.містить номер рядка.

-lЗабезпечує автоматичну лінію закінчення обробки, яка автоматично викликає chop!на кожній вхідний лінії, який видаляє , \nперш ніж повернути його назад.


1

GNU sed , 31 + 1 = 32 байти

+1 байт для -rпрапора.

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

Спробуйте в Інтернеті!

Пояснення

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

1

Вугілля деревне , 9 байт

EN⎇﹪ι²⮌SS

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Примітка: Деревне вугілля не знає довжини списку, тому я додав його як додатковий елемент. Пояснення:

 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.

1

Befunge-93, 48 байт

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

Спробуйте в Інтернеті

Друкує перший рядок зворотно. Має зворотний рядок.

В основному, він працює, чергуючи друк, оскільки він отримує введення та зберігає вхід у стеку. Коли він доходить до нового рядка або в кінці введення, він виводить стек, друкує новий рядок і змінює символ на 0,4, щоб бути або #, або необоротно, щоб змінити режим. Якщо це був кінець введення, закінчіть програму

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.