Codegolf — Винтовка С Обобщенным Массивом

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

Простой гольф для начала недели! Вам даны три массива: базовый массив

 
 
 
 
 
 
 
 
 <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> 
, the массив значений body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px} and the индексный массив 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&]*(?:&lt;(?:s&gt;[^&]*&lt;\/s&gt;|[^&]+&gt;)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/; . You should produce another array where the values from # Ruby, <s>104</s> <s>101</s> 96 bytes вставлены в N at the indices specified by # Language Name, N bytes . Вот пример:

[] [] [] => [] [] [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]

Индексы указывают на следующие позиции в базовом массиве:

B V I => Result

Таким образом, вставив соответствующие элементы из массива значений, результат должен быть таким:

B

Правила

Вы можете написать программу или функцию, принимая входные данные через STDIN (или ближайший альтернативный вариант), аргументы командной строки или аргументы функции и выводя результат через STDOUT (или ближайший альтернативный вариант), возвращаемое значение функции или модифицируя массив, заданный как V parameter.

Если ваше представление является функцией, I and B можно изменить любым способом, а также [0, 5, 1, 4, 7, 1, 3, 0] if it isn't used for output.

Вы можете сделать следующие предположения относительно входных данных:

  • Все элементы базового массива и массива значений будут неотрицательными целыми числами.
  • Массив значений будет содержать не более одного элемента больше, чем базовый массив.
  • Массив значений и массив индексов будут иметь одинаковое количество элементов.
  • Массив индексов не будет содержать повторяющихся индексов, и все индексы будут находиться в диапазоне.
  • Базовые массивы и массивы значений может содержат повторяющиеся элементы.
  • Любой или все массивы могут быть пустыми.
  • Вы не должны предполагать, что индексы даны в каком-то определенном порядке.
  • Вы можете получать входные данные и производить выходные данные в любом удобном, однозначном формате строки или списка. Вы также можете выбрать получение трех массивов в другом порядке.
  • Вы можете выбрать индексацию с отсчетом от 0 или от 1.

Это кодовый гольф, поэтому побеждает самый короткий ответ (в байтах).

Тестовые случаи

Дано в формате [ 5, 1, 4, 1, 3 ] ^ ^ ^ 0 3 5 for 0-based indexing. If you're using 1-based indexing, increment the elements of the third array by 1.

Base: [5, 1, 4, 1, 3] Values: [0, 0, 7] Indices: [5, 0, 3]

Дайте мне знать, если вы встретите другие интересные крайние случаи, и я добавлю их.

Таблица лидеров

Вот фрагмент стека, позволяющий создать как обычную таблицу лидеров, так и обзор победителей по языкам.

Чтобы ваш ответ появился, начните его с заголовка, используя следующий шаблон Markdown:

I

где B is the size of your submission. If you improve your score, you может держите старые результаты в заголовке, вычеркивая их. Например:

V I V B

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

Hedy2007


Рег
20 Nov, 2008

Тем
63

Постов
208

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

Питон 2, 54

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     {(∊⌽2↑⍵)[⍋(2⊃⍵),⍳≢⊃⍵]}(5 1 4 1 3)(0 0 7)(5 0 3)
0 5 1 4 7 1 3 0
 

Принимает ввод как . Modifies the input {(∊⌽2↑⍵)[⍋(2⊃⍵),⍳≢⊃⍵]} когда позвонят (спасибо Мартину Бюттнеру за напоминание, что это возможно).

Использование int[]f( int[] B, int[] V, int[] I ) { int v = V.length, //length of Values r = B.length + v, //length of the result x, y, i; //temps int[] R = java.utils.Arrays.copyOf( B, r ); for( x = 0; x < v; x++ ) { i = I[x]; for( y = 0; y < x; y++ ) if( I[x] > I[y] ) i++; for( y = r - 2; y >= i; y-- ) R[y+1] = R[y]; R[i] = V[x]; } return R; } to call int[]f(int[]B,int[]V,int[]I){int v=V.length,r=B.length+v,x,y,i;int[]R=java.utils.Arrays.copyOf(B,r);for(x=0;x<v;x++){i=I[x];for(y=0;y<x;y++)if(I[x]>I[y])i++;for(y=r-2;y>=i;y--)R[y+1]=R[y];R[i]=V[x];}return R;} для каждой пары индекс/элемент. Чтобы избежать проблемы смещения индексов списка при вставке элементов, пары сортируются в порядке убывания индекса с помощью уродливого zip/sort/unzip. Если бы не проблема с переключением, мы могли бы просто сделать > f=function(b,v,i){e=c(NA,rbind(b,NA));e[i*2+1]=v;e[!is.na(e)]} > f(c(), c(), c()) logical(0) > f(c(0, 0, 0), c(1, 1, 1, 1), c(0, 1, 2, 3)) [1] 1 0 1 0 1 0 1 > f(c(5, 1, 4, 1, 3), c(0, 0, 7), c(5, 0, 3)) [1] 0 5 1 4 7 1 3 0 .

Старый метод (65):

function(b,v,i){e=c(NA,rbind(b,NA));e[i*2+1]=v;e[!is.na(e)]} ||answer||

Пиф, 14 байт

[1,2,[nil,5]]

Демонстрация.

Эта программа принимает входные данные в виде трехкортежей списков в порядке «База», «Индексы», «Значения».

Пояснение на примере x.split(/:+/).map(&:to_i) :

  1. Возьмите входные данные: неявно, Q — это входные данные.

  2. Создайте индекс, пары значений: ->b,v,i{l=-1;i.map{|j|b[j]=[v[l+=1],b[j]]};b*?:} = Qa+ e# Append [[]] to B. @@ e# Rotate V and I on top of B. .{ e# For each v in V and the corresponding i in I: a e# Push [v]. 2$2$= e# Retrieve b := B[i]. + e# Append to push [v b]. e# The stack now consists of: B i [v b] t e# Set B[i] := [v b]. } e# e_ e# Flatten B.

  3. Отсортируйте пары в порядке возрастания индекса: {Qa+@@.{a2$2$=+t}e_} = l~ e# Evaluate the first line of input. _,) e# Compute the array length and add 1. N* e# Push a string of that many linefeeds. q~ e# Evaluate the remaining input. .{t}~ e# Vectorized array set: for each index in the array from line 2, replace the e# LF at that index by the corresponding element of the array from line 3. .\ e# Interleave the two arrays on the stack. N- e# Remove the linefeeds. p e# Print.

  4. Возьмите значение из каждой пары: l~_,)N*q~.{t}~.\N-p = > f(c(), c(), c()) [1] NULL > f(c(0, 0, 0), c(1, 1, 1, 1), c(1, 2, 3, 4)) [1] 1 0 1 0 1 0 1 > f(c(5, 1, 4, 1, 3), c(0, 0, 7), c(6, 1, 4)) [1] 0 5 1 4 7 1 3 0

  5. Разделите базовый список по местоположению индексов: f <- function(b, v, i) { # Initialize the output vector to b n <- b # Initialize an index over the indices j <- 0 # Loop over the values to insert for(g in v) { # Get the index of the next given insertion index j <- j + 1 # Insert g into n. # The position at which to insert the value is determined by # adding the number of indices less than the current one and # subtracting 1. The subtraction is because we're using the # `after` argument in the `append` function. n <- append(n, g, i[j] + sum(i < i[j]) - 1) } # Return n n } = f=function...

  6. Чередование 3 и 4: function(b,v,i){n=b;j=0;for(g in v)n=append(n,g,i[j<-j+1]+sum(i<i[j])-1);n} = q~.\2/$z~0@+2ew@f{\~@<>}.\e_p

  7. Объедините в один список: {0, 5, 1, 4, 7, 1, 3, 0} = {0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0}

 

Rousman


Рег
16 Feb, 2008

Тем
67

Постов
188

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

Хаскель, 62 байта

{5.5 -> 0, 0.5 -> 0, 3.5 -> 7}

Пример использования: Thread[#3+.5->#2] -> {1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3} .

Как это работает: дополнить базовый список полуторными индексами, начиная с Tr@#2->#&~MapIndexed~# (e.g. In[1]:= f = Last/@(Tr@#2->#&~MapIndexed~#⋃Thread[#3+.5->#2])&; In[2]:= f[{5, 1, 4, 1, 3}, {0, 0, 7}, {5, 0, 3}] Out[2]= {0, 5, 1, 4, 7, 1, 3, 0} ) и объединить его с парами индекс-значение. Отсортируйте и отбросьте индекс.

Примечание: не знаю, жульничаю ли я здесь. С математической точки зрения это нормально, но программист может возразить, что список индексов Last/@(Tr@#2->#&~MapIndexed~#⋃Thread[#3+.5->#2])& is not a list of <pre id=O></pre> как просили, но список f=(b,v,i,j=0)=>b.concat(v).map(p=>(p=i.indexOf(j))<0?b[j++]:(i[p]=-1,v[p])) // TEST out=x=>O.innerHTML+=x+'\n' test=[ { b:[], v:[], i:[], k:[] }, { b:[], v:[1], i:[0], k:[1] }, { b:[1,2], v:[], i:[], k:[1,2] }, { b:[1,2], v:[3], i:[0], k:[3,1,2] }, { b:[1,2], v:[3], i:[1], k:[1,3,2] }, { b:[1,2], v:[3], i:[2], k:[1,2,3] }, { b:[0,0,0], v:[1,1,1,1], i:[0,1,2,3], k:[1,0,1,0,1,0,1] }, { b:[5,1,4,1,3], v:[0,0,7], i:[5,0,3], k:[0,5,1,4,7,1,3,0] }, { b:[1,2,3,4], v:[4,3,2,1], i:[4,0,3,1], k:[3,1,1,2,3,2,4,4] } ]; test.forEach(x=>{ r = f(x.b,x.v,x.i.slice(0)) // pass a copy of i, as the function will alter it ok = ''+r==''+x.k s='Test ' + (ok?'OK':'FAIL') +'\n B ['+x.b +']\n V ['+x.v +']\n I ['+x.i +']\n Result ['+r +']\n Check ['+x.k +']\n' out(s) }) (to be exact, the type is polymorphic, but must belong to the i класс, например implicit: Q = input() PQ all elements but last of Q => [[5,1,4,1,3], [5,0,3]] cF split B it the indices in I => [[], [5,1,4], [1,3], []] tQ all elements but first of Q => [[5,0,3], [0,0,7]] C zip => [(5,0), (0,0), (3,7)] S sort => [(0,0), (3,7), (5,0)] med extract the end of each pair => [0,7,0] a ] append an empty list => [0,7,0,[]] , create a pair => ([[], [5,1,4], [1,3], []], [0,7,0,[]]) C zip => [([],0), ([5,1,4],7), ([1,3],0), ([],[])] s sum => ([],0,[5,1,4],7,[1,3],0,[],[]) s sum => [0,5,1,4,7,1,3,0] or B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7] ).

 

Bagayy


Рег
10 Jan, 2016

Тем
75

Постов
185

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

Рубин, 60 59 53 байта

B, I, V

И версия без гольфа

ssC,cFPQamedSCtQ] ||answer||

CJam, 34 23 18 байт

z

Моя первая работа в CJam. Советы приветствуются, я уверен, что в гольфе есть много интересного.

16 байт сохранено с помощью @MartinBüttner и @Dennis.

Функция, ожидающая ввода в стек по порядку @ (I is the topmost).

Пример использования:

[…]

Метод:

  • соединить массив {,//+(y@<z;(z@<z)_ x)} / before {,//+(y@<z;z[<z]_ x)} / after th element with {,//+(y;z_x)}
  • пары значений вставки с позициями вставки
  • объединить полученные два массива
  • сортировать массив по позициям элементов
  • сохранять ценностные элементы
 

Maseanea03


Рег
09 Dec, 2020

Тем
81

Постов
218

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

К, 22 21 байт

f:{,//+(y@<z;(z@<z)_ x)} {,//+(y@<z;(z@<z)_ x)} f[1 2 3 4;4 3 2 1;4 0 3 1] 3 1 1 2 3 2 4 4 f[5 1 4 1 3;0 0 7;5 0 3] 0 5 1 4 7 1 3 0

Мы определяем функцию с тремя аргументами ,// with the implicit variables + , (a;b) and (z@<z) представляющие стартовый список, список значений и список индексов соответственно. Оператор «вырезать» ( _ ) is used to split the starting list apart at the sorted list of given indices ( z ). Мы чередуем значения (после их соответствующей сортировки) с разделенными частями исходного массива, формируя список ( y ), taking its transpose ( x ) и выравнивание результата ( {…} ).

Пример использования:

{,//+(y@<z;(z@<z)_ x)}

Пробелы вокруг подчеркивания необходимы, поскольку K допускает использование подчеркиваний в идентификаторах. K5 устраняет эту потенциальную двусмысленность. Если бы мы могли рассчитывать на то, что индексы идут в порядке возрастания, а символы подчеркивания не являются допустимыми идентификаторами, мы могли бы использовать гораздо более удобную 13-байтовую программу:

i+0.5

(вздох.)

редактировать:

i

Нарушается симметрия, но мы можем сохранить байт, используя индексацию скобок ( [5 1 4 1 3] [0 0 7] [5 0 3] {.\2/\ee+{0=}$1f=}~ ) instead of the infix B V I индексирующий оператор. Обычно это делает программы длиннее, но в данном случае для сортировки нам всё равно понадобились скобки. {.\2/\ee+{0=}$1f=} before performing the cut.

 

Kuja506


Рег
24 Aug, 2011

Тем
73

Постов
195

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

Пиф, 17 байт

def riffle(array, values, indices) indices.zip(values).sort.reverse.each do |index, value| array.insert(index, value) end end

@isaacg уже превзошел мое решение. Но поскольку документация уже готова, я все равно ее опубликую.

Это принимает входные данные в формате ->a,b,c{c.zip(b).sort.reverse.map{|i,v|a.insert i,v}} . You can try it here: Демонстрация или Тестовый набор

Объяснение:

Я использую пример Double from the OP.

Float ||answer||

JavaScript (ES6), 75

Функция с тремя параметрами массива, возвращающая массив. Как ни странно, эта функция изменяет свой Fractional parameter (as kindly allowed by OP)

Проверьте запуск фрагмента, Firefox только как обычно.

Fractionals Integers
 

(Олег)


Рег
29 Dec, 2014

Тем
68

Постов
185

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

Математика, 52 51 байт

[5,0,3]

Пример:

[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]

Объяснение:

Используя пример выше.

  • 0.5 => [0,5,1,4,7,1,3,0]
  • f [5,1,4,1,3] [0,0,7] [5,0,3] => import Data.List f b v i=map snd$sort$zip[0.5,1.5..]b++zip i v
  • Затем возьмите (отсортированное) объединение этих двух списков. (=> [0, 5, 1, 4, 7, 1, 3, 0] )
  • А затем возьмите последний элемент каждой пары. (=> s.icFPQmedSCtQ )
 

God2


Рег
01 Apr, 2021

Тем
81

Постов
196

Баллов
621
  • 26, Oct 2024
  • #9

Р, 75 байт

.icFPQmedSCtQ

Это создает безымянную функцию. Чтобы вызвать его, дайте ему имя, например. [[], [5, 1, 4], [1, 3], []] . Note that the arrays must be 1-indexed because that's just how R rolls.

Ungolfed + объяснение:

cFPQ

Примеры:

[0, 7, 0]

Предложения как всегда приветствуются!

 

Weu20


Рег
26 Nov, 2019

Тем
85

Постов
198

Баллов
663
  • 26, Oct 2024
  • #10

CJam, 19 байт

medSCtQ

Это полноценная программа, которая читает массивы Б, я и В (по одному на строку в указанном порядке) из STDIN.

Попробуйте онлайн в CJam-переводчик.

Как это работает

[(0, 0), (3, 7), (5, 0)]

CJam, 20 байт

SCtQ

Это анонимная функция, которая появляется Б, В и я (сверху вниз) из стека и взамен оставляет в стеке один массив.

Попробуйте онлайн в CJam-переводчик.

Как это работает

[(5, 0), (0, 0), (3, 7)] ||answer||

Рубин, 48 байт

Я думаю это соответствует правилам, но пожалуйста проверьте.

CtQ

Безымянная функция, принимающая на вход три массива. Выводит строку, которую можно однозначно преобразовать в массив чисел с помощью выражения Ruby. [5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7] .

Тестовые случаи на идея.

Я мог бы сохранить еще 3 байта, но формат вывода s.icFPQmedSCtQ is stretching the rules a bit too mych imo, although it is unambiguous.

 

KaitlinLiew


Рег
26 Jun, 2014

Тем
69

Постов
178

Баллов
573
  • 26, Oct 2024
  • #11

Р, 60

Как безымянная функция, принимающая b, v и i

B,V,I=input() for i,v in sorted(zip(I,V))[::-1]:B[i:i]=v, print B

Расширяет b с помощью NA

map(B.insert,*X) ||answer||

Заполняет пробелы, где это необходимо, с помощью v

Возвращает вектор без NA.

Ява, 253, 226, 219, 209

B.insert

не совсем победитель, ну да ладно.

map ||answer||

Предполагая, что B, V и I не равны нулю.

B

v (строчная буква v) — длина массивов значений/индексов.

R — возвращаемый массив. B,I,V computes the permutation that would sort the indexes in ascending order. Since APL's sorting algorithm is stable by definition, the permutation computed puts the element of the catenation of the second and first argument in the right place.

r — длина возвращаемого массива.:

lambda B,*X:map(B.insert,*zip(*sorted(zip(*X))[::-1]))
 

Teerviexy


Рег
28 Oct, 2020

Тем
83

Постов
217

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

Интересно