Tính n% 12


27

Tính nmodulo 12cho số nguyên 32 bit không dấu.

Những quy định:

  • Phải làm việc cho tất cả ntừ 0 đến 23. Các số khác tùy chọn.
  • Chỉ phải sử dụng bất kỳ toán tử nào +-*, ~&^|hoặc <<, >>như thường được xác định trên các gợi ý 32 bit.
  • Có thể sử dụng số lượng tùy ý của các gợi ý không đổi.
  • Không được sử dụng bất kỳ hình thức con trỏ nào, bao gồm mảng hoặc bất kỳ ifcâu lệnh nào , kể cả những thứ được biên dịch thành nếu các câu lệnh như toán tử ternary hoặc toán tử "lớn hơn".

Điểm số:

  • Toán tử + -và toán tử bitwise ~ & ^ | << >>(KHÔNG, AND, XOR, OR, bit shift) cho điểm 1, *cho điểm 2.
  • Tổng số điểm thấp nhất sẽ thắng.

6
Bạn có thể muốn xác định các toán tử cho người dùng ngôn ngữ khác ngoài C / Java. Tôi hiểu +-*là cộng, trừ, nhân; ~&^|là bitwise KHÔNG, AND, XOR, OR; và << >>là bithifts.
Cấp sông St

@steveverrill - cảm ơn. Đó thực sự là ý định.
nbubis

Tôi có thể sử dụng for i in x:y:z, .dostuff?
Οurous

Tôi có thể đặt biến bằng giá trị để sử dụng trong biểu thức không?
xnor

4
hầu hết các trình biên dịch sẽ tối ưu hóa n % 12thành một phép nhân và một sự thay đổi như trong niềm vui của hacker, vì vậy đây là chuyện nhỏ, chỉ cần xuất trình lắp ráp và xem
phuclv

Câu trả lời:


29

4

(Ngôn ngữ không liên quan)

n-((48&(11-n))>>2)

Woo! Đã lên 4.

11-n sẽ đảm bảo tất cả các bit thứ tự cao được đặt khi và chỉ khi n> = 12.

48&(11-n) == nếu n> 11 thì 48 khác 0

(48&(11-n))>>2 == nếu n> 11 thì 12 khác 0

n-((48&(11-n))>>2) là câu trả lời


1
Aww shucks, bạn đánh bại tôi để tiếp cận này! Tôi chỉ còn cách đăng bài n - (((11 - n) & 0xC0000000) >> 28). Làm tốt lắm, tôi không nghĩ nó có thể được thực hiện trong ít hơn bốn.
Runer112

1
@ Runner112 Vâng, tôi đã hy vọng không ai đánh bại tôi khi tôi đăng nó. Mặc dù vậy, hoàn thành tốt việc tìm kiếm nó cho chính mình
isaacg

1
Tuyệt vời :) 4 thực sự là một thành tựu.
nbubis

11

4

Một giải pháp với bảng tra cứu (nó tìm kiếm i ^ (i % 12)):

i ^ (0x1d4c000 >> (i & 0xfc) & 30)

4

Đây là một giải pháp khác với 4 thao tác:

i - ((0xffff >> (i - 12)) & 12)

Nó giả định rằng toán hạng đếm của bithifts được lấy hoàn toàn mod 32, nghĩa x >> -1là giống như x >> 31.

5

Một cách tiếp cận khác, sử dụng bảng tra cứu:

i - (16773120 >> i & 1) * 12

7

bash - 1

echo `seq 0 11` `seq 0 11` | awk '{print $(number+1)}'

ví dụ

$ echo `seq 0 11` `seq 0 11` | awk '{print $(0+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(11+1)}'
11

$ echo `seq 0 11` `seq 0 11` | awk '{print $(12+1)}'
0

$ echo `seq 0 11` `seq 0 11` | awk '{print $(23+1)}'
11

1
Điều này không hợp lệ vì nó sử dụng con trỏ.
tò mò

@cantlydannii Bạn đang đề cập đến con trỏ nào? Các stdinstdoutsuối? Chắc chắn, trong nội bộ, chúng là các con trỏ, nhưng sau đó chúng ta có thể loại bỏ Java vì nó sử dụng Integerlớp bên trong cho rất nhiều thứ.
Cole Johnson

Không phải $ () có hiệu quả tương đương với một con trỏ?
tò mò

@cquildannii - tài liệu awk nói rằng chúng là các biến tích hợp.

5

C, ít endian - 2

Điều này có thể là gian lận nhưng tôi nghĩ rằng nó đáp ứng các quy tắc ...

union {
    int i;
    struct {
        int a:4;
        int b:2;
        int c:10;
    } s;
    struct {
        int a:2;
        int b:14;
    } t;
} u;

u.i = 11-n;
u.s.a = 0;
u.s.c = 0;
result = n-u.t.b;

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

1
Gian lận sắp xếp, vì bạn đang sử dụng = 0 thay vì & 0x0, nên được tính là 2 hoạt động bổ sung. Nhưng +1 cho sự sáng tạo :)
nbubis

