เคล็ดลับสำหรับการเล่นกอล์ฟในระดับแปดเสียง


18

คุณมีเคล็ดลับทั่วไปอะไรสำหรับการเล่นกอล์ฟในอ็อกเทฟ ฉันกำลังมองหาแนวคิดที่สามารถนำไปใช้กับปัญหาเกี่ยวกับการเขียนโค้ดกอล์ฟโดยทั่วไปซึ่งอย่างน้อยค่อนข้างเฉพาะกับ Octave (เช่น "ลบความคิดเห็น" ไม่ใช่คำตอบ) กรุณาโพสต์หนึ่งเคล็ดลับต่อคำตอบ


2
ที่เกี่ยวข้อง แต่ไม่ซ้ำกัน: เคล็ดลับสำหรับการเล่นกอล์ฟใน MATLAB
Dennis Jaheruddin

คำตอบ:


9
  1. เมื่อคุณรู้ว่าaเป็นอิสระจากค่าศูนย์โดยใช้nnz(a)เครื่องคุณ 2 numel(a)เมื่อเทียบกับตัวอักษร
  2. ต้องการที่จะa(a==0)a(find(a==0))
  3. ~tจะสั้นกว่าt==0และแม้จะสั้นกว่า~~tt!=0
  4. 0*(1:n) สั้นกว่า zeros(1,n)
  5. โดยทั่วไป||และ&&ไม่เหมือนกับโอเปอเรเตอร์อื่น ๆ ที่ทำให้เกิดผลลัพธ์เมื่ออาร์กิวเมนต์แรกเป็นสเกลาร์ สำหรับการฝึกอบรมเพียงการฝึกอบรมไม่ว่างเปล่าโดยไม่ต้ององค์ประกอบเท่ากับศูนย์มีค่าตรรกะของความจริง

ดังนั้นเราสามารถทำ0||mแทนall(all(m))เมทริกซ์ใด ๆ ก็ได้

ลองด้วย0||[1 1;1 0]และ0||[1 1;1 1]โน้มน้าวใจตัวเอง

  1. เมื่อคุณใช้บิวด์อินหลาย ๆ ครั้งให้ทำหน้าที่จัดการกับอักขระสำรองเช่น f=@find. สำหรับชื่อฟังก์ชั่นแบบสั้นที่มีอย่างน้อย 3 เหตุการณ์ให้เหตุผลนี้สำหรับชื่อยาว - แม้จะมีสองเหตุการณ์

  2. เมื่อมีฟังก์ชั่นเป็นคำเดียวชอบf=@(n)dosomething(n)สัญกรณ์การfunction r=f(n)r=dosomething(n);endอย่างใดอย่างหนึ่ง

  3. น่าเสียดายที่ตัวแปรโกลบอลต้องถูกประกาศทั้งในขอบเขตโกลบอลและในแต่ละฟังก์ชันที่ใช้มัน แต่มีข้อยกเว้นคือ@(n)...ฟังก์ชั่นที่ไม่ระบุชื่อ"เห็น" ตัวแปรทั้งหมดจากขอบเขตที่พวกเขาถูกเรียกจาก

  4. มันเป็นไปได้ที่จะทำแทนf(a=0,b=0)a=0;b=0;f(a,b)

  5. นี่ดูเหมือนว่าจะไม่มีคุณสมบัติ แต่ลำดับของการประเมินคือจากซ้ายไปขวา (ตรวจสอบที่ v. 3.8.1) คุณสามารถทำzeros(a=n,b=a*a)ทั้งสองอย่างเพื่อสร้างเมทริกซ์ anxn ^ 2 และเก็บไว้เป็นจำนวนแถวและคอลัมน์ในaและbตัวแปร

  6. ตารางลำดับความสำคัญของโอเปอเรเตอร์คือเพื่อนของคุณ ไม่ได้ทำb=(a==0)มาตั้งแต่b=a==0เป็นเหมือนกัน


7

ฉันจำไม่ได้ว่าสิ่งที่ท้าทายฉันเห็นมันมีคนใช้ (โปรดบอกเรา =) แต่ฉันพบว่านี่เป็นเคล็ดลับเรียบร้อย:

โดยปกติถ้าคุณเพิ่มเมทริกซ์คุณต้องมีขนาดเท่ากัน แต่สำหรับเมทริกซ์หนึ่งมิติ (1xn และ nx1) จะมีทางลัด (ซึ่งไม่ทำงานใน Matlab):

z = (1:5)+(6:10)';

สร้างผลเช่นเดียวกับ

