Con số này có xấu không?


34

Giới thiệu

Trong lý thuyết số, một số được coi là xấu nếu có số chẵn là 1 trong biểu diễn nhị phân của nó. Trong thử thách ngày hôm nay, bạn sẽ xác định được một con số nhất định có xấu hay không.

Thử thách

Công việc của bạn là viết một chương trình hoặc hàm đầy đủ chấp nhận một số nguyên duy nhất, không âm làm đầu vào và đầu ra (hoặc trả về) cho dù số đó có xấu hay không.

  • Bạn có thể ra bất kỳ truthy giá trị nếu số là ác, và bất kỳ giá trị falsy nếu số lượng không phải là xấu.
  • Bạn có thể nhập và xuất ở bất kỳ định dạng chấp nhận được .
  • Sơ hở tiêu chuẩn là không được phép.
  • Chuỗi OEIS A001969 là chuỗi chứa tất cả các số ác.
  • Dưới đây là danh sách 10000 số ác đầu tiên, để tham khảo (và nhiều trường hợp thử nghiệm hơn!)
  • Câu hỏi này là , vì vậy càng ngắn, càng tốt.
  • Đừng bỏ qua câu trả lời cực ngắn trong các ngôn ngữ chơi gôn. Tôi khuyến khích bạn gửi bằng bất kỳ ngôn ngữ nào bạn thích.
  • Dưới đây là một số trường hợp thử nghiệm:

    3 => True
    11 => False
    777 => True
    43 => True
    55 => False
    666 => False
    

Bảng xếp hạng

Ở dưới cùng của trang là một đoạn ngăn xếp có chứa bảng thành tích cho câu hỏi này. (Cảm ơn, @MartinEnder)

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

# Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

# Perl, 43 + 2 (-p flag) = 45 bytes

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích bảng xếp hạng:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

EDIT: Tôi tin rằng câu hỏi này không phải là một bản sao của câu hỏi này , bởi vì trong khi câu hỏi đó yêu cầu đếm số lượng câu hỏi, câu hỏi này là hỏi liệu số lượng câu hỏi có phải là số chẵn hay không. Mặc dù bạn có thể thực hiện câu hỏi này bằng cách đơn giản là đếm các bit, nhưng cũng có những cách tiếp cận khác .


2
Liên quan (XOR-ing mỗi chữ số nhị phân giống như lấy tổng modulo-2).
Kevin Cruijssen


2
@BetaDecay nhưng điều đó không hoạt động ngược lại: tức là bạn không thể lấy tất cả các câu trả lời này và xóa mod 2. Do đó, thử thách này mời một số phương thức mới.
Lưỡng cư

13
Tôi tin rằng đó 666 => Falselà một trường hợp thử nghiệm.
dùng2390246

3
Bảng xếp hạng bị hỏng đối với tôi
Jo King

Câu trả lời:


35

Hội Z80 (8 bit), 2 byte

Đoạn mã sau chỉ hoạt động với các giá trị lên tới 255:

; Input is given in register A.
; P flag is set if A is evil.
B7     or A
C9     ret


Phiên bản 16 bit (hoạt động trên tất cả các trường hợp thử nghiệm), 3 byte

Điều này hoạt động với các giá trị lên tới 65535.

; Input is given in BC.
; Output is the same as above.
78     ld A,B
A9     xor C
C9     ret

Nếu bạn cảm thấy thích phiêu lưu, bạn có thể tắt 1 byte bằng cách lưu trữ đầu vào ACnhư vậy

      ld BC, 777
C5    push BC
F1    pop AF

và sau đó chạy

A9    xor C
C9    ret

Tuy nhiên, điều này đặt gánh nặng lên người gọi, vì vậy có thể là hai byte ( push BCpop AF) cũng nên được tính.


tôi thích cái này nhưng nó hoạt động thế nào bộ nhớ của tôi để lắp ráp (6502 + cánh tay) là orcác bit theo chiều dọc với 2 toán hạng
phía bắc-bradley

2
@ south-bradley Trên Z80, nó ngụ ý rằng toán hạng thứ hai của trình orghi nhớ là bộ tích lũy A. Trong trường hợp này, lệnh không thay đổi A. Nó chỉ làm mới thanh ghi trạng thái (và đặc biệt là cờ chẵn lẻ) thành phản ánh nội dung của A.
cschultz2048

