Inverter execuções ímpares


17

Inspiração .

Tarefa

Inverte execuções de números ímpares em uma determinada lista de 2 a 2 15 números inteiros não negativos.

Exemplos

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


4
1. Eu só entendi o desafio depois de examinar os exemplos. Eu acho que séries inteiras ímpares seriam mais claras que sequências . 2. Eu não acho que definir um limite superior explícito seja uma coisa boa. Se um idioma tiver apenas números inteiros de 8 bits, a participação será muito mais difícil.
Dennis

Além disso, não sei ao que se refere a computação numérica adicional . Isso significa que não posso retornar uma tupla imutável ou simplesmente imprimir os números?
Dennis

@ Dennis Atualizado como você sugeriu. É para impedir a entrada / saída como string. Alguma sugestão para uma melhor redação?
Adám 03/07/19

4
Por que você deseja impedir a saída da string?
Dennis

2
Sim, olhando para o outro desafio, a maioria das respostas depende da divisão em zeros, enquanto aqui você teria que dividir em uma condição, para a qual a maioria dos idiomas não tem um built-in.
Xnor

Respostas:


8

Python 2, 75 68 63 bytes

5 bytes graças a Dennis.

E eu superei Dennis .

Créditos a Byeonggon Lee pelo núcleo do algoritmo.

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

Ideone it!

Versão antiga: 75 bytes


Amarrado, sério. Além disso, estou contando 81, não 75. Acho que você contou com guias, mas o editor do SE preencheu espaços.
DJMcMayhem

@DrGreenEggsandIronMan Seu palpite está correto. Guias para facilitar a leitura. Conte a fonte ou a ideona.
Leaky Nun

11
printnão precisa de parênteses. Além disso, você usa apenas auma vez, portanto não há necessidade de uma variável.
Dennis


5

APL, 21 20 bytes

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

Experimente || Todos os casos de teste

Explicação:

                  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

Edit: Salvo um ~agradecimento às leis de De Morgan


11
Olá, e bem-vindo ao PPCG! Este é um bom artigo.
NoOneIsHere

5

Haskell, 46 44 bytes

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

Agradecemos ao @xnor por reconhecer uma dobra e salvar dois bytes.


Bom método, especialmente o (h*)! Você pode salvar um byte no caso base escrevendo f x=xsegunda para coincidir com a lista vazia, embora parece um foldrainda é mais curto: h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]:
xnor

Eu sabia que era apenas um foldrdepois de tudo! Obrigado.
Lynn

4

Gelatina , 10 bytes

Ḃ¬ðœpUżx@F

Experimente online! ou verifique todos os casos de teste .

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

Super hacky :)


o que é k.i?
Freira vazando 03/07

@LeakyNun k.i=0na última linha. É apenas uma variável.
orlp 03/07

Eu não entendo. São ke k.irelacionados?
Leaky Nun

@LeakyNun No. k.ié uma variável persistente entre as chamadas de k. Veja isso como um global improvisado sem precisar usar a globalpalavra - chave.
orlp

4

Python3, 96 bytes

Economizou muitos bytes graças 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

Entrada é uma matriz de colunas, usando ;como separador.

Experimente online!

Explicação

Considere como um exemplo a matriz de entrada [1;2;3;5;7;4;6;7;9]. A primeira parte do código Tiodgv,, converte essa matriz em [1;1;1;0;0;1;0;1;0], onde 1indica uma alteração de paridade . (Especificamente, o código obtém a paridade de cada entrada da matriz de entrada, calcula diferenças consecutivas, converte valores diferentes de zero em 1e precede a 1.)

Então Yscalcula a soma cumulativa , dando [1;2;3;3;3;4;4;5;5]. Cada um desses números será usado como um rótulo , com base no qual os elementos da entrada serão agrupados . Isso é feito por G8XQ!, que divide a matriz de entrada em uma matriz de células que contém os grupos. Neste caso, dá {[1] [2] [3;5;7] [4;6] [7;9]}.

O restante do código itera ( ") na matriz de células. Cada matriz numérica constituinte é pressionada com @g. tofaz uma cópia e calcula sua paridade . Se ( ?) o resultado for verdadeiro, ou seja, o conteúdo do array for ímpar, o array será invertido ( P).

A pilha é exibida implicitamente no final. Cada matriz vertical numérica é exibida, fornecendo uma lista de números separados por novas linhas.


2

Pitão, 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 teste


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

Eu uso um lambda C #. Você pode experimentá-lo no .NETFiddle .

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

Parabéns a Byeonggon Lee pelo algoritmo original.


11
Você pode deixar o espaço no foreach(vare alterar if(n%2==1)para if(n%2>0)salvar 2 bytes (ou na verdade 1, porque sua resposta atual é 179 bytes em vez de 178).
Kevin Cruijssen

@KevinCruijssen Foi alterado na seção menos minify, mas não na seção minify. Também obrigado pelo espaço foreach!
Aloisdg diz 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

Violino


1

Clojure, 86 bytes

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

Aqui está a versão não destruída

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

Basicamente, ele passa pela sequência de entrada e, se encontrar o número par, adiciona o número e o vetor vazio; caso contrário, se for um número ímpar, substitui o último elemento por esse número mais o que estava no último elemento.

Por exemplo, para esta seq 2 4 6 1 3 7 2, é assim:

  • []<=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 []]

E então, aplainar esse vetor fornece a saída correta. Você pode vê-lo online aqui: https://ideone.com/d2LLEC


1

JavaScript (ES6) 70 66

Editar 4 bytes salvos thx @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=[]),economiza alguns bytes. Eu acho que você pode, então, ir para salvar outros dois como este: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil

Qual é o significado de ...o?
aloisdg diz Reinstate Monica


@Neil a matriz vazia usado como o elemento adicional é um golpe de mestre
edc65

1

Stax , 15 10 bytes CP437

Çⁿ╜"}☻≥º╚(

Experimente online!

Geléia Amarrada! Tão triste que a embalagem salvou apenas um byte.

Versão descompactada com 11 bytes:

{|e_^*}/Frm

Explicação

{|e_^*}é um bloco que mapeia todos os números pares npara n+1e todos os números ímpares npara 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

Casca , 7 bytes

ṁ↔ġ¤&%2

Experimente online!

Explicação

ṁ↔ġ¤&%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}}

Experimente online!

Algumas pequenas variações:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.