Простой гольф, чтобы начать неделю! Вам даны три массива: базовый массив B
, массив значений V
и индексный массив I
. Вы должны создать другой массив, в который V
вставляются значения из B
индексов, указанных в I
. Вот пример:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Индексы указывают на следующие позиции в базовом массиве:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Таким образом, вставляя соответствующие элементы из массива значений, результат должен быть:
[0, 5, 1, 4, 7, 1, 3, 0]
правила
Вы можете написать программу или функцию, используя ввод через STDIN (или ближайшую альтернативу), аргументы командной строки или аргументы функции, и выводить результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или изменяя массив, заданный как B
параметра. ,
Если ваше представление является функцией I
и V
может быть изменено любым способом, а такжеB
если оно не используется для вывода.
Вы можете сделать следующие предположения относительно ввода:
- Все элементы массива base и value будут неотрицательными целыми числами.
- Массив значений будет иметь не более одного элемента больше, чем базовый массив.
- Массив значений и индексный массив будут иметь одинаковое количество элементов.
- Массив индекса не будет содержать повторяющихся индексов, и все индексы будут в диапазоне.
- Массивы базы и значения могут содержать повторяющиеся элементы.
- Любой или все массивы могут быть пустыми.
- Вы не должны предполагать, что индексы даны в каком-то определенном порядке.
- Вы можете получать ввод и производить вывод в любой удобной, однозначной строке или формате списка. Вы также можете получить три массива в другом порядке.
- Вы можете выбрать индексацию от 0 до 1.
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Тестовые случаи
Задано в формате B V I => Result
для индексации на основе 0. Если вы используете индексирование на основе 1, увеличьте элементы третьего массива на 1.
[] [] [] => []
[] [1] [0] => [1]
[1,2] [] [] => [1,2]
[1,2] [3] [0] => [3,1,2]
[1,2] [3] [1] => [1,3,2]
[1,2] [3] [2] => [1,2,3]
[0,0,0] [1,1,1,1] [0,1,2,3] => [1,0,1,0,1,0,1]
[5,1,4,1,3] [0,0,7] [5,0,3] => [0,5,1,4,7,1,3,0]
[1,2,3,4] [4,3,2,1] [4,0,3,1] => [3,1,1,2,3,2,4,4]
Дайте мне знать, если вы столкнетесь с другими интересными крайними случаями, и я добавлю их.
Leaderboard
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=50369;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
NULL
к пустому массиву для языков, где есть пустой массивNULL
?Ответы:
Pyth, 14 байт
Демонстрация.
Эта программа принимает входные данные в виде трех наборов списков в следующем порядке: База, Индексы, Значения.
Пояснение к примеру
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Возьмите вход: неявный, Q является входом.
Составьте индекс, пары значений:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Сортируйте пары в порядке возрастания индекса:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Возьмите значение из каждой пары:
medSCtQ
=[0, 7, 0]
Разделите базовый список по месту нахождения признаков:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Чередование 3 и 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
Объединить в один список:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
источник
ssC,cFPQamedSCtQ]
.Python 2, 54
Принимает вход как
B,I,V
. Модифицирует вводB
при вызове (спасибо Мартину Бюттнеру за напоминание, что это возможно).Используется
map
для вызоваB.insert
каждой пары индекс / элемент. Чтобы избежать смещения индексов списков при вставке элементов, сортирует пары в порядке убывания индекса по безобразному zip / sort / unzip. Если бы не смещение вопроса, мы могли бы просто сделатьmap(B.insert,*X)
.Старый метод (65):
источник
Haskell, 62 байта
Пример использования:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.Как это работает: дополнить базовый список индексами «полтора», начиная с
0.5
(например[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
), и объединить его с парами индекс-значение. Сортировка и удаление индекса.Замечание : не знаю, жульничаю ли я здесь. С математической точки зрения это нормально, но программист может утверждать, что список индексов
[5,0,3]
- это не список поIntegers
запросу, а списокFractionals
(точнее, тип полиморфный, но должен принадлежатьFractional
классу, например,Float
илиDouble
).источник
Рубин,
605953 байтаИ негольфированная версия
источник
->a,b,c{...}
. Также есть вероятность,insert
что скобки не нужны.CJam,
342318 байтМоя первая подача CJam. Советы приветствуются, я уверен, что есть много в гольф.
16 байтов сохранено с помощью @ MartinBüttner и @Dennis.
Функция ожидает ввода в стеке по порядку
B V I
(я самый верхний).Пример использования:
Метод:
i
элемент массива сi+0.5
источник
q~.5fm.\2/\ee+$1f=p
и до 18 байтов, используя анонимную функцию:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(все еще 18 байтов)get array element
оператора для1f=
. Я оставлю это как полную программу, хотя.К,
2221 байтОпределим функцию 3 аргумента
{…}
с неявных переменныхx
,y
иz
представляющий начальный список, список значений и список индексов, соответственно. Оператор «cut» (_
) используется для разделения начального списка на отсортированный список заданных индексов ((z@<z)
). Мы чередуем значения (после их соответствующей сортировки) с разделенными фрагментами исходного массива, формируя список ((a;b)
), беря его transpose (+
) и выравнивая результат (,//
).Пример использования:
Пробелы вокруг подчеркивания необходимы, потому что K допускает подчеркивание в идентификаторах. K5 устраняет эту потенциальную неоднозначность. Если бы мы могли рассчитывать на индексы, поступающие в порядке возрастания, а подчеркивания не были действительными идентификаторами, мы могли бы использовать гораздо более приятную 13-байтовую программу:
(вздох.)
редактировать:
Нарушает симметрию, но мы можем сохранить байт, используя скобку-индексацию (
[…]
) вместо@
оператора индексации инфикса . Обычно это делает программы длиннее, но в этом случае нам нужно было все равно сортировать пареныz
перед выполнением вырезания.источник
Pyth, 17 байт
@isaacg опередил мое решение. Но так как моя документация закончена, я все равно ее опубликую.
Это принимает входные данные в формате
B, I, V
. Вы можете попробовать это здесь: Демонстрация или Test SuiteОбъяснение:
Я использую пример
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
из ОП.источник
JavaScript (ES6), 75
Функция с 3 параметрами массива, возвращающая массив. Как ни странно, эта функция изменяет свой
i
параметр (как любезно разрешено OP)Попробуйте запустить фрагмент, Firefox только в обычном режиме.
источник
fat arrow function
это не реализовано даже в девелоперской версии Chrome (AFAIK)Mathematica,
5251 байтПример:
Объяснение:
Используя пример выше.
Tr@#2->#&~MapIndexed~#
=>{1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3}
Thread[#3+.5->#2]
=>{5.5 -> 0, 0.5 -> 0, 3.5 -> 7}
{0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0}
){0, 5, 1, 4, 7, 1, 3, 0}
)источник
CJam,
3029 байтЭто слишком долго. Я чувствую, что это не представление языка игры в гольф: |
Попробуйте онлайн здесь
источник
R 75 байт
Это создает безымянную функцию. Чтобы назвать его, дайте ему имя, например
f=function...
. Обратите внимание, что массивы должны быть 1-индексированы, потому что именно так катится R.Ungolfed + объяснение:
Примеры:
Предложения приветствуются как всегда!
источник
CJam, 19 байтов
Это полная программа, которая читает массивы B , I и V (по одному на строку в указанном порядке) из STDIN.
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
CJam, 20 байтов
Это анонимная функция, которая выскакивает B , V и I (сверху вниз) из стека и оставляет один массив в стеке взамен.
Попробуйте онлайн в интерпретаторе CJam .
Как это работает
источник
Рубин, 48 байтов
Я думаю, что это соответствует правилам, но, пожалуйста, проверьте.
Безымянная функция, принимающая три массива в качестве входных данных. Выводит строку, которая может быть однозначно проанализирована в массив чисел с выражением ruby
x.split(/:+/).map(&:to_i)
.Тестовые случаи на ideone .
Я мог бы сохранить еще 3 байта, но формат вывода
[1,2,[nil,5]]
слишком растягивает правила, но это однозначно.источник
nil
значениями чередования немного растянуты. Но в любом случае это не победа в конкурсе, так что я не очень беспокоюсь об этом в любом случае.R, 60
В качестве неназванной функции, которая принимает b, v и i
Расширяет b с помощью NA. Заполняет пробелы, где это необходимо, с помощью v Возвращает вектор без NA.
источник
Ява,
253, 226, 219,209не совсем победитель, ну да ладно.
Предполагая, что B, V и я не равны нулю. v (нижний регистр v) - длина массивов значений / показателей. R - возвращенный массив. r - длина возвращаемого массива. х, у и я все временные целые числа.
расширен:
источник
APL, 22 байта
В ⎕IO ← 0, чтобы соответствовать тестам.
Это стандартный алгоритм: индексный вектор первого аргумента добавляется к указанным индексам (3-й аргумент).
⍋
вычисляет перестановку, которая сортирует индексы в порядке возрастания. Поскольку алгоритм сортировки APL по определению стабилен, вычисленная перестановка помещает элемент объединения второго и первого аргументов в нужное место.Например :
источник