Збирайте та розміщуйте предмети


13

Мета цього завдання - зібрати вибрані елементи у списку та перемістити їх у певне місце у списку.

В якості наочного прикладу візьміть вхідні значення (представлені чорними коробчастими цілими числами) та відповідний список правдивих значень, де істина позначає вибраний елемент (представлений блакитними полями, де Tправда і хибність F):

введіть тут опис зображення

Перший логічний крок - відокремити елементи, позначені truthy, а не truthy у відповідних списках. Зауважте, що у кожному списку повинен підтримуватися відносний порядок (тобто порядок вибраних елементів повинен бути 1,4,5, а порядок невибраних елементів повинен бути 2,3,6,7)!

введіть тут опис зображення

Другий логічний крок задається індексом у списку, що залишився невибраним, вставте всі вибрані елементи перед елементом у заданому індексі. Припустимо, що індексація починається з 0, припустимо, ви хочете вставити виділення з індексу 3. Це відповідає місці перед 7полем, тому вибрані елементи слід вставити перед 7.

введіть тут опис зображення

Остаточне рішення - тоді 2,3,6,1,4,5,7.

Зауважте, що ця логічна діаграма зображує один із способів цього зробити; вашій програмі не потрібно робити ті ж логічні кроки, поки результат завжди дає однакові результати, що спостерігаються.

Вхідні дані

Вашій програмі надано 3 входи:

  1. Список цілих чисел, що представляють елементи. Це може бути порожній список. Цей список завжди буде складатися з унікальних натуральних чисел, не обов'язково в упорядкованому порядку (тобто 5 не буде в списку двічі).
  2. Список значень truthy / falesy з тією ж довжиною, що і список елементів, де значення truthy означає, що вибрано предмет у тому ж індексі.
  3. Ціле число, яке представляє місце, куди потрібно вставити виділення. Ви можете вибрати, який індекс першого елемента списку буде таким, який він є постійним у кожному запуску вашої програми (наприклад, перший елемент може бути індексом 0 або індексом 1). Вкажіть, будь ласка, якої конвенції дотримується ваша програма. Цей індекс повинен бути в діапазоні [starting_idx, ending_idx+1], тобто він завжди буде дійсним індексом. Якщо індекс регістру є ending_idx+1, вибір слід вставити в кінці списку. Ви можете припустити, що це ціле число впишеться у ваш цілий цілий тип мови.

Вхід може надходити з будь-якого потрібного джерела (stdio, параметр функції тощо)

Вихідні дані

Вихід - це список, що представляє остаточну послідовність елементів. Це може бути будь-яке бажане джерело (stdio, повернене значення, параметр виводу функції тощо). Вам дозволяється змінювати будь-який з вхідних даних на місці (наприклад, заданий список, що може змінюватися, як параметр функції та змушує вашу функцію функціонувати замість цього списку).

Тестові справи

Усі наступні тестові випадки передбачають індексацію на основі 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

Чи буде перший масив містити негативні елементи або нуль?
Leaky Nun

Я хочу сказати «ні», але мене також заінтригує те, яке рішення у вас є, яке цього вимагає. Так що так, ви можете припустити, що перший список містить лише додатне ціле число.
helloworld922

@PeterTaylor ні. Я зафіксував це, щоб прочитати "Список правдивих / хибних значень ...". Чи є хороше ім’я, щоб описати "тип" значень truthy / falesy? Булевий?
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 байт

Збережено 4 байти від @MartinEnder .

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

Анонімна функція. Приймає 1-базисний індекс, список та маркери як вхідні дані та повертає впорядкований список як вихід.


3

Haskell, 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

JavaScript (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

Python 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є 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]створюється список, який містить усі елементи, з якими пов’язане значення 0( False).

Після цього, список елементів , які мають True|1значення , пов'язане (яка визначається перевіркою , які елементи aне присутні в b: [c for c in a if(c in b)<1]) вставляється в списку з усіма елементами , які мають 0( Falseзначення) , пов'язане (список b) за вказаною індексу iі отриманий список повертається.


0

Python 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.