Escriba una función (como placeAt
) que tome una matriz de enteros no negativos y un índice que sea un entero no negativo. Debería colocar un 1 en el índice dado, posiblemente desplazando otras entradas por un lugar para desocupar ese lugar, con 0 para espacios vacíos.
- Si la entrada en el índice deseado es 0, llénela con un 1.
- De lo contrario, busque el 0 más cercano a la izquierda del índice. Desplaza las entradas un lugar a la izquierda en ese 0 para hacer espacio, luego llena el índice con un 1.
- Si no hay 0 a la izquierda, haz lo mismo yendo a la derecha.
- Si ninguno de los dos es posible (es decir, si no hay 0), devuelva la matriz sin cambios.
Los artículos están indexados a 0. El nombre de la función puede ser lo que quieras.
Ejemplos:
(Las letras representan cualquier valor entero positivo).
[a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, c, d, 0] place 2 is 0, just fill
[a, b, 0, c, d, 0] placeAt 3 // output [a, b, c, 1, d, 0] place 3 is filled, shift items left
[a, b, 0, c, d, 0] placeAt 0 // output [1, a, b, c, d, 0] place 0 is filled, can't shift left, shift items right
[a, b, 0, c, d, 0] placeAt 1 // output [a, 1, b, c, d, 0] place 1 is filled, can't shift left, shift items right
[0, a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, 0, c, d, 0] place 2 is filled, shift items left
[0, a, b, 0, c, d, 0] placeAt 4 // output [0, a, b, c, 1, d, 0] place 4 is filled, shift items left (notice you keep shifting up until a 0)
[0, 2, 0, 2] placeAt 3 // output [0, 2, 2, 1] place 3 is filled, shift items left
Este es un desafío de código de golf. La entrada más corta al final de 9 días gana.
0
?[0, 2, 0, 2] placeAt 3
, ¿es legal la salida[2, 0, 2, 1]
? ¿Se requiere que el código sea realmente una función llamadaplaceAt
? Tenga en cuenta que algunos idiomas no tienen exactamente funciones. "Lanzar una excepción" también podría no aplicarse a algunos idiomas; Sugeriría permitir una salida que indique un error.[2, 0, 2, 1]
no es una salida legal, ya que siempre debe cambiar la menor cantidad de elementos posible, y puede nombrar la función como desee.Respuestas:
JavaScript (ES6), 85
Pruebe a ejecutar el fragmento en cualquier navegador compatible con EcmaScript 6 (en particular, no Chrome ni MSIE. Probé en Firefox, Safari 9 podría funcionar)
(Encontré esto sin mirar ninguna de las otras respuestas, ahora veo que es muy similar a la pista. Sin embargo, bastante más corto. Probablemente no obtendré muchos votos a favor para esta)
fuente
splice
es mejor que mi comaJulia, 122 bytes
Solo una implementación ingenua de la especificación para comenzar las cosas.
Sin golf:
fuente
JavaScript (ES6), 98 bytes
Prácticamente el mismo enfoque que mi respuesta de CoffeeScript, pero estoy haciendo un corto circuito al extremo para guardar una
return
declaración:Explicación
Para explicarlo más fácilmente, he reorganizado un poco mi código:
Aquí hay información sobre la evaluación de cortocircuito de JS.
Manifestación
Por el momento, esta demostración solo funciona en Firefox y Edge debido al uso de ES6:
fuente
f(['a', 'b', 0, 'c', 'd', 0], 2)
[a..b]
.f(['a', 'b', 0, 'c', 'd', 0], 1)
Rubí, 208 bytes
fuente
.rindex 0
, guardar un byte cada vez. También se puede ahorrar algo de bytes mediante el uso de un proc en lugar de un método, que ni siquiera tienen nombre:->a,i{...}
. El if / elsif / elsif probablemente se puede acortar con un operador ternario anidado...?...:...?...:...
.Haskell, 119 bytes
Ejemplo de uso:
Cómo funciona: Divida la lista de entrada en la posición dada en la parte izquierda
a
, el elemento en la posición mismax
y la parte derechab
. Si hay un0
ena++x
habitación, completar al primero0
en el reverso dea++x
. Si hay una0
enx++b
, sala de maquillaje allí. Si no hay ninguno0
, combine todas las partes sin cambios para obtener la lista original nuevamente.fuente
CoffeeScript, 96 bytes
fuente
Python 2, 102 bytes
Calcula el índice del cero que se eliminará concatenando la lista invertida hasta el índice de inserción con la parte después del índice en orden normal, y luego encuentra el índice del primer cero. Se agrega un cero al final para evitar
ValueError
excepciones cuando no se encuentra ningún cero. Luego simplemente borre, inserte y regrese.fuente
R, 87 bytes
Explicación
Pruebas
fuente
C #, 265 bytes
Golfizado (265 Personajes)
Con espacios en blanco y hendiduras
Programa completo
Casos de prueba
fuente
([0, 'a', 'b', 0, 'c', 'd'], 2)
String[] Q, int P
aString[]Q,int P
.C, 154 bytes
Pasa los casos de prueba dados, a es el puntero a la matriz, l es la longitud de la matriz (espero que esto no rompa el resumen), i es el índice para la inserción y yc se usa internamente. Posiblemente podría mejorarse combinando la búsqueda izquierda y derecha de bucles.
Ejemplo
Sin golf
Directo, y realmente no hay ningún truco más allá de la declaración de estilo K&R.
fuente