¡Un simple golf para comenzar la semana! Te dan tres matrices: la matriz base B
, la matriz de valor V
y la matriz de índice I
. Debe producir otra matriz donde los valores de V
se inserten en B
los índices especificados por I
. Aquí hay un ejemplo:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Los índices apuntan a las siguientes posiciones en la matriz base:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Entonces, al insertar los elementos correspondientes de la matriz de valores, el resultado debería ser:
[0, 5, 1, 4, 7, 1, 3, 0]
Reglas
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumentos de línea de comando o argumentos de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función, o modificando la matriz dada como B
parámetro .
Si su envío es una función, I
y V
puede modificarse de cualquier manera, así como B
si no se usa para la salida.
Puede hacer los siguientes supuestos sobre la entrada:
- Todos los elementos de la base y la matriz de valores serán enteros no negativos.
- La matriz de valores tendrá como máximo un elemento más que la matriz base.
- La matriz de valores y la matriz de índice tendrán el mismo número de elementos.
- La matriz de índice no contendrá índices repetidos, y todos los índices estarán dentro del rango.
- Las matrices de base y valor pueden contener elementos repetidos.
- Cualquiera o todas las matrices pueden estar vacías.
- No debe suponer que los índices se dan en un orden particular.
- Puede recibir entradas y producir salidas en cualquier formato de cadena o lista conveniente y sin ambigüedades. También puede elegir recibir las tres matrices en un orden diferente.
- Puede elegir entre indexación basada en 0 y basada en 1.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Dado en el formato B V I => Result
para indexación basada en 0. Si está utilizando la indexación basada en 1, incremente los elementos de la tercera matriz en 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]
Avíseme si se encuentra con otros casos interesantes y los agregaré.
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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
de una matriz vacía para idiomas donde está una matriz vacíaNULL
?Respuestas:
Pyth, 14 bytes
Demostración.
Este programa toma las entradas como 3-tuplas de listas en el orden Base, Índices, Valores.
Explicación sobre el ejemplo
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Tome la entrada: implícita, Q es la entrada.
Hacer el índice, pares de valores:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Ordenar los pares en orden de índice creciente:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Saque el valor de cada par:
medSCtQ
=[0, 7, 0]
Dividir la lista base en la ubicación de las indicaciones:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Intercalar 3 y 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
Combinar en una lista:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
fuente
ssC,cFPQamedSCtQ]
.Pitón 2, 54
Toma entrada como
B,I,V
. Modifica la entradaB
cuando se llama (gracias a Martin Büttner por recordarme que esto es posible).Utiliza
map
para llamarB.insert
a cada par índice / elemento. Para evitar el problema de que los índices de la lista cambien a medida que se insertan los elementos, ordena los pares en orden decreciente de índice mediante un archivo zip / sort / unzip feo. Si no fuera por el problema cambiante, podríamos hacerlomap(B.insert,*X)
.Método antiguo (65):
fuente
Haskell, 62 bytes
Ejemplo de uso:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.Cómo funciona: aumente la lista base con índices de "y media" que comiencen en
0.5
(p[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
. Ej. ) Y concatene con los pares índice-valor. Ordenar y descartar el índice.Observación : no sé si estoy haciendo trampa aquí. Desde un punto de vista matemático está bien, pero un programador podría argumentar que la lista de índices
[5,0,3]
no es una lista deIntegers
lo solicitado, sino una lista deFractionals
(para ser exactos, el tipo es polimórfico, pero debe pertenecer a laFractional
clase, por ejemploFloat
oDouble
)fuente
Ruby,
605953 bytesY la versión sin golf
fuente
->a,b,c{...}
. También es probableinsert
que no necesite paréntesis.CJam,
342318 bytesMi primera presentación de CJam. Los consejos son bienvenidos, estoy seguro de que hay mucho para jugar al golf.
16 bytes guardados con la ayuda de @ MartinBüttner y @Dennis.
Función que espera entrada en la pila en orden
B V I
(I es la más alta).Ejemplo de uso:
Método:
i
elemento th de la matriz coni+0.5
fuente
q~.5fm.\2/\ee+$1f=p
y hasta 18 bytes utilizando una función anónima:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(todavía 18 bytes)get array element
operador para1f=
. Sin embargo, lo dejaré como un programa completo.K,
2221 bytesDefinimos una función de 3 argumentos
{…}
con las variables implícitasx
,y
y quez
representan la lista inicial, la lista de valores y la lista de índice, respectivamente. El operador "cortar" (_
) se utiliza para dividir la lista de inicio en la lista ordenada de los índices dados ((z@<z)
). Intercalamos valores (después de ordenarlos de manera correspondiente) con los fragmentos divididos de la matriz original formando una lista ((a;b)
), tomando su transposición (+
) y allanando el resultado (,//
).Ejemplo de uso:
Los espacios alrededor del guión bajo son necesarios porque K permite los guiones bajos en los identificadores. K5 elimina esta ambigüedad potencial. Si pudiéramos contar con los índices en orden ascendente y los guiones bajos no fueran identificadores válidos, podríamos usar el programa de 13 bytes, mucho más agradable:
(suspiro.)
editar:
Rompe la simetría, pero podemos guardar un byte mediante el uso de la indexación de paréntesis (
[…]
) en lugar del@
operador de indexación infijo . Por lo general, esto hace que los programas sean más largos, pero en este caso necesitamos parens de todos modos para ordenarz
antes de realizar el corte.fuente
Pyth, 17 bytes
@isaacg ya superó mi solución. Pero como terminé mi documentación, de todas formas la publicaré.
Esto toma la entrada en el formato
B, I, V
. Puedes probarlo aquí: Demostración o Test SuiteExplicación:
Estoy usando el ejemplo
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
del OP.fuente
JavaScript (ES6), 75
Una función con 3 parámetros de matriz, que devuelve una matriz. Extrañamente, esta función modifica su
i
parámetro (según lo permitido por OP)Pruebe a ejecutar el fragmento, Firefox solo como de costumbre.
fuente
fat arrow function
no se implementa incluso en la versión de desarrollador de Chrome (AFAIK)Mathematica,
5251 bytesEjemplo:
Explicación:
Usando el ejemplo anterior.
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}
)fuente
CJam,
3029 bytesEsto es demasiado largo Siento que esto no es una presentación de lenguaje de golf: |
Pruébalo en línea aquí
fuente
R, 75 bytes
Esto crea una función sin nombre. Para llamarlo, dale un nombre, por ejemplo
f=function...
. Tenga en cuenta que las matrices deben estar indexadas en 1 porque así es como R rueda.Ungolfed + explicación:
Ejemplos:
¡Las sugerencias son bienvenidas como siempre!
fuente
CJam, 19 bytes
Este es un programa completo que lee las matrices B , I y V (una por línea, en ese orden) de STDIN.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
CJam, 20 bytes
Esta es una función anónima que muestra B , V e I (de arriba a abajo) de la pila y, a cambio, deja una sola matriz en la pila.
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Ruby, 48 bytes
Creo que esto cumple con las reglas, pero por favor verifique.
Función sin nombre que toma las tres matrices como entrada. Emite una cadena que se puede analizar sin ambigüedades en una matriz de números con la expresión ruby
x.split(/:+/).map(&:to_i)
.Casos de prueba en ideona .
Podría ahorrar 3 bytes más, pero el formato de salida
[1,2,[nil,5]]
está extendiendo las reglas un poco demasiado mych imo, aunque no es ambiguo.fuente
nil
valores de entrelazado son un poco exageradas. Pero en cualquier caso, esto no está ganando el concurso, por lo que no estoy realmente preocupado por eso de ninguna manera.R, 60
Como una función sin nombre que toma b, v e i
Expande b con NA Llena los huecos donde se requiere con v Devuelve el vector sin NA
fuente
Java,
253, 226, 219,209No es exactamente un ganador, pero bueno.
Suponiendo que B, V y yo no somos nulos. v (v minúscula) es la longitud de las matrices de valores / indicaciones. R es la matriz devuelta. r es la longitud de la matriz devuelta. x, y, y yo somos todos ints temporales.
expandido:
fuente
APL, 22 bytes
En ⎕IO ← 0 para que coincida con los casos de prueba.
Es un algoritmo estándar: el vector índice del primer argumento se agrega a los índices dados (tercer argumento).
⍋
calcula la permutación que ordenaría los índices en orden ascendente. Dado que el algoritmo de clasificación de APL es estable por definición, la permutación calculada coloca el elemento de la cateación del segundo y primer argumento en el lugar correcto.Por ejemplo :
fuente