1
Được Pphép theo codegolf.meta.stackexchange.com/a/8509/29560 ? Đó là một bit trong thanh ghi F(cờ) chỉ có ba cặp hướng dẫn bị ảnh hưởng bởi nó. Ngoài ra, câu trả lời này không đề cập đến việc nó chỉ cạnh tranh các giá trị 8 bit, vì Alà thanh ghi 8 bit. Điều này có nghĩa là nó không thể đưa ra câu trả lời cho 777bất kỳ giá trị không dấu nào khác trên 255.
CJ Dennis

2
Xây dựng chết tiệt:P
Jo King

1
@ cschultz2048 Ađược ghép nối với F, vì vậy tôi sẽ không chấp nhận ABhoặc BAdưới dạng giá trị 16 bit. BClà 16 bit, nhưng sau đó bạn cần một hướng dẫn bổ sung để tải một trong số chúng vào Atrước khi XOR cái kia. Tôi đã luôn đề cập rằng các câu trả lời Z80 của tôi hoạt động hoàn toàn lên tới 255 hoặc 65535, tùy thuộc vào câu hỏi. Có lẽ thêm một phiên bản 16 bit? Vì vậy, 2 byte cho các giá trị 8 bit, 3 byte cho các giá trị 16 bit.
CJ Dennis

25

JavaScript (ES6), 18 byte

f=n=>n?!f(n&~-n):1

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

Giải trình

Logic bitwise đi như thế này:

  • Đối với số nguyên, ~-ntương đương với -(-n)-1, do đó chỉ là một cách làm khác n-1. Trong trường hợp cụ thể đó, chúng tôi thực sự có thể đã sử dụng n-1.
  • n & (n-1)loại bỏ bit có ý nghĩa nhỏ nhất được đặt thành 1 trong n vì việc giảm n biến tất cả các dấu 0 thành 1 và xóa 1 ngay sau đó (bằng cách truyền lan truyền), trong khi vẫn giữ nguyên mọi thứ khác.

    Ví dụ cho n = 24 (11000 ở dạng nhị phân):

      11000 (24)                  11000 (24)
    -     1                   AND 10111 (23)
    -------                   ---------
    = 10111 (23)              =   10000 (16)
       ^                           ^
       |                           |
       +--- this bit is cleared ---+
    

Do đó, chúng tôi xử lý nhiều cuộc gọi đệ quy khi có 1 'trong biểu diễn nhị phân của n , đảo ngược kết quả mỗi lần với !. Cuộc gọi cuối cùng luôn trả về 1 .

Ví dụ:

f(24) = !f(16) = !!f(0) = !!1 = true
f(7) = !f(6) = !!f(4) = !!!f(0) = !!!1 = false

Xin chào, tôi hiểu mã làm gì, nhưng tôi không thể tìm ra logic / lý do đằng sau nó, mặc dù đã đọc một số bài viết về hoạt động bitwise, kiểm tra xem một số có phải là lũy thừa 2 không, v.v. Tôi biết hàm đệ quy là gì . Tôi không hiểu tại sao nó lại được sử dụng theo cách này và tại sao nó lại hoạt động để trả lời cho câu đố, tức là liên kết giữa đệ quy và! F (sức mạnh của hai) <==> số ác. Nếu bạn có thời gian, lời giải thích sẽ được chào đón :) cảm ơn!
supafly

1
@supafly Tôi đã thêm một lời giải thích. Và BTW: chào mừng bạn đến với PPCG!
Arnauld

Việc xử lý rất rõ ràng bây giờ. Tuy nhiên, ý tưởng / lý luận thực sự kỳ diệu! Cám ơn vì đã giải thích!
supafly

13

Python 2 , 25 byte

lambda n:int(bin(n),13)%2

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

bin(n)đưa ra một kết quả như '0b10101'. Đọc số này dưới dạng số nguyên 13, chúng tôi nhận được

làm giảm modulo 2 đến 1 1 5 + 1 1 4 + 0 1 3 + 1 1 2 + 0 1 1 + 1 1

11135+1134+0133+1132+0131+1130
1 + 1 + 0 + 1 + 0 + 1
115+114+013+112+011+110(mod2)
1+1+0+1+0+1(mod2).

Vì vậy, int(bin(n),13)%2bằng 1 + (số lượng trong bin(n)) modulo 2.

Nếu nlà ác, thì kết quả là 1; nếu không thì bằng 0.

Tôi đã chọn thủ thuật này từ Noodle9 .


