นิพจน์ที่สั้นที่สุดสำหรับ {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}


24

{0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}รายการที่กำหนดของจำนวนเต็ม สำหรับผู้ที่สนใจตัวเลขเหล่านี้จะใช้ในการคำนวณวันทำงาน

Weekday = (m[n] + d + y + y>>2 + y/400 - y/100) % 7;ที่m[n]- การแสดงออกของฉันค้นหาd- วันเดือน, -yyear - (month <= 2)

สร้างการแสดงออกซึ่งประกอบด้วยตัวดำเนินการทางคณิตศาสตร์ตรรกะและตัวดำเนินการบิตซึ่งจะส่งออกสำหรับจำนวนเต็มบวกnจำนวนเต็มmดังนั้นที่m % 7เท่ากับจำนวนที่ n ในรายการ

ไม่อนุญาตให้ใช้สาขาผู้ประกอบการที่เกี่ยวข้องกับการค้นหาตารางและพอยน์เตอร์

คะแนน:
1 - สำหรับ| & ^ ~ >> <<ผู้ประกอบการ
1.1 - สำหรับ+ - < > <= >= == != ! && ||ผู้ประกอบการ
1.2 - สำหรับ*ผู้ประกอบการ
1.4 - สำหรับ/ %ผู้ประกอบการ

ตอบด้วยคะแนนต่ำสุดที่ชนะ

ส่วนตัวฉันได้พบ:

(41*n)>>4+((n+61)>>4)<<2ด้วยคะแนน 6.4 ฉันคิดว่ามันจะยากที่จะหาเพื่อให้การแสดงออกของตัวเองเพื่อเริ่มต้นด้วย


ฉันเดาว่าไม่ควรใช้อาร์เรย์ dereferencing (และญาติ)?
John Dvorak

โอ้ใช่ฉันได้แก้ไขคำถามแล้ว
Somnium

6
คำถามจะได้รับการปรับปรุงอย่างมากจากแรงจูงใจบางอย่าง ตัวเลขเหล่านี้มาจากไหน
Peter Taylor

table lookupsถ้อยคำที่น่าสนใจฉันคิดว่า ...
JulıJuluʎs

4
ทำไมไม่นับ% 7 ในคะแนน? อาจมีวิธีแก้ไขปัญหาอื่นที่ไม่ได้ใช้% เลขศูนย์เป็นบวก , ลบ, ทั้งสองอย่างหรือไม่มีอะไรเลย?
Thomas Weller

คำตอบ:


34

2 2.2

ฉันชอบเลขคณิตความแม่นยำที่กำหนดเอง

0x4126030156610>>(n<<2)

หรือถ้าคุณไม่ชอบเลขฐานสิบหก

1146104239711760>>(n<<2)

ทดสอบ:

print([(0x4126030156610>>(n<<2))%7 for n in range(1,13)])
[0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]

คุณสามารถสร้างตารางการค้นหาด้วย4*nแทนและบันทึก 0.2 คะแนนด้วยการเขียนเป็นn<<2?
xnor

@xnor อย่างแน่นอน! เพียงเพื่อเปลี่ยนจากฐานแปดเป็นเลขฐานสิบหก เช่นเดียวกับวินาที
isaacg

เย็น. ฉันไม่มีอะไรเชื่อสวยสามารถทำได้ดีกว่าเพราะมันจะต้องใช้เพียงหนึ่งในการดำเนินงานและพวกเขาทั้งหมดดูเหมือนจะมี 7mod ผู้สมัครที่ดีที่สุดของฉันของการแบ่งชั้นจำนวนเต็มconst/nวิ่งเข้าไปในความขัดแย้งด้วยและn=4 n=8
xnor

@xnor อีกหนึ่งใกล้const%nที่สามารถตอบสนองทุกอย่างยกเว้น n = 1,2 และ 3
isaacg

ฉันจะทำสิ่งเดียวกัน แต่คุณเอาชนะฉันไป ...
Julıʇǝɥʇuʎs

32

2.0

(127004 >> i) ^ 60233

หรือ (คะแนน 2.2):

(i * 3246) ^ 130159

ทั้งหมดพบกับกำลังดุร้าย :-)


เนื่องจากนี่มีคะแนนเท่ากันกับคำตอบของ isaacg แต่ไม่ได้ใช้จำนวนเต็ม 64 บิตฉันจึงเลือกใช้เป็นคำตอบที่ยอมรับได้ ขอบคุณสำหรับคำตอบ!
Somnium

8
@ user2992539 ถึงแม้ว่าจะดีที่คำตอบนี้ใช้จำนวนเต็ม 32 บิต แต่คุณไม่ได้ระบุเกณฑ์นี้ในความท้าทายของคุณซึ่งทำให้คำตอบของ isaacg นั้นใช้ได้อย่างสมบูรณ์ ดังนั้นคำตอบทั้งสองจึงเสมอกันและฉันคิดว่ามันยุติธรรมที่จะยอมรับคำตอบแรกที่ได้คะแนนนี้เท่านั้น (ความรุ่งโรจน์ถึง Super Chafouin แม้ว่า +1!)
Martin Ender

