Carreras impares inversas

17

La inspiración .

Tarea

Ejecuciones inversas de números impares en una lista dada de 2 a 2 15 enteros no negativos.

Ejemplos

0 1 →  0 1
1 3 →  3 1
1 2 3 →  1 2 3
1 3 2 →  3 1 2
10 7 9 6 8 9 →  10 9 7 6 8 9
23 12 32 23 25 27 →  23 12 32 27 25 23
123 123 345 0 1 9 → 345 123 123 0 9 1

Adán
fuente
44
1. Solo entendí el desafío después de mirar los ejemplos. Creo que las series de enteros impares serían más claras que las secuencias . 2. No creo que establecer un límite superior explícito sea algo bueno. Si un idioma solo tiene enteros de 8 bits, participar será mucho más difícil.
Dennis
Además, no estoy seguro de a qué se refiere el cálculo numérico adicional . ¿Significa que no puedo devolver una tupla inmutable o simplemente imprimir los números?
Dennis
@Dennis Actualizado como usted sugirió. Es para evitar la entrada / salida como cadena. ¿Alguna sugerencia para una mejor redacción?
Adám
44
¿Por qué quieres evitar la salida de cadena?
Dennis
2
Sí, mirando el otro desafío, la mayoría de las respuestas se basan en dividir en ceros, mientras que aquí tendrías que dividir en una condición, que la mayoría de los idiomas no tienen incorporada.
xnor

Respuestas:

8

Python 2, 75 68 63 bytes

5 bytes gracias a Dennis.

Y he superado a Dennis .

Créditos a Byeonggon Lee para el núcleo del algoritmo.

o=t=[]
for i in input():o+=~i%2*(t+[i]);t=i%2*([i]+t)
print o+t

Ideone it!

Versión anterior: 75 bytes

Monja permeable
fuente
Atado, de verdad. Además, estoy contando 81, no 75. Supongo que lo contó con pestañas, pero el editor SE llenó los espacios.
DJMcMayhem
@DrGreenEggsandIronMan Su conjetura es correcta. Pestañas para facilitar la lectura. Cuenta la fuente o cuenta la ideona.
Leaky Nun
1
printNo necesita parens. Además, solo se usa auna vez, por lo que no hay necesidad de una variable.
Dennis
5

Pitón 2, 79 75 73 bytes

def f(x):
 i=j=0
 for n in x+[0]:
    if~n%2:x[i:j]=x[i:j][::-1];i=j+1
    j+=1

Esta es una función que modifica su argumento en su lugar. El segundo nivel de sangría es un tabulador.

Pruébalo en Ideone .

Dennis
fuente
¿Dónde está el meta para esto?
Leaky Nun
5

APL, 21 20 bytes

{∊⌽¨⍵⊂⍨e⍲¯1↓0,e←2|⍵}

Pruébalo ||Todos los casos de prueba

Explicación:

                  2|⍵ Select all the odd numbers
                e←    Save that to e
              0,      Append a 0
           ¯1↓        Delete the last element
         e⍲           NAND it with the original list of odd numbers
     ⍵⊂⍨             Partition the list: (even)(even)(odd odd odd)(even)
  ⌽¨                 Reverse each partition
 ∊                    Flatten the list

Editar: salvó un ~agradecimiento a las leyes de De Morgan

Woofmao
fuente
1
Hola y bienvenidos a PPCG! Éste es un buen post.
NoOneIsHere
5

Haskell, 46 44 bytes

h%p|(l,r)<-span(odd.(h*))p=l++h:r
foldr(%)[]

Gracias a @xnor por reconocer un pliegue y guardar dos bytes.

Lynn
fuente
Buen método, especialmente el (h*)! Puede guardar un byte en el caso base escribiendo el f x=xsegundo para que coincida con la lista vacía, aunque parece que a foldres aún más corto h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor
¡Sabía que era solo un foldrdespués de todo! Gracias.
Lynn
4

Jalea , 10 bytes

Ḃ¬ðœpUżx@F

Pruébalo en línea! o verificar todos los casos de prueba .

Cómo funciona

Ḃ¬ðœpUżx@F  Main link. Argument: A (array)

Ḃ           Bit; return the parity bit of each integer in A.
 ¬          Logical NOT; turn even integers into 1's, odds into 0's.
  ð         Begin a new, dyadic link.
            Left argument: B (array of Booleans). Right argument: A
   œp       Partition; split A at 1's in B.
     U      Upend; reverse each resulting chunk of odd numbers.
       x@   Repeat (swapped); keep only numbers in A that correspond to a 1 in B.
      ż     Zipwith; interleave the reversed runs of odd integers (result to the
            left) and the flat array of even integers (result to the right).
         F  Flatten the resulting array of pairs.
