En mi desafío de código anterior , le pedí que escribiera una función que le diga cuál de sus líneas se ha eliminado.
Las instrucciones fueron:
Escribe una función que contenga cinco líneas.
Si ejecuta la función tal como está, debería devolver 0.
Si elimina cualquiera de las cinco líneas y ejecuta la función, debería indicarle cuál de las líneas se ha eliminado (por ejemplo, si elimina la línea final, debería devolver 5).
Ahora, intentemos algo un poco más difícil.
Siga las mismas reglas que anteriormente, pero esta vez, la función debería devolver una matriz que le indica qué DOS líneas se han eliminado.
Entonces, por ejemplo, si elimino las líneas 1 y 5, el valor de retorno debería ser [1,5], y si elimino las líneas 3 y 4, el valor de retorno debería ser [3,4].
Nuevamente, si no se eliminan líneas, la función debería devolver 0. Puntos de bonificación si también puede manejar el caso de eliminación de una línea, pero no es estrictamente necesario que lo haga.
¿Puedes hacer uso de las funciones de ayuda? Sí, pero solo si es necesario. Una única función autónoma que lo lleva a cabo es lo ideal.
Al igual que con el último desafío, gana la solución más votada. Elegiré al ganador en una semana, o antes si no se han recibido nuevos envíos en 24 horas.
fuente
Respuestas:
Perl
En realidad, esto funciona para cualquier número de líneas eliminadas (siempre que no sean todas las líneas, es decir), y puede extenderse trivialmente a más de 5 líneas. No se utilizan funciones auxiliares, e incluso solo utiliza una instrucción por línea. Se basa en el hecho de que, en ausencia de una
return
declaración explícita , el valor de retorno de una función Perl es el valor de la última declaración en ella.Tenga en cuenta que (en el contexto de la lista) este código devuelve una lista vacía en lugar del número 0 si no se han eliminado líneas. Esto podría solucionarse (por ejemplo, agregando "
@a ? @a : 0;
" a la última línea), pero haría el código más feo. En cualquier caso, en escalar contexto se hace devolver el número de líneas eliminadas, lo que será 0 si no se ha eliminado ninguna línea. ;-)fuente
Rubí
Similar a la versión de Perl, pero en Ruby. Devuelvo 0 si no se eliminan líneas según lo solicitado, pero estoy de acuerdo en que hace que el código sea más feo y no tiene sentido como valor de retorno.
Si una matriz vacía es aceptable como valor de retorno cuando no se eliminan líneas, el código se ve así:
Ambos métodos funcionan para cualquier número de líneas eliminadas entre 0 y 5.
fuente
JavaScript, 152 caracteres golfizados
Golfizado:
Autocontenido (pero feo):
Básicamente explota la función
toString
numerando cada línea. Tenga en cuenta que realmente tiene que eliminar la línea debido a esto (comentarlo no funcionará).¡Esto realmente funciona para cualquier número de líneas eliminadas ! Devolverá una matriz de las líneas eliminadas, o una matriz vacía si no se ha eliminado ninguna. (Podría cambiar fácilmente eso para devolver cero (reemplazando
return ra
conreturn ra || 0
), pero me gusta la solución de matriz vacía, ya que sería más útil en el mundo real).Por ejemplo, eliminar la primera línea devuelve
[1]
y eliminar todo excepto la primera línea[2,3,4,5]
. (Por supuesto, no funciona si elimina todas las líneas;-)
)fuente
Rubí
Cómo funciona esto: mi idea era: crear una matriz y, en cada línea, eliminar un valor específico. Entonces, en la primera línea, realmente tengo la matriz
[ 1, 2, 3, 4, 5]
, con el elemento1
eliminado. En la segunda línea, sia
ya está definido, elimine el elemento2
. De lo contrario, cree una nueva matriz con el elemento2
eliminado. Haga lo mismo para la línea 3. En la línea 4, puede estar seguro de que ya hay una matriz creada, así que simplemente elimine el elemento4
. En la línea 5, primero elimine el elemento5
, y sia
es una matriz vacía, regrese0
. De lo contrario, regresea
.fuente
Pitón
Devuelve 0 si no se elimina ninguna línea; de lo contrario, devuelve las líneas eliminadas. Puede eliminar de 1 a 5 líneas, excepto la línea 0 y 6 ;-).
fuente
JavaScript, autónomo, funciona para 0, 1, 2 líneas eliminadas (
607315186 caracteres)→ demostración en vivo ←
Abusar de la elevación variable JS y la fuga global, como en el otro desafío :)
para ser llamado con la matriz [1,2,3,4,5] como parámetro.
315 caracteres
para ser llamado con una matriz vacía como parámetro.
versión sin golf
(también funciona para 3 y 4 líneas eliminadas):
para ser llamado con una matriz vacía como parámetro.
fuente
JavaScript:
violín
fuente
Javascript
Llámalo como quieras, pero creo que es bonito .
Le permite saber qué líneas se eliminaron (1 o más) o 0 si no se eliminan las líneas. Las 5 líneas se pueden eliminar.
EDITAR:
Debido a que se me hizo notar que mi código en realidad podría constar de 6 líneas y viola las reglas, lo ajusté a lo siguiente:
Lo mismo se aplica: devolverá una matriz de líneas eliminadas que van desde 1- Todo o 0 si no hay ninguna.
fuente
function(){
y}
(y cualquier función auxiliar). Cuenta el número de líneas.Lisp común
Funciona para la eliminación de 1-4 líneas. Si elimina todas las líneas, devolverá lo mismo que si no eliminara ninguna.
NB: Tener paréntesis finales en su propia línea se considera un mal estilo, pero dado que otros idiomas lo tienen
end
y}
supongo que está permitido.fuente
Pitón
Funciona para todas las líneas, pero solo si se eliminan dos. Si solo se elimina una línea, imprimirá la línea eliminada y la línea 5. Si se eliminan demasiadas líneas, no imprimirá nada.
Esto usa una función auxiliar porque la palabra clave del no se puede usar en una línea con a; (que yo sepa)
Básicamente, cada línea se elimina a sí misma en la matriz que se declara en el constructor, luego, si se han eliminado suficientes líneas, se imprime la matriz.
Esta función pierde la especificación de dos maneras:
print
yreturn
son intercambiablesfuente
print ''
embargo, ¿no generará un personaje adicional de nueva línea?Deja Vu
Funciona para eliminar cualquier número de líneas (siempre que deje al menos una línea)
fuente
R
Tengo otra versión en R que creo que es mejor (pero usa una función auxiliar):
O se puede evitar el uso de la función auxiliar definiéndola como un argumento predeterminado (funciona de manera idéntica pero es menos legible; sin embargo, no utiliza una función auxiliar "definida por separado"):
Ambos
reportRemovedLines()
yfunnyVersion()
funcionan con cualquier número de líneas eliminadas, excepto si elimina todas las líneas (en ese caso, volveránNULL
). En realidad, devuelven los números de línea, no solo los imprimen, como en R, el valor de la última expresión evaluada dentro de una función se devolverá automáticamente.¿Como funciona? El truco está en la
trick
función que toma todos los objetos de su "entorno principal" (es decir, el entorno de la función que lo llama), pone sus valores juntos en un vector y devuelve, cuyos valores del 1 al 5 no están representados.fuente
JavaScript (136/166 caracteres)
Una versión más pequeña con algunos valores declarados al principio:
Una versión autónoma (no necesita pasar nada; el argumento b está ahí para que pueda verificar si b está definido con
||
)Sí, ambos tienen
return
declaraciones, pero eso es justo si estoy compitiendo con idiomas con retorno implícito.fuente
R
Una versión simple (no infalible ya que obtendrá un error si elimina la línea 5):
Y una versión infalible:
Funciona con cualquier número de líneas eliminadas (excepto si elimina todas las líneas), y puede extenderse fácilmente a más de 5 líneas. Ejecutarlo "tal cual" regresará, lo
integer(0)
cual es conceptualmente similar a regresar solo0
. Devolver un 0 real lo haría más feo y largo, pero no sería complicado.Finalmente, una versión que usa magia:
Función auxiliar:
La función real:
fuente
C ++
Cómo usar: llame a la función con i y use func2 para comprender lo que dice la función.
Si cambia la línea int arr [] = {0,0} a int arr [] = {0,0,0,0,0} también funcionará para las cinco líneas, también es handline una línea eliminar caso de prueba automáticamente, lo que estoy haciendo es simplemente usar bits de una variable como bandera para cada línea ...
fuente
function
tiene seis líneas, no cinco?