คำนวณ n% 12


27

คำนวณnโมดูโล่12สำหรับจำนวนเต็ม 32 บิตที่ไม่ได้ลงนาม

กฎระเบียบ:

  • ต้องใช้งานได้nระหว่าง 0 ถึง 23 หมายเลขอื่น ๆ เป็นตัวเลือก
  • เพียง แต่ต้องใช้ใด ๆ ของผู้ประกอบการ+-*, ~&^|หรือ<<, >>ตามที่กำหนดโดยทั่วไปบน 32 uints บิต
  • อาจใช้จำนวน uints คงที่โดยพลการ
  • ห้ามใช้พอยน์เตอร์รูปแบบใด ๆ รวมถึงอาร์เรย์หรือifข้อความใด ๆรวมถึงสิ่งต่าง ๆ ที่คอมไพล์หากข้อความเช่นตัวดำเนินการแบบไตรภาคหรือตัวดำเนินการ "มากกว่า"

คะแนน:

  • ผู้ประกอบการ+ -และผู้ประกอบการบิต~ & ^ | << >>(ไม่และแฮคเกอร์, OR, บิตกะ) ให้คะแนนของ1, ให้คะแนนของ*2
  • คะแนนรวมต่ำสุดชนะ

6
คุณอาจต้องการกำหนดโอเปอเรเตอร์สำหรับผู้ใช้ภาษาอื่นที่ไม่ใช่ C / Java ฉันเข้าใจว่า+-*เป็นบวกลบคูณด้วย; ~&^|ไม่ใช่ bitwise AND, XOR หรือ; และ<< >>เป็น bitshifts
เลเวลริเวอร์เซนต์

@ สตีฟเวอร์ริลล์ - ขอบคุณ นั่นคือความตั้งใจ
nbubis

ฉันสามารถใช้for i in x:y:z, .dostuff?
Junurous

ฉันสามารถตั้งค่าตัวแปรให้เท่ากับค่าที่ใช้ในนิพจน์ได้หรือไม่?
xnor

4
คอมไพเลอร์ส่วนใหญ่จะปรับn % 12ให้เหมาะสมกับการคูณและการเปลี่ยนแปลงเหมือนอยู่ในความสุขของแฮ็กเกอร์ดังนั้นนี่เป็นเรื่องไม่สำคัญเพียงแค่เอาท์พุทแอสเซมบลีและดู
phuclv

คำตอบ:


29

4

(ภาษาไม่เกี่ยวข้อง)

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

แอ่ว! ได้ถึง 4

11-n จะทำให้มั่นใจได้ว่าบิตลำดับสูงทั้งหมดจะถูกตั้งค่าหาก n> = 12 เท่านั้น

48&(11-n) == ถ้า n> 11 จากนั้น 48 อีก 0

(48&(11-n))>>2 == ถ้า n> 11 แล้ว 12 อีก 0

n-((48&(11-n))>>2) คือคำตอบ


1
อ๊ะคุณชนะข้าด้วยวิธีนี้! n - (((11 - n) & 0xC0000000) >> 28)ผมก็ออกไปจากการโพสต์ช่วงเวลาเท่านั้น ทำได้ดีฉันไม่คิดว่าจะสามารถทำได้ในเวลาน้อยกว่าสี่
Runer112

1
@ Runner112 ใช่ฉันหวังว่าจะไม่มีใครเอาชนะฉันได้เมื่อฉันโพสต์ ทำได้ดีมากในการค้นหาด้วยตัวคุณเองแม้ว่า
isaacg

1
ยอดเยี่ยม :) 4 เป็นความสำเร็จ
nbubis

11

4

วิธีแก้ปัญหาพร้อมกับตารางการค้นหา (มันค้นหาi ^ (i % 12)):

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

4

นี่เป็นอีกวิธีการหนึ่งที่มีการทำงาน 4 อย่าง

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

ก็ถือว่าถูกดำเนินการนับของ bitshifts ถูกนำโดยปริยาย mod 32 คือเป็นเช่นเดียวกับx >> -1x >> 31

5

วิธีอื่นโดยใช้ตารางการค้นหา:

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

7

ทุบตี - 1

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

เช่น

$ 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
สิ่งนี้ไม่ถูกต้องเพราะใช้พอยน์เตอร์
อยากรู้อยากเห็น dannii

@curiousdannii คุณหมายถึงพอยน์เตอร์อะไร? stdinและstdoutลำธาร? แน่นอนว่ามันเป็นพอยน์เตอร์ แต่จากนั้นเราก็อาจตัดสิทธิ์ Java เนื่องจากมันใช้Integerคลาสภายในเพื่อสิ่งต่างๆมากมาย
โคลจอห์นสัน

$ () ไม่เทียบเท่ากับตัวชี้อย่างมีประสิทธิภาพหรือไม่
อยากรู้อยากเห็น dannii

@curiousdannii - เอกสาร awk บอกว่าพวกเขากำลังตัวแปรในตัว

5

C, little-endian - 2

นี่อาจเป็นการโกง แต่ฉันคิดว่ามันเป็นไปตามกฎ ...

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;

มันทำงานยังไง?
nbubis

1
การโกง Sorta เนื่องจากคุณกำลังใช้= 0 แทน& 0x0ซึ่งควรนับเป็นการดำเนินการ 2 เพิ่มเติม แต่ +1 สำหรับความคิดสร้างสรรค์ :)
nbubis

