중첩 목록을 "선택"하는 프로세스를 고려하십시오. 피킹은 다음과 같이 정의됩니다.
- 인수가 목록 인 경우 목록에서 임의로 (균일하게) 요소를 가져 와서 선택하십시오.
- 인수가리스트가 아닌 경우 간단히 리턴하십시오.
파이썬에서 구현 예 :
import random
def pick(obj):
if isinstance(obj, list):
return pick(random.choice(obj))
else:
return obj
간단히하기 위해 중첩 목록에는 정수 또는 추가 중첩 목록 만 포함되어 있다고 가정합니다.
목록이 주어지면로 구별 할 수없는 평탄화 된 버전을 생성 할 수 있습니다 pick
.
예를 들어, 목록을 "pick-flattening"
[1, 2, [3, 4, 5]]
목록을 산출
[1, 1, 1, 2, 2, 2, 3, 4, 5]
. 단순히 평탄화가 유효하지 않은 이유는 하위 목록의 요소가 선택 될 확률이 낮기 때문입니다. 예를 들어 목록 [1, [2, 3]]
에서 1은 2/4 = 1/2 확률이 선택되고 3과 4는 모두 1/4이됩니다. 각각 기회.
또한 싱글 톤 목록에서 선택하는 것은 요소에서 선택하는 것과 동일하며 빈 목록에서 선택하는 것은 의미가 없습니다.
도전
음이 아닌 정수의 중첩 된 목록이 주어지면, 음수 선택시 동일한 확률로 동일한 결과를 산출하는 음이 아닌 정수의 평탄화 된 목록을 리턴하십시오.
이것은 code-golf 이므로 가장 짧은 유효한 답변 (바이트 단위로 측정)이 이깁니다.
명세서
- 입력은
[2, 3, 4]
,[2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
그리고[2, [3, 3], [[4]]]
동일 (그들은 동등한 결과를 제공한다 즉). - 출력
[2, 2, 2, 2, 3, 3, 3, 3]
하고[2, 3]
(즉, 어느 하나의 출력이 될 수 있음) 동일하다. - 1-100 범위의 숫자 만 목록에 있다고 가정 할 수 있습니다.
- 최상위 입력이 목록이라고 가정 할 수 있습니다. 즉
2
, 유효한 입력이 아닙니다. - 당신은 예를 들어, 중첩 된 목록의 합리적인 표현을 사용할 수 있습니다 :
[1, [2, 3]]
,1 {2 3}
,"[ 1 [ 2 3 ] ]"
, 등 - 목록 대신 다중 집합 또는 매핑을 출력하거나 1-100 범위의 숫자 만 허용되므로 수량을 나타내는 길이 100 정수 목록입니다.
테스트 사례
나열된 출력은 하나의 유효한 가능성 일뿐입니다. 유효한 입력 또는 출력을 구성하는 사양은 사양을 참조하십시오.
format:
input -> output
[3] -> [3]
[1, [1, 1]] -> [1]
[1, [2, 3]] -> [1, 1, 2, 3]
[2, 3, [4, [5, 5, 6], 6, 7]] -> [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7]
[[1, 1, 2], [2, 3, 3]] -> [1, 2, 3]
[[1, 1, 2], [2, 3, 3, 3]] -> [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]