Odwróć nieparzyste przebiegi

17

Inspiracja .

Zadanie

Odwrotne przebiegi liczb nieparzystych na podanej liście od 2 do 2 15 liczb całkowitych nieujemnych.

Przykłady

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ám
źródło
4
1. Wyzwanie zrozumiałem dopiero po zapoznaniu się z przykładami. Myślę, że szeregi nieparzystych liczb całkowitych byłyby wyraźniejsze niż sekwencje . 2. Nie sądzę, aby ustalenie wyraźnego górnego limitu było dobrą rzeczą. Jeśli język ma tylko 8-bitowe liczby całkowite, uczestnictwo będzie znacznie trudniejsze.
Dennis
Nie jestem też pewien, do czego odnosi się dalsze obliczenia numeryczne . Czy to oznacza, że ​​nie mogę zwrócić niezmiennej krotki lub po prostu wydrukować liczby?
Dennis
@Dennis Zaktualizowano zgodnie z sugestią. Ma to na celu zapobieganie wprowadzaniu / wysyłaniu jako ciągu. Wszelkie sugestie dotyczące lepszego sformułowania?
Adám
4
Dlaczego chcesz zapobiec wysyłaniu ciągów?
Dennis
2
Tak, patrząc na inne wyzwanie, większość odpowiedzi opiera się na dzieleniu na zera, podczas gdy tutaj musiałbyś podzielić na warunek, dla którego większość języków nie ma wbudowanego.
xnor

Odpowiedzi:

8

Python 2, 75 68 63 bajtów

5 bajtów dzięki Dennisowi.

I obezwładniłem Dennisa .

Podziękowania dla Byeonggon Lee za rdzeń algorytmu.

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

Ideone to!

Stara wersja: 75 bajtów

Leaky Nun
źródło
Naprawdę związany. Poza tym liczę 81, a nie 75. Domyślam się, że policzyłeś to tabulatorami, ale edytor SE wypełniał spacje.
DJMcMayhem
@DrGreenEggsandIronMan Twoje przypuszczenia są prawidłowe. Zakładki dla czytelności. Policz źródło lub policz ideone.
Leaky Nun
1
printnie potrzebuje parens. Ponadto używasz tylko araz, więc nie potrzebujesz żadnej zmiennej.
Dennis
5

Python 2, 79 75 73 bajtów

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

Jest to funkcja, która modyfikuje argument w miejscu. Drugi poziom wcięcia to tabulator.

Przetestuj na Ideone .

Dennis
źródło
Gdzie jest na to meta?
Leaky Nun
5

APL, 21 20 bajtów

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

Wypróbuj || Wszystkie przypadki testowe

Wyjaśnienie:

                  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

Edycja: Zapisano ~dzięki prawom De Morgana

Woofmao
źródło
1
Witaj i witaj w PPCG! To jest dobra wiadomość.
NoOneIsHere
5

Haskell, 46 44 bajtów

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

Dzięki @xnor za rozpoznanie złożenia i zapisanie dwóch bajtów.

Lynn
źródło
Dobra metoda, szczególnie (h*)! Możesz zapisać bajt na podstawie, pisząc f x=xdrugi, aby dopasować pustą listę, choć wygląda na to, że foldrjest jeszcze krótszy h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor
Wiedziałem, że to tylko foldrkoniec! Dziękuję Ci.
Lynn,
4

Galaretka , 10 bajtów

Ḃ¬ðœpUżx@F

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

Ḃ¬ðœ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
źródło
4

Python 2, 78 75 bajtów

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

orlp
źródło
co jest k.i?
Leaky Nun
@LeakyNun k.i=0w ostatniej linii. To tylko zmienna.
orlp
Nie rozumiem Czy ki k.ipowiązane?
Leaky Nun
@LeakyNun No. k.ito stała zmienna między wywołaniami k. Zobacz to jako prowizoryczny globalny bez konieczności używania globalsłowa kluczowego.
orlp
4

Python3, 96 bajtów

Zaoszczędź dużo bajtów dzięki Dziurawej Zakonnicy!

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
źródło
3

C, 107 bajtów

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
źródło
3

MATL , 20 bajtów

TiodgvYsG8XQ!"@gto?P

Dane wejściowe to tablica kolumn, używana ;jako separator.

Wypróbuj online!

Wyjaśnienie

