Introducción y crédito
Hoy sin un preludio elegante: impleméntelo takewhile
.
Una variación de esto (en una estructura de datos no trivial) fue una tarea en el curso de programación funcional de mi universidad. Esta tarea ahora está cerrada y se ha discutido en clase y tengo el permiso de mi profesor para publicarla aquí (pregunté explícitamente).
Especificación
Entrada
La entrada será una lista (o el concepto equivalente de su idioma) de enteros positivos.
Salida
El resultado debe ser una lista (o el concepto equivalente de su idioma) de enteros positivos.
¿Qué hacer?
Su tarea es implementar takewhile
(se permiten las incorporaciones de lenguaje) con el predicado de que el número en consideración es par (centrarse en taketime).
Por lo tanto, itera sobre la lista de principio a fin y mientras la condición se mantiene, copia a la lista de salida y tan pronto como golpea un elemento que no hace que la condición sea verdadera, aborta la operación y la salida (un ejemplo paso a paso está abajo). Esta funcionalidad de orden superior también se llama takeWhile ( takewhile
).
Posibles casos de esquina
El orden de la lista de salida en comparación con la lista de entrada no puede ser cambiado, por ejemplo, [14,42,2]
no puede llegar a ser [42,14]
.
La lista vacía es una entrada y salida válida.
¿Quién gana?
Este es el código de golf, por lo que gana la respuesta más corta en bytes.
Se aplican reglas estándar, por supuesto.
Vectores de prueba
[14, 42, 2324, 97090, 4080622, 171480372] -> [14, 42, 2324, 97090, 4080622, 171480372]
[42, 14, 42, 2324] -> [42, 14, 42, 2324]
[7,14,42] -> []
[] -> []
[171480372, 13, 14, 42] -> [171480372]
[42, 14, 42, 43, 41, 4080622, 171480372] -> [42, 14, 42]
Ejemplo paso a paso
Example Input: [42, 14, 42, 43, 41, 4080622, 171480372]
Consider first element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42]
Consider second element: 14
14 is even (7*2)
Put 14 into output list, output list is now [42,14]
Consider third element: 42
42 is even (21*2)
Put 42 into output list, output list is now [42,14,42]
Consider fourth element: 43
43 is not even (2*21+1)
Drop 43 and return the current output list
return [42,14,42]
Respuestas:
Mathematica, 18 bytes
Otro glorioso incorporado que es derrotado por un factor de 3 por los idiomas de golf sin el ...
fuente
Haskell, 13 bytes
span
divide la lista de entrada en un par de listas justo antes del primer elemento donde el predicado (->even
) es falso.fst
toma el primer elemento de la pareja.Versión alternativa, 13 bytes:
break
es lo opuesto aspan
, es decir, divide la lista en el primer elemento donde el predicado es verdadero.Por supuesto también hay
Pero eso es 14 bytes.
fuente
MATL , 6 bytes
Pruébalo en línea!
Explicación
fuente
to~Y<)
también funciona, pero me gusta más este :-)Hexagonía , 19
Legible:
Pruébalo en línea!
Esto probablemente se puede jugar por un byte o dos, pero eso puede requerir un diseño realmente ingenioso, que se puede encontrar más fácilmente a través de la fuerza bruta (incluso si puede tomar bastante tiempo encontrarlo).
Explicación de alto nivel
El programa sigue principalmente este pseudocódigo:
Lo cual abusa de cómo Hexagony intenta leer un número una vez que STDIN está vacío (devuelve un cero). Muchas gracias a Martin por su ayuda con este enfoque.
Explicación completa
Todavía no he jugado con Mono para obtener el fantástico IDE esotérico de Timwi , ¡así que me he apoyado en Martin para que me proporcione algunas bonitas imágenes útiles!
Primero, un pequeño manual sobre el flujo de control básico en Hexagony. El primer puntero de instrucciones (IP), que es el único utilizado en este programa, comienza en la parte superior izquierda del código fuente hexagonal y comienza a moverse hacia la derecha. Cada vez que la IP abandona el borde del hexágono, mueve
side_length - 1
filas hacia el centro del hexágono. Como este programa utiliza un hexágono de longitud lateral de tres, la IP siempre se moverá dos filas cuando esto suceda. La única excepción es si se mueve fuera de la fila central, donde se mueve condicionalmente hacia la parte superior o inferior del hexágono, dependiendo del valor del borde de memoria actual.Ahora un poco sobre condicionales. Los únicos condicionales en Hexagony para el flujo de control son
>
,<
y el borde medio del hexágono. Todos estos siguen una regla constante: si el valor en el borde de la memoria actual es cero o el flujo de control negativo se mueve hacia la izquierda y si es positivo, el control fluye hacia la derecha. Los corchetes mayores y menores que redirigen la IP en ángulos de sesenta grados, mientras que el borde del hexágono controla a qué fila salta la IP.Hexagony también tiene un modelo de memoria especial, donde todos los datos se almacenan en los bordes de una cuadrícula hexagonal infinita. Este programa solo usa tres aristas: una para almacenar un dos, una para el número actualmente leído y otra para el módulo número dos. Se ve algo así como:
No voy a explicar cuidadosamente dónde estamos en la memoria en cada punto durante la explicación del programa, así que vuelve aquí si te confundes por dónde estamos en la memoria.
Con todo eso fuera del camino, la explicación real puede comenzar. Primero, llenamos el borde "2" en la memoria con un 2, luego ejecutamos un no-op y movemos el puntero de memoria hacia la derecha (
2.}
).A continuación, comenzamos el ciclo principal del programa. Leemos el primer número de STDIN y luego tocamos un condicional (
?<
). Si no quedan números en STDIN, esto lee un cero en el borde de la memoria actual, así que giramos a la izquierda en el@
, que finaliza el programa. De lo contrario, rebotamos en un espejo, movemos el puntero de memoria hacia atrás y hacia la izquierda, envolvemos el hexágono para calcular el resto de dividir la entrada por 2 y luego presionamos otro condicional (/"%>
).Si el resto era uno (es decir, el número era impar), giramos a la derecha siguiendo el camino azul de arriba, comenzando ejecutando el no-op nuevamente, luego envolvemos la parte inferior del hexágono, multiplicamos el borde actual por 10 y luego suma ocho, rebota en un par de espejos, haz la misma multiplicación y suma nuevamente, obteniendo 188 en el borde actual, volviendo a la parte superior del hexágono, ejecutando el no-op nuevamente y finalmente terminando el programa (
.8/\8.@
). Este resultado complicado fue un feliz accidente, originalmente había escrito una lógica mucho más simple, pero noté que podía eliminarlo a favor del no-op, que pensé que estaba más en el espíritu de Hexagony.Si el resto era cero, giramos a la izquierda siguiendo el camino rojo, arriba. Esto hace que muevamos el puntero de memoria hacia la izquierda y luego imprimamos el valor allí (el valor de entrada) como un número. El espejo con el que nos encontramos actúa como no operativo debido a la dirección en la que nos estamos moviendo ( ). Como 77 es positivo, nos movemos hacia la parte inferior del hexágono y, debido al trampolín, omitimos la primera instrucción ( ). Luego multiplicamos el borde de la memoria actual por 10 y sumamos 8, obteniendo 778. Luego sacamos este valor mod 256 (10) como un carácter ASCII, que resulta ser una nueva línea. Finalmente, salimos del hexágono y volvemos al primero que anula el 778 con el siguiente valor de entrada.
{/!
). Luego tocamos el borde del hexágono, que actúa de manera condicional con un solo resultado, ya que el valor de entrada de antes ya se probó como positivo, por lo que siempre nos movemos hacia la derecha (si te imaginas mirando en la dirección de la IP) . Luego multiplicamos la entrada por 10 y agregamos dos, solo para cambiar la dirección, envolver y sobrescribir el nuevo valor con el valor ascii de la letra mayúscula M, 77. Luego golpeamos algunos espejos y salimos por el borde del medio de el hexágono con un trampolín (2<M\>$
!
?
fuente
Pyth,
1397 bytes¡Créditos a @FryAmTheEggman por 2 bytes (bastante difíciles)!
Explicación:
Pruébalo aquí .
fuente
G
s introducidos, uno para la condicións%R2G
y otro como argumento para la funciónP
.Jalea , 5 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Python 2,
4342 bytesLa función modifica su argumento en su lugar .
¡Gracias a @xnor por jugar golf en un byte de una manera realmente inteligente!
Pruébalo en Ideone .
fuente
"1'"in`map(bin,x)`
a Python 2.ed, 13
Porque los programadores reales usan The Standard Text Editor .
Toma la entrada como un entero en cada línea; salidas en el mismo formato.
Esto simplemente encuentra el primer número impar (número que termina en un dígito impar) y lo elimina de esa línea hasta el final del archivo.
fuente
Clojure, 21 bytes
¡Clojure está casi compitiendo por fin! (gracias a que la tarea está integrada) Véalo en línea https://ideone.com/BEKmez
fuente
Python,
4544 bytesPruébalo en Ideone .
fuente
R, 25 bytes
O equivalente
fuente
05AB1E,
87 bytesExplicación
Pruébalo en línea
Solución anterior de 8 bytes
Explicación
Pruébalo en línea
fuente
Brainf ***, 263 bytes
Tomé un pequeño fragmento de aquí
Daría una explicación, pero ni siquiera tengo idea de cómo funciona esto.
Espera entradas como números separados por espacios (p
2 432 1
. Ej. )fuente
+
y>
usar alguna lógica?>
s sean más eficientes, pero ahora no las entiendo lo suficientePyth, 7 bytes
Pruébalo aquí!
Lo que intenté hacer en Pyke pero el índice está roto en ese cajero automático
fuente
Raqueta, 22 bytes
El
λ
carácter se cuenta como 2 bytes.No he visto Racket usado antes en ninguna de las respuestas de golf de código que he visto, ¡así que tuve que hacerlo al menos una vez!
fuente
Laberinto , 14 bytes
La entrada y la salida son listas separadas por salto de línea (aunque en principio, la entrada podría usar cualquier separador sin dígitos).
Pruébalo en línea!
Este es probablemente el programa Labyrinth más compacto que he escrito.
Curiosamente,
takewhile(odd)
es mucho más simple:Explicación
La cartilla de laberinto habitual:
?
en este caso), hacia el este.El flujo principal a través del programa es un bucle único alrededor del perímetro:
De hecho, sabemos que la parte superior de la pila es cero después
!
y,"
por lo tanto, se garantiza que la IP no gire hacia el centro.`
y,%
por otro lado, se usan como condicionales donde la IP podría moverse hacia el centro de manera que@
finalice el programa, o podría seguir moviéndose alrededor del perímetro.Veamos el código en el bucle:
Y luego el ciclo comienza de nuevo.
Eso plantea la pregunta de por qué
takewhile(odd)
es mucho más simple. Hay dos razones:0
(que es par), no necesitamos una verificación EOF por separado. La lista se cortaría en ese punto de todos modos.N % 2
es0
(en lugar de1
), lo que significa que, en lugar del flujo de control condicional, simplemente podemos dividir la otra copiaN
porN % 2
: si la entrada es impar, eso simplemente se vaN
e incluso nos deshacemos delN % 2
(así que no ' t need;
), pero si la entrada es par, eso simplemente termina el programa con un error (silencioso) de división por cero.Por lo tanto, el otro código es un bucle simple que no permite ninguna ramificación en absoluto.
fuente
Brachylog ,
1916 bytesExplicación
Hoy aprendí un buen truco (que se utilizó en la respuesta de 19 bytes):
~b.hH
es más corto que:[H]rc.
agregar un elemento al comienzo de una lista. El primero significa "Salida es el resultado con un elemento adicional al principio, y el primer elemento de la Salida esH
" , mientras que el otro es directamente "Salida es la concatenación de[[H], Result]
".fuente
J, 10 bytes
Explicación
fuente
1{.2&|<;._2]
es interesante (aunque más largo)$
lugar de{.
Python, 41 bytes
Trunca
l
hasta el índice de la primera aparición de un número impar. El índice se encuentra buscando a1
en el módulo de valores2
. Para evitar que no se encuentre ningún número impar,1
se coloca un al final.fuente
C #, 50 bytes
fuente
a=>a.TakeWhile(x=>x%2<1);
CJam , 11 bytes
¡Gracias a @Dennis por dos correcciones y un byte de descuento!
Este es un bloque de código (equivalente a una función; permitido por defecto) que espera la matriz de entrada en la pila y deja la matriz de salida en la pila.
Pruébalo en línea!
Explicación
fuente
Retina , 17 bytes
El avance de línea final es significativo. La entrada y la salida son listas separadas por espacios.
Pruébalo en línea!
Esta es una simple sustitución de expresiones regulares, coincide con el primer número impar (es decir, un número que termina en un dígito impar) y, si es posible, el espacio que lo precede, así como todo lo que está después, y lo reemplaza con una cadena vacía, es decir, todos los elementos de allí en adelante se eliminan de la entrada.
Como señala Leaky Nun, tomando la lista en binario, podemos guardar 6 bytes, pero parece un poco engañoso, por lo que probablemente continuaré contando la versión decimal:
fuente
JavaScript (Firefox 30-57), 30 bytes
fuente
V , 13 bytes
Pruébalo en línea!
Explicación:
Convenientemente, el mismo código funciona para verificar todos los casos de prueba simultáneamente.
fuente
Dyalog APL , 11 bytes
2|
división resto de dividir con 2~
negar∧\
AND-scan (se apaga desde el primer 0)/⍨
seleccione dondefuente
Rubí, 25 bytes
Creo que pierdo ...
fuente
->a{a.take_while &:even?}
o al menos->a{a.take_while(&:even?)}
?Pyke, 8 bytes
Intérprete arreglado, use otros enlaces
Utiliza el método de Dennis, excepto que mi función split_at incluye el cambio, probablemente un error
O con corrección de errores, 7 bytes
Pruébalo aquí!
O después de la segunda corrección de errores, 6 bytes
Pruébalo aquí!
Explicación:
fuente
GolfScript, 11 bytes
Este es un programa completo de GolfScript que lee un literal de matriz de GolfScript en cadena (p
[28 14 7 0]
. Ej. ) E imprime la misma matriz con el primer elemento impar y todo lo demás después de eliminarlo:Pruébalo en línea. (También: versión extendida con arnés de prueba ) .
Versión de golf con comentarios:
Esta solución se basa en el
{ },
operador de filtro GolfScript , que ejecuta el contenido del bloque de código en cada elemento de una matriz y selecciona los elementos de la matriz para los cuales el código del bloque devuelve un valor verdadero (es decir, distinto de cero) en parte superior de la pila.Así, por ejemplo,
{1&},
seleccionaría todos los números impares en una matriz y{~1&},
seleccionaría todos los números pares. El desafío, entonces, es hacer un filtro que seleccione números pares hasta que encuentre el primero impar , y luego no seleccione ningún número.La solución que utilicé es reemplazar la máscara de bits constante
1
(utilizada para extraer el bit más bajo de cada número de entrada) con una variable en la pila que almacena el resultado (0 o 1) de la iteración del bucle de filtro anterior (y se inicializa en 1 antes del bucle). Por lo tanto, tan pronto como el filtro devuelve 0 una vez, la máscara de bits también se establece en 0, evitando que el filtro vuelva a devolver 1 nuevamente.fuente
Adelante, 114 bytes
Forth realmente no tiene listas. Los parámetros deben insertarse en la pila en orden inverso, como es típico en Forth. El resultado se dejará en la pila en el mismo orden. Esto no funciona en Ideone por alguna razón, pero funciona en repl. ¿Se requiere la nueva línea para eliminar la ambigüedad de algún tipo?
Pruébalo en línea
Sin golf, con comentarios:
Este programa (mi intento anterior) imprime los resultados hasta que alcanza un número impar. Todo lo que quede (no tomado) se dejará en la pila.
Falla si solo son enteros
fuente
Befunge, 35 Bytes
Este código maneja números entre 0 y 65535
Formato de entrada:
Aquí hay una versión que muestra los valores al final del proceso:
Puede probar el código aquí , pero tendrá que agregar una línea final con espacios finales, ya que esta interpretación especifica:
No sé si esto es aceptable, ya que no conté esto al final en el byte count
nb: parece que debido a que estoy almacenando el número en el código, el intérprete no permitirá que este programa se ejecute dos veces en el correcto camino. Tendrás que volver a cargarlo.
Cómo funciona esto: el intérprete sigue las flechas y omite una instrucción al cruzar '#'
Los puntos grises son prueba, y la línea roja elimina las variables innecesarias de la pila
Usando el aquí en el intérprete anterior, los valores guardados se muestran en el código usando sus representaciones (no sé el formato). Sí, Befunge es un lenguaje bastante reflexivo.
fuente