C90 (gcc), 46 ไบต์
r;main(c,v)int**v;{while(0<--c&*v[c])r++;c=r;}
การป้อนข้อมูลผ่านทางอาร์กิวเมนต์บรรทัดคำสั่ง (จำนวนเต็มต่ออาร์กิวเมนต์) เอาท์พุทผ่านรหัสทางออก
ลองออนไลน์!
มันทำงานอย่างไร
rคือตัวแปรทั่วโลก ค่าเริ่มต้นประเภทของการintและเป็นทั่วโลกก็มีค่าเริ่มต้นที่0
ฟังก์ชั่นอาร์กิวเมนต์คเริ่มต้นที่intเช่นกัน มันจะถือจำนวนเต็มn + 1สำหรับอาร์เรย์ของn Booleans; อาร์กิวเมนต์แรกของmainจะเป็นเส้นทางของไฟล์ที่เรียกทำงานได้เสมอ
อาร์กิวเมนต์ฟังก์ชั่นวีint**
ถูกประกาศเป็น ประเภทที่แท้จริงของvจะเป็นchar**
แต่เนื่องจากเราจะตรวจสอบเฉพาะบิตที่มีความสำคัญน้อยที่สุดของแต่ละอาร์กิวเมนต์เพื่อบอกตัวละคร0 (รหัสจุด48 ) และ1 (รหัสจุด49 ) นอกเหนือจากนี้สิ่งนี้จะไม่สำคัญกับเด็กเล็ก เครื่อง
ห่วงในขณะที่ decrements คและเปรียบเทียบกับ0 เมื่อcถึง0เราจะแตกออกจากลูป นี้เป็นสิ่งจำเป็นเฉพาะในกรณีที่อาร์เรย์ไม่มี0 's
ตราบเท่าที่0<--c
ผลตอบแทน1เราจะใช้อาร์กิวเมนต์บรรทัดคำสั่งc th ( v[c]
) และแยกตัวอักษรตัวแรกของมันด้วยโดย dereferencing ตัวชี้ ( *
) เราใช้ค่าบิตและ AND ของบูลีน0<--c
และจุดรหัสของตัวละคร (และสามไบต์ขยะที่ตามมา) ดังนั้นเงื่อนไขจะกลับ0เมื่อพบ0 , แบ่งออกจากวง
ในกรณีที่ยังเหลืออยู่ในขณะที่อาร์กิวเมนต์บรรทัดคำสั่งที่มี1 , r++
เพิ่มRโดย1จึงนับจำนวนของท้าย1 's
สุดท้ายc=r
เก็บราคาคำนวณของRในค ด้วยการตั้งค่าเริ่มต้นคอมไพเลอร์ปรับให้เหมาะสมและลบการมอบหมาย; มันสร้างmovl %eax, -4(%rbp)
คำสั่งจริง เนื่องจากret
ส่งคืนค่าของการลงทะเบียน EAX สิ่งนี้จะสร้างผลลัพธ์ที่ต้องการ
โปรดทราบว่ารหัสนี้ไม่ได้ทำงานกับ C99 ซึ่งผลตอบแทน0จากหลักถ้าท้ายของหลักจะมาถึง
01100
?