Зворотний вид вставки


19

Об'єктивна

Створіть оригінальний скремблірований список із рухів, які зробив би сортування вставки для його сортування. У вихідному списку будуть всі цифри від 0до N-1(включно), де Nрозмір вводу.

Вхідні дані

Список, що містить необхідні рухи для сортування списку. Кожне значення являє собою кількість слотів, переміщених на оригінальне (скремблірованное) число, яке знаходиться у його правильному положенні, майте на увазі, що цей процес знаходиться зліва направо.
Значення в (0-індексованому) положенні iу вхідному списку буде між 0та iвключно.
Вам не потрібно обробляти недійсні дані, будь-яка поведінка в цьому випадку прийнятна (збій, нескінченний цикл тощо).

Вихідні дані

Скручений список

Крок за кроком для генерації рухів

Scrambled List | Moves to sort
[4,0,2,1,3,5]  | [0, , , , , ] #4 stay in place
[4,0,2,1,3,5]  | [0,1, , , , ] #0 is moved 1 slot to the left
[0,4,2,1,3,5]  | [0,1,1, , , ] #2 is moved 1 slot
[0,2,4,1,3,5]  | [0,1,1,2, , ] #1 is moved 2 slot
[0,1,2,4,3,5]  | [0,1,1,2,1, ] #3 is moved 1 slot
[0,1,2,3,4,5]  | [0,1,1,2,1,0] #5 is in the right place already
[0,1,2,3,4,5]

Отже, для введення [0,1,1,2,1,0]програми потрібно виводити програму [4,0,2,1,3,5].
Майте на увазі, що рухи не до позиції у (остаточному) відсортованому списку, а у відсортованому сегменті (напівжирним розділом)

Випробування

[0,0,0] -> [0,1,2]
[0,1,0,1] -> [1,0,3,2]
[0,0,0,0,0,5] -> [1,2,3,4,5,0]
[0,1,2,3] -> [3,2,1,0]
[0,1,1,1] -> [3,0,1,2]
[0,1,1,2,1,0] -> [4,0,2,1,3,5]

Перемога

Це , тому найкоротша відповідь виграє.

code-golf  array-manipulation  code-golf  code-golf  animation  code-golf  restricted-source  code-golf  java  code-golf  decision-problem  graph-theory  code-golf  conversion  electrical-engineering  code-golf  ascii-art  code-golf  string  substitution  code-golf  math  code-golf  string  set-theory  code-golf  code-golf  compile-time  code-golf  kolmogorov-complexity  binary  code-golf  sequence  cops-and-robbers  code-golf  subsequence  card-games  code-golf  sequence  primes  code-golf  code-golf  number  graphical-output  music  code-golf  ascii-art  code-golf  string  lambda-calculus  code-golf  string  code-generation  code-golf  unicode  code-golf  math  combinatorics  code-golf  balanced-string  code-golf  sequence  cops-and-robbers  code-golf  sequence  cops-and-robbers  code-challenge  fastest-code  chess  code-golf  math  graphical-output  code-golf  string  hello-world  animation  code-golf  number  arithmetic  code-golf  integer  code-golf  code-golf  combinatorics  code-golf  kolmogorov-complexity  graphical-output  code-golf  string  code-golf  code-golf  game  code-golf  math  combinatorics  code-golf  ascii-art  popularity-contest  random  code-golf  arithmetic  number-theory  integer  code-golf  tips  underload  code-golf  math  sequence  primes  code-golf  math  path-finding  code-golf  ascii-art  primes  code-golf  kolmogorov-complexity  alphabet 

1
Може програма також сприймає довжину списку як вхідний?
mbomb007

@ mbomb007 nope.
прут

Чи можемо ми скористатися кроками (n-1)? Перший є непотрібним, оскільки він завжди дорівнює нулю.
ГБ

@GB впевнено, якщо результат правильний, ви можете використовувати будь-який алгоритм
стрижень

Відповіді:


14

Желе , 12 байт

L!_UÆ¡$œ?J’U

Спробуйте в Інтернеті!

Пояснення

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

L!_UÆ¡$œ?J’U
   U           Reverse {the input}
    Æ¡         and convert from base factorial to integer;
  _   $        subtract that from
L!             the factorial of the length of {the input};
       œ?      then take the nth permutation of
         J     [1,2,...,l], where l is the length of {the input},
          ’    subtract 1 from every elevent,
           U   and reverse it

У випадку базової факторії ми можемо зауважити, що перший елемент списку повинен бути 0, другий може бути 0 або 1, третій повинен бути 0/1/2 тощо. Таким чином, ми повинні повернути вхід, щоб перевести його елементи в звичайний порядок запису для базового перетворення.

Додатково, щоб відносні порядки перетворення факторів та перетворення перестановки відповідали операції, яку використовує сортування вставки, нам потрібно здійснити два коригування: повернення послідовності перестановок та змінення порядку списку вихідних даних. Повернення списку вихідних даних є досить простим, потребуючи лише в Uкінці програми. Щоб змінити послідовність перестановок, ми віднімаємо від факторіала вхідну довжину (це працює тому, що базовий факторіал видає число в діапазоні від 0 до (довжина! -1), тоді як перестановки нумеруються Jelly від 1 до довжини! , створюючи неявну окрему, яка скасовує відключення, яке зазвичай отримуєш, коли віднімаєш індекс перестановки з факторіалу).

Желе , 9 байт, у співпраці з @JonathanAllan

UÆ¡Nœ?J’U

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

Спробуйте в Інтернеті!


4
О_О Що чаклунство це таке?
DLosc

Про добре - я знав , що мої Æ¡і œ?атоми будуть працювати для цього (я вже почав намагатися використовувати їх для цієї проблеми раніше - я був так близько, просто необхідна L!там).
Джонатан Аллан

