Tính chẵn lẻ của các yếu tố khác


23

Bài tập

Cho một mảng các số nguyên dương, thay thế từng phần tử bằng tính chẵn lẻ của tổng các phần tử khác. Mảng được đảm bảo có ít nhất 2 yếu tố.

Định nghĩa

  • Chẵn lẻ: cho dù một số là số lẻ hay số chẵn.

Thí dụ

Đối với mảng [1,2,3,1]:

  • Thay thế 1bằng tính chẵn lẻ của 2+3+1, tức là even.
  • Thay thế 2bằng tính chẵn lẻ của 1+3+1, tức là odd.
  • Thay thế 3bằng tính chẵn lẻ của 1+2+1, tức là even.
  • Thay thế 1bằng tính chẵn lẻ của 1+2+3, tức là even.

Đầu ra: [even, odd, even, even]

Đầu vào

Một mảng số nguyên dương.

Bạn có thể lấy nó làm một mảng thích hợp hoặc là một chuỗi các số nguyên dương được phân tách bằng dòng.

Bạn có thể cho rằng mảng và các giá trị bên trong nằm trong khả năng xử lý ngôn ngữ của bạn.

Đầu ra

Một mảng gồm hai giá trị nhất quán , một đại diện odd, một đại diện even.

Bạn có thể xuất nó dưới dạng một chuỗi được phân tách bằng nguồn cấp của hai giá trị.

Tủ thử

Đầu vào:

[1, 2, 3, 1]
[1, 2, 3, 2, 1]
[2, 2]
[100, 1001]

Đầu ra:

[even, odd, even, even]
[even, odd, even, odd, even]
[even, even]
[odd, even]

Lưu ý: bạn có thể chọn các giá trị phù hợp khác ngoài oddeven.

Chấm điểm

Đây là . Câu trả lời ngắn nhất trong byte thắng.

Lỗ hổng tiêu chuẩn áp dụng.

Câu trả lời:


16

Thạch , 3 byte

+SḂ

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

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

+SḂ  Main link. Argument: A (array)

 S   Compute the sum of A.
+    Add the sum to each element of A.
     Using _ (subtraction) or ^ (bitwise XOR) would also work.
  Ḃ  Bit; compute the parity of each resulting integer.

Đó là một cách tiếp cận thông minh.
Leaky Nun

1
@LeakyNun Đó là cách tiếp cận tương tự mà mọi người khác đang sử dụng, chỉ ngắn hơn: P
Sản phẩm ETH

@ETHproductions Khá nhiều, vâng. Thete chỉ có rất nhiều cách để tính chẵn lẻ ...
Dennis

@ETHproductions này sử dụng phép cộng thay vì trừ ...
Leaky Nun

@LeakyNun Đúng, câu trả lời Japt của tôi cũng vậy. Trong Jelly, nó chỉ là_SḂ
ETHproductions

8

JavaScript (ES6), 38 36 32 byte

a=>a.map(b=>eval(a.join`+`)-b&1)

Sử dụng 0cho chẵn và 1lẻ.

Kiểm tra

f=
a=>a.map(b=>eval(a.join`+`)-b&1)
console.log(f([1, 2, 3, 1]))
console.log(f([1, 2, 3, 2, 1]))
console.log(f([100, 1001]))


Tắt 2 byte: c-b&1thay vì(c-b)%2
Leaky Nun

Bah! Bạn đánh bại tôi vào nó!
Xù xì

1
Tôi sẽ phải nhớ để sử dụng eval(a.join`+`)hơn a.reduce((x,y)=>x+y). Thật thông minh
Cyoce

8

Haskell, 20 byte

f x=odd.(sum x-)<$>x

Sử dụng Truecho các giá trị lẻ và Falsecho các giá trị chẵn.

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

Trừ từng phần tử khỏi tổng của danh sách và kiểm tra xem nó có lẻ không.

fchuyển sang pointfree cũng có 20 byte : map=<<(odd.).(-).sum.


6

