배열과 프로그램을 반으로 나누기


10

소개

직사각형 정수 배열을 반으로 균등하게 분할하는 프로그램을 작성해야합니다 (이유가 무엇이든). 이 작업은 계산 집약적이지만 운 좋게도 계산을 수행 할 듀얼 코어 머신이 있습니다. 병렬 처리의 이점을 최대화하기 위해 프로그램을 반으로 균등하게 분할하고 각 코어가 하나의 파트 중 하나를 다른 파트와 독립적으로 실행하도록 결정합니다.

입력과 출력

입력 한 내용은, 적어도 크기의 음이 아닌 정수의 장방형 2 차원 어레이 인 1 × 1 임의의 적절한 형식으로 촬영. 이러한 배열 의 분할 은 각 수평 행을 접두사와 접미사 (둘 중 하나는 비어있을 수 있음)로 분할하여 얻습니다. 분할이 유효하려면 두 개의 인접한 행이 동일한 인덱스 또는 인접 인덱스에서 분할되어야합니다. 예를 들어, 배열을 고려하십시오

2 4 5 5 6 3
9 7 1 7 7 0
0 0 3 6 7 8
1 2 4 7 6 1
6 6 8 2 0 0

이것은 유효한 분할입니다 :

 2;4 5 5 6 3
;9 7 1 7 7 0
;0 0 3 6 7 8
 1;2 4 7 6 1
 6 6;8 2 0 0

이것은 또한 유효한 분할입니다.

2 4 5 5 6 3;
9 7 1 7 7;0
0 0 3 6 7;8
1 2 4 7;6 1
6 6 8;2 0 0

이것은 유효한 분할이 아닙니다 :

2 4;5 5 6 3
9 7 1;7 7 0
0;0 3 6 7 8
1 2;4 7 6 1
6 6;8 2 0 0

출력은 최소값이어야합니다.

abs(sum_of_prefixes - sum_of_suffixes)

입력의 모든 유효한 분할 이상.

규칙과 득점

당신은 쓸 것이다 이 개 그들 사이에 공유 코드가 없어야합니다 같은 언어 프로그램 (중 전체 프로그램 또는 기능). 그것들을 P1P2 라고합시다 . 프로그램 P1 은 입력 배열을 받아서 무언가를 출력 합니다 . 프로그램 P2 는 이것을 무언가 입력으로 받아서 입력 배열에 대한 위 작업의 응답을 출력합니다.

점수는 P1P2최대 바이트 수이며 , 점수가 낮을수록 좋습니다.

몇 가지 설명 :

  • 두 개의 전체 프로그램, 하나의 함수와 하나의 전체 프로그램 또는 두 개의 함수를 작성할 수 있습니다.
  • 두 개의 전체 프로그램의 경우 P1 의 전체 출력 이 Unix 파이프 라인에서와 같이 입력 으로 P2 에 입력됩니다 P1 | P2. 두 개의 개별 소스 파일에서 컴파일 / 해석 된 경우 프로그램이 올바르게 작동해야합니다.
  • 두 프로그램 중 하나가 기능인 경우 필요한 상용구 코드를 추가하여 전체 프로그램으로 변환되며 위의 규칙이 적용됩니다. 특히, 두 함수는 공유 보조 함수, 공유 반입 명령문 또는 공유 전역 변수를 사용할 수 없습니다.

테스트 사례

[[1]] -> 1
[[4,5],[8,3]] -> 4
[[8],[11],[8],[10],[4]] -> 1
[[5,7,0,9,11,2,1]] -> 7
[[146,194,71,49],[233,163,172,21],[121,173,14,302],[259,169,26,5],[164,30,108,37],[88,55,15,2]] -> 3
[[138,2,37,2],[168,382,33,77],[31,199,7,15],[192,113,129,15],[172,88,78,169],[28,6,97,197]] -> 7
[[34,173,9,39,91],[169,23,56,74,5],[40,153,80,60,28],[8,34,102,60,32],[103,88,277,4,2]] -> 0
[[65,124,184,141],[71,235,82,51],[78,1,151,201],[12,24,32,278],[38,13,10,128],[9,174,237,113]] -> 2
[[164,187,17,0,277],[108,96,121,263,211],[166,6,57,49,73],[90,186,26,82,138],[173,60,171,265,96]] -> 8

잠시 동안 나는 이것이 멀티 스레딩 질문 이라고 생각 했다. 나는 더 많은 것을 기대했습니다.
Adám

답변:


2

하스켈, 102 바이트

기능 1 (102 바이트) :

l=length
[]#i=[[]]
(r:s)#i=id=<<[(splitAt j r:)<$>s#j|j<-[i-1..i+1],j>=0,j<l r]
f r=(r#)=<<[0..l$r!!0]

기능 2 (90 바이트) :

g::[[([Int],[Int])]]->Int 
g a=minimum$map(\(x,y)->abs$sum(sum<$>x)-sum(sum<$>y))$unzip<$>a

F1에서 확인할 하드 코딩 된 정수 배열을 포함하여 전체 프로그램으로 만들기위한 상용구가 없습니다.

main = print $ f [[164,187,17,0,277],[108,96,121,263,211],[166,6,57,49,73],[90,186,26,82,138],[173,60,171,265,96]]

그리고 F2의 경우 :

main = print . g . read =<< getContents

이제 runhaskell f1.hs | runhaskell f2.hs어떤 출력을 호출 할 수 있습니다 8.

작동 방식 : f정수 목록을 가져옵니다.

f r = (r#)=<<[0..l$r!!0]          -- for each index [0 .. length r] call # with
                                  -- the first parameter being r and
                                  -- collect the results in a single list

[]#i=[[]]                         -- base case. If the list of lists is empty, stop
(r:s)#i                           -- else let r be the first list, s all others
           j<-[i-1..i+1],         -- foreach possible index j for the next line
                 j>=0,j<l r       --    (skipping out of range indices)
     (splitAt j r:)<$>            -- split the current line at j into a pair of
                                  -- lists and prepend it to every element of
                      s#j         -- a recursive call with s and j
id=<<                             -- flatten into a single list

이제 가능한 모든 스플릿 목록이 있습니다. 예를 들어 첫 번째 스플릿과 가운데의 임의 스플릿

[([],[164,187,17,0,277]),                  [([164,187],[17,0,277]),
 ([],[108,96,121,263,211]),                 ([108,96],[121,263,211]),
 ([],[166,6,57,49,73]),                     ([166],[6,57,49,73]),
 ([],[90,186,26,82,138]),                   ([90,186],[26,82,138]),
 ([],[173,60,171,265,96])]                  ([173,60,171],[265,96])]

기능 g은 그러한 목록을 가지고

                    unzip<$>a       -- turn every pair of lists into a list of pairs
  map(\(x,y)->                      -- foreach such pair     
      abs$sum(sum<$>x)-sum(sum<$>y) -- calculate the score
minimum                             -- and find the minimum

참고 : 두 번째 기능은 조금 더 골프를 칠 수는 있지만 점수를 변경하지는 않습니다.

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