Membalikkan gerakan aneh

17

Inspirasi .

Tugas

Membalikkan bilangan ganjil dalam daftar 2 hingga 2 15 bilangan bulat non-negatif.

Contohnya

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

Adm
sumber
4
1. Saya hanya memahami tantangan setelah melihat contoh-contohnya. Saya pikir menjalankan bilangan bulat aneh akan lebih jelas daripada urutan . 2. Saya tidak berpikir menetapkan batas atas eksplisit adalah hal yang baik. Jika suatu bahasa hanya memiliki bilangan bulat 8-bit, berpartisipasi akan jauh lebih sulit.
Dennis
Juga, saya tidak yakin apa yang dimaksud perhitungan numerik lebih lanjut . Apakah itu berarti bahwa saya tidak dapat mengembalikan tuple yang tidak dapat diubah atau hanya mencetak nomornya?
Dennis
@Dennis Diperbarui seperti yang Anda sarankan. Ini untuk mencegah input / output sebagai string. Ada saran untuk kata-kata yang lebih baik?
Adám
4
Mengapa Anda ingin mencegah output string?
Dennis
2
Ya, melihat tantangan lain, sebagian besar jawaban bergantung pada pemisahan nol, sedangkan di sini Anda harus membagi pada kondisi, yang sebagian besar bahasa tidak memiliki bawaan untuk.
xnor

Jawaban:

8

Python 2, 75 68 63 byte

5 byte berkat Dennis.

Dan saya telah mengalahkan Dennis .

Penghargaan untuk Byeonggon Lee untuk inti dari algoritma.

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

Ide itu!

Versi lama: 75 byte

Biarawati Bocor
sumber
Terikat, sungguh. Juga, saya menghitung 81, bukan 75. Saya kira Anda menghitungnya dengan tab, tetapi editor SE mengisi spasi.
DJMcMayhem
@DrGreenEggsandIronMan Dugaan Anda benar. Tab untuk keterbacaan. Baik menghitung sumber atau menghitung ideone satu.
Leaky Nun
1
printtidak perlu orangtua. Juga, Anda hanya menggunakan asekali, jadi tidak perlu untuk variabel.
Dennis
5

Python 2, 79 75 73 byte

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

Ini adalah fungsi yang mengubah argumennya. Level indentasi kedua adalah tabulator.

Uji di Ideone .

Dennis
sumber
Di mana meta untuk ini?
Leaky Nun
5

APL, 21 20 byte

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

Cobalah || Semua uji kasus

Penjelasan:

                  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

Sunting: Disimpan ~berkat berkat hukum De Morgan

Woofmao
sumber
1
Halo, dan selamat datang di PPCG! Ini adalah pos yang bagus.
NoOneIsHere
5

Haskell, 46 44 byte

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

Terima kasih kepada @xnor karena mengenali lipatan dan menghemat dua byte.

Lynn
sumber
Metode yang bagus, terutama (h*)! Anda dapat menyimpan byte pada casing dasar dengan menulis f x=xdetik untuk mencocokkan daftar kosong, meskipun sepertinya foldrlebih pendek h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]::
xnor
Saya tahu itu hanya foldrsetelah semua! Terima kasih.
Lynn
4

Jelly , 10 byte

Ḃ¬ðœpUżx@F

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Ḃ¬ðœ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
sumber
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 :)

orlp
sumber
apa k.i?
Leaky Nun
@ LeakyNun k.i=0di baris terakhir. Itu hanya variabel.
orlp
Saya tidak mengerti. Apakah kdan k.iterkait?
Leaky Nun
@ LeakyNun No. k.iadalah variabel persisten antara panggilan k. Lihat sebagai global darurat tanpa harus menggunakan globalkata kunci.
orlp
4

Python3, 96 byte

Menyimpan banyak byte berkat 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
sumber
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();}
orlp
sumber
3

MATL , 20 byte

TiodgvYsG8XQ!"@gto?P

Input adalah array kolom, menggunakan ;sebagai pemisah.

Cobalah online!

Penjelasan