@ m.buettner ฉันต้องเห็นด้วยกับคุณ ครั้งต่อไปฉันจะระมัดระวังมากขึ้นด้วยคำอธิบายและการเลือกคำตอบ
Somnium

เพื่อให้ผู้อื่นเรียนรู้คุณสามารถอธิบายอย่างละเอียดถึงวิธีการคำนวณแรงเดรัจฉานอย่างไร
Thomas Weller

@ โทมัสฉันเพิ่งทำforลูปสองครั้งทดสอบค่าทั้งหมด p, q สำหรับสูตร(p >> i) ^ qจากนั้นก็ไปดื่มกาแฟและ 10 ล้านต่อมาก็มาอ่านผล
Arnaud

8

35.3

ฉันสงสัยว่านี่อาจเป็นวิธีที่มีประสิทธิภาพน้อยที่สุดในการสร้างรายการ:

1.7801122128869781e+003 * n - 
1.7215267321373362e+003 * n ^ 2 + 
8.3107487075415247e+002 * n ^ 3 - 
2.0576746235987866e+002 * n ^ 4 + 
1.7702949291688071e+001 * n ^ 5 + 
3.7551387326116981e+000 * n ^ 6 - 
1.3296432299817251e+000 * n ^ 7 + 
1.8138635864087030e-001 * n ^ 8 - 
1.3366764519057219e-002 * n ^ 9 + 
5.2402527302299116e-004 * n ^ 10 - 
8.5946393615396631e-006 * n ^ 11 -
7.0418841304671321e+002

ฉันแค่คำนวณการถดถอยพหุนาม ฉันอยากรู้ว่าวิธีการอื่นใดที่น่ากลัวที่สามารถทำได้

โดยเฉพาะอย่างยิ่งฉันสามารถบันทึก 3.3 คะแนนถ้าผลลัพธ์ถูกปัดเศษ เมื่อมาถึงจุดนี้ฉันไม่คิดว่าเรื่องนี้


5

3.2

วิธีการแก้ปัญหาที่เป็นศูนย์:

7 & (37383146136 >> (i*3))

โซลูชันพื้นฐานเดียว:

7 & (299065169088 >> (i*3))

ตอนแรกฉันคิดว่าการ%7ดำเนินการจะถูกนับเช่นกันและ%การดำเนินการที่มีราคาแพงที่นี่ฉันพยายามที่จะแก้ปัญหาโดยไม่ได้

ฉันมาที่ผลลัพธ์ 3.2 เช่นนี้:

// Construction of the number
// Use 3 bits per entry and shift to correct place
long c = 0;
int[] nums = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
for (int i = nums.Length - 1; i >= 0; i--)
{
    c <<= 3;
    c += nums[i];
}
// c = 37383146136

// Actual challenge
for (int i = 0; i < 13; i++)
{
    Console.Write("{0} ",7 & 37383146136 >> i*3);
}

ฉันสนใจที่จะเพิ่มประสิทธิภาพโดยใช้วิธีนี้ (ไม่รวม%) ขอบคุณ


นี่มันเจ๋งบางทีมันอาจช่วยฉันได้ซักวัน) คุณคิดว่าฉันควรสร้างคำถามแยกต่างหากสำหรับการลดสูตรทั้งสูตรหรือไม่?
Somnium

1
แล้วไง(0426415305230 >> (i*3)) & 7ล่ะ คุณสามารถดูตัวเลขเอาท์พุทในลำดับย้อนกลับ
CJ Dennis

@CDDennis: ฉันคิดว่าไม่มีเลขฐานแปดใน C #
โธมัสเวลเลอร์

ฉันคิดว่ามันเป็นแค่ C? ฉันไม่เห็นการอ้างอิงอื่น ๆ ถึง C #
CJ Dennis

0

Python (3)

ในวันนี้ฉันมีคำถามไม่กี่ข้อฉันจึงตัดสินใจจัดทำโปรแกรมเพื่อแก้ปัญหาโดยอัตโนมัติในโทเค็น 3 (หรือ 2) นี่คือผลลัพธ์สำหรับความท้าทายนี้:

G:\Users\Synthetica\Anaconda\python.exe "C:/Users/Synthetica/PycharmProjects/PCCG/Atomic golfer.py"
Input sequence: 0 3 2 5 0 3 5 1 4 6 2 4
f = lambda n: (72997619651120 >> (n << 2)) & 15
f = lambda n: (0x426415305230L >> (n << 2)) & 15
f = lambda n: (0b10000100110010000010101001100000101001000110000 >> (n << 2)) & 15

Process finished with exit code 0

พิสูจน์ว่างานนี้:

f = lambda n: (72997619651120 >> (n << 2)) & 15

for i in range(12):
   print i, f(i)

0 0
1 3
2 2
3 5
4 0
5 3
6 5
7 1
8 4
9 6
10 2
11 4

นักแก้ปัญหาของคุณพิจารณาต้นทุนของตัวถูกดำเนินการอย่างไร
Thomas Weller

@ThomasW มันไม่ได้ก็จะมักจะใช้การเปลี่ยนแปลงที่ถูกต้องอาจจะมีการเปลี่ยนแปลงทางด้านซ้าย (ถ้าค่าไม่ได้ 1 บิต) &และ
Julıʇǝɥʇuʎs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.