Codegolf - Дополнения Близнецов

  • Автор темы Accepter_
  • Обновлено
  • 22, Oct 2024
  • #1

Рассмотрим массив положительных целых чисел длиной \$n\$.

  • дополнять элемента с индексом \$i\$ является элемент с индексом \$n - i - 1\$.
  • близнец элемента \$a\$ является его дополнением после удаления всех элементов, не равных \$a\$.

Например, в массиве

 [1, 2, 3, 4, 2, 1, 3, 2] -> [3, 1, 2, 2, 4, 2, 1, 3]
[1, 2, 1, 3] -> [2, 1, 3, 1]
[10] -> [10]
[8, 3, 1, 8, 1, 8, 3, 10, 3, 8, 10, 8] -> [8, 8, 10, 1, 8, 3, 8, 3, 10, 3, 1, 8]
 
, the complement of the first 2 это последний 2 , and the twin of the first 3 это последний 2 . (In general, the twin of the first \$a\$ is the last \$a\$, the twin of the second \$a\$ is the second-to-last \$a\$, etc.)

Учитывая непустой массив положительных целых чисел, замените каждый элемент дополнением к его двойнику.

[1, 2, 3, 4, 2, 1, 3, 2]

#код-гольф #массив

Accepter_


Рег
08 Oct, 2006

Тем
73

Постов
167

Баллов
542
  • 26, Oct 2024
  • #2

Р, 65 59 50 41 36 байт

 
 
 
 
 
 
 
 
 
def f(a):

b=a*0

for S in a:b[a==S]=a[a[::-1]==S]

return b

Попробуйте онлайн!

Как?

Сначала использовалась пара хитростей:

  1. Переназначьте
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     ⇧      # 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 ⇧₌Ṙ⇧İİ функция,
  2. Обратите внимание, что 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||

Желе, 8 байт

ƛ?=TḂZ;UÞfµh;vt?Ṙ$İ

Попробуйте онлайн!

Порт Ионы J ответ:

ave ||answer||

Желе, 9 байт

split %>% lapply %>% unsplit

Попробуйте онлайн!

function(x)ave(rev(x),x,FUN=rev)

-1 байт благодаря Линн за трюк с повышением оценок. При повышении уровня списка индексы сортируются по соответствующим значениям.

 

Raileanu.andrii


Рег
13 Nov, 2019

Тем
75

Постов
211

Баллов
616
  • 26, Oct 2024
  • #3

Желе, 7 байт

⌽⊏˜{⍋∾⌽¨⊔???}⊏⍋

Попробуйте онлайн!

Порт мой ответ Р.

Псевдокод: ⍋∘⍋⊏⍋∘⌽⊏⊢

Желе объяснение:

θ Input array E Map over elements θ Input array § Indexed by θ Input array ⮌ Reversed ⌕A Find all occurrences of ι Current value § Indexed by θ Input array ⌕A Find all occurrences of ι Current value ⌕ Find index of κ Current index I Cast to string Implicitly print ||answer||

Желе, 10 байт

IEθ§θ§⌕A⮌θι⌕⌕Aθικ

Полноценная программа, которая принимает список и печатает результат.

Попробуйте онлайн!

Как?

ĠżṚ$€ẎḢÞịṚ - Main Link: list, A Ġ - group indices by their element's values $€ - for each: Ṛ - reverse that list of indices having equal values ż - zip the two together Ẏ - tighten (to a list of [index, twin index] pairs) Þ - sort by: Ḣ - pop head from the pair being inspected Ṛ - reverse A ị - use the (remaining) twin indices to index into the reversed copy of A - implicit, smashing print ||answer||

Древесный уголь, 18 17 байт

ĠżṚ$€ẎḢÞịṚ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

ỤỤ # get the order of the order of the input; ị # use this to index into... $ # (previous two links together) U # ...reverse of Ụ # ...order of the input; ị # finally use this to index into the input ||answer||

БКН, 9 байтСБКС

Порт Ответ Доминика ван Эссена R.

x [ order of reverse of x ] [ order of order of x ]

Беги онлайн!


БКН, 17 13 байтСБКС

Моя собственная попытка, которая в конечном итоге была похожа на ответ «Основываясь на ответе Линн Джелли», который является портом J-ответ Ионы.

ỤỤịUỤ$ị

