Inspirado por esta pregunta:
Haga una función (o un programa completo) que reciba una lista de números y genere la lista reorganizada, de modo que los números indexados pares aparezcan primero, y los números indexados impares sigan. Los valores de los números en sí mismos no afectan el orden, solo sus índices lo hacen. Todos los índices están basados en cero.
Por ejemplo:
Entrada: [0, 1, 2, 3, 4]
Salida: [0, 2, 4, 1, 3]
Otro ejemplo:
Entrada: [110, 22, 3330, 4444, 55555, 6]
Salida: [110, 3330, 55555, 22, 4444, 6]
Use la representación más natural para las listas que tiene su idioma. No hay limitaciones en la complejidad (por ejemplo, asignar una lista temporal está bien, no es necesario hacerlo en el lugar).
PD: debería funcionar para la lista vacía (entrada vacía => salida vacía).
fuente
Respuestas:
Japt , 1 byte
Pruébalo en línea!
fuente
Python, 23 bytes
Pruébalo en línea
fuente
lambda
? ¿Por qué nomu
onu
? : Plambda
porλ
y reducir el número de bytes en 5. : PPyth, 5
Pruébelo en línea o ejecute un Test Suite
Explicación
fuente
CJam, 7 bytes
Empuja un bloque (lo más parecido a una función sin nombre) que transforma el elemento de la pila superior según sea necesario.
Pruébalo aquí.
Explicación
La explicación supone que la parte superior de la pila es la matriz
[0 1 2 3 4]
. Los valores reales no afectan el cálculo.fuente
Laberinto ,
2825242322 bytes¡Esto fue muy divertido! :) Ese es, con mucho, el programa Labyrinth más densamente comprimido que he escrito hasta ahora. Tenía tantas versiones en 20 y 21 bytes que casi funcionaron que todavía dudo que esto sea óptimo ...
Esto toma la entrada como una lista de enteros positivos (con un delimitador arbitrario) e imprime el resultado en STDOUT como enteros delimitados por salto de línea.
La búsqueda de 20/21 bytes: he verificado todos los programas del formulario
donde
X
hay algún carácter razonable por fuerza bruta, pero no encontró ninguna solución válida. Por supuesto, eso no significa que no exista una solución más corta, pero no es posible forzar programas de 20 bytes sin una cantidad decente de suposiciones en su estructura.Explicación
(La explicación está un poco desactualizada, pero todavía no estoy convencido de que la solución sea óptima, por lo que esperaré con la actualización).
Por lo tanto, normalmente se supone que los programas Laberinto parecen laberintos. Mientras el puntero de instrucciones se encuentre en un corredor, seguirá ese corredor. Cuando la IP golpea cualquier tipo de cruce, la dirección se determina en función del valor superior de la pila principal de Labyrinth (Labyrinth tiene dos pilas, con una cantidad infinita de ceros en la parte inferior). Eso normalmente significa que cualquier bucle no trivial será bastante costoso, porque si tiene celdas sin pared en todo el lugar, todo es una unión, y en la mayoría de los casos la parte superior de la pila no tendrá el valor correcto para la IP tomar el camino que le gustaría tomar. Entonces, lo que debe hacer es ampliar los bucles de modo que tengan un todo en el centro con solo un punto de entrada y salida bien definido cada uno.
Pero esta vez tuve mucha suerte y todo encajó tan bien que pude juntarlo todo en un gran grupo. :)
El flujo de control comienza en el
_
sur. El_
empuja un cero en la pila principal. Puede parecer un no-op, pero esto aumenta la profundidad de la pila (no implícita) a la1
que necesitaremos más adelante.?
lee un entero de STDIN. Si no hay más números enteros para leer, esto empuja a cero. En ese caso, la IP sigue moviéndose hacia el sur y@
finaliza el programa de inmediato (porque la lista de entrada está vacía). De lo contrario, la IP gira hacia el este.Ahora estamos entrando en un circuito muy cerrado con dos puntos de salida:
!
imprime el entero de nuevo en STDOUT, dejando solo un cero en la pila. La IP sigue avanzando hacia el este y?
lee el siguiente número entero. Si eso no es cero, giramos a la derecha y avanzamos hacia el sur.?
lee otro (el siguiente índice par). Nuevamente, si eso no es cero, giramos a la derecha y nos movemos hacia el oeste.Luego
\
imprime un salto de línea sin cambiar la pila, por lo que tomamos otra derecha, moviéndonos hacia el norte.!
imprime el siguiente entero de índice par. Como ahora hay al menos un entero de índice impar (positivo) en la pila, seguimos girando a la derecha y el ciclo se repite.Una vez que cualquiera de esos
?
llega al final de la lista, empujan un cero y se mueven directamente al correspondiente;
, que descarta ese cero.En el caso de que haya un solo elemento en la lista, hemos terminado (porque lo imprimimos de inmediato), por lo que la IP seguiría moviéndose hacia el Este hasta el final
@
, nuevamente terminando el programa (imprimiendo un final salto de línea en el camino).De lo contrario, también necesitamos imprimir los enteros de índice impar. En ese caso, los dos caminos (desde los dos puntos de salida del primer bucle) se fusionan en el medio
"
, girando hacia el este en cualquier caso._
empuja un cero para evitar girar a la izquierda@
y;
descarta ese cero. Ahora entramos en un nuevo bucle:El IP ingresa esto en la celda inferior izquierda, moviéndose hacia el norte, girando alrededor del bucle en sentido horario. El
}
desplaza la parte superior de la pila principal a la pila auxiliar. Si bien todavía hay un elemento en la pila, la IP sigue haciendo lo suyo. Una vez que todo se ha desplazado a la pila auxiliar (y se ha revertido en el proceso), la IP continúa moviéndose hacia el Este, ingresando al último bucle:\
imprime un salto de línea nuevamente,{
mueve un elemento de la pila auxiliar de nuevo a main. Si todavía era un elemento de la lista, será positivo, y la IP gira hacia el sur, donde se imprime el elemento!
. Luego#
empuja la profundidad de la pila (y ahora aquí es donde la inicial_
es importante, porque esto#
asegura una profundidad de pila positiva), de modo que la IP todavía gire a la derecha, a través de la\
y{
otra vez.Después de que imprimimos todo,
{
sacamos un cero de la parte inferior de la pila auxiliar, la IP continúa hacia el Este y@
finaliza el programa.fuente
MATLAB, 24
similar a la pitón.
¡Gracias @LuisMendo por guardar 2 bytes!
fuente
@(x)x([1:2:end 2:2:end])
Haskell , 37 bytes
Pruébalo en línea!
El
foldr
recursivo construye la lista par y la lista impar. Anteponer un elemento a la lista se actualiza anteponiéndolo a la lista impar y llamándolo la nueva lista par, y llamando a la lista par anterior la nueva lista impar. Entonces, el par[l,r]
se concaterna al++r
.Gracias a Ørjan Johansen por guardar 5 bytes usando listas de dos elementos en lugar de tuplas.
42 bytes:
Agrega índices a la lista
l
y filtra los pares o los impares.Otro formato más, para 44. La función
g
toma todos los elementos indexados pares. Los índices impares se obtienen soltando primero un elemento y luego aplicandog
. Sil
se garantizara que no está vacío, podríamos hacerlotail
de forma segura por 41fuente
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
conf
ser la función principal.concat
lugar de tuplas yuncurry(++)
.PowerShell v3 +,
75674947 bytesPruébalo en línea!
Espera entrada a través de salpicaduras, como se muestra en el enlace TIO.
Crea una matriz
$l
como una matriz de matrices, luego canaliza la entrada$args
en un bucle|%{}
. Cada vez a través del ciclo, agregamos un elemento a una de las dos matrices secundarias de$l
flip-flop de la$f
variable usando lógica booleana. La primera vez,$f
es$null
, la!
cual es$true
, o1
cuando se indexa en una matriz. Esto significa que el primer elemento se coloca en la segunda matriz de$l
, por lo que$l[1]
primero se genera la salida.Apoyos para TessellatingHeckler para la asistencia de golf y esta variación.
-2 bytes gracias a mazzy.
Advertencias
Siguiendo estrictamente como está escrita la pregunta, esto es técnicamente inválido, ya que PowerShell no tiene un concepto de "listas" como objetos pseudo-inmutables, solo matrices o tablas hash (también conocidos como diccionarios). Por lo tanto, estoy tratando la línea de la pregunta " Use la representación más natural para las listas que tiene su idioma " como preguntando sobre matrices, ya que es lo más cercano que tiene PowerShell. Además, la salida es un elemento por línea, ya que esa es la forma predeterminada de PowerShell de escribir una matriz. Esto significa una entrada de
(0,1,2,3,4)
will output0\r\n2\r\n4\r\n1\r\n3\r\n
.fuente
$args
+ salpicaduras en su lugar$input
y,@()*2
en su lugar@(),@()
F #,
797756Basado en una de las respuestas de Haskell
Primero indexamos la lista, luego la dividimos con criterios: primer elemento (el índice) y suma 1 igual a 0.
Eso nos da un par de listas de pares; La primera lista contiene todos los pares indexados y el otro las cuotas indexadas.
A partir de eso, reensamblamos las dos listas con el operador append y finalmente descartamos el índice.
Editar: se perdió uno obvio, no hay necesidad de nombrar el argumento "xs" (hábitos), por lo que puede reducirse a un nombre de 1 letra
También tengo un potencial de 76 bytes, que es básicamente el mismo pero definido como composición de funciones. El problema es que no se compila como un valor, pero funcionará efectivamente con cualquier argumento de lista dado, así que no estoy seguro de si está bien o no:
Nota: List.indexed solo está disponible desde F # 4.0 a pesar de que aún no está documentado en MSDN
fuente
fun
, ¿no?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Suponiendo que|>
en F # es más o menos equivalente al operador de alimentación hacia la derecha==>
en Perl 6. También solo estoy adivinando quéfst>>(&&&)1>>(=)0
haceJavaScript (ES6), 52 bytes
También lo hace de una pasada
Mostrar fragmento de código
fuente
F=
desde el principio; puede guardar un byte usando esto:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 bytes
fuente
J, 8 bytes
Este es un verbo monádico (un argumento), utilizado de la siguiente manera:
Explicación
fuente
/:0:`1:\
que también tiene 8 bytes.Jalea , 4 bytes
Pruébalo en línea!
Basado en la respuesta de Martin CJam
fuente
Mathematica, 40 bytes
{}[[2;;;;2]]
arrojará un error.fuente
Burlesque, 12 bytes
Uso como en:
Explicación:
Aunque una vez que se lanza la nueva actualización, puede hacerlo con el nuevo Unmerge incorporado (que hace lo contrario de la fusión
**
incorporada):fuente
Perl,
3533 bytes31 bytes + 2 bytes para
-ap
. Lee una cadena delimitada por espacios de STDIN:Cuando la entrada está vacía, imprime un solo espacio, que consideraría equivalente a una lista vacía. Si no, se puede arreglar a un costo de 4 bytes con:
(requiere Perl 5.10+, imprime una nueva línea final)
o a un costo de 5 bytes con:
(sin espacios en blanco al final)
Cómo funciona
Esta solución utiliza el
-a
indicador, que divide la entrada en espacios en blanco y coloca los resultados en la@F
matriz.La verdadera magia ocurre en
push
:La
$|
variable se usa normalmente para forzar el vaciado de salida, pero tiene otra propiedad interesante: cuando se disminuye repetidamente, su valor alterna entre 0 y 1.Aprovechando el hecho de que no hay restricciones en los identificadores especificados a través de la desreferencia simbólica , alternativamente empujamos los elementos de la matriz a las matrices
@0
y@1
, por lo que@0
termina con todos los elementos indexados pares y@1
con las probabilidades. Luego simplemente concatenamos las matrices en cadena para obtener nuestra salida.fuente
C, 70
Nada especial, solo una función de mapeo de índice.
Menos golf
fuente
Pyth, 8 bytes
Relativamente simple
fuente
Vitsy, 22 bytes
Vitsy realmente no fue hecha para hacer esto ...
fuente
Perl 6 , 25 bytes
Esta es la lambda más corta que se me ocurrió.
fuente
Minkolang 0.12 , 15 bytes
Pruébalo aquí
Explicación
fuente
R, 49 bytes
Llámalo como q (bla). O, si x ya contiene la lista para reorganizar, entonces
son solo 35 bytes.
fuente
F #, 64
Inspirado por la respuesta de Sehnsucht (pero no suficiente representante para comentar).
Asigna cada valor a una tupla donde la segunda entrada es el módulo del índice de la lista, ordena por módulo, luego asigna de nuevo al valor original.
fuente
Prólogo, 103 bytes
Ejemplo
fuente
bash y GNU coreutils, 68 bytes
Suponemos que la lista está separada por una nueva línea y se pasa por entrada estándar.
Desafortunadamente, esto ignorará cualquier entrada más allá del índice 1999, por lo que no cumple con las especificaciones.
También registra un archivo temporal codificado ('x'), que podría ser problemático si se ejecuta en paralelo, y no lo elimina después. ¡Lo siento por eso!
fuente
PHP,
7869 bytesPHP puede fragmentar y cortar, pero no intercalar matrices; eso hace que esto sea un poco voluminoso:
Llame por referencia o pruébelo en línea .
primer enfoque (programas para 78 bytes):
imprime una coma inicial; inserte
[!$i]
antes del primero$argv
para eliminarlo.Otras dos soluciones de 78 bytes (imprima una coma inicial y una final):
Corre
php -nr '<code>' <arguments>
o pruébalos en líneafuente
Japt , 3 bytes
Intentalo
Intentalo
fuente
Clojure / ClojureScript, 52 bytes
Escrito en un ClojureScript REPL, también debe ser válido Clojure.
fuente
K, 10 bytes
Basado en la respuesta Pyth de 5 bytes.
fuente
Hasio , 191 bytes
Este fue bastante largo :(
Lee la matriz de args, así que ejecute esto con
hassium file.has 0 1 2 3 4
Ejecute y vea expandido con el caso de prueba aquí
fuente