하스켈 , 168 바이트
p
는 Int
s 의 목록으로 순열을 취하는 (유형 클래스 다형성) 함수이며 s의 다차원 배열을 나타내는 중첩 된 목록 Int
입니다.
로 호출 p [2,1] [[10,20,30],[40,50,60]]
하지만 형식 기본값이 실패 :: [[Int]]
하면 결과 형식을 제공하는 것과 같은 형식 주석을 추가해야 할 수도 있습니다.
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
온라인으로 사용해보십시오!
정적 입력이 방해되는 경향이 있기 때문에 Haskell에서는 임의의 깊이로 중첩 된 배열을 사용하여 골프 문제를 해결하기가 다소 어색합니다. Haskell 목록 (챌린지 설명과 동일한 구문을 사용)은 잘 중첩 될 수 있지만 중첩 깊이가 다른 목록은 유형이 호환되지 않습니다. 또한 표준 Haskell 구문 분석 함수에는 구문 분석하려는 값의 유형을 알아야합니다.
결과적으로, 프로그램이 상대적으로 장황한 유형 관련 선언을 포함해야하는 것은 불가피합니다. golfed의 경우, I는 입력 클래스 정의에 정착 P
같은 p
배열의 종류 이상의 다형성 일 수있다.
한편 TIO의 테스트 하네스는 파싱 문제를 해결할 수있는 방법을 보여줍니다.
작동 원리
이 알고리즘의 본질을 요약하면 : 순열 목록에서 버블 정렬을 수행하여 해당 순열 인덱스가 교체 될 때 주변 차원을 바꿉니다.
class P a
선언에 의해 주어진 바와 같이 , 어떤 경우든지 p
순열 (항상 유형 [Int]
)과 배열 의 두 인수를 취 합니다.
- 알고리즘이 작동하는 방식이지만 인덱스의 선택은 상대 순서를 제외하고 임의적입니다. (따라서 0과 1 기반 작업입니다.)
- 밑면
instance P Int
은 차원 1의 배열을 처리하며 p
, 한 차원은 자신에게만 매핑 될 수 있기 때문에 변경되지 않은 상태로 반환됩니다.
- 다른 하나
instance P a => P [a]
는 차원 n + 1 배열에 대해 차원 n 하위 배열을 정의하기 위해 p
차원 n 하위 배열을 호출 하여 재귀 적 으로 정의됩니다 .
p(x:r)m
첫 번째의 p r
모든 요소에서 첫 번째를 재귀 적으로 호출 하여 첫 번째를 제외한 모든 차원이 서로에 대해 올바르게 치환 된 m
결과 배열 n
을 제공합니다.
- 에 수행해야하는 나머지 순열
n
은에 의해 제공됩니다 x:y:z = x:sort r
.
- 그렇다면
x<y
의 첫 번째 차원 n
이 이미 올바르게 배치되어 n
반환됩니다.
- 인 경우 함수
x>y
의 첫 번째 및 두 번째 차원을 n
교체해야 transpose
합니다. 마지막으로 p(x:z)
결과의 모든 요소에 재귀 적 으로 적용되어 원래의 첫 번째 차원이 올바른 위치로 바뀝니다.
exec
(2 바이트 절약) .