Boustrophedonise


35

Terkait tetapi sangat berbeda.

Sebuah boustrophedon adalah teks di mana setiap baris tulisan membalik atau terbalik, dengan huruf terbalik.

Dalam tantangan ini, kita hanya akan membalik setiap baris lainnya, tetapi membiarkan karakter yang sebenarnya digunakan tetap utuh. Anda dapat memilih garis mana yang akan dibalik, asalkan garis yang lain.

Anda dapat mengambil teks dalam format apa pun yang sesuai selama Anda mendukung nol atau lebih baris ASCII yang dapat dicetak, masing-masing dengan nol atau lebih karakter.

Contoh:

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

Tidak dapat memahami apakah pengembalian dan input harus berupa baris yang dipisahkan teks atau dapat berupa file atau daftar baris.
sergiol

@sergiol Default aturan PPCG I / O berlaku.
Adm

Bisakah kode saya berperilaku tidak konsisten, yaitu terkadang mulai berbalik dari baris pertama dan terkadang dari baris kedua?
Erik the Outgolfer

2
@EriktheOutgolfer Ya, saya bertanya tentang ini sebelumnya dan kata-kata dari "Anda dapat memilih jalur mana yang akan dibalik, selama itu adalah yang lainnya." sebenarnya diubah menjadi seperti sekarang untuk membuatnya cukup umum untuk perilaku itu.
Martin Ender

1
@totallyhuman Ya, sesuai OP.
Adem

Jawaban:


20

APL (Dyalog Classic) , 4 byte

⊢∘⌽\

Input adalah vektor vektor karakter.

adalah fungsi yang membalikkan vektor (bila diterapkan secara monadik).

adalah " dex " - fungsi yang mengembalikan argumen yang benar. Ketika dikomposisikan ( ) dengan fungsi lain, fia memaksa yang terakhir bersifat monadik sebagaimana A ⊢∘f Bekivalen dengan A ⊢ (f B)dan karenanya f B.

\adalah operator pemindaian . g\A B C ...adalah vektor A (A g B) (A g (B g C)) ...di mana gditerapkan dyadically (notasi infiks). Pengganti ⊢∘⌽untuk gitu menyederhanakan untuk:

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

Pembalikan pada posisi genap (atau ganjil, tergantung pada bagaimana Anda menghitung) dibatalkan.

Cobalah online!


4
Itu benar-benar ]&|.&.>/\untuk mereka yang dapat membaca J.
FrownyFrog

2
Ini sangat pintar.
Erik the Outgolfer

13

Haskell , 26 byte

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

Cobalah online! Contoh penggunaan: zipWith($)l ["abc","def","ghi"]hasil ["abc","fed","ghi"].

Penjelasan:

ladalah daftar fungsi tak terbatas yang bergantian antara idfungsi entitas dan reversefungsi.

Ritsleting fungsi utama ldan daftar input dengan aplikasi fungsi $, yaitu untuk input yang ["abc", "def", "ghi"]kita dapatkan [id$"abc", reverse$"def", id$"ghi"].


11

Sekam , 4 byte

z*İ_

Mengambil dan mengembalikan daftar string (penerjemah secara implisit menggabungkan hasilnya dengan baris baru sebelum mencetak). String pertama dibalik. Cobalah online!

Penjelasan

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

Dalam Husk, mengalikan string dengan angka berulang berkali-kali, juga membalikkannya jika jumlahnya negatif.


6

JavaScript (ES6), Firefox, 43 byte

Versi ini menyalahgunakan algoritma pengurutan Firefox . Ini menghasilkan sampah di Chrome dan tidak mengubah string sama sekali di Edge.

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

Uji kasus

Atau Coba online! (Monyet laba-laba)


JavaScript (ES6), 45 byte

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

Uji kasus


6

APL (Dyalog Unicode) , 10 byte

⌽¨@{2|⍳≢⍵}

Bekerja dua arah:

Cobalah online! dengan⎕IO←1

Cobalah online! dengan⎕IO←0

Bagaimana itu bekerja:

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

