순열 비둘기 구멍 원리


25

스도쿠 게임에서 많은 플레이어는 각 광장에 들어갈 수있는 가능한 숫자를 "연필"하는 것을 좋아합니다.

스도쿠 행

위의 행은 배열로 나타낼 수 있습니다.

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [1,2,4], [8]]

이제 4갈 수 있는 곳은 한 곳 밖에 없습니다 . 이를 통해 위의 목록을 단순화하여 다음을 수행 할 수 있습니다.

[[1,2,9], [6], [5], [7], [1,2,9], [1,2,9], [3], [4], [8]]

이 문제의 목표는 순열에서 가능한 숫자의 목록을 가져 와서 제거 할 수있는 가능성을 추론하는 것 입니다.

다른 예로, 다음과 같은 가능성이 있다고 가정 해 보겠습니다.

[[0,1,3], [0,2,3], [1,2], [1,2]]

마지막 두 자리 1과 2로 채워 져야합니다 . 따라서 배열의 처음 두 요소에서 이러한 가능성을 제거 할 수 있습니다.

[[0,3], [0,3], [1,2], [1,2]]

다른 예로서 :

[[0,1,2,3], [0,2], [0,2], [0,2]]

그것의 불가능은 모두 만 1 위치 거기로, 위의 가능성에서 순열을 구성 1하고 3, 당신은 빈 배열을 반환 할 것입니다.

가능성 목록을 입력하고 최대 가능성을 제거한 후에 나머지 가능성을 출력해야합니다.

  • 특정 배열이 불가능한 경우 빈 배열 또는 하위 배열 중 하나가 비어있는 배열을 반환해야합니다.
  • 배열의 형식이 양호하고 하나 이상의 요소가 있다고 가정 할 수 있습니다.
  • 크기의 배열을 감안할 때 N, 당신은 항상 범위에있을 것입니다 부분 배열의 수를 가정 할 수있다 [0:N), 그N <= 10
  • 에서 0까지의 모든 숫자 N-1가 존재 한다고 가정하지 않을 수도 있습니다.
  • 단일 하위 배열 내의 숫자가 고유하다고 가정 할 수 있습니다.
  • 하위 배열에 단일 가능성 만 포함 된 경우 가능성을 배열 또는 자체적으로 나타낼 수 있습니다. [[1],[2],[0]], [1,2,0], [[1,2],0,[1,2]]모두 유효합니다.
  • 합리적인 문자열 형식 또는 목록 / 배열 형식으로 배열을 승인 할 수 있습니다.
  • 하위 배열은 임의의 순서로있을 수 있습니다.
  • 비정형 배열을 처리하는 대신 빈 자리를로 채울 수 있습니다 -1.

테스트 사례

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

이것은 이므로 가능한 한 빨리 답변하십시오!


9보다 큰 숫자가 있습니까?
Leaky Nun

9보다 큰 숫자를 지원할 필요는 없습니다.
Nathan Merrill

하위 배열로 중복해서 반환 할 수 있습니까?
Leaky Nun

@LeakyNun 번호 하위 배열은 고유 한 요소 만 포함 할 수 있습니다.
Nathan Merrill

네 번째 테스트 사례에서 약간의 실수가 있다고 생각합니다. 하위 목록 중 하나는 이중 괄호입니다.
TheBikingViking

답변:


17

Brachylog , 21 바이트

:1fz:da|,[]
:2a#d
:Am

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

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

술어 0 (주 술어)

:1fz:da|,[]
:1f            Find all solutions of Predicate 1 using Input as Input.
   z           Transpose
    :da        Deduplicate each.
       |,[]    If there is no solution, return [] instead.

술어 1 (보조 술어 1)

:2a#d
:2a     Each element of Output satisfies Predicate 2 with each element of Input as Input
   #d   Each element is different

술어 2 (보조 술어 2)

:Am     Output is member of Input

8

젤리 , 10 바이트

Œp⁼Q$ÐfZQ€

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

Œp⁼Q$ÐfZQ€   Main chain, argument: z

Œp           Cartesian product
  ⁼Q$Ðf      Filter for those that remain unchanged when uniquified
       Z     Transpose
        Q€   Uniquify each subarray

Jelly가 latin1 이외의 문자를 사용할 때 10 바이트를 청구하는 것은 약간 불분명합니다. UTF-8로 표시되는 위의 순서에는 16 바이트가 필요합니다.
Chris Becke

1
@ChrisBecke 젤리는 자신의 캐릭터 세트를 가지고
로빈 Gertenbach에게

그럼에도 불구하고-내가 온라인으로 시도한다면! -16 바이트를 보내야합니다.
Chris Becke

@ChrisBecke 예. 그러나 Jelly를 다운로드하면 10 바이트 프로그램 만 작성하면됩니다.
Leaky Nun

그리고 젤리 이외의 다른 것으로 편집 할 수없는 텍스트 파일로 저장합니까? Jelly가 프로그램을 압축했다면이 주장에 의해 압축 된 바이트 만 계산해야합니까?
Chris Becke


6

하스켈, 100 바이트

import Data.List
p z=map nub$transpose$filter(and.(flip$zipWith elem)z)$permutations[0..length z-1]

좋은 해결책! and.flip(zipWith elem)z더 짧습니다
Damien


2

파이썬 3, 101 99 바이트

-2 바이트에 대한 @TLW 덕분에

from itertools import*
lambda x:list(map(set,zip(*[i for i in product(*x)if len(i)==len(set(i))])))

리스트리스트의 인수를 통해 입력을 받아 세트리스트를 리턴하는 익명 함수.

작동 원리

from itertools import*        Import Python's library for iterator generation
lambda x                      Anonymous function with input possibilities x as a
                              list of lists
...for i in product(*x)...    For i in the Cartesian product of x, ie all candidate
                              arrangements:
[...if len(i)==len(set(i))]    Filter into list by non-duplicity (set removes
                               duplicates, so there are no duplicates if the length
                               of i is the same as the length of the set of
                               the elements of i)
zip(*...)                     Unpack and take the transpose, leaving the modified
                              possibilities with duplicates
map(set,...)                  Remove duplicates
:list(...)                    Return the modified possibilities as a list of sets

Ideone에서 사용해보십시오


list(map(set,짧은, 생각
TLW


0

PHP, 245231 바이트

(131) 은 다른 것들에 대한 데카르트 제품 기능, 114 117

function c($a){if ($a){if($u=array_pop($a))foreach(c($a)as$p)foreach($u as$v)yield $p+[count($p)=>$v];}else yield[];}
function p($a){foreach(c($a)as$i)if(max(array_count_values($i))<2)foreach($i as$k=>$v)$r[$k][$v]=$v;return$r?:[];}

직교 제품에 대한 재귀 기능으로 일부 테스트 사례에서 메모리 문제가 발생했습니다. 이 생성기 클래스 와 보다 잘 작동했습니다 function c($a){$b=[];foreach($a as$i)$b[]=new \ArrayIterator($i);return new CartesianProductIterator($b);}.
그러나 제 발전기 는 더 짧아서 같은 일을합니다.

그러나 더 큰 예제는 내 컴퓨터에서 잠시 후 내부 서버 오류 (반복자와 생성기 모두)를 발생시킵니다. 불행히도 현재 서버 로그를 확인할 시간이 없습니다.

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