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+