Vì đây là Python 2, mã có thể được rút ngắn hơn nữa với cú pháp backrick repr không dùng nữa : lambda n:int(`n`,13)%2. Hãy thử trực tuyến!
GarethPW

Vâng, đã có một chút xì hơi ở đó và quên mất mục đích của cuộc tranh luận cơ bản. Rất tiếc!
GarethPW

11

Japt -h!, 5 4 3 byte

¤å^

Thử nó


Giải trình

¤       :Convert to base-2 string
 å^     :Cumulatively reduce by XORing
        :Implicitly output the last element negated

@LuisfelipeDejesusMunoz, chuyển giải pháp 05AB1E của Kevin cũng hoạt động ở mức 5 byte, nếu bạn muốn thử điều đó.
Xù xì

¤¬x vđây là câu trả lời của kevin
Luis felipe De jesus Munoz

@LuisfelipeDejesusMunoz, yup, vậy thôi.
Xù xì

8

C # (Trình biên dịch tương tác Visual C #) , 43 38 byte


Chơi thử trực tuyến!

i=>Convert.ToString(i,2).Sum(c=>c)%2<1

Bị đánh cắp

i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1

Mã đầy đủ với các bài kiểm tra

Func<Int32, Boolean> f = i => Convert.ToString( i, 2 ).Sum( c => c ) % 2 < 1;

Int32[] testCases = { 3, 11, 777, 43, 55 };

foreach( Int32 testCase in testCases ) {
    Console.Write( $" Input: {testCase}\nOutput: {f(testCase)}" );
    Console.WriteLine("\n");
}

Console.ReadLine();

Phát hành

  • v1.1 - -5 bytes- Thay thế CountchoSum
  • v1.0 - 43 bytes- Giải pháp ban đầu.

Ghi chú

  • không ai

2
Nâng cao cho tiếng cười khúc khích "phiên bản" vô danh của bạn đã cho tôi.
Jack Brounstein

8

Bash (không có tiện ích bên ngoài), 56 44 byte

while(($1));do set $(($1/2)) $(($2+$1%2));done;!(($2%2))

(($1))&&exec $0 $[$1/2] $[$2+$1%2];!(($2%2))

Điều này giả định rằng số được tìm thấy trong $1, đã được thông qua làm đối số dòng lệnh đầu tiên. Nó cũng giả định rằng đây là một kịch bản shell (để nó có thể exectự).

Nó đệ quy, sau một thời trang, sử dụng exec $0, cho đến khi số (in $1) bằng 0, chia cho hai trong mỗi lần lặp. Nó cũng tính tổng (số $2) số lần chúng ta nhận được một số lẻ. Cuối cùng, số ban đầu là "ác" nếu tổng $2bằng không lẻ.

Ví dụ yêu cầu:

$ ./script 3 && echo evil
evil

$ ./script 11 && echo evil

$ ./script 777 && echo evil
evil

$ ./script 43 && echo evil
evil

$ ./script 55 && echo evil

Dành cho 0:

$ ./script 0 && echo evil
./script: line 1: ((: %2: syntax error: operand expected (error token is "%2")
evil

Kết quả chính xác, với một chút phụ ở bên.


7

R , 37 26 byte

!sum(scan()%/%2^(0:31))%%2

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

Một thay thế cho câu trả lời của Robert S. , điều này tránh khỏi sự phân tách bit tích hợp nhưng kết thúc ít golf hơn và nhờ JayCe và digEmAll kết thúc trong việc chơi gôn nhẹ hơn.

231-1


Tại sao không mã hóa cứng 31 thay vì log2? Hãy thử trực tuyến!
digEmAll

@digEmAll Điều đó có nghĩa là không cần xác định x
JayCe

231-1%/%%%

Ngoài ra intToBits chỉ hỗ trợ các giá trị số nguyên tối đa 2 ^ 31-1;)
digEmAll



5

R , 99 98 44 34 28 byte

-1 cảm ơn Kevin Cruijssen! -54 cảm ơn ngm! -10 cảm ơn Giuseppe! -6 cảm ơn JayCe!

!sum(intToBits(scan())>0)%%2

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


Ngoài ra, sử dụng binaryLogicgói (39 byte):

!sum(binaryLogic::as.binary(scan()))%%2

2
Tôi không biết R quá rõ, nhưng tôi khá chắc chắn ==0có thể <1:)
Kevin Cruijssen


