N次元配列を反転する


10

細部

整数のみを含む配列(またはリスト)を指定して、すべてのサブ要素を逆にした配列を返すか出力する関数またはプログラムを記述します。つまり、最も深い配列のすべての要素を逆にし、次に2番目に深い配列にするなどです。次元を指定する必要はありませんが、関数またはプログラムは、プログラミング言語のネイティブ形式のギザギザの配列に対して機能する必要があります。


例

この:

[[1,2], [3,4]]

これになるでしょう:

[[4,3], [2,1]]

この:

[[[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9]],
 [[10,11,12], [13,14,15], [16,17,18]],
 [[19,20,21], [22,23,24], [25,26,27]],
 [[28,29,30], [31,32,33], [34,35,36]],
 [[37,38,39], [40,41,42], [43,44,45]],
 [[46,47,48], [49,50,51], [52,53,54]]]

これになるでしょう:

[[[54,53,52], [51,50,49], [48,47,46]],
 [[45,44,43], [42,41,40], [39,38,37]],
 [[36,35,34], [33,32,31], [30,29,28]],
 [[27,26,25], [24,23,22], [21,20,19]],
 [[18,17,16], [15,14,13], [12,11,10]],
 [[ 9, 8, 7], [ 6, 5, 4], [ 3, 2, 1]]]

この:

[[[1,2]],
 [[3,4], [5]],
 [[6,7,8], [9], [10,11]],
 [[[12,13], [14,15]], [16], [17,18,19,20]],
 [21]]

これになるでしょう:

[[21],
 [[20,19,18,17], [16], [[15,14], [13,12]]],
 [[11,10], [9], [8,7,6]],
 [[5], [4,3]],
 [[2,1]]]

ボーナス

これにより、一部のオブジェクト指向プログラミング言語での回答が期待できます ...

-50%Bytecountプログラムが入力として、さまざまなタイプのメンバー(これらはオブジェクトの形式である場合があります)を持つ配列(またはリスト)を受け取り、すべての配列を正常に反転できる場合。

この:

[["Foo",["Bar",1]],
  2,
 ["Baz"],
 [[["Qux"],3],3.14]]

これになるでしょう:

[[3.14,[3,["Qux"]]],
 ["Baz"],
  2,
 [[1,"Bar"],"Foo"]]

1
おまけの例では、文字列をアトムとして扱います。私はそれらがサブアレイであり、したがって逆にされるべきであると主張します。APLには文字列データ型がなく、文字データ型しかないので、これは実際に通常の文字列をフィードしたときに私のAPLソリューションが行うことです。したがって、文字列は1次元の文字配列です。文字列を通常の順序のままにしたい場合は、表示フォームを持つオブジェクトにする必要があります。
— アダム

@Nᴮᶻ-50%のバイト数が多すぎると思いますか?さまざまなデータ型に対して-30%Bytecount、文字列を反転するために-10%Bytecount、整数型(123-> 321)を反転するために-15%Bytecount、反転するために-15%Bytecountなどの行に沿って何かを行うことができます。浮動型(3.14-> 41.3)。
— パブリック氏

1
私は一般的にボーナスを嫌います。整数と浮動小数点数を逆にすることは...興味深いです。
— アダム・

4
今はそのままにしておきますが、次回は、サンドボックスを使用してそのようなことを理解することをお勧めします。
— アダム・

回答:


9

Pyth、11-50%= 5.5バイト

L?+IbY_yMbb

オンラインでお試しください:デモまたはテストスイート。

これは関数を定義しますy。追加の3バイトは、<newline>yQ単純に入力リストで関数を呼び出すため、合計バイト数にカウントする必要はありません。

説明:

L?+IbY_yMbb
L             define a function y(b), that returns:
 ?+IbY           if b + [] == b (test if b is a list):
      _yMb           recursively call y on all elements in b, then reverse the list
          b      else: b

6

Dyalog APL、14〜50%= 7バイト

{∇¨⍣(×|≡⍵)⌽⍵}

⌽⍵
⍣(×|≡⍵)引数がアトム([絶対]深さの符号)でない場合は逆引数...
∇¨...(逆引数の)各要素に関数を適用します。

⎕ML←3APL2から移行したシステムの場合(IBMスタイル)の場合、を削除することで1バイトを節約できます|。

APLをオンラインで試してください。

好奇心のために、提案された intとfloatの逆転:

{∇¨⍣(×≡⍵){0::⌽⍵⋄⍎⌽⍕⍵}⍵}

内部関数:

0::⌽⍵エラーが発生した場合は、修正された引数
⍎⌽⍕makeを文字列に戻し、逆にしてmakeを数値に戻す


4

プロローグ、40-50%= 20バイト

a(X,Y):-reverse(X,Z),maplist(a,Z,Y);X=Y.

これは、リストの各メンバーに対して、失敗するまで(つまり、最後の要素がリストでなくなっa/2たとき)maplist/3、述語を再帰的に呼び出しますreverse/2。


4

Python 2、40-50%= 20

f=lambda x:map(f,x)[::-1]if"">x>[]else x

ボーナスを獲得するために必要なのは、それを行うための基本的な方法から必要なわずかな変更だけです。すべてのリストが空の文字列よりも小さく、すべての数値が空のリストよりも小さいという事実を使用します。

すべてのテストケース


ボーナスなしのバージョンはであることに注意してくださいf=lambda x:map(f,x)[::-1]if x>[]else x。
— mbomb007 2016年

3

Emacs Lisp、46バイト* 0.5 = 23

(defun g(x)(if(atom x)x(mapcar'g(reverse x))))

使用例:(g '((1 2) 3 (four 5)))->((5 four) 3 (2 1))

古典的な再帰的アプローチ:引数がリストでない場合は変更せず、リストの場合はリストの逆に関数をマッピングします。


2

Mathematica、34/2 = 17バイト

Quiet[Reverse//@#]/.Reverse->(#&)&

またはReverse//@#&、Reverseあらゆる場所で大量のエラーが発生したい場合は、



1

JavaScript ES6、42-50%= 21バイト

私のスコアは多くの点で完璧です。r入力のメンバーに自分自身を再帰的に適用する関数を実装します。

r=a=>Array.isArray(a)?a.reverse().map(r):a

プロパティを持つオブジェクトがないと仮定すると、popdev-nullのおかげで、これは(31-50%= 15.5)になります。

r=a=>a.pop?a.reverse().map(r):a

または、オブジェクトに正しいreverseプロパティがあると仮定すると、それも可能です(35-50%= 17.5):

r=a=>a[R="reverse"]?a[R]().map(r):a

次のような配列を安全に確認できると思いますa.pop?a.reverse().map(r):a。void 0カスタムオブジェクトを処理する必要がないと仮定します。
— andlrc 2016年

1

Lua、111 99 * .5 = 55.5 49.5バイト

function r(a)local t={}for i,v in next,a do t[#a+1-i]=type(v)=="table"and r(v)or v end return t end

再帰の良いビット



1

Brachylog、5〜50%= 2.5バイト

ċ↔↰ᵐ|

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

         The input
ċ        which is a list
 ↔       reversed
   ᵐ     with each element
  ↰      passed through this same predicate
    |    is the output. If the input isn't a list,
         it is the output.

は↔文字列と整数を逆にすることもできるので、で非リストを明示的に失敗させる必要がありますċ。


1

Wolfram言語(Mathematica)、23 -50%= 11.5バイト

#/.List->Reverse@*List&

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

Lists Mathematica({...})のはと同等List[...]です。@*は合成演算子なので、の各出現をListで置き換えるReverse@*Listと、入力(Reverse@*List[...]= Reverse[{...}])で出現するすべてのリストが反転します。


24 -50%= 12バイト

#~Reverse~Range@Depth@#&

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

でのみ機能しませんList。


1

Clojure、38バイト

(そしてボーナスは私が推測しますが、Clojureは動的言語なので無料で提供されます)

(fn f[x](if(seq? x)(map f(into()x))x))

これは良いスタートですが、これらの最適化を採用しませんでした:

  • fn名前付き関数の代わりにで無名関数を定義しdefnます。しかしf、再帰には「スコープ付き」の名前が必要です
  • 代わりに、ベクトルのリストとして入力してください、そして、我々が使用できるseq?代わりにcoll?
  • (into () ...)代わりに使用reverse
  • xマッピングの前に反転します。その場合、それほど多くのスペースは必要ありません。

0

Ruby、32〜50%= 16バイト

再帰関数。を使用rescueして数値または文字列をNoMethodError試行するときにトリガーされるをキャッチすると、入力がを介した配列であるかどうかをチェックするよりも2バイト短いことがわかります。reversemapa==[*a]

f=->a{a.reverse.map(&f)rescue a}

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

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