Rozważ jako przykład tablicę wejściową [1;2;3;5;7;4;6;7;9]. Pierwsza część kodu Tiodgvkonwertuje tę tablicę na [1;1;1;0;0;1;0;1;0], gdzie 1wskazuje zmianę parzystości . (W szczególności kod uzyskuje parzystość każdego wpisu tablicy wejściowej, oblicza kolejne różnice, konwertuje wartości niezerowe na 1i wstawia a 1.)

Następnie Ysoblicza łączną sumę , dając [1;2;3;3;3;4;4;5;5]. Każda z tych liczb będzie używana jako etykieta , na podstawie której zostaną zgrupowane elementy wejścia . Odbywa się to poprzez G8XQ!podział tablicy wejściowej na tablicę komórkową zawierającą grupy. W tym przypadku daje {[1] [2] [3;5;7] [4;6] [7;9]}.

Reszta kodu iteruje ( ") w tablicy komórek. Każda składowa tablica numeryczna jest wypychana @g. towykonuje kopię i oblicza jej parzystość . Jeśli ( ?) wynik jest prawdziwy, tzn. Zawartość tablicy jest nieparzysta, tablica jest odwracana ( P).

Stos jest domyślnie wyświetlany na końcu. Wyświetlana jest każda numeryczna tablica pionowa, podająca listę liczb oddzielonych znakami nowej linii.

Luis Mendo
źródło
2

Pyth, 14 bajtów

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

Przypadki testowe

Anders Kaseorg
źródło
2

J , 33 31 30 bajtów

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

Stosowanie

   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
mile
źródło
2

C #, 179 178 177 bajtów

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

Używam C # lambda. Możesz spróbować na .NETFiddle .

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

Wyrazy uznania dla Byeonggon Lee za oryginalny algorytm.

aloisdg przenosi się do codidact.com
źródło
1
Możesz upuścić miejsce na foreach(vari zmienić, if(n%2==1)aby if(n%2>0)zapisać 2 bajty (a właściwie 1, ponieważ twoja aktualna odpowiedź to 179 bajtów zamiast 178).
Kevin Cruijssen
@KevinCruijssen Zostało to zmienione w części mniejszej zmiany, ale nie w części mniejszej. Dziękuję również za miejsce na Foreach!
aloisdg przenosi się do codidact.com
1

TSQL 118 bajtów

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

Skrzypce

t-clausen.dk
źródło
1

Clojure, 86 bajtów

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

Oto wersja bez golfa

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

Zasadniczo przechodzi przez sekwencję wejściową i jeśli napotka liczbę parzystą, dodaje liczbę i pusty wektor, w przeciwnym razie, jeśli jest liczbą nieparzystą, zastępuje ostatni element tą liczbą plus to, co było w ostatnim elemencie.

Na przykład dla tego seq 2 4 6 1 3 7 2wygląda następująco:

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

A następnie spłaszczenie tego wektora daje prawidłową moc wyjściową. Możesz to zobaczyć online tutaj: https://ideone.com/d2LLEC

Cliffroot
źródło
1

JavaScript (ES6) 70 66

Edytuj 4 bajty zapisane thx @Neil

a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
edc65
źródło
:r=r.concat(o,x,o=[]),oszczędza ci kilka bajtów. Myślę, że można następnie przejść, aby zapisać kolejne dwie tak: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil
Co to znaczy ...o?
aloisdg przenosi się na codidact.com
@Neil pusta tablica używana jako dodany element to suw główny
edc65
1

Stax , 15 10 bajtów CP437

Çⁿ╜"}☻≥º╚(

Wypróbuj online!

Wiązana galaretka! Tak smutne, że pakowanie pozwoliło zaoszczędzić tylko jeden bajt.

Wersja rozpakowana z 11 bajtami:

{|e_^*}/Frm

Wyjaśnienie

{|e_^*}Jest to blok, który odwzorowuje wszystkie liczby parzyste ndo n+1i wszystkie numery nieparzyste ndo 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
źródło
1

Łuska , 7 bajtów

ṁ↔ġ¤&%2

Wypróbuj online!

Wyjaśnienie

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

Rubinowy , 51 bajtów

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

Wypróbuj online!

Niektóre niewielkie różnice:

->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
źródło
0

Perl 5 z -p42 bajtami

map{$_%2?$\=$_.$\:print$\.$_,$\=""}$_,<>}{

Wypróbuj online!

Dom Hastings
źródło