1
Tốt đẹp! Có thể có 34 byte
Giuseppe

1
Điều này cũng hoạt động như tôi nghĩ: 32 byte Nhưng đòi hỏi một chút giải thích :)
digEmAll


5

C (gcc) , 36 byte

c;f(n){for(c=0;n;c++)n&=n-1;n=~c&1;}

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

Phương pháp từ K & R https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan

Phải được biên dịch với mức tối ưu hóa 0


Không biên dịch trên gcc 5.4.0: error: expected constructor, destructor, or type conversion before '(' token(mũi tên đang chỉ vào ftên hàm). Tôi cần những gì trình biên dịch cờ?
Villapx

1
Không làm việc với -O.
nwellnhof

2
"Trả về 0 cho sự thật, 1 cho chim ưng" Điều này có hợp pháp không? Không cố làm mất uy tín câu trả lời của bạn, chỉ tò mò và bởi vì nó sẽ tiết kiệm cho tôi một byte. Lưu ý: Từ trung thực trong câu hỏi liên kết đến câu trả lời này . Và bình luận này cũng đề cập đến sự thật.
Borka223

@nwellnhof @villapx Biên dịch tốt trên 7.3.0 của tôi - chỉ cần đảm bảo rằng bạn không thiếu -O0cờ trình biên dịch.

@ Borka223 hmmm sau nhiều tháng lướt qua trang web này, tôi đã có ấn tượng rằng sự thật và chim ưng có thể là bất cứ điều gì, miễn là chúng phù hợp với giải pháp của bạn. Tuy nhiên, câu trả lời bạn liên kết chắc chắn có vẻ mâu thuẫn với điều đó. Tôi đã đi trước và thêm byte. Cảm ơn
vazt


4

PHP, 37 36 byte

<?=1&~substr_count(decbin($argn),1);

Để chạy nó:

echo '<input>' | php -nF <filename>

Hoặc dùng thử trực tuyến!

In 1đúng và 0sai.

-1 byte nhờ Benoit Esnard !


1
Tôi nghĩ bạn có thể lưu một byte bằng cách loại bỏ thao tác modulo : <?=1&~substr_count(decbin($argn),1);. Cái này cũng in 0 cho sai.
Benoit Esnard

Cảm ơn @BenoitEsnard! Điều đó rất thông minh, tôi đã cập nhật câu trả lời của mình :) Bạn học được điều gì đó mới mỗi ngày!
Davіd

4

Brachylog , 4 byte

ḃo-0

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

Với nhiều trường hợp thử nghiệm (là xấu và thì không.)

Sử dụng một cái gì đó tôi đã khám phá gần đây về -vị ngữ: tài liệu của nó chỉ nói "sự khác biệt của các yếu tố của [đầu vào]", nhưng những gì nó thực sự làm là "tổng các yếu tố được lập chỉ mục chẵn (bắt đầu từ 0) của đầu vào, trừ đi tổng số lẻ các yếu tố liên quan đến đầu vào ".

Đây,

chuyển đổi số thành một mảng các chữ số nhị phân,

o sắp xếp chúng để mang tất cả các số 1 lại với nhau.

Bây giờ, nếu có số 1 chẵn, sẽ có số 1 bằng nhau trong các chỉ số chẵn và chỉ số lẻ. Vì vậy, -sau đó sẽ cho 0. Nhưng nếu có một số lẻ 1s, sẽ có thêm 1 điểm xuất hiện, dẫn đến sự khác biệt là -1 hoặc 1.

Vì vậy, cuối cùng, chúng tôi khẳng định rằng sự khác biệt là 0và có được kết quả đúng hoặc sai theo đó. Với các yêu cầu đầu ra linh hoạt hơn , điều này có thể được loại bỏ cho câu trả lời 3 byte, với 0 là đầu ra trung thực và -1 và 1 là cả hai đầu ra falsey.


4

INTERCAL , 90 65 63 byte

DOWRITEIN:1
DO:2<-'#0$#65535'~?':1~:1'
DOREADOUT:2
PLEASEGIVEUP

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

Ung dung và mở rộng (cho những gì nó có giá trị) với các bình luận kiểu C.

DO WRITE IN :1 //Store user input in 1
DO :2<-:1~:1 //Select just the ones. So will convert binary 10101 to 111
DO :3<-:?2 //Run the unary xor over the result. Essentially, xor with the right bitshifted
           //(with wraparound) value).