Dennis
fuente
4

Python 2, 78 75 bytes

def r(l):
 def k(n):o=~n%2<<99;k.i+=o*2-1;return k.i-o
 k.i=0;l.sort(key=k)

Súper hacky :)

orlp
fuente
lo que es k.i?
Leaky Nun
@LeakyNun k.i=0en la última línea. Es solo una variable.
orlp
No lo entiendo Son ky k.irelacionados?
Leaky Nun
@LeakyNun No. k.ies una variable persistente entre llamadas de k. Véalo como un improvisado global sin tener que usar la globalpalabra clave.
orlp
4

Python3, 96 bytes

¡Ahorré muchos bytes gracias a Leaky Nun!

o=l=[]
for c in input().split():
 if int(c)%2:l=[c]+l
 else:o+=l+[c];l=[]
print(" ".join(o+l))
Byeonggon Lee
fuente
3

C, 107 bytes

i;b[65536];f(){for(;i;)printf("%d ",b[--i]);}main(n){for(;~scanf("%d",&n);)n%2||f(),b[i++]=n,n%2||f();f();}
orlp
fuente
3

MATL , 20 bytes

TiodgvYsG8XQ!"@gto?P

La entrada es una matriz de columnas que se usa ;como separador.

Pruébalo en línea!

Explicación

Considere como ejemplo la matriz de entrada [1;2;3;5;7;4;6;7;9]. La primera parte del código, Tiodgvconvierte esta matriz en [1;1;1;0;0;1;0;1;0], donde 1indica un cambio de paridad . (Específicamente, el código obtiene la paridad de cada entrada de la matriz de entrada, calcula diferencias consecutivas, convierte valores distintos de cero 1y antepone un1 ).

Luego Yscalcula la suma acumulativa , dando [1;2;3;3;3;4;4;5;5]. Cada uno de estos números se usará como una etiqueta , en función de la cual se agruparán los elementos de la entrada . Esto se realiza mediante G8XQ!, que divide la matriz de entrada en una matriz de celdas que contiene los grupos. En este caso da {[1] [2] [3;5;7] [4;6] [7;9]}.

