새 잎을 뒤집어


19

컴퓨터 과학 전통에서 나무 는 맨 위에 뿌리 가 있고 맨 아래에 나뭇잎 입니다. 리프 노드에는 숫자가 표시되어 있습니다. 당신의 목표는 표시 된 특수 잎을 가져 와서 -1새로운 뿌리가되도록 이동하는 것입니다.

[3, [[16], -1], [4]] --> [[[[4], 3], [16]]]

여기에 이미지 설명을 입력하십시오

특별한 잎을 맨 위로 돌리고 나무의 나머지 부분을 매달아 놓는 것을 상상할 수 있습니다. 모든 나뭇 가지의 올바른 왼쪽에서 오른쪽 순서를 얻기 위해 나무를 회전하면서 평면에 유지하십시오.

새 나무에는를 제외한 원래 나무의 모든 잎이 -1있습니다.

입력:

의 잎 하나를 제외하고는 잎이 다른 양의 정수인 나무 -1. 나무의 뿌리는 최소한 두 개의 가지가 떨어져 나옵니다.

입력은 [3, [[16], -1], [[4]]]문자열 목록과 같은 중첩 목록으로 제공됩니다 . 구분 기호는 선택 사항이며 사용자에게 달려 있지만 인접한 숫자는 분리해야합니다.

산출:

뒤집힌 트리를 입력과 같은 형식으로 출력하거나 인쇄합니다. 목록 항목의 순서가 정확해야합니다. 전체 수정이 좋습니다.

입 / 출력이 데이터 유형 인 경우 기본적으로 필요한 형식으로 인쇄되는 유형이어야합니다. 기본적으로 작업을 수행하는 기본 제공 기능은 허용되지 않습니다.

테스트 사례 :

>> [3, [[16], -1], [4]]
[[[[4], 3], [16]]]

>> [2, -1]
[[2]]

>> [44, -1, 12]
[[12, 44]]

>> [[[[-1]]], [[[[4]]]]]
[[[[[[[[[4]]]]]]]]]

>> [[1, 2, 3], [4, -1, 6], [7, 8, 9]]
[[6, [[7, 8, 9], [1, 2, 3]], 4]]

>> [9, [8, [7, [6, -1, 4], 3], 2], 1]
[[4, [3, [2, [1, 9], 8], 7], 6]]

1
예제가 다이어그램과 일치하지 않는 것 같습니다. 의 4주위에 괄호가 두 개 더 3있지만 1 층 깊이로만 그려져 있습니다.
isaacg 2016 년

답변:


7

CJam, 24 24 22 바이트

l~{):T]{s$}$(+T1+}gW<p

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

2 바이트를 제거해 주셔서 감사합니다.

설명

l~          e# Read the input.
{           e# Do:
    ):T     e# Save the last item to T.
    ]       e# Wrap everything else (as an array) and the last item into an array,
    {s$}$   e#   where the one with -1 (having "-" if stringified) is the first item.
    (+      e# Insert the second array into the first array as the first item,
            e#   or just move the -1 to the end if the first item is already -1.
    T1+     e# Check if the array before this iteration ended with -1.
}g          e# Continue the loop if it did't.
W<p         e# Remove the -1 and print.

{s$}$정렬 순서를 반대로하여을 사용할 수 있습니다 . 또한 익명 함수는 전체 프로그램보다 1 바이트를 절약 할 수 있습니다.
Dennis

1
@ 데니스 감사합니다. 그러나 그것이 함수라면 추가가 필요하다고 생각 [합니다.
jimmy23013 2016 년

6

Pyth, 26 25 24 23 바이트

L?y.>b1}\-`Jtb.xyahbJ]J

데모. 테스트 하네스.

y중첩 된 Pyth 목록을 입력으로받는 함수를 정의합니다 .

이 재귀 함수에서 삼항 ?및 시도 제외 함수 로 인해 탐색해야 할 세 가지 경우가 있습니다 .x. 함수에서 입력은 b입니다.

첫 번째 경우 }\-`Jtb는 진실 일 때 발생합니다 . 이것은 -문자열 표현에 tb"꼬리"의 첫 번째 요소 bb제외한 모든 요소 가 있는지 테스트합니다 . tb에 저장됩니다 J. 를 제외한 모든 레이블은 양수이므로 목록의 첫 번째 요소에없는 -1경우에만 해당 -1됩니다.

이 경우을 사용하여 주기적 b으로 1 만큼 오른쪽으로 시프트 한 .>b1다음 재귀 적으로 함수를 호출합니다. 이를 통해 -1목록의 헤드 (첫 번째 요소)로 포함 된 요소를 사용하여 다음 단계로 진행할 수 있습니다.

다음 두 경우에는 위의 내용이 허위이므로 -1목록의 머리 부분에도 있습니다.

두 번째 경우 ahbJ에는 오류가 발생하지 않습니다. hb정수인 경우에만 오류가 발생합니다 . 그렇지 않은 경우 hb목록이되며, -1잎이 뿌리에 가까워 지도록 나무를 회전시켜야 합니다. ahbJ추가하여이를 수행 J의 끝에 하나의 요소로 hb효과적으로에서 트리의 루트를 이동 b하는 hb.

세 번째이자 마지막 경우에는 오류가 발생합니다. 따라서 hb단일 요소입니다. 첫 번째 경우의 테스트 때문에 hb이어야합니다 -1. 따라서 나머지 b, 즉 J목록에 싸인 즉을 반환 할 수 있습니다 ]J.

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