DO :9<-#0$#65535 //Intermingle the 16 bit values of all 0's and all 1's, to create a
                 //32 bit number with 1's in the odd positions.
DO :4<-:9~:3 //It turns out that at this point, evil numbers will have no bits in odd
             //positions, and non-evil numbers will have precisely one bit in an odd
             //position. Therefore, the ~ will return 0 or 1 as appropriate.
PLEASE READ OUT :4 //Politely output
PLEASE GIVE UP //Polite and self explanatory

Tôi đã phải thực hiện một vài nhượng bộ để biến điều này thành khả thi trong INTERCAL. Đầu tiên là, như với tất cả các chương trình INTERCAL, đầu vào số phải được viết ra. Vì vậy, nếu bạn muốn đầu vào, 707bạn sẽ cung cấp SEVEN OH SEVEN.

Thứ hai là INTERCAL không thực sự có giá trị trung thực hoặc giả. Thay vào đó, nó sẽ xuất ra Số La Mã I(1) nếu số đó không xấu hoặc 0 (thường được biểu thị là -vì Số La Mã thường không thể đại diện cho 0).

Nếu bạn muốn lật chúng để các số ác trả về 1 và các số không ác trả về 0, bạn có thể thay đổi dòng 4 và 5 từ phiên bản không được mã hóa như sau, mặc dù nó có thêm 3 byte.

DO:9<-#65535$#0
DO:4<-#1~:9~3


3

dc , 18 16 byte

[2~rd1<M+]dsMx2%

Trả về (cho ngăn xếp) 0 cho ác và 1 cho không ác

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

Khá đơn giản - áp dụng đệ quy toán tử thương số / phần dư kết hợp cho thương số ~mới và cộng tất cả các phần còn lại với nhau, sau đó sửa đổi 2 (sau khi chi hai byte để chuyển sang một giá trị trung thực / giả) .

Được chỉnh sửa để phản ánh sự đồng thuận rằng 0 cho sự thật và 1 cho sự giả dối là được, đặc biệt là trong một ngôn ngữ không có loại if(boolean)cấu trúc.


3

Python 2, 29 byte

lambda n:~bin(n).count('1')&1

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

Trả về 1 nếu đúng, khác 0.