6

Perl 5, 17 + 2 (-pl) = 19 byte

garis-garis aneh terbalik

$_=reverse if$.%2

bahkan garis terbalik

$_=reverse if$|--

Setelah komentar @ Martin: input harus memiliki linefeed tambahan.

coba online




3

K (oK) , 17 14 byte

Larutan:

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

Cobalah online!

Contoh:

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

Penjelasan:

Terapkan reversepada indeks ganjil dari daftar input:

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

Catatan:

  • beralih &(#x)#0 1untuk &2!!#xmenghemat 3 byte



3

Alumin , 66 byte

hdqqkiddzhceyhhhhhdaeuzepkrlhcwdqkkrhzpkzerlhcwqopshhhhhdaosyhapzw

Cobalah online!

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

  OUTPUT A NEWLINE
  hhhhhdao
syhapzw

2
@totallyhuman Ini sebenarnya bahasa saya.
Conor O'Brien


2

R , 85 byte

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

Cobalah online!

Input dari stdin dan output ke stdout.

Setiap baris harus diakhiri oleh linefeed / carriage return / CRLF, dan ia mencetak dengan baris baru yang sesuai. Jadi, input harus memiliki linefeed tambahan.


2

Jelly , 5 4 byte

U¹ƭ€

Cobalah online!

Terima kasih HyperNeutrino untuk -1 byte! (sebenarnya karena saya tidak pernah tahu cara ƭkerjanya karena kurangnya dokumentasi, kali ini saya beruntung)


Dicoba ¦dengan m(7 byte). s2U2¦€;/juga 7 byte.
user202729

2

T-SQL, 65 byte

Aturan input standar kami memungkinkan SQL untuk memasukkan nilai dari tabel yang sudah ada , dan karena SQL secara inheren tidak berurutan, tabel harus memiliki nomor baris untuk mempertahankan urutan teks asli.

Saya telah mendefinisikan tabel dengan kolom identitas sehingga kita cukup memasukkan baris teks secara berurutan (tidak dihitung terhadap total byte):

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

Jadi untuk memilih dan membalikkan baris bergantian:

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

Perhatikan bahwa saya dapat menyimpan 11 byte dengan mengecualikan ORDER BY i, dan itu kemungkinan akan mengembalikan daftar dalam urutan asli untuk panjang yang masuk akal (itu tentu berlaku untuk contoh 4-line). Tetapi SQL hanya menjamin jika Anda menyertakan ORDER BY, jadi jika kami memiliki, katakanlah, 10.000 baris, kami pasti akan membutuhkan ini.


2

Perl 6 , 44 byte

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

Cobalah

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

Sebenarnya , 7 byte

;r'R*♀ƒ

Penjelasan:

;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)

Cobalah online!


1

Alice , 13 byte

M%/RM\
d&\tO/

Cobalah online!

Input melalui argumen baris perintah yang terpisah. Membalikkan baris pertama (dan setiap baris lainnya setelah itu).

Penjelasan

       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 Standar (MLton) , 51 byte

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

Cobalah online! Contoh penggunaan: $ ["abc","def","ghi"]hasil ["abc","fed","ghi"].

Penjelasan:

$adalah fungsi yang berulang pada daftar string. Dibutuhkan dua string adan bdari daftar, menjaga yang pertama tidak berubah dan membalik yang kedua dengan mengubah string menjadi daftar karakter ( explode), membalikkan daftar ( rev), dan mengubahnya kembali menjadi string ( implode).


+1, tidak cukup solusi ML imo
jfh

1

Retina , 18 byte

