ブストロフェドニーゼ


35

関連するが、非常に異なる。

ブ-ストロフィ-ドンは執筆の他のすべての行が反転文字で、反転したり逆転されるテキストです。

このチャレンジでは、他のすべての行を逆にしますが、実際の文字はそのままにしておきます。1行おきであれば、反転する行を選択できます。

それぞれ0個以上の文字を含む印刷可能なASCIIの0個以上の行をサポートする限り、任意の適切な形式のテキストを使用できます。

例:

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

戻り値と入力がテキストで区切られた行である必要があるのか​​、ファイルまたは行のリストであるのかがわかりません。
sergiol

@sergiol デフォルトのPPCG I / Oルールが適用されます。
アダム

私のコードは一貫性のない振る舞いをすることができますか、つまり、最初の行から、時には2行目から逆行を開始できますか?
エリックアウトゴルファー

2
@EriktheOutgolferはい、私は以前にこれについて尋ね、「他のすべての行である限り、どの行を反転するかを選択してもよい」という文言について尋ねました。実際に、その動作に十分な汎用性を持たせるようになりました。
マーティンエンダー

1
@totallyhumanはい、OPによる。
アダム

回答:


20

APL(Dyalog Classic)、4バイト

⊢∘⌽\

入力は、文字ベクトルのベクトルです。

ベクトルを反転する関数です(単項で適用される場合)。

は「dex」-その正しい引数を返す関数です。()を他の関数fで構成したとき、それは後者をA ⊢∘f B等価であるため強制的にモナドにA ⊢ (f B)しますf B

\あるスキャン演算子。g\A B C ...ベクターである(インフィックス表記)dyadically適用されます。代わりに使用すると、次のことが簡単になります。A (A g B) (A g (B g C)) ...g⊢∘⌽g

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

偶数位置(またはカウント方法によっては奇数)での反転はキャンセルされます。

オンラインでお試しください!


4
それは文字通り]&|.&.>/\Jを読むことができる人のためです。
FrownyFrog

2
これは本当に賢いです。
エリックアウトゴルファー

13

Haskell、26バイト

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

オンラインでお試しください!使用例:zipWith($)l ["abc","def","ghi"]yields ["abc","fed","ghi"]

説明:

lidエンティティ関数と関数を交互に繰り返す関数の無限リストですreverse

メイン関数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.

ハスクでは、文字列に数字を掛けると何度も繰り返され、数字が負の場合は逆になります。


6

JavaScript(ES6)、Firefox、43バイト

このバージョンは、Firefoxのソートアルゴリズムを悪用します。Chromeでゴミを生成し、Edgeで文字列をまったく変更しません。

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

テストケース

または、オンラインでお試しください!(クモザル)


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

ノート:

  • 3バイトを節約する&(#x)#0 1ため&2!!#xに切り替えられました





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は本質的に順序付けされていないため、テーブルには元のテキストの順序を保持する行番号が必要です。

ID列を使用してテーブルを定義したため、単純にテキスト行を連続して挿入できます(バイト合計にはカウントされません)。

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行がある場合、これは間違いなく必要です。





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"]yields ["abc","fed","ghi"]

説明:

$文字列のリストを再帰的に調べる関数です。リストから2つの文字列aを受け取りb、最初の文字列を変更せずに保持し、文字列を文字のリストに変換(explode)、リストを逆に(rev)、文字列に戻す()ことで2番目を逆にしますimplode


+1、不十分なMLソリューション
imo

1

網膜、18バイト

{O$^`\G.

*2G`
2A`

オンラインでお試しください!説明:最初のステージは最初の行を反転させ、2番目のステージは最初の2行を印刷し、その後、3番目のステージはそれらを削除します。その後、プログラム全体が何もなくなるまで繰り返します。1つの後続の改行は先行の費用で取り除かれるかもしれません;


1

Wolfram言語(Mathematica)、33バイト

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

オンラインでお試しください!

使い方

StringReverse@*Append、文字列のリストと別の文字列を入力として指定すると、文字列をリストの最後に追加してから、すべての文字列を逆にします。

Fold上記に関して入力を行うことは、次のことを意味します。

  • 最初の行を逆にします。
  • 最後に2行目を追加し、両方を逆にします。
  • 最後に3行目を追加し、3つすべてを逆にします。
  • 最後に4行目を追加し、4つすべてを逆にします。
  • 等、行がなくなるまで。

各行は、前の行よりも1回少なく反転するため、方向が交互に変わります。


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は、に事前初期化された変数です-1a従って、配列の要素をラップWaです[-1]
  • %数字nと配列aをポップし、配列のすべてのn要素を取得します。nが負の場合、それも逆になりW%ます。つまり、配列が逆になります。
  • .バイナリ操作に続く、アレイの対応する要素にその操作を適用し、そう[1 2 3] [4 5 6] .+です[5 7 9]。1つの配列が他の配列よりも長い場合、要素は変更されずに保持されます。つまりWa.%、配列の最初の要素が逆になります。
  • fその後、バイナリ操作がスタックから要素を取得し、のように動作します{<that element> <that operation>}%。つまり、配列内の各要素を通過し、その要素をプッシュし、スタックから最初にポップされた要素をプッシュし、操作を実行し、結果を収集します配列に戻ります。これはWa.f%、配列内のすべての要素の最初の要素を逆にすることを意味します。


1

Swift90 85 82 72バイト

@ Mr.Xcoderのおかげで-10バイト

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]})}
氏Xcoder

1

Ruby、19 + 2 = 21バイト

-nlフラグ用に+2バイト。

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

オンラインでお試しください!

説明

Perl 5の回答と実質的に同一ですが、これを書いたときには見ていませんでした。

空白を使用すると、コードは次のようになります。

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

この-pオプションにより、Rubyは次のようなループでスクリプトを効果的にラップします。

while gets
  # ...
  puts $_
end

特殊変数に$_は、によって読み取られた最後の行gets$.行番号が含まれます。

-l自動的に呼び出して処理を終了する自動ライン、有効にchop!除去し、各入力ライン上を、\n私たちはそれを逆にする前に。


1

GNU sed、31 + 1 = 32バイト

-rフラグ用に+1バイト。

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の文字を#またはno-opに変更してモードを変更します。入力が終了した場合は、プログラムを終了します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.