4

PHP - คะแนน 0

ฉันสงสัยว่าเป็นไปได้ยังไงที่ไม่มีใครมาพร้อมกับสิ่งนี้ก่อนฉัน !!!

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

2
ดี ฉันคิดว่าอาจมีปัญหาแม้ว่าจะไม่ได้รับอนุญาตให้ใช้อาร์เรย์ แม้ว่าจะดีจริงๆ
AJMansfield

@AJMansfield หนึ่งอาจโต้แย้งว่าไม่มีอาร์เรย์ แต่มีสตริง (ใช่ที่สตริงระดับต่ำคืออาร์เรย์ไบต์) :)
seequ

1
@seequ One อาจให้เหตุผลว่าสิ่งนี้ไม่ถูกต้องเนื่องจากมันใช้ RAM (ใช่ในระดับต่ำ ram เป็นอาร์เรย์ทางเทคนิคที่จัดทำดัชนี) ¯_ (ツ) _ / ¯
Stan Strum

2

C, คะแนน 5

ทำงานได้ถึง 23 ไม่รับประกันข้างต้น

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

((n+4)>>2)&4ส่งคืน 4 สำหรับ n> = 12 เพิ่มเข้าไปใน n แล้วคุณจะได้คำตอบที่ถูกต้องในบิตที่มีนัยสำคัญน้อยที่สุด 4 บิตจากนั้นตัดส่วนอื่น ๆ


ทำได้ดี!! ตอนนี้เรามาดูกันว่าใครสามารถไปถึง 4 ..
nbubis

2

ภาษาอะไรก็ได้: 5

จะไม่ชนะ แต่มีส่วนร่วมเพราะสนุกและอาจเป็นเพราะเข้าใจง่าย

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

สิ่งนี้เทียบเท่า

n - (n>11)*12

นี่จะเทียบเท่าเพราะเมื่อคุณเพิ่ม 20 ถึง 12 คุณจะได้ 32 ดังนั้นบิตที่ 5 กลายเป็น 1 นี่ก็ต่อเมื่อ n> 1 เป็น 32 คือจำนวนที่เล็กที่สุดที่บิตที่ 5 กลายเป็น 1

โปรดทราบว่าสามารถขยายได้อย่างง่ายดายสำหรับช่วงที่สูงขึ้นตามที่คุณสามารถทำได้

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

เพื่อเข้าถึงช่วงจนถึง 35


1

Python 2.x - 4

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

เป็น=ผู้ประกอบการ?

ในกรณีนั้นคะแนนคือ 6

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

โซลูชันของ BTW @steveverrill สามารถใช้โดยตรงใน Python ได้เช่นกัน

ใช้งานได้ในช่วง 0 .. 23

แล้วเกิดอะไรขึ้น คูณด้วย 357913942 และหารด้วย 2 ^ 32 (หรือกะขวา 32)


ฉันชอบที่คุณใช้ฟังก์ชั่นเพื่อคูณเพียงครั้งเดียว แต่ imho คุณแค่เปลี่ยนการคูณเป็นฟังก์ชัน m (,) ซึ่งสำหรับฉันหมายความว่าคุณใช้มันสองครั้ง
Pinna_be

ขึ้นอยู่กับการตีความกฎ แต่คุณมีจุดที่ถูกต้อง
วิลเล็ม

1

C - 6

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

นี่ควรเป็นส่วนหนึ่งของคำถามหรือเพียงแค่คำตอบอื่น ฉันขอแนะนำอย่างหลัง
Jwosty

@Jwosty - เปลี่ยนแล้ว
nbubis

0

คอบร้า - 2 (หรือ 3)

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

นี่อาจเป็นการดัดกฎนิดหน่อย แต่ฉันถามและได้รับอนุญาตให้ใช้สิ่งนี้

นอกจากนี้ยังใช้งานได้กับหมายเลขใด ๆ


0

โคนา - 5

อาจไม่ถูกต้องเพราะฉันไม่แน่ใจว่าผู้ดำเนินการชั้นได้รับอนุญาต แต่ฉันมีสอง*และลบ:

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

ซึ่งควรทำงานกับจำนวนเต็มใด ๆ


ฉันไม่แน่ใจเกี่ยวกับการทำงานของพื้น แต่ฉันแน่ใจว่าการคูณแรกกำลังทำงานกับสิ่งอื่นที่ไม่ใช่จำนวนเต็ม 32 บิต
Runer112

@ Runer112: OP บอกว่าอินพุตต้องเป็น 32 บิตและโอเปอเรเตอร์เป็นไปตามที่กำหนดโดยปกติแล้วจะมี 32 บิต uints มันบอกว่าไม่มีอะไรเกี่ยวกับค่าที่ไม่ใช่จำนวนเต็มในรหัส
Kyle Kanos

0.08333 * x ไม่เหมือนกับการคูณตามที่นิยามไว้บน uints 32 บิตยกเว้น 0.08333 เพราะ 0.08333 ไม่ใช่ 32-uint
Runer112

1
"อาจใช้จำนวน uints คงที่แบบกำหนดเอง" - ie ไม่สามารถใช้ลอยแบบสุ่มได้
nbubis

1
@nbubis: บรรทัดนั้นไม่ได้มีข้อ จำกัด ในการลอย
Kyle Kanos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.