Thu thập và đặt các mục


13

Mục tiêu của thử thách này là thu thập các mục đã chọn trong danh sách và di chuyển chúng đến một vị trí nhất định trong danh sách.

Để làm ví dụ trực quan, lấy các giá trị đầu vào (được biểu thị bằng số nguyên hộp đen) và danh sách giá trị trung thực tương ứng trong đó biểu thị đúng mục được chọn (được biểu thị bằng các hộp màu xanh, trong đó Tlà trung thực và sai lệch F):

nhập mô tả hình ảnh ở đây

Bước hợp lý đầu tiên là tách các mục được đánh dấu là trung thực và không trung thực vào danh sách tương ứng của chúng. Lưu ý rằng thứ tự tương đối trong mỗi danh sách phải được duy trì (nghĩa là thứ tự của các mục được chọn phải 1,4,5và thứ tự của các mục không được chọn phải được 2,3,6,7)!

nhập mô tả hình ảnh ở đây

Bước logic thứ hai được đưa ra một chỉ mục trong danh sách còn lại của các mục không được chọn, chèn tất cả các mục đã chọn trước mục đó vào chỉ mục đã cho. Giả sử lập chỉ mục bắt đầu từ 0, giả sử bạn muốn chèn lựa chọn ở chỉ mục 3. Điều này tương ứng với vị trí trước 7hộp, vì vậy các mục đã chọn nên được chèn trước 7.

nhập mô tả hình ảnh ở đây

Giải pháp cuối cùng là sau đó 2,3,6,1,4,5,7.

Lưu ý rằng sơ đồ logic này mô tả một cách có thể được thực hiện; chương trình của bạn không cần phải thực hiện các bước logic tương tự miễn là đầu ra luôn tạo ra kết quả quan sát giống nhau.

Đầu vào

Chương trình của bạn được cung cấp 3 đầu vào:

  1. Một danh sách các số nguyên đại diện cho các mục. Đây có thể là một danh sách trống. Danh sách này sẽ luôn bao gồm các số nguyên dương duy nhất, không nhất thiết phải theo thứ tự được sắp xếp (tức là 5 sẽ không có trong danh sách hai lần).
  2. Một danh sách các giá trị trung thực / giả mạo có cùng độ dài với danh sách các mục, trong đó một giá trị trung thực thể hiện rằng mục đó trong cùng một chỉ mục đã được chọn.
  3. Một số nguyên đại diện cho nơi để chèn lựa chọn. Bạn có thể chọn chỉ mục của mục đầu tiên của danh sách miễn là nó không đổi trong mỗi lần chạy chương trình của bạn (ví dụ: mục đầu tiên có thể là chỉ mục 0 hoặc chỉ mục 1). Vui lòng xác định quy ước mà chương trình của bạn tuân thủ. Chỉ số này phải nằm trong phạm vi [starting_idx, ending_idx+1], tức là nó sẽ luôn là một chỉ mục hợp lệ. Đối với chỉ số trường hợp là ending_idx+1, lựa chọn nên được chèn vào cuối danh sách. Bạn có thể cho rằng số nguyên này sẽ phù hợp với loại số nguyên của ngôn ngữ của bạn.

Đầu vào có thể đến từ bất kỳ nguồn nào mong muốn (stdio, tham số hàm, v.v.)

Đầu ra

Đầu ra là một danh sách đại diện cho chuỗi cuối cùng của các mục. Điều này có thể là bất kỳ nguồn mong muốn (stdio, giá trị trả về, tham số đầu ra chức năng, v.v.). Bạn được phép sửa đổi bất kỳ đầu vào tại chỗ nào (ví dụ: được cung cấp danh sách có thể sửa đổi dưới dạng tham số chức năng và để chức năng của bạn hoạt động tại chỗ trong danh sách đó).

Các trường hợp thử nghiệm

Tất cả các trường hợp kiểm tra sau đây giả sử lập chỉ mục dựa trên 0. Tôi đã sử dụng 0 và 1 để chỉ ra các giá trị giả / trung thực tương ứng cho mặt nạ lựa chọn.

