Đây là một phiên bản của thử thách gần đây Con số này có phải là số nguyên của -2 không? với một bộ tiêu chí khác nhau được thiết kế để làm nổi bật bản chất thú vị của vấn đề và làm cho thách thức trở nên khó khăn hơn. Tôi xem xét một số ở đây .
Thách thức như Toby đã nêu một cách tuyệt vời trong câu hỏi được liên kết, là:
Có nhiều cách thông minh để xác định xem một số nguyên có phải là công suất chính xác không 2. Đó không còn là vấn đề thú vị nữa, vì vậy hãy xác định xem một số nguyên đã cho có phải là công suất chính xác của -2 hay không . Ví dụ:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Quy tắc:
- Một số nguyên là 64 bit, đã ký, hai phần bù. Đây là loại dữ liệu duy nhất bạn có thể làm việc với.
- Bạn chỉ có thể sử dụng các hoạt động sau đây. Mỗi trong số này được tính là một hoạt động.
n << k
,n >> k
: Dịch chuyển trái / phảin
theok
bit. Dấu bit được mở rộng trong ca phải.n >>> k
: Phải dịch chuyển nhưng không mở rộng bit dấu. 0 là được chuyển trong.a & b
,a | b
,a ^ b
: Bitwise AND, OR, XOR.a + b
,a - b
,a * b
: Thêm cộng, trừ, nhân.~b
: Đảo ngược bit.-b
: Hai phủ định bổ sung.a / b
,a % b
: Chia (thương số nguyên, làm tròn về 0) và modulo.- Modulo của số âm sử dụng các quy tắc được chỉ định trong C99 :
(a/b) * b + a%b
sẽ bằng nhaua
. Vì vậy,5 % -3
là2
, và-5 % 3
là-2
: 5 / 3
là1
,5 % 3
là2
, như 1 * 3 + 2 = 5.-5 / 3
là-1
,-5 % 3
là-2
, như -1 * 3 + -2 = -5.5 / -3
là-1
,5 % -3
là2
, như -1 * -3 + 2 = 5.-5 / -3
là1
,-5 % -3
là-2
, như 1 * -3 + -2 = -5.- Lưu ý rằng
//
toán tử phân chia tầng của Python không thỏa mãn tính chất phân chia "tròn về 0" ở đây và%
toán tử của Python cũng không đáp ứng các yêu cầu.
- Modulo của số âm sử dụng các quy tắc được chỉ định trong C99 :
- Bài tập không được tính là một hoạt động. Như trong C, các phép gán đánh giá giá trị của phía bên trái sau khi gán:
a = (b = a + 5)
đặtb
thànha + 5
, sau đó đặta
thànhb
và được tính là một thao tác. - Bài tập tổng hợp có thể được sử dụng
a += b
phương tiệna = a + b
và được tính là một thao tác.
- Bạn có thể sử dụng hằng số nguyên, chúng không được tính là bất cứ thứ gì.
- Dấu ngoặc đơn để xác định thứ tự các hoạt động được chấp nhận.
- Bạn có thể khai báo các chức năng. Khai báo hàm có thể theo bất kỳ kiểu nào thuận tiện cho bạn nhưng lưu ý rằng số nguyên 64 bit là kiểu dữ liệu hợp lệ duy nhất . Khai báo hàm không được tính là hoạt động, nhưng một lệnh gọi hàm được tính là một. Ngoài ra, để rõ ràng: Các hàm có thể chứa nhiều
return
câu lệnh vàreturn
s từ bất kỳ điểm nào được cho phép. Bảnreturn
thân nó không được tính là một hoạt động. - Bạn có thể khai báo các biến miễn phí.
- Bạn có thể sử dụng
while
các vòng lặp, nhưng bạn không thể sử dụngif
hoặcfor
. Toán tử được sử dụng trongwhile
điều kiện tính vào điểm số của bạn.while
các vòng lặp thực thi miễn là điều kiện của chúng ước tính giá trị khác không ("trung thực" 0 trong các ngôn ngữ có khái niệm này không phải là kết quả hợp lệ). Kể từ sớm trở lại được cho phép, bạn được phép sử dụngbreak
cũng - Tràn / tràn được cho phép và không có giá trị kẹp sẽ được thực hiện. Nó được xử lý như thể hoạt động thực sự xảy ra chính xác và sau đó bị cắt thành 64 bit.
Tiêu chí chấm điểm / chiến thắng:
Mã của bạn phải tạo ra một giá trị khác không nếu đầu vào là lũy thừa -2 và khác 0.
Đây là nguyên tử-mã-golf . Điểm của bạn là tổng số thao tác có trong mã của bạn (như được xác định ở trên), không phải là tổng số thao tác được thực hiện trong thời gian chạy. Các mã sau đây:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Chứa 5 hoạt động: hai trong chức năng và ba cuộc gọi chức năng.
Không quan trọng bạn trình bày kết quả của mình như thế nào, sử dụng bất cứ điều gì thuận tiện trong ngôn ngữ của bạn, cuối cùng là lưu trữ kết quả trong một biến, trả về từ một hàm hoặc bất cứ điều gì.
Người chiến thắng là bài đăng chính xác (cung cấp bằng chứng ngẫu nhiên hoặc chính thức nếu cần thiết) và có số điểm thấp nhất như mô tả ở trên.
Thưởng thử thách chế độ rất khó!
Để có cơ hội chiến thắng hoàn toàn không có gì ngoại trừ khả năng gây ấn tượng với mọi người trong các bữa tiệc, hãy gửi câu trả lời mà không cần sử dụng while
các vòng lặp! Nếu đủ số này được gửi, tôi thậm chí có thể xem xét chia các nhóm chiến thắng thành hai loại (có và không có vòng lặp).
Lưu ý: Nếu bạn muốn cung cấp giải pháp bằng ngôn ngữ chỉ hỗ trợ số nguyên 32 bit, bạn có thể làm như vậy, miễn là bạn đủ khả năng biện minh rằng nó sẽ vẫn đúng cho số nguyên 64 bit trong phần giải thích.
Ngoài ra: Một số tính năng cụ thể về ngôn ngữ có thể được cho phép miễn phí nếu chúng không trốn tránh các quy tắc nhưng cần thiết để ép buộc ngôn ngữ của bạn hành xử theo các quy tắc trên . Ví dụ (giả định), tôi sẽ cho phép miễn phí không bằng 0 so với while
các vòng lặp, khi áp dụng cho điều kiện nói chung, như một cách giải quyết cho một ngôn ngữ có "0" trung thực. Các nỗ lực rõ ràng để tận dụng các loại điều này là không được phép - ví dụ: khái niệm giá trị "trung thực" 0 hoặc "không xác định" không tồn tại trong quy tắc trên và do đó chúng có thể không được dựa vào.
m ^= s
nó vẫn không ấn tượng và tôi nghĩ sẽ hoàn toàn ổn khi thay thế để cải thiện nó nhiều hơn nữa.
while
và break
không if
? if (x) { ... }
tương đương với while (x) { ... break; }
.
break
và lợi nhuận sớm là phần đáng tiếc) và là một câu chuyện dài và một bài học kinh nghiệm về các quy tắc cho các thách thức trong tương lai. Luôn có phiên bản "tiền thưởng"! :)
if
và for
không được phép? int x=condition; while (x) { ... x=0; }
là miễn phí, chỉ cần thêm mã. Điều tương tự với phong cách c for
.