Р, 65 59 50 41 36 байт
def f(a):
b=a*0
for S in a:b[a==S]=a[a[::-1]==S]
return b
Попробуйте онлайн!
Как?
Сначала использовалась пара хитростей:
- Переназначьте
⇧ # Gradeup
₌Ṙ⇧ # Push ^ reversed, ^ gradeup'd
İ # Use the reversed copy to index into the double-gradeup'd
İ # Use those indicies to index into the input.
operator to become the ⇧₌Ṙ⇧İİ
функция,
- Обратите внимание, что
c;j;i;*w;*f(a,n)int*a;{for(w=calloc(i=n,4);i--;w[i]=a[n+~j]){for(j=c=0;j<=i;)c+=a[i]==a[j++];for(j=n;c;)c-=a[i]==a[--j];}a=w;};
is equivalent to Ù # Uniquify the (implicit) input-list
v # Loop over each unique value `y`:
IyQ # Check for each value in the input-list if it's equal to `y`
# (1 if truthy; 0 if falsey)
ƶ # Multiply each by its 1-based index
0K # Remove all 0s
© # Store this list in variable `®` (without popping)
R # Reverse it
α # Get the absolute difference between each 1-based index
Ig # and the input-length
I è # Use that to (0-based) index into the input-list
®< # Push `®` and decrease each by 1 to make them 0-based
ǝ # Insert the values at those indices into the list
# (which will be the implicit input-list in the first iteration)
# (after the loop, the result is output implicitly)
, со связанными рангами, разбитыми по первому появлению.
Итак, без гольфа:
ÙvIIyQƶ0K©RIgαè®<ǝ
||answer||
Минипит, 30 байт (17,7 байт в закодированном виде)
f=
a=>a.map(g=n=>a.at(g[n]=~-g[n])-n?g(n):a[~g[n]])
console.log(f([1, 2, 3, 4, 2, 1, 3, 2]) + ''); // [3, 1, 2, 2, 4, 2, 1, 3]
console.log(f([1, 2, 1, 3]) + ''); // [2, 1, 3, 1]
console.log(f([10]) + ''); // [10]
console.log(f([8, 3, 1, 8, 1, 8, 3, 10, 3, 8, 10, 8]) + ''); // [8, 8, 10, 1, 8, 3, 8, 3, 10, 3, 1, 8]
Minipyth — это новый минималистичный язык, который я разработал. В нем используются только строчные буквы и нет таких вещей, как переменные, функции арности 2 и т. д.
Поскольку Minipyth использует только строчные буквы, его можно перекодировать, чтобы сделать его намного короче. Поэтому я также указываю его теоретико-информационную длину, которая короче в раз $$\log(26)/\log(256) \approxeq 59\%.$$
У Minipyth пока нет онлайн-исполнителя, но его можно использовать в автономном режиме через репозиторий, указанный выше.
Он выполняется справа налево в порядке применения функций.
Я разобью его на несколько частей, чтобы показать, что происходит.
Сначала мы готовим список, состоящий из элементов вида [дополнение, индекс, значение], где значение — это элемент входа, индекс — его позиция во входе, а дополнение — его дополнение.
a=>a.map(g=n=>a.at(g[n]=~-g[n])-n?g(n):a[~g[n]])
Далее мы группируем эти элементы по их значениям. Это просто a => // a[] = input array
a.map(v => // for each value v in a[]:
a[ // lookup in a[]:
b[ j = // get the position j
b.indexOf(v) // of the 1st occurrence of v in b[]
] = 0, // and clear it
j // get a[j]
], // end of lookup
b = [...a] // start with b[] initialized to
.reverse() // a copy of a[] in reverse order
) // end of map()
, group by inverse head (last element).
Теперь нам нужно сформировать близнецов.
a=>a.map(v=>a[b[j=b.indexOf(v)]=0,j],b=[...a].reverse())
z и q просто сделайте все правильно.
Теперь наши элементы представляют собой шесть списков элементов: [дополнение близнеца, индекс близнеца, значение близнеца, дополнение, индекс, значение].
Нам просто нужно вернуть вещи в исходный порядок, используя индекс, а затем извлечь дополнение к близнецу.
|.{~[:(/:&;~|.&.>)<@I.@=
Одно замечание, сделанное на момент написания этой статьи (коммит 4436b81a3), inverse меняет порядок применения своих аргументов. Это было сделано для имитации обратных функций, но я решил, что мне это не нравится, и я это отменю. В будущем в эквивалентной программе h и t поменяются местами:
ƛ ; # Map input to...
?=T # Indices of that element
ḂZ # Zipped with its reverse
UÞf # Uniquify and flatten to a list of [index, pair index] pairs
µh; # Sort by first item
vt # Get second item of each
İ # Use those to index into
?Ṙ$ # Input reversed
||answer||
ƛ?=TḂZ;UÞfµh;vt?Ṙ$İ
Попробуйте онлайн!
Порт Ионы J ответ:
ave
||answer||
split %>% lapply %>% unsplit
Попробуйте онлайн!
function(x)ave(rev(x),x,FUN=rev)
-1 байт благодаря Линн за трюк с повышением оценок. При повышении уровня списка индексы сортируются по соответствующим значениям.