[x,y]=meshgrid(1:5,6:10);
z = x+y;

จากนั้นบางสิ่งที่ pawel.boczarski ได้กล่าวถึงแล้ว: ใน Octave คุณสามารถ (ในขณะที่คุณไม่สามารถใช้ Matlab) กำหนดตัวแปรเสริมภายในฟังก์ชั่นการจัดการและการกำหนดตัวแปรเองนั้นมีค่าของการมอบหมายเพื่อให้คุณสามารถย่อรหัสได้ ตัวอย่าง แต่คุณจะได้เคล็ดลับ):

f=@(n)(z=n+1)*z; %returns (n+1)^2

เคล็ดลับอื่น (เช่นที่ใช้ใน Matlab) คือการใช้สายอักขระในการจัดเก็บหมายเลข (hardcoded) (เคล็ดลับที่ประณีตนี้ถูกขโมยจาก feersum)คุณเพียงต้องการบางสิ่งที่ตีความสตริงเป็นตัวเลขซึ่งเป็นเรื่องง่ายเช่นการเพิ่มศูนย์:

a = 'abc';
a+0 %returns
[97 98 99]

หรือ

sum('abc') == 294

ผมเชื่อว่ามันควรจะเป็นไม่ได้a+0 a+'0'อื่น ๆ กว่าที่เคล็ดลับที่มีความสุข =)
สตีวีกริฟฟิ

ถูกต้องขอบคุณ! PS: คุณสามารถเพิ่ม+= -= /=ผู้ประกอบการ ฯลฯ ในรายการของคุณด้านล่าง?
ข้อบกพร่อง

1
+aสั้นกว่าa+0
Luis Mendo

7

ใช้รายการอาร์กิวเมนต์:

อ็อกเทฟสามารถรับอาร์กิวเมนต์เริ่มต้นเพื่อให้สามารถประเมินนิพจน์ในรายการอาร์กิวเมนต์

คุณลักษณะนี้มีประโยชน์เมื่อเราต้องการคำนวณนิพจน์และใช้หลายครั้ง:

f = @(x,a=sort(x))a(a>.5);

กรณีใช้งานอย่างหนึ่งคือเมื่อเราใช้การกำหนดดัชนีเพื่อแก้ไขส่วนของอาเรย์และเราต้องการใช้อาเรย์:

a=[1 2 3 4]
a(2)=5;

แต่การแสดงออก(a(2)=5)กลับa(2)มาหรือการแสดงออก(a([1 3])=4)กลับอาร์เรย์สององค์ประกอบ ไม่ส่งคืนอาร์เรย์ทั้งหมด เราสามารถใช้รายการอาร์กิวเมนต์:

f=@(a=[1 2 3 4],b=a(2)=5)a;

ที่นี่ผลลัพธ์ของการกำหนดดัชนีจะถูกเก็บไว้ในตัวแปรจำลองbและฟังก์ชันส่งคืนอาร์เรย์


6

- ในระดับแปดเสียงมันเป็นไปได้ที่จะใช้การจัดทำดัชนีในการแสดงออกชั่วคราวคุณสมบัติที่ต้องห้ามใน MATLAB และคุณลักษณะนี้มีประโยชน์มากสำหรับการเล่นกอล์ฟ ตัวอย่าง:

ระดับแปดเสียง: [1 23 4 5 7](3:4) และระดับเทียบเท่า MATLAB: ระดับa=[1 23 4 5 7];a(3:4)
แปดเสียง: hilb(4)(4:5,4:5) และระดับเทียบเท่า MATLAB: ระดับh=hilb(4);h(4:5,4:5)
แปดเสียง: {1,4,{4 5 6},[7 ;3]}{3}และระดับเทียบเท่า MATLAB: ระดับa={1,4,{4 5 6},[7 ;3]};a{3}
แปดเสียง: num2cell([1 2 3 4]){:}สำหรับการสร้างรายการคั่นด้วยเครื่องหมายจุลภาค
คู่:a'(:)'

-S บางครั้งในฟังก์ชั่นที่ไม่ระบุชื่อเป็นฟังก์ชั่นปกติเราต้องประเมินหลายนิพจน์ที่มีการกำหนดวิธีการหนึ่งคือการที่เราสามารถวางแต่ละการแสดงออกในเซลล์ (เนื่องจากเซลล์สามารถมีวัตถุหลายประเภท) และเมื่อเราต้องการค่า ในแต่ละนิพจน์เราสามารถใช้การจัดทำดัชนีเพื่อแยกองค์ประกอบนั้น

{1,4,{4 5 6},[7 ;3]}{3}
หรือ

{a=1,b=4,c={4 5 6},[b ;3]}{4}


@StewieGriffin เคล็ดลับดี! อัปเดตคำตอบ!
rahnema1

5

ข้ามอัฒภาค!

ฉันจะใช้คำตอบนี้เพื่ออธิบายประเด็น

รหัสเดิมคือ:

function f(x);if~movefile('f.m',x);disp("+-+\n| |\n+-+");end

หลังจากลบเครื่องหมายอัฒภาคอาจลดลงเป็นดังต่อไปนี้บันทึกสามไบต์:

function f(x)if~movefile('f.m',x)disp("+-+\n| |\n+-+")end

สามารถใช้สถานที่นี้ได้ไม่กี่แห่งและสิ่งที่คุณไม่ได้ลองเพราะดูเหมือนว่าข้อผิดพลาดทางไวยากรณ์มักจะใช้งานได้


1
สิ่งที่คุณไม่ได้ลองเพราะดูเหมือนว่าข้อผิดพลาดทางไวยากรณ์มักจะใช้งานได้คู่ในสรุป
Sanchises

2

อันนี้ง่าย แต่มีประโยชน์

ใน Octave แต่ไม่ใช่ MATLAB คุณสามารถทำได้ใน C ++:

x = 0  ->  x = 0
x++    ->  ans = 0
x      ->  x = 1
++x    ->  ans = 2
x      ->  x = 2

2

อีกแบบง่าย ๆ แต่มีประโยชน์ (ไม่สามารถทำได้ใน MATLAB):

กำหนดค่าเดียวกันให้กับตัวแปรหลายตัว:

a=b=c=0;

2

ใช้eval!

แรงบันดาลใจจากคำตอบของหลุยส์ Mendo ของที่นี่


input('')ฟังก์ชั่นที่ไม่ระบุชื่อที่อยู่ในกรณีส่วนใหญ่ที่สั้นกว่าการสร้างสคริปต์ที่ต้องการหนึ่งหรือมากกว่าโทรไปยัง ข้อเสียคือลูปและการปรับเปลี่ยนตัวแปร (เช่นการสลับสององค์ประกอบในเมทริกซ์) เป็นไปไม่ได้ยุ่งยาก

ด้วยevalคุณสามารถดึงอินพุตเหมือนกับฟังก์ชันนิรนามทั่วไปและรันสคริปต์เช่นเดียวกับสคริปต์ปกติ:

พิจารณาสิ่งนี้ :

c=(i=@input)('');N=i('');A=i('');for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A

เปรียบเทียบกับสิ่งนี้:

@(c,N,A)eval('for C=c,A(flip(k))=A(k=[x=find(A==C),N^2+1-x]);end,A')

รหัสเหมือนกัน แต่ส่วนอินพุตสั้นกว่ามาก


สิ่งนี้สามารถใช้เพื่อแก้ไขตัวแปรอินพุตเช่นนี้ (เครดิตสำหรับLuis Mendoสำหรับสิ่งนี้!):

f(x)eval('x([1,4])=x([4,1])`;

3
รหัสนี้เหมือนกันเฉพาะ uglier, ช้ากว่าและอ่านน้อยกว่า คุณจะขออะไรอีก :-D
Luis Mendo เมื่อ


1

ที่เกี่ยวข้อง แต่ไม่เหมือนกันเคล็ดลับสำหรับการ MATLAB

คุณสมบัติที่เป็นที่รู้จักและใช้เพียงเล็กน้อยของอ็อกเทฟคือฟังก์ชั่นบิวอินในตัวส่วนใหญ่สามารถเรียกได้โดยไม่ต้องใช้วงเล็บซึ่งในกรณีนี้พวกเขาจะจัดการกับสิ่งต่าง ๆ ที่ตามมาเป็นสตริง (ตราบเท่าที่ไม่มีช่องว่าง) หากมีช่องว่างคุณต้องมีเครื่องหมายคำพูด dispนี้สามารถนำมาใช้บ่อยในการบันทึกไบต์หรือสองเมื่อใช้ งานทั้งหมดต่อไปนี้และให้ผลลัพธ์เดียวกัน:

disp('Hello')
disp Hello
disp"Hello"

หากคุณมีช่องว่างคุณต้องมีเครื่องหมายคำพูด:

disp('Hello, World!')
disp"Hello, World!"

ตัวอย่างอื่น ๆ ที่มีประโยชน์น้อย ได้แก่ :

nnz PPCG
ans = 4

size PPCG
ans = 1  4

str2num 12
ans = 12
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.