N 차원 배열 반전


10

세부

정수만 포함하는 배열 (또는 목록)이 주어지면 모든 하위 요소가 반전 된 배열을 반환하거나 출력하는 함수 나 프로그램을 작성하십시오. 즉, 가장 깊은 배열의 모든 요소를 ​​뒤집은 다음 두 번째 가장 깊은 요소 등을 뒤집습니다. 크기를 지정할 필요는 없지만 함수 또는 프로그램은 프로그래밍 언어의 기본 형식으로 들쭉날쭉 한 배열 에 합니다.


이:

[[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 % 프로그램이 다양한 유형의 멤버 (객체 형식 일 수 있음)를 가진 배열 (또는 목록)을 입력으로 취하고 모든 배열을 성공적으로 되돌릴 수있는 경우.

이:

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

이것이 될 것입니다 :

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

1
보너스 예에서는 문자열을 원자로 취급합니다. 나는 그것들이 하위 배열이라고 주장하기 때문에 역순으로해야합니다. 사실 APL에는 문자열 데이터 유형이없고 문자 데이터 유형 만 있기 때문에 일반 문자열을 공급할 때 APL 솔루션이하는 일입니다. 따라서 문자열은 1 차원 문자 배열입니다. 문자열을 정상적인 순서로 유지하려면 표시 형식으로 개체를 만들어야합니다.
Adám

@ Nᴮᶻ -50 % 바이트 수가 너무 관대하다고 생각하십니까? 다양한 데이터 유형의 경우 -30 % 바이트 수 줄을 따라, 문자열을 뒤집기위한 -10 % 바이트 수, 정수 유형을 뒤집기위한 -15 % 바이트 수, 역전을위한 -15 % 바이트 수와 같은 것을 수행 할 수 있습니다 부동 유형 (3.14-> 41.3).
MrPublic

1
나는 일반적으로 보너스를 싫어합니다. 정수와 부동 소수점을 뒤집는 것은 ... 흥미로운 일입니다.
Adám

4
지금은 그대로 두십시오. 그러나 다음에는 샌드 박스를 사용하여 그러한 것을 알아 내고 싶을 수도 있습니다.
Adám

답변:


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::⌽⍵오류가 발생하면 revesed 인수
⍎⌽⍕make를 문자열로 반환하고 역순으로 숫자로 만듭니다.


4

프롤로그, 40-50 % = 20 바이트

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

이것은 실패 할 때까지 (즉, 마지막 요소가 목록이 아니었을 때까지) 목록의 각 멤버에 대해로 술어 a/2를 재귀 적으로 호출 합니다.maplist/3reverse/2


4

파이썬 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

3

이맥스 리스프, 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

자바 스크립트 ES6, 42-50 % = 21 바이트

내 점수는 여러면에서 완벽합니다. r입력 멤버에 자신을 재귀 적으로 적용 하는 함수 를 구현합니다 .

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

객체에 속성이 없다고 가정 pop하면 dev-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

1

루아, 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 Language (Mathematica) , 23-50 % = 11.5 바이트

#/.List->Reverse@*List&

온라인으로 사용해보십시오!

ListMathematica ( {...}) 의 s는와 같습니다 List[...]. @*그래서 각각의 선두로부터 대체 조성물 연산자이며 ListReverse@*List반전 입력 (발생 모든 목록 Reverse@*List[...]=는 Reverse[{...}]).


24-50 % = 12 바이트

#~Reverse~Range@Depth@#&

온라인으로 사용해보십시오!

에서 작동하지 않습니다 List.


1

클로저, 38 바이트

(그리고 보너스는 추측하지만 Clojure는 동적 언어이므로 무료로 제공됩니다)

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

이것은 좋은 시작이지만 다음 최적화를 사용하지 않았습니다.

  • fn로 명명 된 기능 대신 익명 기능을 정의하십시오 defn. 그러나 우리는 여전히 f재귀를위한 "범위"이름이 필요합니다
  • 벡터 대신에 목록으로 입력하면 seq?대신에 사용할 수 있습니다coll?
  • (into () ...)대신에 사용reverse
  • x매핑하기 전에 반전 하면 공간이 많이 필요하지 않습니다.

0

루비 , 32-50 % = 16 바이트

재귀 기능. 를 사용 rescue하여 숫자 또는 문자열을 NoMethodError시도 할 때 트리거하면 catch 를 통해 입력이를 통해 배열인지 확인하는 것보다 2 바이트 짧습니다 .reversemapa==[*a]

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

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.