Задание
Напишите программу или функцию, чьи входные данные представляют собой список / массив X целых чисел, а выходные данные представляют собой список наборов целых чисел Y , так что для каждого элемента e в каждом наборе Y [ i ], X [ e ] = i и таким образом, что общее число элементов в множествах в Y равно числу элементов в X .
(Это в основном та же операция, что и обращение к хеш-таблице / словарю, за исключением того, что вместо этого применяется к массивам.)
Примеры
В этих примерах предполагается индексирование на основе 1, но вместо этого вы можете использовать индексацию на основе 0.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Разъяснения
- Вы можете представлять набор в виде списка, если хотите. Если вы это сделаете, порядок элементов не имеет значения, но вы не можете повторять элементы.
- Вы можете использовать любой разумный однозначный формат ввода / вывода; Например, вы можете разделить элементы набора пробелами, а сами наборы - символом новой строки.
- Y должен быть конечной длины и, по крайней мере, достаточно длинным, чтобы все элементы X были индексами массива. Однако он может быть длиннее максимального элемента X (дополнительные элементы будут пустыми наборами).
- Все элементы X будут действительными индексами массива, то есть неотрицательными целыми числами, если вы используете индексацию на основе 0, или положительными целыми числами, если вы используете индексацию на основе 1.
Состояние победы
Как вызов коду-гольфу , чем короче, тем лучше.
[5,5,6,6]
и[6,6,5,5]
могут быть идентичны?[5,5,6,6]
и[6,6,5,5]
не могут иметь одинаковый выход, но выход для[5,5,6,6]
также может быть, например,[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
бы действительный вывод для[5,5,6,6]
?Ответы:
MATL , 8 байт
Ввод - это вектор-столбец с
;
разделителем (например[2;2;2]
). Выход - это строковое представление массива ячеек векторов строк (например{[]; [1 2 3]}
). Вектор строки одного элемента совпадает с числом (поэтому{1; 2; 3}
выводится вместо{[1]; [2]; [3]}
).Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Большая часть работы выполняется функцией высшего порядка Matlab
accumarray
, которая группирует элементы во втором входе в соответствии с соответствующими значениями в первом и применяет указанную функцию к каждой группе. В этом случае используется функция@(x){sort(x).'}
, которая выводит отсортированные элементы в каждой группе и обеспечивает упаковку результатов для всех групп в массив ячеек.источник
Python, 69 байт
Использует индексирование на основе 0.
источник
Желе ,
75 байтПопробуйте онлайн!
Как это работает
источник
Желе , 8 байт
Попробуйте онлайн!
Как это работает
источник
Mathematica, 36 байт
объяснение
Для каждого
n
in{1, 2, ..., Max@#}
, гдеMax@#
наибольшее целое число в списке ввода, вычисляетсяPosition
s, где онn
появляется в списке ввода#
. Так какPosition[{6,6,5,5},5]
(например) возвращает{{3},{4}}
, мы затемApply
Join
ко всем элементам на уровне{1}
результата.источник
Haskell , 45 байт
s
берет список целых чисел и возвращает список списков. 1-индексированный, чтобы сохранить входные данные тестового примера неизмененными (хотя выходные данные получают несколько дополнительных пустых списков).Попробуйте онлайн!
Это довольно простые вложенные списки. Единственным небольшим изменением является использование возможности сделать более длинный список с помощью
sum
вместоmaximum
.источник
PHP, 55 байт
0 индексированные.
источник
R
684947 байтУдивительно, но гораздо проще, чем более длинные решения. Извлекает вектор
x
из STDIN, создает вектор из1
tomax(x)
, неявно генерирует список длиныmax(x)
и проверяет, какие индексыx
соответствуют указанным в новом списке. Неявно печатает вывод.Старая версия:
Немного другой подход к другому ответу. Принимает вектор к STDIN, создает список с длиной, равной максимальному значению на входе. Перебирает ввод и добавляет индекс в нужное место.
Использует индексирование на основе 1.
источник
Python 2 ,
918685 байтЯ программирую на своем телефоне, но мне очень понравился этот вызов. Я могу определенно играть в гольф дальше.
Попробуйте онлайн!
источник
Желе , 9 байт
1-индексированные, пустые наборы, представленные в виде
0
наборов одного элемента, представленных в видеN
наборов из нескольких элементов, представленных в виде[M,N,...]
Попробуйте онлайн!
Как?
источник
JavaScript (ES6),
6462 байтаСохранено 2 байта благодаря @SteveBennett
Принимает 0-индексированный ввод. Возвращает разделенный запятыми список множеств.
Контрольные примеры
Показать фрагмент кода
Альтернативная версия, 53 байта
Если упрощенный вывод, такой как
'||||3,2|1,0'
приемлемый, мы можем просто сделать:источник
`{${o.join`},{`}}`
законен ES2015."{" + o.join("},{") + "}"
, если это делает это более понятным.join`
эквивалентноjoin('
. Не знал, что ты сможешь это сделать.array.join` `
. Это очень запутанно, потому что вы встраиваете это в строку шаблона, и, что еще более запутанно, это объединяющая строка},{
, которая по совпадению выглядела как часть строки шаблона ... и в любом случае это просто странно и безобразно. :)Баш , 109 байт
Жаль, что нет встроенного для максимального значения массива.
Попробуйте онлайн!
источник
Mathematica 62 байта
Я буду управлять этим для вас
Попробуйте онлайн (просто вставьте код с помощью Ctrl-V и нажмите Shift + Enter)
, не забудьте вставить список ввода в конце, как в примере выше
источник
AppendTo
. Кроме того,{j,1,Length[#1]}
может быть просто{j,Length@#}
или даже короче{j,Tr[1^#]}
.Tr[1^#]
это довольно обычный прием , чтобы сохранить байты по сравнению с использованиемLength
.Perl 6 ,
36 3229 байтПопытайся
Попытайся
Попытайся
Expanded:
Возвращает нулевые индексы, чтобы получить 1 основанный перекрестный оператор (
X
) в сочетании с+
оп . (33 байта)Для того, чтобы заставить его вернуть Сета сек только надстройку
set
в там (всего 37 байт)источник
R,
8072 байта1-индексируется, берет
X
из stdin. Возвращает список векторов индексов сNULL
пустым набором.Попробуйте онлайн!
старая версия:
Попробуйте онлайн!
источник
Y=list();
работает так же хорошоfew
байты в моем ответе :) codegolf.stackexchange.com/a/120024/5953005AB1E , 10 байтов
Попробуйте онлайн!
источник
Röda , 51 байт
Это порт ответа Python от Uriel .
Другая версия (88 байт):
Попробуйте онлайн!
Оба с 1 индексом.
источник
PowerShell, 81 байт
Попробуйте онлайн!
1-индексироваться.
источник
GNU Make ,
214213208204 байтаВвод / вывод: ввод массива через аргументы, вывод в stdout, по одному на строку, разделенные пробелами.
объяснение
Порядок индексов в наборах меняется на обратный, потому что
P
рекурсивно вызывает себя перед обновлениемA$2
(вызов выполняется при оценке правой части).источник
make
способ сделать арифметику сама? Обращение к внешним программам для этого напоминает читерство, потому что вы, вероятно, могли бы поместить в эти программы гораздо больше алгоритма и в итоге получить более короткую программу.bc
иgrep
. Я также мог бы использоватьtest
и$?
.dc
имеет более краткий синтаксис, но, честно говоря, все они чувствуют то же самое.Common Lisp, 91 байт
Индексирование на основе 1 возвращает наборы в виде списков.
Попробуйте онлайн!
источник
к , 13 байт
Это 0-индексированный.
Попробуйте онлайн!
источник