Um simples golfe para começar a semana! Você recebe três matrizes: a matriz base B
, a matriz de valor V
e a matriz de índice I
. Você deve produzir outra matriz na qual os valores V
são inseridos B
nos índices especificados por I
. Aqui está um exemplo:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Os índices apontam para as seguintes posições na matriz base:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Então, inserindo os elementos correspondentes da matriz de valores, o resultado deve ser:
[0, 5, 1, 4, 7, 1, 3, 0]
Regras
Você pode escrever um programa ou função, recebendo entradas via STDIN (ou alternativa mais próxima), argumentos de linha de comando ou argumentos de função e gerar o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou modificando a matriz fornecida como B
parâmetro .
Se o seu envio for uma função I
e V
puder ser modificado de qualquer forma, assim como B
se não for usado para saída.
Você pode fazer as seguintes suposições sobre a entrada:
- Todos os elementos da matriz de base e valor serão números inteiros não negativos.
- A matriz de valores terá no máximo mais um elemento que a matriz base.
- A matriz de valores e a matriz de índices terão o mesmo número de elementos.
- A matriz de índice não conterá índices repetidos e todos os índices estarão dentro do intervalo.
- As matrizes base e valor podem conter elementos repetidos.
- Qualquer uma ou todas as matrizes podem estar vazias.
- Você não deve assumir que os índices são fornecidos em qualquer ordem específica.
- Você pode receber entrada e produzir saída em qualquer formato conveniente ou inequívoco de sequência ou lista. Você também pode optar por receber as três matrizes em uma ordem diferente.
- Você pode escolher entre indexação com base em 0 e com base em 1.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Casos de teste
Fornecido no formato B V I => Result
para indexação baseada em 0. Se você estiver usando a indexação baseada em 1, aumente os elementos da terceira matriz em 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]
Deixe-me saber se você se deparar com outros casos interessantes, e eu os adicionarei.
Entre os melhores
Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# 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
a uma matriz vazia para idiomas em que está uma matriz vaziaNULL
?Respostas:
Pitão, 14 bytes
Demonstração.
Este programa recebe as entradas como uma tupla de 3 listas na ordem Base, Índices, Valores.
Explicação no exemplo
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Tome a entrada: implícito, Q é a entrada.
Faça o índice, pares de valores:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Classifique os pares em ordem crescente de índice:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Tire o valor de cada par:
medSCtQ
=[0, 7, 0]
Divida a lista base no local das indicações:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Intercalar 3 e 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
Combine em uma lista:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
fonte
ssC,cFPQamedSCtQ]
.Python 2, 54
Toma entrada como
B,I,V
. Modifica a entradaB
quando chamada (obrigado a Martin Büttner por me lembrar que isso é possível).Usa
map
para chamarB.insert
cada par de índice / elemento. Para evitar que os índices da lista sejam alterados à medida que os elementos são inseridos, classifique os pares em ordem decrescente do índice com um feio zip / classificar / descompactar. Se não fosse a questão da mudança, poderíamos simplesmente fazermap(B.insert,*X)
.Método antigo (65):
fonte
Haskell, 62 bytes
Exemplo de uso:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.Como funciona: aumente a lista base com índices "e meio" começando em
0.5
(por exemplo[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
) e concatenando-a com os pares de valor-índice. Classifique e descarte o índice.Observação : não sei se estou trapaceando aqui. Do ponto de vista matemático, tudo bem, mas um programador pode argumentar que a lista de índices
[5,0,3]
não é uma listaIntegers
conforme solicitado, mas uma lista deFractionals
(para ser exato, o tipo é polimórfico, mas deve pertencer àFractional
classe, por exemplo,Float
ouDouble
)fonte
Ruby,
605953 bytesE a versão ungolfed
fonte
->a,b,c{...}
. Também as chances são deinsert
que não precisa de parênteses.CJam,
342318 bytesMinha primeira submissão ao CJam. Conselhos são bem-vindos, tenho certeza de que há muito para jogar golfe.
16 bytes salvos com a ajuda de @ MartinBüttner e @Dennis.
Função que espera entrada na pilha em ordem
B V I
(I é a mais alta).Exemplo de uso:
Método:
i
elemento th da matriz comi+0.5
fonte
q~.5fm.\2/\ee+$1f=p
e para 18 bytes usando uma função anônima:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(ainda 18 bytes)get array element
operador para1f=
. Vou deixar como um programa completo.K,
2221 bytesDefinimos uma função 3 argumento
{…}
com as variáveis implícitasx
,y
ez
representando a ordem de entrada, a lista de valores e a lista de dice, respectivamente. O operador "recortar" (_
) é usado para dividir a lista inicial na lista classificada dos índices fornecidos ((z@<z)
). Entrelaçamos valores (depois de ordená-los de maneira correspondente) com os pedaços divididos da matriz original, formando uma lista ((a;b)
), pegando sua transposição (+
) e achatando o resultado (,//
).Exemplo de uso:
Os espaços ao redor do sublinhado são necessários porque K permite sublinhados nos identificadores. O K5 remove essa ambiguidade potencial. Se pudéssemos contar com os índices que vinham em ordem crescente e os sublinhados não eram identificadores válidos, poderíamos usar o programa de 13 bytes, muito mais agradável:
(suspiro.)
editar:
Quebra a simetria, mas podemos salvar um byte usando bracket-indexing (
[…]
) em vez do@
operador de indexação infix . Normalmente, isso torna os programas mais longos, mas, neste caso, precisávamos de parênteses para ordenarz
antes de executar o corte.fonte
Pitão, 17 bytes
@isaacg já venceu minha solução. Mas como eu terminei minha documentação, vou postá-la de qualquer maneira.
Isso leva a entrada no formato
B, I, V
. Você pode experimentá-lo aqui: Demonstration or Test SuiteExplicação:
Estou usando o exemplo
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
do OP.fonte
JavaScript (ES6), 75
Uma função com 3 parâmetros de matriz, retornando uma matriz. Estranhamente, essa função modifica seu
i
parâmetro (conforme gentilmente permitido pelo OP)Teste a execução do snippet, o Firefox apenas como de costume.
fonte
fat arrow function
não é aplicado mesmo na versão do desenvolvedor do Chrome (AFAIK)Mathematica,
5251 bytesExemplo:
Explicação:
Usando o exemplo acima.
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}
)fonte
CJam,
3029 bytesIsso é muito longo. Eu sinto que isso não é um envio de idioma para o golfe: |
Experimente online aqui
fonte
R, 75 bytes
Isso cria uma função sem nome. Para chamá-lo, dê um nome, por exemplo
f=function...
. Observe que as matrizes devem ser indexadas 1, porque é assim que R é rolado.Ungolfed + explicação:
Exemplos:
Sugestões são bem-vindas como sempre!
fonte
CJam, 19 bytes
Este é um programa completo que lê as matrizes B , I e V (uma por linha, nessa ordem) do STDIN.
Experimente online no intérprete CJam .
Como funciona
CJam, 20 bytes
Essa é uma função anônima que abre B , V e I (de cima para baixo) da pilha e deixa uma única matriz na pilha em troca.
Experimente online no intérprete CJam .
Como funciona
fonte
Ruby, 48 bytes
Acho que isso está em conformidade com as regras, mas verifique.
Função sem nome, tendo as três matrizes como entrada. Produz uma string que pode ser analisada sem ambiguidade em uma matriz de números com a expressão ruby
x.split(/:+/).map(&:to_i)
.Casos de teste em ideone .
Eu poderia salvar mais 3 bytes, mas o formato de saída
[1,2,[nil,5]]
está esticando as regras um pouco demais, embora seja inequívoco.fonte
nil
valores de intercalação são um pouco exageradas. Mas, em ambos os casos, isso não está vencendo o concurso, então não estou realmente preocupado com isso de qualquer maneira.R, 60
Como uma função sem nome que recebe b, ve eu
Expande b com NAs Preenche as lacunas onde necessário com v Retorna o vetor sem NAs
fonte
Java,
253, 226, 219,209não é exatamente um vencedor, mas tudo bem.
Supondo que B, V e eu não sejam nulos. v (v minúsculo) é o comprimento das matrizes Valores / Indicações. R é a matriz retornada. r é o comprimento da matriz retornada. x, ye i são todos ints temporários.
expandido:
fonte
APL, 22 bytes
Em ⎕IO ← 0 para corresponder aos casos de teste.
É um algoritmo padrão: o vetor de índice do primeiro argumento é anexado aos índices fornecidos (terceiro argumento).
⍋
calcula a permutação que classificaria os índices em ordem crescente. Como o algoritmo de classificação da APL é estável por definição, a permutação calculada coloca o elemento da catenação do segundo e primeiro argumento no lugar certo.Por exemplo :
fonte