นี่เป็นรุ่นของการท้าทายล่าสุดตัวเลขนี้เป็นจำนวนเต็ม -2 หรือไม่ ด้วยชุดของเกณฑ์อื่นที่ออกแบบมาเพื่อเน้นลักษณะที่น่าสนใจของปัญหาและทำให้การท้าทายยากขึ้น ฉันใส่พิจารณาบางเป็นมันนี่
ความท้าทายที่ Toby กล่าวไว้อย่างน่าอัศจรรย์ในคำถามที่เชื่อมโยงคือ:
มีวิธีการที่ชาญฉลาดในการระบุว่าเป็นจำนวนเต็มเป็นพลังที่แท้จริงของ 2 นั่นคือไม่ได้เป็นปัญหาที่น่าสนใจเพื่อให้ตรวจสอบว่าเป็นจำนวนเต็มให้เป็นพลังที่แท้จริงของการมี-2 ตัวอย่างเช่น:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
กฎ:
- จำนวนเต็มคือ 64 บิตเซ็นชื่อเป็นส่วนประกอบสองอย่าง นี่เป็นประเภทข้อมูลเดียวที่คุณสามารถใช้งานได้
- คุณสามารถใช้การดำเนินการดังต่อไปนี้เท่านั้น แต่ละสิ่งเหล่านี้นับเป็นการดำเนินการครั้งเดียว
n << k
,n >> k
: เลื่อนไปทางซ้าย / ขวาทีn
ละk
บิต บิตของเครื่องหมายถูกขยายในกะขวาn >>> k
: เลื่อนไปทางขวา แต่ไม่ขยาย bit sign 0 ถูกเลื่อนa & b
,a | b
,a ^ b
: Bitwise AND, OR แฮคเกอร์a + b
,a - b
,a * b
: บวกลบคูณ~b
: การสลับบิต-b
: การปฏิเสธโดยสมบูรณ์ของสองคนa / b
,a % b
: หาร (หารด้วยจำนวนเต็ม, ปัดเศษเป็น 0) และโมดูโล- Modulo ของตัวเลขที่ติดลบใช้กฎที่ระบุไว้ใน C99 : เท่ากับ
(a/b) * b + a%b
a
ดังนั้น5 % -3
เป็น2
และ-5 % 3
เป็น-2
: 5 / 3
คือ1
,5 % 3
คือ2
เป็น 1 * 3 + 2 = 5-5 / 3
is-1
,-5 % 3
is-2
เท่ากับ -1 * 3 + -2 = -55 / -3
is-1
,5 % -3
is2
เท่ากับ -1 * -3 + 2 = 5-5 / -3
คือ1
,-5 % -3
คือ-2
เป็น 1 * -3 + -2 = -5- โปรดทราบว่า
//
ตัวดำเนินการหารพื้นของ Python ไม่พอใจคุณสมบัติ "รอบต่อ 0" ของการแบ่งที่นี่และ%
ตัวดำเนินการของ Python ไม่ตรงตามข้อกำหนด
- Modulo ของตัวเลขที่ติดลบใช้กฎที่ระบุไว้ใน C99 : เท่ากับ
- การมอบหมายไม่นับเป็นการดำเนินการ เช่นเดียวกับใน C การมอบหมายให้ประเมินค่าทางด้านซ้ายหลังจากการกำหนด:
a = (b = a + 5)
ตั้งค่าb
เป็นa + 5
จากนั้นตั้งค่าa
เป็นb
และนับเป็นการดำเนินการหนึ่งครั้ง - การมอบหมายแบบผสมอาจใช้
a += b
วิธีการa = a + b
และนับเป็นการดำเนินการครั้งเดียว
- คุณอาจใช้ค่าคงที่จำนวนเต็มพวกเขาไม่นับเป็นอะไร
- วงเล็บเพื่อระบุลำดับของการดำเนินการเป็นที่ยอมรับ
- คุณอาจประกาศฟังก์ชั่น การประกาศฟังก์ชันสามารถอยู่ในรูปแบบใดก็ได้ที่สะดวกสำหรับคุณ แต่โปรดทราบว่าจำนวนเต็ม 64 บิตเป็นชนิดข้อมูลที่ถูกต้องเท่านั้น การประกาศฟังก์ชันไม่นับเป็นการดำเนินการ แต่การเรียกใช้ฟังก์ชันจะนับเป็นหนึ่ง นอกจากนี้ยังมีความชัดเจน: ฟังก์ชั่นอาจมีหลาย
return
งบและreturn
s จากจุดใดก็ได้ที่ได้รับอนุญาตreturn
ตัวเองไม่ได้นับเป็นการดำเนินการ - คุณสามารถประกาศตัวแปรได้ฟรี
- คุณอาจจะใช้
while
ลูป แต่คุณอาจจะไม่ใช้หรือif
for
ผู้ประกอบการที่ใช้ในwhile
เงื่อนไขจะนับรวมคะแนนของคุณwhile
ลูปดำเนินการตราบเท่าที่เงื่อนไขของพวกเขาประเมินเป็นค่าที่ไม่เป็นศูนย์ ("ความจริง" 0 ในภาษาที่มีแนวคิดนี้ไม่ใช่ผลลัพธ์ที่ถูกต้อง) เนื่องจากอนุญาตให้ส่งคืนได้ แต่เนิ่นๆคุณจึงได้รับอนุญาตให้ใช้break
เช่นกัน - อนุญาตให้ใช้มากเกิน / อันเดอร์โฟลว์และจะไม่ทำการหนีบค่า จะถือว่าเสมือนว่าการดำเนินการเกิดขึ้นจริงอย่างถูกต้องและถูกตัดทอนเป็น 64 บิต
เกณฑ์การให้คะแนน / ชนะ:
รหัสของคุณจะต้องสร้างค่าที่ไม่ใช่ศูนย์ถ้าอินพุตเป็นกำลังของ -2 และเป็นอย่างอื่น
นี่คืออะตอมรหัสกอล์ฟ คะแนนของคุณคือจำนวนการดำเนินการทั้งหมดที่มีอยู่ในรหัสของคุณ (ตามที่กำหนดไว้ด้านบน) ไม่ใช่จำนวนการดำเนินการทั้งหมดที่ดำเนินการในเวลาทำงาน รหัสต่อไปนี้:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
มีการดำเนินการ 5 รายการ: สองฟังก์ชันและการเรียกใช้ฟังก์ชันสามครั้ง
ไม่สำคัญว่าคุณจะนำเสนอผลลัพธ์ของคุณอย่างไรใช้สิ่งที่สะดวกในภาษาของคุณไม่ว่าจะเป็นการเก็บผลลัพธ์ไว้ในตัวแปรในที่สุดส่งคืนจากฟังก์ชั่นหรืออะไรก็ตาม
ผู้ชนะคือโพสต์ที่ถูกต้องซึ่งพิสูจน์ได้ (จัดหาหลักฐานยืนยันแบบเป็นทางการหรือเป็นทางการหากจำเป็น) และมีคะแนนต่ำสุดตามที่อธิบายไว้ข้างต้น
โบนัสโหมดท้าทายยากมาก !
เพื่อโอกาสในการชนะอย่างแน่นอนไม่มีอะไรนอกจากความสามารถที่จะสร้างความประทับใจให้ผู้คนในปาร์ตี้ส่งคำตอบโดยไม่ต้องใช้while
ลูป! หากมีสิ่งเหล่านี้เพียงพอฉันอาจพิจารณาแบ่งกลุ่มที่ชนะเป็นสองหมวดหมู่ (มีและไม่มีลูป)
หมายเหตุ: หากคุณต้องการเสนอวิธีแก้ปัญหาในภาษาที่รองรับเฉพาะจำนวนเต็ม 32 บิตคุณสามารถทำได้โดยระบุว่าคุณเพียงพอที่จะพิสูจน์ว่ายังคงถูกต้องสำหรับจำนวนเต็ม 64 บิตในคำอธิบาย
นอกจากนี้: บางคุณลักษณะเฉพาะภาษาอาจได้รับอนุญาตที่ไม่มีค่าใช้จ่ายหากพวกเขาไม่หลบเลี่ยงกฎระเบียบ แต่มีความจำเป็นที่จะบีบบังคับภาษาของคุณเป็นพฤติกรรมตามกฎดังกล่าวข้างต้น ตัวอย่างเช่น (contrived) ฉันจะอนุญาตให้เปรียบเทียบฟรีไม่เท่ากับ 0ในwhile
ลูปเมื่อนำไปใช้กับเงื่อนไขโดยรวมเป็นวิธีแก้ปัญหาสำหรับภาษาที่มี "ความจริง" 0 ความพยายามที่ชัดเจนในการใช้ประโยชน์จากสิ่งต่าง ๆ ประเภทนี้ไม่ได้รับอนุญาต - เช่นแนวคิดของค่า "ความจริง" 0 หรือ "ไม่ได้กำหนด" ไม่มีอยู่ในชุดกฎข้างต้นและอาจไม่ได้รับการพึ่งพา
m ^= s
ก็ยังคงเป็นที่น่าประทับใจและผมคิดว่ามันจะตกลงทั้งหมดเพื่อทำการเปลี่ยนตัวผู้ที่จะปรับปรุงมันมากยิ่งขึ้น
while
และbreak
แต่ไม่if
? เทียบเท่ากับif (x) { ... }
while (x) { ... break; }
break
และผลตอบแทนเร็วเป็นส่วนที่น่าเสียใจ) และเป็นเรื่องราวที่ยาวนานและบทเรียนที่ได้เรียนรู้ในกฎสำหรับความท้าทายในอนาคต มีเวอร์ชั่น "โบนัส" เสมอ! :)
if
และfor
ไม่ได้รับอนุญาต? int x=condition; while (x) { ... x=0; }
ฟรีโค้ดเพิ่มเติมอีกเท่านั้น for
สิ่งเดียวกันกับคสไตล์