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


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


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

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


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.


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.

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 :)


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))

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();}

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.


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


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

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.


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


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


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

: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.

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.

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}}

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.