Беги онлайн!

 

Sergio_nuft


Рег
11 Feb, 2007

Тем
72

Постов
183

Баллов
553
  • 26, Oct 2024
  • #4

Р, 41 39 32 байта

ĠUF,ỤyJịU Main Link Ġ Group indices by equal elements U Reverse each block F Flatten ,Ụ Pair with the grade of the original list yJ Apply this as a translation to the indices of the list ịU Index that into the reverse of the original list

Попробуйте онлайн!

Я думал об этом как о ĠUF,ỤyJịU before remembering that Ġ Group indices U Reverse each group F Flatten Ụ Grade up ịỤ Index into graded-up original list ịU Index into reversed list e.g. input: “XYXZYY” (needn't be integers!) Ġ: [[1,3],[2,5,6],[4]] U: [[3,1],[6,5,2],[4]] F: [ 3,1, 6,5,2, 4 ] Ụ: [2,5,1,6,4,3] This is a "rank" of the input, breaking ties backwards: X Y X Z Y Y 2 1 rank Xs backwards 5 4 3 rank Ys backwards 6 rank Zs backwards → [2,5,1,6,4,3]. Meanwhile, Ụ is [1,3,2,5,6,4] (equiv. to ĠF), indices that sort the input: [X,Y,X,Z,Y,Y] [1, 3, indices of Xs 2, 5,6, indices of Ys 4] indices of Zs Now ịỤ permutes one list by the other, mapping each element to its twin's index: ịỤ: [3,6,1,4,5,2] X Y X Z Y Y 3 1 Twin indices of Xs 6 5 2 Twin indices of Ys 4 Twin indices of Zs And we only have to index into the backwards input: ịU: “ZXYXYY” делает то же самое для меньшего количества байтов.

Тестовый жгут взят из Ответ Доминика ван Эссена.

Объяснение далее.

 

Supering


Рег
06 Apr, 2011

Тем
72

Постов
190

Баллов
600
  • 26, Oct 2024
  • #5

Utterlats100


Рег
25 Oct, 2024

Тем
62

Постов
175

Баллов
545
  • 26, Oct 2024
  • #6

Python/NumPy, 60 байт

smqmscbnq m Map over the groups. bn Bifurcate on n, reversing the group. c Chop, forming pairs. ms Sum the pairs, concatenating into one list s Sum, concatenating the lists back into one

Попробуйте это онлайн!

Ожидает и возвращает массивы numpy.

 

Dasada


Рег
05 Dec, 2016

Тем
72

Постов
199

Баллов
569
  • 26, Oct 2024
  • #7

JavaScript (ES6), 56 байт

gih

Попробуйте онлайн!

Прокомментировал

cmmzsbbnlis b Bifurcate: make a list by applying two functions to the input b Function 1: Bifurcate on n negate, reversing the input, l length, the length of the input is inverse sum, wrap the input in a list. s sum, concatenate into a single list of 3 elements m map on mz the default map, identify on lists, casts int x to [0, ..., x-1] c chop, transpose the three lists to form lists of 3 elements. ||answer||

JavaScript (ES2022), 48 байт

mhoithzsmqmscbnqgihcmmzsbbnlis twin_complement= function(x){ o=order(rev(x)) # get the order of reversed values of x, # breaking ties in reverse order-of-first-occurrence in x; t=o[rank(x, # use this to get the twin index for each index of reversed x ties.method="first")] # = the element at the rank position of each x value, # now breaking ties in order-of-first-occurrence in x; x[t] # finally, return the complement of x # at each twin position in reversed x. }
 

At3s


Рег
26 Jan, 2012

Тем
65

Постов
205

Баллов
600
  • 26, Oct 2024
  • #8

05AB1E, 18 байты

order(order(x))

Попробуйте онлайн или проверить все тестовые случаи.

Объяснение:

rank(x) ||answer||

С (ГКК), 131 127 байт

order

Попробуйте онлайн!

Сэкономлено 4 байта благодаря потолочный кот!!!

Вводит указатель на массив целых чисел (\$a\$) и его длину (поскольку указатели в C не несут информации о длине).
Возвращает указатель на массив всех дополнений близнецов элементов \$a\$.

 

Numzy


Рег
03 Jun, 2014

Тем
70

Постов
178

Баллов
558
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно