Chạy lẻ


17

Cảm hứng .

Bài tập

Chạy ngược các số lẻ trong một danh sách đã cho từ 2 đến 2 15 số nguyên không âm.

Ví dụ

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. Tôi chỉ hiểu thử thách sau khi xem các ví dụ. Tôi nghĩ rằng các số nguyên lẻ sẽ rõ ràng hơn các chuỗi . 2. Tôi không nghĩ đặt giới hạn trên rõ ràng là một điều tốt. Nếu một ngôn ngữ chỉ có số nguyên 8 bit, việc tham gia sẽ khó khăn hơn rất nhiều.
Dennis

Ngoài ra, tôi không chắc những gì tính toán số tiếp theo đề cập đến. Điều đó có nghĩa là tôi không thể trả lại một tuple bất biến hoặc chỉ đơn giản là in các số?
Dennis

@Dennis Cập nhật như bạn đề xuất. Đó là để ngăn chặn đầu vào / đầu ra dưới dạng chuỗi. Bất kỳ đề nghị cho từ ngữ tốt hơn?
Adám

4
Tại sao bạn muốn ngăn chặn đầu ra chuỗi?
Dennis

2
Vâng, nhìn vào thử thách khác, hầu hết các câu trả lời đều dựa vào việc chia nhỏ số 0, trong khi ở đây, bạn phải phân chia theo một điều kiện, mà hầu hết các ngôn ngữ không được tích hợp sẵn.
xnor

Câu trả lời:


8

Python 2, 75 68 63 byte

5 byte nhờ Dennis.

Và tôi đã vượt qua Dennis .

Tín dụng cho Byeonggon Lee cho cốt lõi của thuật toán.

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

Nghĩa là nó!

Phiên bản cũ: 75 byte


Bị trói, thật đấy. Ngoài ra, tôi đang đếm 81, không phải 75. Tôi đoán bạn đã đếm nó bằng các tab, nhưng trình soạn thảo SE chứa đầy khoảng trắng.
DJMcMayhem

@DrGreenEggsandIronMan Dự đoán của bạn là chính xác. Tab cho dễ đọc. Hoặc là đếm nguồn hoặc đếm một ideone.
Rò rỉ Nun

1
printkhông cần parens. Ngoài ra, bạn chỉ sử dụng amột lần, do đó không cần phải có biến.
Dennis


5

APL, 21 20 byte

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

Hãy thử nó | | Tất cả các trường hợp thử nghiệm

Giải trình:

                  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

Chỉnh sửa: Đã lưu một ~lời cảm ơn đến luật pháp của De Morgan


1
Xin chào, và chào mừng đến với PPCG! Đây là một bài viết tốt.
NoOneIsHãy

5

Haskell, 46 44 byte

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

Cảm ơn @xnor vì đã nhận ra một nếp gấp và lưu hai byte.


Phương pháp tốt đẹp, đặc biệt là (h*)! Bạn có thể tiết kiệm một byte vào trường hợp cơ sở bằng cách viết f x=xthứ hai để phù hợp với danh sách trống, mặc dù nó trông giống như một foldrvẫn chưa rút ngắn: h%p|(l,r)<-span(odd.(h*))p=l++h:r;foldr(%)[]:
XNOR

Tôi biết đó chỉ là một foldrsau tất cả! Cảm ơn bạn.
Lynn

4

Thạch , 10 byte

Ḃ¬ðœpUżx@F

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

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

Siêu hack :)


k.i
Rò rỉ Nun

@LeakyNun k.i=0trên dòng cuối cùng. Nó chỉ là một biến.
orlp

Tôi không hiểu Được kk.icó liên quan?
Rò rỉ Nun

@LeakyNun Số k.ilà một biến liên tục giữa các cuộc gọi của k. Xem nó như một toàn cầu tạm thời mà không phải sử dụng globaltừ khóa.
orlp

4

Python3, 96 byte

Đã lưu rất nhiều byte nhờ 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

Đầu vào là một mảng cột, sử dụng ;như dấu phân cách.

Hãy thử trực tuyến!

Giải trình