MATL , 5 , 4 byte

ts-o

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

Một byte được lưu nhờ Dennis!

Điều này mang lại '1' cho số lẻ và '0' cho số chẵn. Giải trình:

t       % Duplicate the input
 s      % Get the sum of the input
  -     % Subtract it from the original input
   o    % Get the parity of each element

6

Alice , 31 28 byte

/O.HQ\d$K@
\i#\ /d2-&+!w?+2%

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

Định dạng đầu vào không quan trọng miễn là các số nguyên được tách ra. Định dạng đầu ra được phân tách theo dòng.

Bố cục có thể vẫn chưa tối ưu nhưng tôi chưa tìm được cách rút ngắn điều này hơn nữa.

Giải trình

/     Reflect to SE. Switch to Ordinal.
i     Read all input as a string.
      Reflect off bottom boundary. Move to NE.
.     Duplicate the input string.
      Reflect off top boundary. Move to SE.
\     Reflect to N. Switch to Cardinal.
H     Implicitly convert the top copy of the input to the integers it
      contains and take the absolute value of the top-most one. (Taking
      the absolute value doesn't do anything, but we need the implicit
      conversion to integers.)
      The IP wraps back to the second line.
\     Reflect to SE. Switch to Ordinal.
      Immediately reflect off bottom boundary. Move to NE.
