Corse dispari inverse


17

Ispirazione .

Compito

Esecuzioni inverse di numeri dispari in un determinato elenco da 2 a 2 15 numeri interi non negativi.

Esempi

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. Ho capito la sfida solo dopo aver visto gli esempi. Penso che serie di numeri dispari sarebbero più chiari delle sequenze . 2. Non penso che stabilire un limite superiore esplicito sia una buona cosa. Se una lingua ha solo numeri interi a 8 bit, la partecipazione sarà molto più difficile.
Dennis,

Inoltre, non sono sicuro a quale ulteriore calcolo numerico si riferisca. Significa che non posso restituire una tupla immutabile o semplicemente stampare i numeri?
Dennis,

@Dennis Aggiornato come da te suggerito. Serve a prevenire input / output come stringa. Qualche suggerimento per una migliore formulazione?
Adám,

4
Perché vuoi impedire l'output delle stringhe?
Dennis,

2
Sì, guardando l'altra sfida, la maggior parte delle risposte si basa sulla suddivisione su zero, mentre qui dovresti dividere su una condizione, per la quale la maggior parte delle lingue non ha un built-in.
xnor

Risposte:


8

Python 2, 75 68 63 byte

5 byte grazie a Dennis.

E ho superato Dolf .

Ringraziamenti a Byeonggon Lee per il nucleo dell'algoritmo.

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

Ideone esso!

Vecchia versione: 75 byte


Legato, davvero. Inoltre, sto contando 81, non 75. Immagino tu l'abbia contato con le schede, ma l'editor SE ha riempito gli spazi.
DJMcMayhem

@DrGreenEggsandIronMan La tua ipotesi è corretta. Schede per la leggibilità. O conta la fonte o conta l'ideone.
Leaky Nun,

1
printnon ha bisogno di genitori. Inoltre, lo usi solo auna volta, quindi non è necessaria una variabile.
Dennis,


5

APL, 21 20 byte

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

Provalo || Tutti i casi di test

Spiegazione:

                  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

Modifica: salvato un ~ringraziamento alle leggi di De Morgan


1
Ciao e benvenuto in PPCG! Questo è un buon post.
NoOneIsHere

5

Haskell, 46 44 byte

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

Grazie a @xnor per il riconoscimento di una piega e il salvataggio di due byte.


Bel metodo, in particolare il (h*)! Puoi salvare un byte sul case base scrivendo il f x=xsecondo in modo che corrisponda alla lista vuota, anche se sembra che un foldrsia ancora più corto h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor

Sapevo che era solo un foldrdopotutto! Grazie.
Lynn,

4

Gelatina , 10 byte

Ḃ¬ðœpUżx@F

Provalo online! o verifica tutti i casi di test .

Come funziona

Ḃ¬ðœ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 byte

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


che cos'è k.i?
Leaky Nun,

@LeakyNun k.i=0sull'ultima riga. È solo una variabile.
Orlp,

Non capisco Sono ke k.icorrelati?
Leaky Nun,

@LeakyNun No. k.iè una variabile persistente tra le chiamate di k. Vedilo come un gioco di fortuna globale senza dover usare la globalparola chiave.
orlp,

4

Python3, 96 byte

Hai salvato molti byte grazie 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 byte

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 byte

TiodgvYsG8XQ!"@gto?P

L'input è un array di colonne, che utilizza ;come separatore.

Provalo online!

Spiegazione

Considera come esempio l'array di input [1;2;3;5;7;4;6;7;9]. La prima parte del codice, Tiodgvconverte questo array in [1;1;1;0;0;1;0;1;0], dove 1indica un cambio di parità . (In particolare, il codice ottiene la parità di ciascuna voce dell'array di input, calcola le differenze consecutive, converte i valori diversi da zero 1e antepone a 1.)

Quindi Yscalcola la somma cumulativa , dando [1;2;3;3;3;4;4;5;5]. Ognuno di questi numeri verrà utilizzato come etichetta , in base al quale verranno raggruppati gli elementi dell'input . Questo viene fatto da G8XQ!, che divide l'array di input in un array di celle contenente i gruppi. In questo caso dà {[1] [2] [3;5;7] [4;6] [7;9]}.

Il resto del codice scorre ( ") sull'array di celle. Ogni array numerico costituente viene inserito @g. tofa una copia e calcola la sua parità . Se ( ?) il risultato è veritiero, ovvero i contenuti dell'array sono dispari, l'array viene capovolto ( P).

Lo stack viene implicitamente visualizzato alla fine. Viene visualizzato ogni array verticale numerico, che fornisce un elenco di numeri separati da nuove righe.


2

Pyth, 14 byte

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

Casi test


2

J , 33 31 30 byte

[:;]<@(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 byte

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

Io uso un C # lambda. Si può provare su .NETFiddle .

Il codice meno 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);
};

Complimenti a Byeonggon Lee per l'algoritmo originale.


1
È possibile rilasciare lo spazio in corrispondenza di foreach(vare modificare if(n%2==1)in if(n%2>0)per salvare 2 byte (o effettivamente 1, perché la risposta corrente è di 179 byte anziché 178).
Kevin Cruijssen,

@KevinCruijssen È stato modificato nella sezione meno minify ma non in quella minify. Grazie anche per lo spazio foreach!
aloisdg si trasferisce su codidact.com il


1

TSQL 118 byte

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 byte

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

Ecco la versione ungolfed

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

Fondamentalmente passa attraverso la sequenza di input e se incontra un numero pari aggiunge il numero e il vettore vuoto altrimenti, se si tratta di un numero dispari, sostituisce l'ultimo elemento con questo numero più quello che era nell'ultimo elemento.

Ad esempio per questo seq 2 4 6 1 3 7 2va così:

  • []<=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 quindi l'appiattimento di questo vettore fornisce l'output corretto. Puoi vederlo online qui: https://ideone.com/d2LLEC


1

JavaScript (ES6) 70 66

Modifica 4 byte salvati grazie 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=[]),ti salva un paio di byte. Penso che si possa poi andare a salvare un altro due in questo modo: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil,

Qual è il significato di ...o?
aloisdg si trasferisce su codidact.com il


@Neil l'array vuoto usato come elemento aggiunto è un colpo da maestro
edc65

1

Stax , 15 10 byte CP437

Çⁿ╜"}☻≥º╚(

Provalo online!

Gelatina legata! Così triste che l'imballaggio ha salvato solo un byte.

Versione non compressa con 11 byte:

{|e_^*}/Frm

Spiegazione

{|e_^*}è un blocco che mappa tutti i numeri pari na n+1, e tutti i numeri dispari 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

Buccia , 7 byte

ṁ↔ġ¤&%2

Provalo online!

Spiegazione

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

0

Rubino , 51 bytes

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

Provalo online!

Alcune lievi variazioni:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.