Hãy xem xét như một ví dụ về mảng đầu vào [1;2;3;5;7;4;6;7;9]. Phần đầu tiên của mã, Tiodgvchuyển đổi mảng này thành [1;1;1;0;0;1;0;1;0], trong đó 1chỉ ra sự thay đổi của tính chẵn lẻ . (Cụ thể, mã có được tính chẵn lẻ của từng mục nhập của mảng đầu vào, tính toán các khác biệt liên tiếp, chuyển đổi các giá trị khác không thành 1và trả trước a 1.)

Sau đó Ystính tổng cộng , cho [1;2;3;3;3;4;4;5;5]. Mỗi số này sẽ được sử dụng làm nhãn , dựa vào đó các yếu tố của đầu vào sẽ được nhóm lại . Điều này được thực hiện bằng cách G8XQ!phân tách mảng đầu vào thành một mảng ô chứa các nhóm. Trong trường hợp này nó cho {[1] [2] [3;5;7] [4;6] [7;9]}.

Phần còn lại của mã lặp ( ") trên mảng ô. Mỗi mảng số cấu thành được đẩy với @g. totạo một bản sao và tính chẵn lẻ của nó . Nếu ( ?) kết quả là trung thực, tức là nội dung mảng là số lẻ, mảng được lật ( P).

Ngăn xếp được hiển thị ngầm ở cuối. Mỗi mảng dọc số được hiển thị, đưa ra một danh sách các số được phân tách bằng các dòng mới.


2

Bình thường, 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

Các trường hợp thử nghiệm


2

J , 33 31 30 byte

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

Sử dụng

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

Tôi sử dụng lambda C #. Bạn có thể thử nó trên .NETFiddle .

Mã ít 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 đến Byeonggon Lee cho thuật toán ban đầu.


1
Bạn có thể bỏ khoảng trống tại foreach(varvà thay đổi if(n%2==1)để if(n%2>0)lưu 2 byte (hoặc thực tế là 1, vì câu trả lời hiện tại của bạn là 179 byte thay vì 178).
Kevin Cruijssen

@KevinCruijssen Nó đã được thay đổi trong phần ít rút gọn nhưng không thay đổi trong phần rút gọn. Cũng cảm ơn bạn cho không gian foreach!
aloisdg nói Phục hồi lại


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

Vĩ cầm


1

Clojure, 86 byte

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

Đây là phiên bản chưa được chỉnh sửa

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

Về cơ bản, nó đi qua chuỗi đầu vào và nếu nó gặp số chẵn thì nó sẽ thêm số và vectơ trống nếu nó là số lẻ, nó sẽ thay thế phần tử cuối cùng bằng số này cộng với phần tử cuối cùng.

Ví dụ cho seq này, 2 4 6 1 3 7 2nó diễn ra như sau:

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

Và sau đó làm phẳng vector này cho đầu ra chính xác. Bạn có thể thấy nó trực tuyến tại đây: https://ideone.com/d2LLEC


1

JavaScript (ES6) 70 66

Chỉnh sửa 4 byte đã lưu 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=[]),tiết kiệm cho bạn một vài byte. Tôi nghĩ bạn có thể tiếp tục cứu hai người khác như thế này : a=>[...a,[]].map(x=>x&1?o=[x,...o]:r=r.concat(o,x,o=[]),r=o=[])&&r.
Neil

Ý nghĩa của là ...ogì?
aloisdg nói Phục hồi lại


@Neil mảng trống được sử dụng làm phần tử được thêm vào là một nét chính
edc65

1

Stax , 15 10 byte CP437

Çⁿ╜"}☻≥º╚(

Hãy thử trực tuyến!

Thạch đã trói! Thật buồn khi đóng gói chỉ lưu một byte.

Phiên bản giải nén với 11 byte:

{|e_^*}/Frm

Giải trình

{|e_^*}là một khối mà các bản đồ tất cả các số chẵn nđể n+1, và tất cả các số lẻ nđể 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

Husk , 7 byte

ṁ↔ġ¤&%2

Hãy thử trực tuyến!

Giải trình

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

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

Hãy thử trực tuyến!

Một số biến thể nhỏ:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.