Challenge Accept เขียนภาษา C หาค่า Max ในบรรทัดเดียว

พอดีวันนั้นเล่น Facebook อยู่ดีๆแล้วเจอคำท้านี้เข้าครับ ผมเลยลองจัดสักหน่อย

นี่เป็น Function ที่ผมเขียนได้

int max(int *p){
return *(p+1)==0 ? *p : (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p));
}

ส่วนอันนี้เป็นตัวอย่างวิธีใช้แบบเต็มๆ

#include <stdio.h>

int max(int *p){
	return *(p+1)==0 ? *p : (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p));
}

int main(){
	int p[]={3,5,1,8,9,12,3,5,6,7,0};
	int i;
	//printf("%d\n",12 & 0);
	printf("%d",max(p));

	//for(i=0;i<10;i++) printf("%d\n",p[i]);
	return 0;
}

 

จาก Code นี้มีข้อจำกัด 2 เรื่อง

  • ข้อมูลในตัวแปรที่ส่งเข้าไปหายหมดนะครับ(คือมันจะเละไม่ได้ข้อมูลเดิมชัวร์)
  • ตัวสุดท้ายของ Array ต้องเป็น 0 เสมอ (จริงๆถึงไม่ 0 ส่วนมากมันก็เจอ 0 ถ้า index out of bound แต่ไม่ทุกกรณีแค่นั้น)

อธิบาย Code แบบเป็นส่วนๆ

  • *(p+1)==0 ? *p : บอกว่า *(p+1) (ค่าตัวหน้า) เป็น 0 รึเปล่า ถ้าใช่หมายถึงจบ จะ return *p (ค่าปัจจุบัน) ถ้าไม่ใช่ทำข้างล่าง
  • (*p > *(p+1) ? (((*(p+1) = *p) & 0) | max(++p)) : max(++p))
  • ถ้า *p > *(p+1) (ค่าปัจจุบันมากกว่าค่าถัดไป) เป็นจริง ให้ทำ (((*(p+1) = *p) & 0) | max(++p)) ตรงนี้ต้องแยกเป็นส่วนย่อยๆเยอะๆ
    *(p+1) = *p คือกำหนดค่าในช่องถัดไป เป็นค่าปัจจุบัน(เพราะค่าปัจจุบันมากกว่า)
    & 0 คือบรรทัดบนจะ return ค่า *p มา แต่เราไม่ต้องการจึง & 0 เพื่อบังคับให้   (((*(p+1) = *p) & 0) เป็น 0
    | คือการ or แบบ bit ซึ่งผมเอามาใช้ให้มันทำ 2 คำสั่งในบรรทัดเดียว จะได้ 0 | max(++p) คือโดยค่าถัดไปให้ max ไป recursion จากนั้นค่อย return
    การเอามา & 0 แล้ว or ทำให้มัน return เฉพาะค่า ที่มาจาก max(++p)
  • ถ้า  *p > *(p+1) (ค่าปัจจุบันมากกว่าค่าถัดไป) เป็นเท็จ return max(++p) ไปเทียบตัวต่อไปว่ามากกว่าไหมจนกว่าจะจบ

Code เหี้ยมากๆ อ่านไม่รู้เรื่องแน่ความหน้า Note กรุก็ไม่มั่นใจว่าอ่านอีกทีจะเข้าใจไหมเนี่ย 55+

Loading Facebook Comments ...