{O$^`\G.

*2G`
2A`

Cobalah online! Penjelasan: Tahap pertama membalikkan baris pertama, kemudian tahap kedua mencetak dua baris pertama, setelah itu tahap ketiga menghapusnya. Seluruh program kemudian diulang sampai tidak ada yang tersisa. Satu baris baru yang tertinggal dapat dihapus dengan biaya seorang pemimpin ;.


1

Bahasa Wolfram (Mathematica) , 33 byte

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

Cobalah online!

Bagaimana itu bekerja

StringReverse@*Append, ketika diberi daftar string dan string lain sebagai input, menambahkan string ke akhir daftar dan kemudian membalikkan semua string.

FoldMasukan yang terkait dengan hal di atas berarti kita:

  • Balikkan baris pertama.
  • Tambahkan baris kedua ke ujung dan balikkan keduanya.
  • Tambahkan baris ketiga ke ujung dan balikkan ketiganya.
  • Tambahkan baris keempat ke ujung dan balikkan keempatnya.
  • Dan seterusnya, sampai kita kehabisan garis.

Setiap baris akan dibalik satu kali lebih sedikit dari garis sebelumnya, sehingga garis-garis itu berganti arah.


1

CJam , 11 byte

{2/Waf.%:~}

Cobalah online! (CJam array literal menggunakan spasi untuk memisahkan elemen)

Penjelasan:

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

Penjelasan untuk bagian Waf.%"ilmu hitam":

  • Wadalah variabel yang diinisialisasi ke -1. amembungkus elemen dalam array, demikian Wajuga [-1].
  • %muncul angka ndan array adan mengambil setiap nelemen array. Ketika nnegatif, itu juga membalikkannya, yang berarti W%membalikkan array.
  • .diikuti oleh operasi biner berlaku operasi itu untuk elemen array yang sesuai, begitu [1 2 3] [4 5 6] .+pula [5 7 9]. Jika satu array lebih panjang dari yang lain, elemen disimpan tanpa modifikasi, artinya Wa.%membalik elemen pertama dari array.
  • fdiikuti oleh operasi biner akan mengambil elemen dari stack dan kemudian bertindak seperti {<that element> <that operation>}%, yaitu, pergi melalui setiap elemen dalam array, dorong elemennya, dorong elemen pertama muncul dari tumpukan, jalankan operasi, dan kemudian kumpulkan hasilnya kembali ke array. Ini berarti Wa.f%membalik elemen pertama dari setiap elemen dalam array.

1

V , 4 byte

òjæ$

Cobalah 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$

1

Swift , 90 85 82 72 byte

-10 byte terima kasih kepada @ Mr.Xcoder

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

Anda dapat menggunakan printdan menjatuhkan deklarasi tipe kembali:func f(a:[String]){print(a.reduce([]){$0.map{"\($0.reversed())"}+[$1]})}
Mr. Xcoder

1

Ruby , 19 + 2 = 21 byte

+2 byte untuk -nlbendera.

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

Cobalah online!

Penjelasan

Praktis identik dengan jawaban Perl 5 , meskipun saya belum melihat yang ketika saya menulis ini.

Dengan spasi putih, kode ini terlihat seperti ini:

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

The -ppilihan membuat Ruby efektif membungkus naskah Anda dalam sebuah loop seperti ini:

while gets
  # ...
  puts $_
end

Variabel khusus $_berisi baris terakhir yang dibaca oleh gets, dan$. berisi nomor baris.

The -lmemungkinkan baris otomatis berakhir pengolahan, yang secara otomatis panggilan chop!pada setiap baris masukan, yang menghilangkan satu \nsebelum kita membalikkan itu.


1

GNU sed , 31 + 1 = 32 byte

+1 byte untuk -rbendera.

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

Cobalah online!

Penjelasan

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

Arang , 9 byte

EN⎇﹪ι²⮌SS

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Catatan: Charcoal tidak tahu panjang daftar, jadi saya menambahkannya sebagai elemen tambahan. Penjelasan:

 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 byte

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

Cobalah secara Online

Mencetak baris pertama secara terbalik. Memiliki baris baru.

Pada dasarnya, ini bekerja dengan bergantian antara mencetak saat mendapat input dan menyimpan input pada tumpukan. Ketika mencapai baris baru atau akhir input, ia mencetak tumpukan, mencetak baris baru, dan memodifikasi karakter pada 0,4 menjadi # atau no-op untuk mengubah mode. Jika itu adalah akhir dari input, akhiri program

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.