Відмінний код!
Грег Мартін

1
Насправді, ви можете це зробити в 9 байт, UÆ¡Nœ?L’Uтому що я реалізував œ?(і подібне), щоб діяти модульно (як би вони використовували списки Jelly). В Nтільки індекси зі значенням негативної. Примітка: Я змінив Jдо L- це тільки тому , що даний номер він робить вибір під капотом в будь-якому випадку).
Джонатан Аллан

6

Математика, 92 байти

Permute[Range[l=Length@#]-1,(c=Cycles@{#}&)@{}©##&@@c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]&

Чиста функція, приймаючи список вхідних цілих чисел як вхідне та повертаючи список невід’ємних цілих чисел. Вищевказаний код містить a ©, що є неправильним: це заповнювач для 3-байтового символу U + F3DE, який Mathematica позначає колом із крапкою в ньому та являє собою склад перестановок.

c=Cycles@{#}&визначає функцію, яка перетворює список цілих чисел у Cyclesоб'єкт, що представляє перестановку; наприклад, c[{3,4}]- це елементи 3 та 4 списку , що змінюють переміщення. c[i-0~Range~#[[i]]]~Table~{i,l,1,-1}]приймає список введення та створює перестановки, необхідні для скасування сортування вставки. Потім c@{}©##&@@всі ці перестановки складаються разом, починаючи з перестановки ідентичності c@{}. Нарешті, Permute[Range[l=Length@#]-1,...]застосовує цю перестановку до 0-індексованого списку відповідної довжини.


1
Чого немає вбудованого ?! Безумовно ...
Джонатан Аллан

3
@{#}&)@{}©##&@@виглядає страшно.
Yytsi

6

Python 2, 79 68 байт

Дякуємо Кразору за збереження 10 байт

Завдяки TuukkaX за збереження 1 байта

a=input();b=range(len(a));print[b.pop(j-a[j])for j in b[::-1]][::-1]

Працює шляхом генерації рухів у зворотному напрямку


2
Зробіть це 66 ! Як щодо: a=input();b=range(len(a));print[b.pop(j-a[j]) for j in b[::-1]][::-1]. Перелічіть розуміння ftw!
FMaz

1
@Krazor У вас є пробіл, який можна було вилучити раніше for, тому зробіть це 65 Я здогадуюсь: D
Yytsi

@Krazor Виявляється, розуміння списку не дуже спрацювало, але мені сподобалась ідея використання b [:: - 1]!
наркоман з математики

У жодному разі? Я коментував мобільним, можливо, я щось неправильно ввів. Яка частина не працює? Для мене це правильно інтерпретувало та виконувало всі тестові справи.
FMaz

@Krazor О, так, ні, ти не правий. Я той, хто помилково вводив це під час тестування.
математика наркоман

5

JavaScript (ES6), 69 65 63 байт

a=>a.reverse(b=[...a.keys()]).map(o=>+b.splice(~o,1)).reverse()

Прикро і введення, і вихід у неправильному порядку. Редагувати: Збережено 4 байти завдяки @Arnauld. Збережено 2 байти завдяки @ETHproductions.


Я все ще намагався знайти кращий шлях, але ти був набагато швидшим. Хороший!
Арнольд

1
Вам не потрібно i, чи не так?
Арнольд

@Arnauld Мабуть ні. Я почав, намагаючись зрозуміти відповідь Python, і тільки що помітив, що він насправді не використовує i...
Ніл

1
Легко -2:o=>+b.splice(~o,1)
ETHproductions

3

JavaScript (ES6), 73 71 байт

Збережено 2 байти завдяки ETHproductions

m=>(a=m.map((_,i)=>j=i)).map(_=>a.splice(j,0,+a.splice(j-m[j--],1)))&&a

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


Хороший спосіб одночасно отримати довжину і діапазон. Я збирався запропонувати a=m.map(_=>j++,j=0), але це така ж довжина, і я впевнений, що ви вже спробували це.
ETHproductions

@ETHproductions Ти маєш рацію: я також спробував це. :-) (Може бути , варто відзначити , що це не еквівалентно: це було б встановити jв a.lengthчому a.length-1і зажадає a.splice(--j,0,a.splice(j-m[j],1)[0]))
Arnauld

Хе, я теж думав про це, але я не вважав, що це варто згадувати, оскільки це однакова довжина
ETHproductions

1
Легко -2:+a.splice(j-m[j--],1)
ETHproductions

2

Haskell , 85 байт

f x|n<-length x-1=reverse x#[n,n-1..0]
(n:r)#l=r#(take n l++drop(n+1)l)++[l!!n]
x#l=x

Спробуйте в Інтернеті! Приклад використання: f [0,1,1,2,1,0]врожайність [4,0,2,1,3,5].

f xвикликає функцію #з xперевернутим списком та списком [length x - 1, length x - 2, ... , 0]. (n:r)#lвиконує сортування із зворотним введенням, рекурсивно виймаючи nth-й елемент l, де l!!nвиходить nth-й елемент і видає take n l++drop(n+1)lсписок lзі nвилученим th-елементом.


Haskell, така гарна.
FMaz

1

perl, 61 байт

@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p

Вихід закінчується у масиві @o. Приклад з вхідним масивом як аргументами командного рядка:

perl -le'@o=@p=0..@ARGV-1;splice@o,$_,0,splice@o,$_-pop,1for reverse@p;print@o' 0 1 1 2 1 0
402135

1

Рубін, 49 байт

->l{(w=l.size).times{l.insert(l.shift+w-=1,w)};l}

Виконує "зворотну вставку" на місці всередині списку, починаючи з найбільшої кількості.

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