Q     Reverse the stack (this converts the integers back to strings but
      that's irrelevant). After this, we end up with all the individual
      integers on the bottom of the stack in reverse order and the other
      copy of the input string with all integers on top.
      Reflect off top boundary. Move to SE.
/     Reflect to E. Switch to Cardinal.
d     Push the stack depth, which is one more than the number of list
      elements (due to the other input string on the stack).
2-    Subtract 2.
&+    Run + that many times, which implicitly converts the second string
      to the integers it contains and then adds up all the list elements.
!     Store the sum on the tape.
w     Push the current IP position to the return address stack. This
      lets us return here repeatedly to implement a loop.

  ?+    Retrieve the input sum from the tape and add it to the current
        element.
  2%    Compute its parity. Other ways to do this are 1A and 0x. 2F would
        also work but it gives 0/2 instead of 0/1.
        The IP wraps the first column of the grid.
  \     Reflect to NE. Switch to Ordinal. The IP bounces diaginally up
        and down until it hits the next \.
  O     Implicitly convert the current parity to a string and print it
        with a trailing linefeed.
  #     Skip the next command (the H).
  \     Reflect to E. Switch to Cardinal.
  d     Push the stack depth. This is zero when we're done.
  $     Skip the next command if the stack depth is indeed zero, which
        exits the loop.

K     Jump to the return address on top of the return address stack without
      popping it (so that the next K will jump there again).

@     Terminate the program.

6

Bình thường, 7 6 byte

mi2-sQ

-1 Byte nhờ @KZhang

Đầu ra 1 cho lẻ, 2 cho chẵn.

Thử nó!

Giải trình

m%-sQd2
m      Q    # For each element in the (implicit) input list
   sQ       # Take the sum of all the elements
  -  d      # subtract that element, so that we now have the sum of the other elements
 %    2     # modulo 2; 1=off, 0=even

Bằng cách thay đổi modulo %_2thành GCD i2_, bạn thậm chí có thể làm cho dẩn thay đổi mã thành mi2-sQ, lưu một byte. Các đầu ra được thay đổi thành 2 cho chẵn và 1 cho lẻ.
K Zhang



4

R, 21 byte

(sum(n<-scan())-n)%%2

đọc danh sách từ stdin và trả về 0 cho chẵn, 1 cho số lẻ. liên kết đầu vào với biến nbên trong lệnh gọi sumthay vì gọi nó bên ngoài, nghĩa làn=scan();(sum(n)-n)%%2

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



3

Clojure, 30 byte

#(for[i %](odd?(apply - i %)))

Thay vào đó, tất cả các giá trị từ mỗi giá trị lần lượt, ví dụ với đầu vào [a b c d]giá trị được tính thứ 2 là b - a - b - c - d= -(a + c + d). Đầu ra là falsecho chẵn và truelẻ.

Nhưng bạn cũng có thể sử dụng +và tính toán mỗi thuật ngữ tiếp theo hai lần để nó không ảnh hưởng đến tính chẵn lẻ.


3

CJam , 10 byte

{_:+f+1f&}

Đây là một khối ẩn danh (chức năng) lấy đầu vào từ ngăn xếp và thay thế nó bằng đầu ra.

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

Giải trình

Xem xét đầu vào [1 2 3 1].

{         e# Begin block
          e#   STACK: [1 2 3 1]
  _       e#   Duplicate
          e#   STACK: [1 2 3 1], [1 2 3 1]
  :+      e#   Fold addition over the array: compute its sum
          e#   STACK: [1 2 3 1], 7 
  f+      e#   Map addition over the array with extra parameter
          e#   STACK: [8 10 11 8]
  1       e#   Push 1
          e#   STACK: [8 10 11 8], 1
  f&      e#   Map bit-wise "and" over the array with extra parameter
          e#   STACK: [0 0 1 0]
}         e# End block



2

Japt , 7 byte

£x +X&1

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

Giải trình

 £   x +X&1
 mX{ x +X&1}  // Ungolfed
UmX{Ux +X&1}  // Variable introduction

UmX{       }  // Replace each item in the input array with
         &1   //   the parity of
    Ux        //   the sum of the input array
       +X     //   plus X.
              // Implicit: output result of last expression

2

Perl 5, 31 byte

sub{map$x+=$_,@_;map$x-$_&1,@_}

Đầu ra 1cho lẻ và 0cho chẵn.


+1, tốt đẹp. Tuy nhiên, tôi nghĩ rằng đây là 28 byte: perldoc perlsub"Chữ ký là một phần của cơ thể của chương trình con. Thông thường, phần thân của chương trình con chỉ đơn giản là một khối mã."
msh210

@ msh210 Cảm ơn! Tôi không nghĩ đó là cách nó hoạt động, mặc dù - chắc chắn phần thân của chương trình con chỉ có 28 byte, nhưng bạn không thể bỏ đi submà không phá vỡ nó.
Chris

Nhưng đôi khi một chương trình con hoạt động mà không có sub, ví dụ như sau sorthoặcgrep hoặc làm đối số cho chương trình con khác. Điều này có thể đáng để hỏi về Code Golf Meta .
msh210

@ msh210 Một chương trình con hoạt động mà không subchỉ khi nó được sử dụng trong một hàm tạo mẫu ( sortgrepđược tạo ra nhiều hơn hoặc ít hơn). Nhưng nếu không, sublà bắt buộc. Bất kể, chơi golf 3 byte bằng cách bỏ qua subkhông thực sự thú vị.
Dada

2

Clojure (Script), 36 byte

Đầu ra là truecho lẻ và falsecho chẵn. Cả đầu ra và đầu vào là chuỗi.

(fn[l](map #(odd?(-(apply + l)%))l))

2

PHP, 50 byte

Phiên bản trực tuyến

1 cho số lẻ, 0 cho số chẵn

Đầu ra dưới dạng chuỗi được phân tách bằng _

<?foreach($_GET as$v)echo array_sum($_GET)-$v&1,_;

PHP, 72 byte

Đầu ra là sử dụng mảng array_map

<?print_r(array_map(function($v){return array_sum($_GET)-$v&1;},$_GET));

1
Bạn có thể bỏ ?:0nó mà không làm gì cả. foreach($_GET as$v)echo array_sum($_GET)-$v&1,_;
Christoph

2

C, 68 62 byte

i;s;f(c,l)int*l;{while(i<c)s+=l[i++];while(i)l[--i]=s-l[i]&1;}

1 cho số lẻ, 0 cho số chẵn

Thử trực tuyến chi tiết

f(int c, int * l)
{
    int i = 0, s = 0;

    while(i < c)
    {
        s = s + l[i];
        i = i + 1;
    }

    // assert(i == c)

    while(i > 0)
    {
        i = i - 1;
        l[i] = s - l[i]&1;
    }
}

2

Võng mạc , 40 38 byte

\d+
¶$` $'
^¶

\d+
$*
+` |11

%M`1
¶
 

Hãy thử trực tuyến! Đầu ra 1 cho số lẻ và 0 cho số chẵn. Giải thích: Hai dòng đầu tiên nhân đôi đầu vào một lần cho mỗi số trong đầu vào, nhưng không có phần tử. Điều này tạo ra một dòng trống thêm mà sau đó sẽ bị xóa. Đầu vào sau đó được chuyển đổi từ thập phân sang đơn nguyên, các khoảng trắng bị xóa và tính chẵn lẻ được tính toán. Ngay cả chẵn lẻ sau đó được chuyển đổi thành 0 và kết quả được nối lại thành một dòng. Chỉnh sửa: Đã lưu 2 byte nhờ @FryAmTheEggman. Tôi đã thử một số phiên bản khác về mặt khái niệm dễ chịu hơn nhưng phải mất quá nhiều byte để thể hiện:

\d\B

T`2468O`00001
T`d`10`^([^1]*1[^1]*1)*[^1]*1[^1]*$

Thay đổi tất cả các đầu vào thành chẵn lẻ của chúng, sau đó lật tất cả các chẵn lẻ của chúng nếu tổng số có chẵn lẻ.

\d+
$*
^.*
$&¶$&
 (?=.*$)

11

\B
0
T`d`10`.*¶1
¶0

Tính tổng một bản sao của đầu vào, sau đó lấy tính chẵn lẻ của mọi thứ, sau đó đảo ngược các tính chẵn lẻ nếu tổng là số lẻ, sau đó xóa tổng lại.


Tôi đã thử những gì xuất hiện trong đầu tôi và nhận được một giải pháp ngắn hơn một chút , mặc dù tôi vẫn nghĩ rằng nó hầu như không tối ưu. Đặc biệt tôi không thích cách tôi xử lý số 0 thêm mà tôi nhận được vào cuối.
FryAmTheEggman

@FryAmTheEggman Việc tiết kiệm của bạn đến từ việc có một cách ít rõ ràng hơn để chuyển đổi ;trở lại không gian của bạn. Nếu bạn đặt ;ở đầu thì bạn có thể lưu một byte bằng cách xóa nó ngay lập tức thay vì sau khi nó chuyển thành 0.
Neil

Trên thực tế, nhìn lại, tại sao giai đoạn cuối cùng của bạn không chỉ thay thế dòng mới bằng không gian? Điều đó có tiết kiệm được 2 byte không?
FryAmTheEggman

@FryAmTheEggman Có; Tôi nghĩ rằng ban đầu tôi đã có nhiều hơn một thay thế để thực hiện trong lần lặp trước.
Neil


1

k, 9 byte

{2!x-+/x}

Đầu ra là một 1for odd, và 0cho chẵn.Hãy thử trực tuyến.

Chuyển đổi thành mã giả, nó sẽ là:

for number in x:
    yield (number - sum(x)) % 2


1

Brain-Flak , 94 68 66 byte

({({}<>)<>})<>{<>(({})<({}<>{}<>(())){({}[()]<([{}])>)}{}>)<>}<>{}

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

Điều này có vẻ hơi dài cho nhiệm vụ. Có thể có một cách thuận tiện hơn để làm điều này.

Giải trình

Đầu tiên chúng ta tính tổng của ngăn xếp với:

({({}<>)<>})

Chúng tôi đi qua toàn bộ ngăn xếp thêm kết quả đó cho từng phần tử và xác định tính cặp

<>{<>(({})<({}<>{}<>(())){({}[()]<([{}])>)}{}>)<>}<>{}

Điều này sử dụng thuật toán mod 2 khá thú vị mà tôi đã đưa ra cho thử thách này.

({}(())){({}[()]<([{}]())>)}{}

Thao tác này sẽ đẩy 1 dưới mức giảm đầu vào cho đến khi đầu vào bằng 0 mỗi lần thực hiện 1-nđến 1 mà chúng ta đã đặt trước đó, sau đó loại bỏ đầu vào.


Bạn có thể mod 2 ở cuối. Bạn không cần phải mod 2 tổng.
Rò rỉ Nun

@LeakyNun Cảm ơn! Tôi chỉ nhận ra điều đó và thực hiện sửa chữa.
Thuật sĩ lúa mì

1

Khôn ngoan , 54 52 byte

::^:??[:!^:?^:!^:?^?]|!::^??[!:?^:><^!:?^:!^:?^?]!&|

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

Giải trình

Mã này sẽ ngắn hơn rất nhiều nếu nó không mất quá nhiều byte để trao đổi hai phần tử hàng đầu. Kỷ lục hiện tại là

:?^:!^:?^!

Điều này không may cấu thành phần lớn của mã.


Đầu tiên chúng ta lấy tổng XOR của ngăn xếp

::^:??[:!^:?^:!^:?^?]|!

Sau đó, chúng tôi XOR điều này với mọi phần tử và phần tử với bit cuối cùng bằng 0

::^??[!:?^:><^!:?^:!^:?^?]!&|

1

Java , 81 78 byte

3 byte nhờ Kevin Cruissen

void f(int[]a){int s=0,i=a.length;for(int x:a)s+=x;for(;i-->0;a[i]=s-a[i]&1);}

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

Sửa đổi các mảng tại chỗ.



67 byte nếu bạn sử dụng lambda: Hãy thử trực tuyến!
Brian McCutchon

Cảm ơn, nhưng tôi không thích sử dụng lambda.
Rò rỉ Nun

1

AWK , 64 byte

{for(i=0;++i<=NF;print s[i]%2)for(j=0;++j<=NF;)if(i!=j)s[i]+=$j}

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

Xuất ra một 0khoản tiền chẵn và 1cho các khoản tiền lẻ được phân tách bằng dòng mới. Suy nghĩ thậm chí hơi khác thường là đặt printlệnh bên trong bước for"gia tăng". Tôi đã thử một vài cách "thông minh" để in, nhưng chúng không lưu byte.

Chỉ để cười khúc khích, nếu bạn không muốn có dòng mới:

{for(i=0;++i<=NF;m=m,s[i]%2)for(j=0;++j<=NF;)if(i!=j)s[i]+=$j}1

có cùng số byte như trên, nhưng khó hiểu hơn một chút.


1

Swift - 55 byte

Cuối cùng cũng đánh bại C! Ngoài ra, 0 cho chẵn, 1 cho lẻ

func g(a:[Int]){for i in a{print((a.reduce(0,+)-i)%2)}}

Một chức năng, với cách sử dụng: g(a: [1,2,3,2,1] // => 0 1 0 1 0

Kiểm tra nó ra!


Không quen thuộc với Swift, nhưng trong nhiều ngôn ngữ bạn có thể thay thế (x-y)%2bằngx-y&1
Cyoce

@Cyoce Đối với tôi, sau khi thử nghiệm, nó không hoạt động. Các hoạt động của bitwise không phải là sở trường của Swift
Ông Xcoder

1

Tiên đề, 45 byte

f(a)==[(reduce(+,a)-a.j)rem 2 for j in 1..#a]

không kiểm tra loại đầu vào, tính toán lại có thể của tổng "a" mỗi phần tử ... kiểm tra

(27) -> [[a,f(a)] for a in [[1,2,3,1], [1,2,3,2,1], [2,2], [100, 1001] ]]
   (27)
   [[[1,2,3,1],[0,1,0,0]], [[1,2,3,2,1],[0,1,0,1,0]], [[2,2],[0,0]],
    [[100,1001],[1,0]]]

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.