Chuyển đổi số thành chuỗi nhị phân như '0b11', đếm số 1, nhận phần bù kết quả và trả về bit cuối cùng của phần bù (cảm ơn, https://codegolf.stackexchange.com/users/53560/cdlane !) (1 ​​nếu số ban đầu là chẵn, 0 nếu là số lẻ).


1
Không ít byte hơn nhưng lambda n:~bin(n).count('1')&1thay thế phân chia mô-đun bằng một cái gì đó có khả năng ít tốn kém hơn.
cdlane

3

x86-16, 3 byte

Danh sách NASM:

 1                                  parity16:
 2 00000000 30E0                        xor al,ah
 3 00000002 C3                          ret

Hàm số nguyên 16 bit arg trong AX (bị hủy), giá trị trả về trong PF.

Phần cứng tính toán tính chẵn lẻ của kết quả đối với chúng tôi, trong Parity Flag của x86 . Người gọi có thể sử dụng jp/ jnpđể phân nhánh, hoặc bất cứ điều gì họ thích.

Hoạt động chính xác như câu trả lời Z80 / 8080 của @ cschultz ; trong thực tế, 8086 được thiết kế để làm cho việc chuyển nguồn cơ học từ 8080 trở nên dễ dàng .

Lưu ý rằng PF chỉ được đặt từ byte thấp của kết quả rộng hơn, do đó test edi,edisẽ không hoạt động cho phiên bản x86-64. Bạn sẽ phải chuyển ngang xuống 16 bit hoặc popcnt eax, edi/ and al,1(trong đó 0 là trung thực).


3

C ++ (gcc) (-O0),  36  31 byte

int f(int i){i=!i||i%2-f(i/2);}

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


C ++ (tiếng kêu) , 35 byte

int f(int i){return!i||i%2-f(i/2);}

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


Đây là nỗ lực đầu tiên của tôi khi chơi golf mã, hy vọng tôi không vi phạm bất kỳ quy tắc nào mà tôi có thể đã bỏ lỡ.

Chỉnh sửa:
- Saved 5 byte nhờ @ Jonathan Frech: thay thế !=bởi -returnbằng i=(thay thế cuối cùng dường như không làm việc với kêu vang dù)
- Kể từ khi có vẻ là một cuộc tranh luận liệu tôi có nên sử dụng gcc -O0 lạm dụng, tôi nghĩ tôi có thể chỉ đưa ra cả hai phiên bản


Chào mừng đến với PPCG! Bạn có thể tiết kiệm một byte bằng cách chơi golf !=đến -và bốn khác bằng cách chơi golf returnđể i=.
Jonathan Frech

@JonathanFrech Đã lâu rồi kể từ khi tôi làm C ++, nó có hoàn toàn trả về biểu thức được gán cuối cùng trong một hàm nếu không có câu lệnh return không? Tôi đoán đó là một điều gcc?
- Phục hồi Monica

1
Đây là hành vi lạm dụng hành vi không xác định cụ thể của gcc ở mức tối ưu hóa O0.
Jonathan Frech

Bằng cách chuyển sang K & R C, bạn có thể giảm xuống còn 23 byte (rất ấn tượng!) Hãy thử trực tuyến!
ErikF

@JonathanFrech: tại sao mọi người cứ khăng khăng sử dụng bản gcc -O0hack ngu ngốc đó ? Nó không giống như độ dài của tổng số nồi hơi của ngôn ngữ là vấn đề quan trọng khi so sánh việc triển khai. Ngoài ra, điều thú vị hơn là chọn giữa returnso với gọi theo tham chiếu (cập nhật *itại chỗ). Tôi thà viết câu trả lời C hoặc C ++, không phải câu trả lời không được tối ưu hóa-gcc, bởi vì không tối ưu hóa-gcc không phải là một ngôn ngữ rất hữu ích.
Peter Cordes

3

SML , 32 byte

fun%0=1| %n=(n+ %(n div 2))mod 2

Giải thích:

  • % là tên hàm
  • nhận đầu vào thay thế và trả về 1 nếu xấu, 0 nếu không
  • n là đầu vào, trả về (n +% (n // 2))% 2

Được thực hiện bởi 2 sinh viên Carnegie Mellon buồn chán


Chào mừng bạn đến với PPCG, và câu trả lời đầu tiên tốt!
mbomb007

2

Forth (gforth) , 53 byte

: f 1 swap begin 2 /mod -rot xor swap ?dup 0= until ;

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

Giải trình

Lấy tổng xor của các chữ số của dạng nhị phân của số. (liên tục chia cho 2 và xors phần còn lại với giá trị "tổng")

Giải thích mã

: f              \ begin a new word definition
  1 swap         \ place 1 on the stack below the input (n)
  begin          \ start an indefinite loop
    2 /mod       \ get the quotient and remainder of dividing n by 2
    -rot         \ move the sum and remainder to the top of the stack
    xor          \ xor the sum and remainder
    swap         \ move the quotient back to the top of the stack
    ?dup         \ duplicate if > 0
    0=           \ get "boolean" indicating if quotient is 0
  until          \ end the loop if it is, otherwise go back to the beginning
;                \ end the word definition

2

Java 8, 40 36 byte

n->n.toString(n,2).chars().sum()%2<1

-4 byte nhờ @Okx cho một cái gì đó tôi không nên quên mình ..

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

Giải trình:

n->                // Method with Integer parameter and boolean return-type
  n.toString(n,2)  //  Convert the integer to a binary String
   .chars()        //  Convert that to an IntStream of character-encodings
   .sum()          //  Sum everything together
    %2<1           //  And check if it's even

Lưu ý rằng mã hóa ký tự cho 014849, nhưng tóm tắt chúng và lấy modulo-2 vẫn giữ kết quả chính xác bởi vì 48%2 = 049%2 = 1.


1
n.toString(n,2)tiết kiệm 4 byte.
Okx

@Okx Không chắc là tôi đã quên cái đó như thế nào, lol .. Cảm ơn! ;)
Kevin Cruijssen

Nếu bạn được phép sử dụng 1 và 0 thay vì đúng và sai (không chắc chắn cho Java), bạn có thể thay đổi thành: ~n.toString(n,2).chars().sum()%2để lưu một byte.
Mario Ishac

1
@MarDev Thật không may 01không trung thực / falsey trong Java, chỉ booleans/ Booleanslà. Nếu một thách thức nêu rõ hai đầu ra riêng biệt được cho phép thì <1có thể đã bị xóa để lưu 2 byte thực sự. :)
Kevin Cruijssen


2

Võng mạc 0.8.2 , 28 byte

.+
$*
+`(1+)\1
$+0
0

11

^$

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

.+
$*

Chuyển đổi sang unary.

+`(1+)\1
$+0

Chuyển đổi nhị phân một phần (để lại số 0 thêm).

0

Xóa tất cả các số không.

11

Modulo những người hai.

^$

Kiểm tra xem kết quả có bằng không.


2

Hội x86, 12 11 byte

F3 0F B8 44 24 04  popcnt      eax,dword ptr [esp+4] ; Load EAX with the number of ones in arg
F7 D0              not         eax ; One's complement negation of EAX
24 01              and         al,1 ; Isolate bottom bit of EAX
C3                 ret             

-1 byte nhờ đề xuất của @ trần


@ceilingcat Bắt tốt!
Govind Parmar

1
Đề nghị inc eaxthay vì not eax. Cũng có thể muốn đề cập rằng điều này đòi hỏi một bộ xử lý có hỗ trợ cho popcnthướng dẫn.
trần mèo

1
ngoài ra bạn không phải mất arg từ stack. xem các quy ước được gọi là codegolf.stackexchange.com/a/161497/17360 (câu trả lời sâu hơn của Peter Cordes codegolf.stackexchange.com/a/165020/17360 )
qwr

1
Lưu ý rằng bạn có thể trả lại một boolean trong FLAGS stackoverflow.com/a/48382679/3163618
qwr

666 không phải là một trường hợp thử nghiệm?
Arcanist Lupus

2

Tiện ích Bash + GNU, 33

dc -e2o?p|tr -d 0|wc -c|dc -e?2%p

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

Đọc đầu vào từ STDIN. Đầu ra 1 cho True và 0 cho Sai.

  • dc chuyển đổi đầu vào thành một chuỗi nhị phân
  • tr loại bỏ số không
  • wc đếm những cái còn lại (và dòng mới, điều chỉnh ý nghĩa của logic
  • dc tính toán mod 2 và đưa ra câu trả lời

2

Python 2, 28 27 byte

f=lambda n:n<1or n&1^f(n/2)

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

Trả về một giá trị trung thực nếu chính xác một trong số đó the ones-bit is a 1the result of calling this function on n/2 is truthylà đúng (hoặc n==0). Nó hoạt động vì n/2tương đương với một bithift bên phải với phân chia sàn (chỉ dành cho Python 2).

Phiên bản thay thế, cũng 28 27 byte

g=lambda n:n<1or g(n&n-1)^1

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

Dựa trên phương pháp K & R đếm các bit set được tham chiếu bởi vazt.

Cả hai đều có thể ngắn hơn hai byte nếu đầu ra cho phép falsey có nghĩa là xấu xa.

Chỉnh sửa: Cảm ơn lưỡng cư vì đã tiết kiệm một byte!


Bạn có thể xóa khoảng trắng giữa 1orđể lưu byte +1. Giải pháp tốt đẹp!
Lưỡng cư

Man, tôi nghĩ tôi đã thử nó. Nắm bắt tốt!
Jack Brounstein

2

APL (Dyalog Unicode) , 10 byte SBCS

Chức năng ngầm ẩn danh. Có thể lấy bất kỳ mảng số nguyên nào làm đối số.

≠⌿12∘⊥⍣¯1

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

2∘⊥⍣¯1 chuyển đổi thành nhị phân, sử dụng bao nhiêu chữ số cần thiết cho số lớn nhất, các chữ số riêng biệt dọc theo trục chính

1⍪ trả trước những cái dọc theo trục chính

≠⌿ Giảm XOR dọc theo trục chính


2

J , 9 byte

Chức năng ngầm ẩn danh. Có thể lấy bất kỳ mảng số nguyên nào làm đối số.

1-2|1#.#:

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

1- một điểm trừ (tức là phủ định logic của)

2| mod-2 của

1#. tổng (lit. đánh giá cơ sở-1) của

#: biểu diễn nhị phân


Đẹp quá Cách tiếp cận nhàm chán là 9 byte:2|1+1#.#:
Conor O'Brien

Điều này dường như chỉ hoạt động vì 777 trong đầu vào làm cho mỗi số được biểu thị trong 10 bit. Thay thế nó bằng ví dụ 480 và đầu ra lật.
FrownyFrog

@ ConorO'Brien Bumps trumps không chính xác.
Adám

@FrownyFrog Đã sửa.
Adám
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.