El resto del código itera ( ") en la matriz de celdas. Cada matriz numérica constituyente se empuja con @g. tohace una copia y calcula su paridad . Si ( ?) el resultado es verdadero, es decir, el contenido de la matriz es impar, la matriz se voltea ( P).

La pila se muestra implícitamente al final. Se muestra cada matriz vertical numérica, que proporciona una lista de números separados por nuevas líneas.

Luis Mendo
fuente
2

Pyth, 14 bytes

s_McQshMBx0%R2

           %R2Q   Take all elements of the input list modulo 2
         x0       Get the indices of all 0s
      hMB         Make a list of these indices and a list of these indices plus 1
     s            Concatenate them
   cQ             Chop the input list at all those positions
 _M               Reverse all resulting sublists
s                 Concatenate them

Casos de prueba

Anders Kaseorg
fuente
2

J , 33 31 30 bytes

[:;]<@(A.~2-@|{.);.1~1,2|2-/\]

Uso

   f =: [:;]<@(A.~2-@|{.);.1~1,2|2-/\]
   f 0 1
0 1
   f 1 3
3 1
   f 1 2 3
1 2 3
   f 1 3 2
3 1 2
   f 10 7 9 6 8 9
10 9 7 6 8 9
   f 23 12 32 23 25 27
23 12 32 27 25 23
   f 123 123 345 0 1 9
345 123 123 0 9 1
millas
fuente
2

C #, 179 178 177 bytes

s=>{var o=new List<int>();var l=new Stack<int>();foreach(var n in s.Split(' ').Select(int.Parse)){if(n%2>0)l.Push(n);else{o.AddRange(l);o.Add(n);l.Clear();}}return o.Concat(l);}

Yo uso un C # lambda. Puedes probarlo en .NETFiddle .

El código menos minify:

s => {
    var o=new List<int>();var l=new Stack<int>();
    foreach (var n in s.Split(' ').Select(int.Parse)) {
        if (n%2>0)
            l.Push(n);
        else {
            o.AddRange(l);
            o.Add(n);
            l.Clear();
        }
    }
    return o.Concat(l);
};

Felicitaciones a Byeonggon Lee por el algoritmo original.

aloisdg dice Reinstate Monica
fuente
1
Puede soltar el espacio en foreach(vary cambiar if(n%2==1)a if(n%2>0)para guardar 2 bytes (o en realidad 1, porque su respuesta actual es 179 bytes en lugar de 178).
Kevin Cruijssen
@KevinCruijssen Se cambió en la sección de minificar menos pero no en la de minificar. También gracias por el espacio foreach!
aloisdg dice Reinstate Monica
1

TSQL 118 bytes

DECLARE @ TABLE(i int identity, v int)
INSERT @ values(123),(123),(345),(0),(1),(9)

SELECT v FROM(SELECT sum((v+1)%2)over(order by i)x,*FROM @)z
ORDER BY x,IIF(v%2=1,max(i)over(partition by x),i),i desc

Violín

t-clausen.dk
fuente
1

Clojure, 86 bytes

#(flatten(reduce(fn[a b](if(odd? b)(conj(pop a)(conj[b](last a)))(conj a b[])))[[]]%))

Aquí está la versión sin golf

#(flatten ; removes all empty vectors and flattens odd sequences
    (reduce 
        (fn[a b]
            (if(odd? b) ; if we encounter odd number in the seq
                (conj(pop a)(conj[b](last a))) ; return all elements but last and the element we encountered plus the last element of current result
                (conj a b[])) ; else just add the even number and the empty vector
            )
        [[]] ; starting vector, we need to have vector inside of vector if the sequence starts with odd number
        %    ; anonymous function arg
    )   
)

Básicamente, pasa por la secuencia de entrada y si encuentra un número par, agrega el número y el vector vacío; de lo contrario, si es un número impar, reemplaza el último elemento con este número más lo que estaba en el último elemento.

Por ejemplo, para este seq 2 4 6 1 3 7 2va así:

  • []<=2
  • [2 []]<=4
  • [2 [] 4 []]<=6
  • [2 [] 4 [] 6 []]<=1
  • [2 [] 4 [] 6 [1 []]]<=3
  • [2 [] 4 [] 6 [3 [1 []]]]<=7
  • [2 [] 4 [] 6 [7 [3 [1 []]]]]<=2
  • [2 [] 4 [] 6 [7 [3 [1 []]]] 2 []]

Y luego aplanar este vector da la salida correcta. Puede verlo en línea aquí: https://ideone.com/d2LLEC

acantilado
fuente
1

JavaScript (ES6) 70 66

Editar 4 bytes guardados gracias a @Neil

a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
edc65
fuente
:r=r.concat(o,x,o=[]),te ahorra un par de bytes. Creo que a continuación, puede pasar a salvar a otros dos como esto: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil
¿Cuál es el significado de ...o?
aloisdg dice Reinstate Monica
@Neil la matriz vacía utilizada como elemento agregado es un trazo maestro
edc65
1

Stax , 15 10 bytes CP437

Çⁿ╜"}☻≥º╚(

Pruébalo en línea!

Gelatina atado! Tan triste que el embalaje solo salvó un byte.

Versión desempaquetada con 11 bytes:

{|e_^*}/Frm

Explicación

{|e_^*}es un bloque que asigna todos los números pares na n+1, y todos los números impares na 0.

{|e_^*}/Frm
{     }/       Group array by same value from block
 |e            1 if the element is even, 0 if odd.
   _^          Get another copy of the current element and increment by 1
     *         Multiply them
        F      For each group execute the rest of the program
         r     Reverse the group
          m    Print elements from the group, one element per line.
Weijun Zhou
fuente
1

Casco , 7 bytes

ṁ↔ġ¤&%2

Pruébalo en línea!

Explicación

ṁ↔ġ¤&%2  Implicit input, a list of integers.
  ġ      Group by equality predicate:
   ¤ %2   Arguments modulo 2
    &     are both truthy.
ṁ        Map and concatenate
 ↔       reversing.
Zgarb
fuente
0

Ruby , 51 bytes

->l{l.chunk(&:odd?).flat_map{|i,j|i ?j.reverse: j}}

Pruébalo en línea!

Algunas ligeras variaciones:

->l{l.chunk(&:odd?).flat_map{|i,j|i&&j.reverse||j}}
->l{l.chunk(&:odd?).flat_map{|i,j|!i ?j:j.reverse}}
->l{l.chunk(&:even?).flat_map{|i,j|i ?j:j.reverse}}
Asone Tuhid
fuente