아이템 수집 및 배치


13

이 과제의 목표는 목록에서 선택한 항목을 수집하여 목록의 특정 위치로 옮기는 것입니다.

시각적 예로, 입력 값 (블랙 박스 정수로 표시됨)과 해당되는 진리 값 목록을 사용합니다. 여기서 true는 항목이 선택 T되었음을 나타냅니다 ( 진실하고 거짓 인 파란색 상자로 표시 F).

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

첫 번째 논리적 단계는 진실이 아닌 진실로 표시된 항목을 해당 목록으로 분리하는 것입니다. 각 목록의 상대 순서는 유지되어야합니다 (즉, 선택된 항목의 순서는이어야 1,4,5하고 선택되지 않은 항목의 순서는이어야합니다 2,3,6,7).

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

두 번째 논리 단계에는 선택되지 않은 항목의 나머지 목록에 색인이 제공됩니다. 선택한 색인의 항목 앞에 선택한 모든 항목을 삽입하십시오. 인덱싱이 0에서 시작한다고 가정하면, 인덱스 3에 선택 항목을 삽입한다고 가정합니다. 이것은 7상자 앞의 지점에 해당 하므로 선택한 항목을 앞에 삽입해야합니다 7.

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

최종 솔루션은 다음과 같습니다 2,3,6,1,4,5,7.

이 논리 다이어그램은 이것이 수행 될 수있는 한 가지 방법을 나타냅니다. 출력이 항상 동일한 관찰 가능한 결과를 생성하는 한 프로그램은 동일한 논리적 단계를 수행하지 않아도됩니다.

입력

당신의 프로그램은 3 개의 입력을받습니다 :

  1. 항목을 나타내는 정수 목록입니다. 빈 목록 일 수 있습니다. 이 목록은 항상 고유 한 양의 정수로 구성되며 반드시 정렬 된 순서는 아닙니다 (즉, 5가 목록에 두 번 있지는 않음).
  2. 항목 목록과 길이가 같은 참 / 거짓 값의 목록입니다. 여기서 참 값은 동일한 색인의 항목이 선택되었음을 나타냅니다.
  3. 선택 영역을 삽입 할 위치를 나타내는 정수입니다. 프로그램의 모든 실행에서 일정하기 만하면 목록의 첫 번째 항목의 인덱스를 선택할 수 있습니다 (예 : 첫 번째 항목은 인덱스 0 또는 인덱스 1 일 수 있음). 프로그램이 준수하는 규칙을 지정하십시오. 이 인덱스는 범위 내에 있어야합니다 [starting_idx, ending_idx+1]. 즉, 항상 유효한 인덱스입니다. case index가 ending_idx+1인 경우 목록 끝에 선택 항목을 삽입해야합니다. 이 정수가 언어의 기본 정수 유형에 적합하다고 가정 할 수 있습니다.

입력은 원하는 소스 (stdio, function parameter 등)에서 올 수 있습니다.

산출

출력은 항목의 최종 순서를 나타내는 목록입니다. 이것은 원하는 소스에 해당 할 수 있습니다 (stdio, return value, function output parameter 등). 모든 입력을 제자리에서 수정할 수 있습니다 (예 : 수정 가능한 목록을 함수 매개 변수로 지정하고 해당 목록에서 함수가 제자리에서 작동하도록).

테스트 사례

다음 테스트 사례는 모두 0 기반 인덱싱을 가정합니다. 선택 마스크에 대해 각각 잘못된 값과 잘못된 값을 나타 내기 위해 0과 1을 사용했습니다.

테스트 케이스의 목록 형식은 [a,b,c]이지만 입력 목록이 유한 한 순서를 나타내는 한 괜찮습니다.

입력:

[]
[]
0

산출:

[]

입력:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
3

산출:

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

입력:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
0

산출:

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

입력:

[1,2,3,4,5,6,7]
[1,0,0,1,1,0,0]
4

산출:

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

입력:

[1,2,3,4,5,6,7]
[1,1,1,1,1,1,1]
0

산출:

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

입력:

[1,2,3,4,5,6,7]
[0,0,0,0,0,0,0]
5

산출:

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

입력:

[1,3,2,5,4,6]
[1,0,0,1,1,0]
3

산출:

[3,2,6,1,5,4]

채점

이것은 코드 골프입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점은 금지되어 있습니다. 원하는 내장 기능을 사용할 수 있습니다.


입력과 출력이 ' "1 2 3", "1 0 0", 1'과 같을 수 있습니까?
betseg

예, 두 개의 유한 순서 정수 시퀀스와 정수 인덱스를 나타내는 것은 괜찮습니다.
helloworld922

첫 번째 배열에 음수 항목이 포함됩니까, 아니면 0입니까?
Leaky Nun

나는 아니오라고 말하고 싶지만, 이것이 당신에게 어떤 솔루션이 필요한지 궁금합니다. 따라서 첫 번째 목록에 양의 정수만 포함되어 있다고 가정 할 수 있습니다.
helloworld922

@PeterTaylor 번호 나는 "진실 / 거짓 가치의 목록 ..."을 읽도록 고쳤다. 진실 / 거짓 가치의 "유형"을 설명하기에 좋은 이름이 있습니까? 부울 같은?
helloworld922

답변:


10

MATL, 9 바이트

&)i:&)bwv