Các trường hợp kiểm tra tình cờ có các danh sách được định dạng [a,b,c], nhưng miễn là các danh sách đầu vào của bạn thể hiện một chuỗi có thứ tự hữu hạn là tốt.

Đầu vào:

[]
[]
0

Đầu ra:

[]

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Chấm điểm

Đây là mã golf; câu trả lời ngắn nhất trong byte thắng. Sơ hở tiêu chuẩn bị cấm. Bạn được phép sử dụng bất kỳ tích hợp nào mong muốn.


Đầu vào và đầu ra có thể giống như '"1 2 3", "1 0 0", 1' không?
betseg

Có, bất cứ điều gì đại diện cho hai chuỗi số nguyên có thứ tự hữu hạn và một chỉ số nguyên trong đều ổn.
hellowworld922

Mảng đầu tiên sẽ chứa các mục âm hay bằng 0?
Nữ tu bị rò rỉ

Tôi muốn nói không, nhưng tôi cũng tò mò về giải pháp mà bạn có đòi hỏi điều này. Vì vậy, có, bạn có thể giả sử danh sách đầu tiên chỉ chứa số nguyên dương.
hellowworld922

@PeterTaylor không. Tôi đã sửa nó để đọc "Danh sách các giá trị trung thực / giả mạo ...". Có một cái tên hay để mô tả "loại" của các giá trị trung thực / giả? Giống như Boolean?
hellowworld922

Câu trả lời:


10

MATL, 9 byte

&)i:&)bwv

Giải pháp này chấp nhận một mảng các giá trị T(đúng) và F(sai) làm đầu vào thứ hai. Ngoài ra đối với trường hợp thử nghiệm đầu tiên, với các mảng trống, nó không tạo ra đầu ra.

Hãy thử trực tuyến! và một phiên bản sửa đổi một chút cho tất cả các trường hợp thử nghiệm.

Giải trình

    % 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

Toán học, 66 62 byte

Đã lưu 4 byte từ @MartinEnder .

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

Chức năng ẩn danh. Lấy chỉ mục dựa trên 1, danh sách và các điểm đánh dấu làm đầu vào và trả về danh sách được sắp xếp lại làm đầu ra.


3

Haskell, 70 byte

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

Ví dụ sử dụng: ([1,2,3,4,5,6,7]#[True,False,False,True,True,False,False]) 3-> [2,3,6,1,4,5,7].

Làm thế nào nó hoạt động:

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

JavaScript (ES6), 76 byte

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

1

Thạch , 10 byte

¬+\>⁵Ḥ³oỤị

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

¬+\>⁵Ḥ³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 byte

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();}

vô dụng:

    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();
    }

cải tiến ý tưởng đánh giá cao.


0

Python 3, 91 byte

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:]

trong đó adanh sách các yếu tố / số, xTrue/Falsedanh sách và ilà chỉ mục.

Phiên bản đa dòng để cải thiện khả năng đọc:

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:] 

Làm thế nào nó hoạt động?

Cuộc gọi đến zip(a,x)kết quả trong một danh sách các bộ dữ liệu trong đó mỗi bộ chứa thông tin : (element,0|1). Sau đó, một sự hiểu biết danh sách được sử dụng để xác định các yếu tố có 0/Falsegiá trị liên quan và lưu trữ chúng trong biến b.

Vì vậy, [c for c,z in zip(a,x)if z<1]tạo một danh sách chứa tất cả các phần tử có giá trị 0( False) được liên kết.

Sau đó, danh sách các yếu tố trong đó có một True|1giá trị liên quan (được xác định bằng cách kiểm tra mà các yếu tố của akhông có mặt trong b: [c for c in a if(c in b)<1]) được chèn trong danh sách với tất cả các yếu tố mà có 0( Falsegiá trị) liên quan (danh sách b) ở chỉ số quy định ivà danh sách kết quả được trả về.


0

Python 3, 106 93 byte

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

Phiên bản cũ hơn:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.