Pertimbangkan sebagai contoh array input [1;2;3;5;7;4;6;7;9]. Bagian pertama dari kode,, Tiodgvmengkonversi array ini menjadi [1;1;1;0;0;1;0;1;0], di mana 1menunjukkan perubahan paritas . (Secara khusus, kode memperoleh paritas dari setiap entri array input, menghitung perbedaan berurutan, mengonversi nilai bukan nol menjadi 1, dan menambahkan sebuah 1.)

Kemudian Ysmenghitung jumlah kumulatif , memberi [1;2;3;3;3;4;4;5;5]. Masing-masing angka ini akan digunakan sebagai label , berdasarkan elemen-elemen input yang akan dikelompokkan . Ini dilakukan oleh G8XQ!, yang membagi array input menjadi array sel yang berisi grup. Dalam hal ini memberi {[1] [2] [3;5;7] [4;6] [7;9]}.

Sisa kode iterates ( ") pada array sel. Setiap array numerik konstituen didorong dengan @g. tomembuat salinan dan menghitung paritasnya . Jika ( ?) hasilnya benar, yaitu isi array aneh, array dibalik ( P).

Tumpukan secara implisit ditampilkan di akhir. Setiap larik vertikal numerik ditampilkan, memberikan daftar angka yang dipisahkan oleh baris baru.

Luis Mendo
sumber
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

Uji kasus

Anders Kaseorg
sumber
2

J , 33 31 30 byte

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

Pemakaian

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

Saya menggunakan C # lambda. Anda dapat mencobanya di .NETFiddle .

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

Kudos to Byeonggon Lee untuk algoritma asli.

aloisdg kata Reinstate Monica
sumber
1
Anda dapat menjatuhkan spasi di foreach(vardan mengubah if(n%2==1)ke if(n%2>0)untuk menyimpan 2 byte (atau sebenarnya 1, karena jawaban Anda saat ini adalah 179 byte, bukan 178).
Kevin Cruijssen
@KevinCruijssen Itu diubah di bagian yang lebih kecil tapi tidak di bagian yang kecil. Juga terima kasih atas ruang pendahulunya!
aloisdg berkata Reinstate Monica
1

Pyth, 29 28 byte

JYVQ=+J*%hN2+YN=Y*%N2+NY;+JY

Suite uji.

Terjemahan langsung dari jawaban python saya (kapan menerjemahkan dari python ke pyth menjadi ide yang bagus?)

Biarawati Bocor
sumber
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

Biola

t-clausen.dk
sumber
1

Clojure, 86 byte

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

Ini adalah versi tanpa 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
    )   
)

Pada dasarnya ia melewati urutan input dan jika bertemu bilangan genap ia menambahkan angka dan vektor kosong jika tidak, itu bilangan ganjil menggantikan elemen terakhir dengan angka ini ditambah apa yang ada di elemen terakhir.

Sebagai contoh untuk seq 2 4 6 1 3 7 2ini seperti ini:

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

Dan kemudian meratakan vektor ini memberikan hasil yang benar. Anda dapat melihatnya online di sini: https://ideone.com/d2LLEC

cliffroot
sumber
1

JavaScript (ES6) 70 66

Edit 4 byte disimpan thx @Neil

a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r
edc65
sumber
:r=r.concat(o,x,o=[]),menghemat beberapa byte. Saya pikir Anda kemudian dapat pergi untuk menyelamatkan dua lain seperti ini: a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil
Apa artinya ...o?
Aloisdg berkata Reinstate Monica
@Neil array kosong yang digunakan sebagai elemen yang ditambahkan adalah master stroke
edc65
1

Stax , 15 10 byte CP437

Çⁿ╜"}☻≥º╚(

Cobalah online!

Jeli terikat! Sedih karena pengemasan hanya menghemat satu byte.

Versi tanpa paket dengan 11 byte:

{|e_^*}/Frm

Penjelasan

{|e_^*}adalah sebuah blok yang memetakan semua nomor bahkan nuntuk n+1, dan semua angka ganjil nuntuk 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
sumber
1

Sekam , 7 byte

ṁ↔ġ¤&%2

Cobalah online!

Penjelasan

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

Ruby , 51 byte

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

Cobalah online!

Beberapa variasi kecil:

->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
sumber
0

Perl 5 dengan -p, 42 byte

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

Cobalah online!

Dom Hastings
sumber