이 솔루션은 T(true) 및 F(false) 값 의 배열을 두 번째 입력으로 허용합니다. 또한 빈 배열이있는 첫 번째 테스트 케이스의 경우 출력이 생성되지 않습니다.

온라인으로 사용해보십시오! 모든 테스트 사례에 대해 약간 수정 된 버전입니다 .

설명

    % Implicitly grab the first two inputs
&)  % Index into the first array using the boolean, places two items on the stack:
    % 1) The values where the boolean is TRUE and 2) the values where it is FALSE.
i   % Explicitly grab the third input (N)
:   % Create an array from 1...N
&)  % Index into the FALSE group using this array as an index. Puts two items on the stack:
    % 1) The first N elements of the FALSE group and 2) other members of the FALSE group
b   % Bubble the TRUE members up to the top of the stack
w   % Flip the top two stack elements to get things in the right order
v   % Vertically concatenate all arrays on the stack
    % Implicitly display the result

5

매스 매 티카, 66 62 바이트

@MartinEnder 에서 4 바이트 저장 .

a=#2~Extract~Position[#3,#4>0]&;##&@@@Insert[##~a~0,##~a~1,#]&

익명의 기능. 1 기반 색인, 목록 및 마커를 입력으로 취하고 다시 정렬 된 목록을 출력으로 리턴합니다.


3

하스켈, 70 바이트

m%n=[e|(e,b)<-zip m n,b]
(l#s)p|(h,t)<-splitAt p$l%(not<$>s)=h++l%s++t

사용 예 : ([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3-> [2,3,6,1,4,5,7].

작동 방식 :

m%n=[e|(e,b)<-zip m n,b]        -- helper function, that extracts the elements of m
                                -- with corresponding True values in n
(l#s)p                          -- l: list of values
                                   s: list of booleans
                                   p: position to insert
  |                   (not<$>s) -- negate the booleans in s
                    l%          -- extract elements of l
          splitAt p             -- split this list at index p
   (h,t)<-                      -- bind h to the part before the split
                                -- t to the part after the split
     = h++l%s++t                -- insert elements at True positions between h and t

3

자바 스크립트 (ES6), 76 바이트

(a,b,c)=>(d=a.filter((_,i)=>!b[i]),d.splice(c,0,...a.filter((_,i)=>b[i])),d)

1

젤리 , 10 바이트

¬+\>⁵Ḥ³oỤị

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

작동 원리

¬+\>⁵Ḥ³oỤị  Main link.
            Arguments: x (list of Booleans), y (list of inputs), z (index)
¬           Logical NOT; invert all Booleans in x.
 +\         Take the cumulative sum.
            This replaces each entry with the number of zeroes up to that entry.
   >⁵       Compare the results with z.
            This yields 0 for the first z zeroes, 1 for all others. The behavior
            for ones is not important.
    Ḥ       Unhalve; multiply the previous resulting by 2.
     ³o     Take the element-wise logical NOT of x and the previous result.
            This replaces all but the first z zeroes in x with twos.
       Ụ    Grade up; sort the indices of the result according to the corr. values.
        ị   Retrieve the items of y at those indices.

0

C #, 132 바이트

int[]r(int[]a,bool[]b,int l){var x=a.Where((i,j)=>!b[j]);return x.Take(l).Concat(a.Where((i,j)=>b[j])).Concat(x.Skip(l)).ToArray();}

언 골프 :

    public static int[] r(int[] a,bool[] b,int l)
    {
        var x = a.Where((i, j) => !b[j]);
        return x.Take(l).Concat(a.Where((i, j) => b[j])).Concat(x.Skip(l)).ToArray();
    }

개선 아이디어에 감사드립니다.


0

파이썬 3, 91 바이트

def f(a,x,i):b=[c for c,z in zip(a,x)if z<1];return b[:i]+[c for c in a if(c in b)<1]+b[i:]

여기서 a요소 / 번호 목록은, x는 IS True/False목록과 i인덱스입니다.

가독성 향상을위한 여러 줄 버전 :

def f(a,x,i):
    b=[c for c,z in zip(a,x)if z<1]
    return b[:i]+[c for c in a if(c in b)<1]+b[i:] 

어떻게 작동합니까?

호출하면 zip(a,x)각각에 정보가 포함 된 튜플 목록이 표시됩니다 (element,0|1). 그런 다음 목록 이해를 사용하여 0/False연관된 값 이있는 요소를 판별 하고 변수에 저장합니다.b .

따라서 ( ) 값이 연결된 [c for c,z in zip(a,x)if z<1]모든 요소가 포함 된 목록을 만듭니다 .0False

그런 다음, True|1관련 값 이있는 요소 목록 ( :에 a없는 요소를 확인하여 판별 됨 )이 지정된 색인에 ( ) 값이있는 (list ) 인 모든 요소와 함께 목록에 삽입됩니다. 결과 목록이 반환됩니다. b[c for c in a if(c in b)<1]0Falsebi


0

파이썬 3, 106 93 바이트

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):(f,t)[y[n]].append(x[n])
 f[z:z]=t
 return f

이전 버전 :

def f(x,y,z):
 t,f=[],[]
 for n in range(len(x)):
  if y[n]:t+=[x[n]]
  else:f+=[x[n]]
 f[z:z]=t
 return f
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.