4

PHP - điểm 0

Tôi tự hỏi làm thế nào có thể có ai đến với điều này trước tôi !!!

$n = 18;
$s = str_repeat("a", $n);
$s2 = preg_replace('/aaaaaaaaaaaa/', '', $s);
echo strlen($s2);

2
Tốt đẹp. Tôi nghĩ rằng có thể có một vấn đề mặc dù, vì mảng không được phép. Thực sự tốt đẹp mặc dù.
AJMansfield

@AJMansfield Người ta có thể lập luận rằng điều này không có mảng mà là chuỗi (vâng, ở mức chuỗi thấp là mảng byte). :)
xem

1
@seequ Người ta cũng có thể lập luận rằng điều này không hợp lệ vì nó sử dụng RAM (vâng, ở mức độ thấp, ram về mặt kỹ thuật là một mảng được lập chỉ mục) _ (ツ) _ /
Stan Strum

2

C, điểm 5

Hoạt động lên đến 23, không được đảm bảo ở trên đó.

( ((n+4)>>2)&4 ) + n & 15

((n+4)>>2)&4trả về 4 cho n> = 12. Thêm nó vào n và bạn nhận được câu trả lời đúng trong 4 bit ít quan trọng nhất, sau đó cắt bớt các bit khác.


Làm tốt!! Bây giờ hãy xem liệu ai đó có thể đến 4 ..
nbubis

2

bất cứ ngôn ngữ nào: 5

sẽ không chiến thắng, nhưng tham gia vì vui và có thể vì dễ hiểu hơn người khác:

n - ((n+20)>>5)*12

cái này tương đương với

n - (n>11)*12

điều này tương đương vì khi bạn thêm 20 đến 12, bạn nhận được 32, do đó bit thứ 5 trở thành 1. Điều này chỉ khi n> 1 là 32 là số nhỏ nhất trong đó bit thứ 5 trở thành 1.

cũng lưu ý rằng có thể dễ dàng mở rộng cho phạm vi cao hơn, như bạn có thể làm

n - ((n+20)>>5)*12 - ((n+41)>>5)*12

để đạt đến một phạm vi cho đến 35


1

Con trăn 2.x - 4

j=input();m=lambda a,b:a*b;a=(m(j,357913942)>>32);print j-m(12,a)

=một nhà điều hành?

Trong trường hợp đó điểm số là 6.

j-12*(j*357913942>>32)

Giải pháp của BTW @steveverrill cũng có thể được sử dụng trực tiếp trong Python.

Hoạt động cho phạm vi 0 .. 23

Vì vậy những gì đang xảy ra ? Nhân với 357913942 và chia cho 2 ^ 32 (hoặc sang phải 32)


Tôi thích cách bạn sử dụng một hàm để nhân chỉ một lần. nhưng imho bạn chỉ đổi tên phép nhân thành hàm m (,), với tôi nghĩa là bạn đã sử dụng nó hai lần.
Pinna_be

phụ thuộc vào cách các quy tắc được diễn giải, nhưng bạn có một điểm hợp lệ
Willem

1

C 6

(n - (((n * 0xAAAB) >> 19)) * 12 )

Đây có thể là một phần của câu hỏi hoặc chỉ là một câu trả lời khác. Tôi đề nghị sau.
Jwosty

@Jwosty - đã thay đổi.
nbubis

0

Rắn hổ mang - 2 (hoặc 3)

def modulo12(n as uint32) as uint32
        for i in 11:n to int64:12,n-=12
        return n

Điều này thể uốn cong các quy tắc một chút, nhưng tôi đã hỏi và được phép sử dụng điều này.

Nó cũng hoạt động cho bất kỳ số nào.


0

Kona - 5

Có thể không hợp lệ vì tôi không chắc liệu nhà điều hành sàn có được phép hay không, nhưng tôi đã có hai *và một điểm trừ:

mod:{x-(_0.08333*x)*12}

Mà nên làm việc cho bất kỳ số nguyên.


Tôi không chắc chắn về hoạt động của sàn, nhưng tôi chắc chắn rằng phép nhân đầu tiên đang hoạt động trên một cái gì đó không phải là số nguyên 32 bit.
Runer112

@ Runer112: OP cho biết đầu vào phải là 32 bit và các toán tử được xác định như bình thường với các gợi ý 32 bit; nó không nói gì về các giá trị không nguyên trong mã.
Kyle Kanos

Trừ khi tôi hiểu nhầm điều gì đó, 0,08333 * x dường như không nhân như được định nghĩa trên các gợi ý 32 bit, bởi vì 0,08333 không phải là một uint 32 bit.
Runer112

1
"Có thể sử dụng số lượng tùy ý của các gợi ý không đổi." - tức là không thể sử dụng phao tùy ý.
nbubis

1
@nbubis: dòng đó không thực sự đặt ra giới hạn đối với số float.
Kyle Kanos
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.