เคล็ดลับสำหรับการเล่นกอล์ฟใน MATL


20

MATLภาษาการเล่นกอล์ฟที่สร้างขึ้นโดยหลุยส์ Mendo MATL ได้รับการพิสูจน์แล้วว่ามีการแข่งขันที่สูงและมักจะเต้นในภาษาอื่น ๆ เช่น Pyth, CJam และ Jelly

เคล็ดลับที่เป็นประโยชน์สำหรับการเล่นกอล์ฟใน MATL คืออะไร (เช่นเคยหนึ่งเคล็ดลับต่อคำตอบโปรด!)

  • สำหรับบันทึกที่ MATL สามารถทดสอบออนไลน์ได้ที่นี่
  • เอกสารสามารถพบได้ในGithub

5
มันเป็นข้อได้เปรียบที่ดีถ้าคุณรู้จัก Matlab / Octave บ้าง ลูกเล่นบางอย่างจากTips สำหรับการเล่นกอล์ฟใน MatlabและTips สำหรับการเล่นกอล์ฟใน Octave ที่ใช้ใน MATL ด้วย
ข้อบกพร่อง

คำแนะนำ: ดูเหมือนว่าaccumarray( XQ) อาจทรงพลัง (อาจมากกว่าใน MATLAB / Octave เนื่องจากฟังก์ชั่นความยาวเหล่านั้นมีรหัสตัวเลขที่มีประโยชน์) แต่ฉันไม่รู้ว่าจะแสดงตัวอย่างที่ดีได้ดีพอ หากมีประโยชน์จริง ๆ แล้วใครบางคนสามารถสร้างคำตอบพร้อมแนวคิดในการใช้งานได้หรือไม่?
sundar - Reinstate Monica

คำตอบ:


7

รู้ว่าตัวอักษรที่กำหนดไว้ล่วงหน้า

แม้ว่าบางคนจะเก็บข้อมูลเมื่อคัดลอกไปยังคลิปบอร์ดพวกเขาทั้งหมดมีค่าที่กำหนดไว้ล่วงหน้า

  • Fกด0 (จริงเท็จ )
  • Tผลัก1 (ที่จริงทรู )
  • Hกด2 (ค่าคลิปบอร์ดที่กำหนดไว้ล่วงหน้า)
  • Iกด3 (ค่าคลิปบอร์ดที่กำหนดไว้ล่วงหน้า)
  • Kกด4 (ค่าคลิปบอร์ดที่กำหนดไว้ล่วงหน้า)
  • Jกด0 + 1j (ค่าคลิปบอร์ดที่กำหนดไว้ล่วงหน้า)

ไม่แน่ใจว่าฉันครอบคลุมค่าที่กำหนดไว้ล่วงหน้าทั้งหมดหรือไม่


เพียงเพื่อความสมบูรณ์ (และในกรณีที่คุณต้องการเพิ่มคำตอบของคุณ): คลิปบอร์ดแต่ละระดับLมีค่าที่กำหนดไว้ล่วงหน้า แต่มีไว้สำหรับการใช้งานพิเศษ (แทนที่จะเป็นค่าทั่วไปทั่วไป) ตัวอย่างเช่น1LGive [1 0](ซึ่งใช้เป็นดัชนี1:end), 2LGive [0 -1 1](สำหรับ1:-1:end) นอกจากนี้ฟังก์ชั่นlและOรับ 0 อินพุตโดยค่าเริ่มต้นและผลิต0และ1ตามลำดับ
Luis Mendo

ฉันไม่เห็นว่าสิ่งนี้มีประโยชน์ ... ฉันเขียน4ไม่ได้เหรอ?
Cyoce

@Cyoce ประโยชน์คือการหลีกเลี่ยงช่องว่างเป็นตัวคั่น หากคุณต้องการที่จะผลักดัน1แล้ว4, 14จะไม่ทำ 1 4คุณจะต้อง หรือ1Kบันทึกหนึ่งไบต์
Luis Mendo

@ LuisMendo อ่าฉันเข้าใจแล้ว ผมคิดว่าผมคิดว่ามันถูกใช้หมายเลข 1 หลักวิธีการเท่านั้น (ไม่แน่ใจว่าทำไม)
Cyoce

1
กรณีที่อีกKแทนที่จะ4เป็นประโยชน์คือ: 1-4วิธีการ: การผลักดัน1แล้วดัน-4; ในขณะที่1-Kหมายความว่า: กด1, ลบออกจากสิ่งใดก็ตามที่อยู่ด้านล่างในสแต็กจากนั้นกด4
Luis Mendo

5

&Meta-Function (ขาเข้าทางเลือก / ข้อมูลจำเพาะขาออก)

วิธีการดั้งเดิมในการระบุจำนวนของอาร์กิวเมนต์ที่ป้อนเพื่อส่งผ่านไปยังฟังก์ชันคือการใช้$ฟังก์ชันเมตา

2$:     % Two-input version of :

ในทำนองเดียวกันเมื่อต้องการระบุจำนวนเอาต์พุตอาร์กิวเมนต์คุณสามารถใช้#ฟังก์ชัน meta- ระบุจำนวนเอาต์พุตอาร์กิวเมนต์

2#S     % Two-output version of sort

หรือถ้าคุณผ่านตัวเลขที่มากกว่าจำนวนอาร์กิวเมนต์เอาท์พุทที่กำหนดไว้สำหรับฟังก์ชั่นเฉพาะการmod(N, numberOfOutputs) + 1ส่งออกจะถูกส่ง

4#S     % Get only the second output of sort

คุณสามารถระบุโลจิคัลอาร์เรย์เพิ่มเติมเป็นอินพุต#เพื่อดึงเฉพาะอาร์กิวเมนต์เอาต์พุตที่ระบุเท่านั้น

TFT#u   % Three output version of unique and discard the second output

ข้อมูลจำเพาะอินพุต / เอาท์พุตทั้งหมดนี้มีประโยชน์แต่เพิ่มจำนวนไบต์ของคุณอย่างรวดเร็ว ในการจัดการกับเรื่องนี้ MATL ได้แนะนำ&meta-function ในรุ่น 17.0.0ปล่อย &ฟังก์ชันเมตานี้ทำหน้าที่เป็นทางลัดสำหรับสเปคอินพุตหรือเอาต์พุตเฉพาะสำหรับฟังก์ชั่น ลองดูความหมายนั่น

ในตัวอย่างของเราด้านบนเราต้องการใช้เวอร์ชันสองอินพุตของ:(สร้างเวกเตอร์ที่มีค่าที่เว้นระยะเท่ากัน) ในขณะที่จำนวนอาร์กิวเมนต์เริ่มต้นที่ป้อนเข้า:คือ1(สร้างอาร์เรย์จาก[1...N]) เป็นเรื่องธรรมดามากที่ผู้ใช้ต้องการระบุค่าเริ่มต้นของช่วงที่ต้องการอินพุตที่สอง ดังนั้นสำหรับ:เราได้กำหนดไว้ให้เป็นทางลัดสำหรับ&2$

10      % Push 10 to the stack
12      % Push 12 to the stack
2$:     % Create an array: [10, 11, 12] 

ตอนนี้จะกลายเป็นดังต่อไปนี้บันทึกไบต์ !

10 12 &:

เราจะทราบได้อย่างไรว่าจำนวนข้อโต้แย้งสำรองคืออะไร?

ข้อมูลจำเพาะอินพุต / เอาต์พุตที่&แปลเป็นฟังก์ชันเฉพาะซึ่งเราเพิ่มประสิทธิภาพการประหยัดไบต์

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

นี่คือส่วนอาร์กิวเมนต์อินพุต / เอาต์พุตของคำอธิบายวิธีใช้ :

 +- Min-Max range of # of inputs
 |        +----- Alt. Default # of inputs
 |        |
 V        V
1--3 (1 / 2); 1 <--- Possible / Default # of outputs
      ^       
      |       
  Default # of inputs

คุณตัดสินได้อย่างไร &ว่าแต่ละฟังก์ชันมีความหมายอย่างไร

อย่างระมัดระวัง. การใช้StackExchange APIเราสามารถดาวน์โหลดคำตอบ MATL ทั้งหมดที่เคยถูกใช้ในความท้าทาย PPCG ด้วยการแยกคำตอบแต่ละคำตอบจากนั้นเราสามารถกำหนดความถี่ที่แต่ละข้อมูลจำเพาะอินพุต / เอาต์พุตถูกใช้สำหรับแต่ละฟังก์ชั่น การใช้ข้อมูลนี้เราจึงสามารถระบุข้อมูลจำเพาะอินพุต / เอาท์พุตอย่างมีอคติที่&เมตาฟังก์ชั่นควรเป็นตัวแทนสำหรับแต่ละฟังก์ชั่น บางครั้งก็ไม่มีผู้ชนะที่ชัดเจนในขณะนี้ฟังก์ชั่นจำนวนมากยังไม่ได้&กำหนด

นี่คือสคริปต์ที่เราใช้ (น่าเสียดายที่มันเขียนใน MATLAB และไม่ใช่ MATL)

และนี่คือตัวอย่างของฮิสโตแกรมของ$/ #การใช้งาน


1
คุณลักษณะนี้ถูกแนะนำโดย @Suever ในขั้นต้น&จะหมายถึง "เพิ่มจำนวนอินพุต 1 โดยเทียบกับค่าเริ่มต้น" ข้อเสนอแนะของเขากลายเป็นประโยชน์มากขึ้น
Luis Mendo

5

ทำความคุ้นเคยกับคำจำกัดความความจริง / เท็จของ MATL

ในขณะที่true( T) และfalse( F) เป็นตัวแทนของความจริงและเท็จเอาท์พุทอย่างชัดเจนตามลำดับการตกลงกันอย่างแพร่หลายตามคำจำกัดความของความจริง / เท็จทำให้เรามีความยืดหยุ่นมากขึ้นใน MATL

คำจำกัดความของรัฐ:

if (x)
    disp("x is truthy");
else
    disp("x is falsy");
end

ดังนั้นเราจึงสามารถเขียนแบบทดสอบความจริง / ข้อผิดพลาด MATL ด่วนซึ่งจะวนซ้ำผ่านอินพุตทั้งหมดและแสดงว่าพวกเขาได้รับการพิจารณาว่าเป็นความจริงหรือเป็นเท็จ

` ? 'truthy' } 'falsey' ]DT

นี่คือเวอร์ชันออนไลน์

ความหมายใน MATL

สิ่งนี้จริงแปลว่าใน MATL (และดังนั้นใน MATLAB และคู่) คือว่าเป็นเงื่อนไขที่จะถือเป็นจริงถ้าหากมันเป็นส่วนประกอบที่ไม่ว่างเปล่าและที่แท้จริงของค่าทั้งหมดที่มีไม่ใช่ศูนย์ มีสองส่วนที่ควรเน้น

  1. ไม่ใช่ศูนย์ : ซึ่งหมายความว่าไม่เท่ากับศูนย์ ( ==) ซึ่งรวมถึงตัวเลขบวกจำนวนลบอักขระที่ไม่เป็นโมฆะ ฯลฯ คุณสามารถตรวจสอบได้อย่างง่ายดายโดยการแปลงค่าที่กำหนดเป็นlogicalค่า ( g) หรือคุณสามารถใช้~~

    F           % Falsy
    T           % Truthy
    0           % Falsy
    1           % Truthy
    2           % Truthy
    -1          % Truthy
    'a'         % Truthy
    ' '         % Truthy (ASCII 32)
    char(0)     % Falsy  (ASCII 0)  
    
  2. ค่าทั้งหมด : โดยทั่วไปแล้วเราคิดว่าสเกลาร์เป็นจริงหรือเท็จ แต่ใน MATL เราสามารถประเมินสเกลาร์เวกเตอร์แถวเวกเตอร์คอลัมน์หรือเมทริกซ์หลายมิติ ไม่ใช่ศูนย์ (ตามที่นิยามไว้ข้างต้น) มิฉะนั้นจะเป็นเท็จ นี่เป็นตัวอย่างที่แสดงให้เห็น

    [1, 1, 1]           % Truthy
    [1, 0, 0]           % Falsey
    [1, 1, 1; 1, 1, 1]  % Truthy
    [1, 0, 1; 1, 1, 1]  % Falsey
    'Hello World'       % Truthy
    

กรณีขอบหนึ่งดังกล่าวข้างต้นเป็นอาร์เรย์ที่ว่างเปล่า[]ซึ่งมักจะถือว่าเป็นเท็จ ( ตัวอย่าง )

ฉันจะใช้มันเพื่อเล่นกอล์ฟได้ดีขึ้นได้อย่างไร

หากความท้าทายเพียงกล่าวว่าผลลัพธ์ของคุณควรเป็นความจริงหรือเป็นเท็จคุณอาจใช้ประโยชน์จากคำนิยามข้างต้นเพื่อสักสองสามไบต์จากคำตอบของคุณ เพื่อเป็นการประหยัดความสับสนขอแนะนำให้คุณรวมลิงก์ไปยังการทดสอบความจริง / เท็จออนไลน์ข้างต้นในคำตอบของคุณเพื่อช่วยอธิบายว่าการทำงานของค่าความจริง / ค่าเท็จของ MATL เป็นอย่างไร

ตัวอย่างเฉพาะสองตัวอย่าง:

  • คำตอบที่ลงท้ายAด้วย หากความท้าทายที่ต้องใช้ truthy หรือผลลัพธ์ falsy และคุณท้ายคำตอบของคุณในall( A) เพื่อสร้างเกลาคุณสามารถลบไบต์สุดท้ายและคำตอบของคุณจะยังคงอยู่ที่ถูกต้อง (ยกเว้นกรณีที่ส่งออกเป็น[]ตั้งแต่[]เป็นfalseแต่[]Aเป็นtrue)

  • เพื่อให้มั่นใจว่าอาร์เรย์มีเพียงคนเดียวที่ไม่ซ้ำกันค่า : การใช้ในสถานที่ของ&= un1=หากค่าทั้งหมดในอาร์เรย์มีค่าเท่ากันการเปรียบเทียบความเท่าเทียมกันขององค์ประกอบแบบชาญฉลาดจะให้N x Nเมทริกซ์ของค่าทั้งหมด หากค่าทั้งหมดไม่เท่ากันเมทริกซ์นี้จะมี0ค่าบางค่าดังนั้นจึงถือว่าเป็นเท็จ


4

อินพุตโดยนัย

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

อินพุตโดยปริยายสามารถดูได้ดังต่อไปนี้: สแต็กจะขยายออกไปเรื่อย ๆ ด้านล่างด้านล่างนั่นคือที่ตำแหน่ง 0, −1, −2, ... ด้วยค่าที่ไม่ได้ถูกกำหนดไว้ในตอนแรก . อินพุตเหล่านี้ถูกถามจากผู้ใช้เมื่อจำเป็นเท่านั้นตามลำดับที่ต้องการ หากจำเป็นต้องป้อนข้อมูลหลายรายการในเวลาเดียวกันพวกเขาปฏิบัติตามคำสั่งสแต็กปกตินั่นคือการป้อนข้อมูลที่ลึกที่สุดในกอง (ขยาย) จะถูกป้อนก่อน


2
อินพุตโดยนัยคือคุณลักษณะที่ถูกแนะนำโดย @flawr
Luis Mendo

6
@flawr ต้องเป็นคนที่ฉลาดจริงๆ : D
ข้อผิดพลาด

3

อาร์เรย์แบบลอจิคัลสามารถใช้เป็นอาร์เรย์แบบตัวเลขได้

คุณสามารถใช้TFสัญลักษณ์ "" แทนการใช้ตัวอักษรและเลขศูนย์ได้" " ตัวอย่างเช่นFTFเป็นเช่นเดียวกับ[0,1,0]ที่FTFสร้างlogicalค่าไม่ใช่doubleค่า โดยปกติจะไม่เป็นปัญหาเนื่องจากการดำเนินการทางคณิตศาสตร์ใด ๆ จะถือว่าค่าตรรกะเป็นตัวเลข ตัวอย่างเช่น,FTFQให้[1,2,1]( Qคือ "เพิ่มขึ้น 1")

ในบางกรณีการแปลงตัวเลขเป็นไบนารีอาจสั้นกว่า ตัวอย่างเช่น[1,0,1], TFTและ5Bเหมือนกัน; อีกครั้งด้วยความระมัดระวังว่าสองหลังเป็นlogicalค่า


กรณีที่ความแตกต่างระหว่างTF(ตรรกะ) และ[1 0](ตัวเลข) เป็นเรื่องสำคัญเมื่อใช้เป็นดัชนี อาร์เรย์ของชนิดlogicalใช้เป็นดัชนีหมายถึง: เลือกองค์ประกอบที่สอดคล้องกับทิ้งเหล่านั้นสอดคล้องกับT Fดังนั้น[10 20]TF)ผลิต10(เลือกองค์ประกอบแรก) ในขณะที่[10 20][1 0])ผลิต[10 20](ดัชนี[1 0]มีการตีความ1:endนั่นคือเลือกองค์ประกอบทั้งหมดของอาร์เรย์)


3

สำหรับวนที่มีขนาด n-1

พิจารณาเปลี่ยน

tnq:"...

กับ

td"...

สามารถประหยัดได้ถึงไบต์ทั้งหมดหรือมากกว่า


@Luis จริง! ฉันคิดว่าอาจต้องใช้เวกเตอร์ดั้งเดิมที่วนลูป แต่ก็ไม่สามารถทำได้ในแนวทางแรกเช่นกัน จะลบคำพูดนั้น
Sanchises

แต่คุณไม่จำเป็นต้องบันทึก 1 ไบต์ คุณบันทึก 1 หรือ 2 ขึ้นอยู่กับว่าคุณต้องการ@/ X@ภายในวงหรือไม่ บางทีคุณอาจพูดว่า "to save bytes"
Luis Mendo

3

ย้ายสิ่งต่าง ๆ จากหลังจากการวนซ้ำไปยังภายในการวนรอบเพื่อใช้ประโยชน์จากจุดสิ้นสุดโดยนัย

วนซ้ำendงบ]สามารถออกถ้ามีรหัสไม่หลังจากที่พวกเขา MATL parser ถูกเติมเต็มโดยปริยาย

ดังนั้นถ้าคุณสามารถย้ายสิ่งต่าง ๆ ]จากหลังจากวนไปภายในห่วงคุณสามารถที่จะบันทึกสุดท้าย

เป็นตัวอย่างที่เฉพาะเจาะจงรหัสต่อไปนี้ค้นหาจำนวนศูนย์ต่อท้ายที่มีอยู่ในแฟกทอเรียลของตัวเลขN(ดูที่นี่ )

  • รหัสวนซ้ำจาก1ถึงN
  • สำหรับตัวเลขเหล่านี้แต่ละตัวจะคำนวณปัจจัยสำคัญและกำหนดจำนวนครั้งที่5มีอยู่
  • คำตอบคือจำนวนครั้งสะสมที่5ปรากฏขึ้น (ใช้งานได้เพราะ5อย่างน้อยหนึ่งครั้ง2)

แนวคิดแรกคือ:"@Yf5=]vs(โปรดทราบว่ามีคำสั่งหลังจากวนรอบ):

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
]      % End for
v      % Concatenate all vectors as a column vector
s      % Sum. Implicitly display

เนื่องจากvโดยค่าเริ่มต้นเชื่อมต่อเนื้อหาสแต็กทั้งหมดเข้าด้วยกันจึงสามารถย้ายไปยังลูปได้ และเนื่องจากการเพิ่มนั้นเชื่อมโยงกันsก็สามารถเคลื่อนย้ายได้เช่นกัน สิ่งนั้นจะทิ้ง]ไว้ที่จุดสิ้นสุดของโค้ดและสามารถละเว้นได้:"@Yf5=vs::

:      % Range from 1 to implicit input
"      % For each number in that vector
  @    %   Push that number
  Yf   %   Vector of prime factors (with repetitions)
  5=   %   True for entries that equal `5`, and `false` for the rest
  v    % Concatenate all vectors so far as a column vector
  s    % Sum. Inplicitly end loop and display

ฉันไม่รู้หรอกว่าสำคัญของภาษาที่เขียนด้วยอักษรเฮียโรกลิคเหมือนกัน แต่ฉันจะขอสงวนเวลาส่วนใหญ่ในการเรียนภาษานี้ในอีกสามเดือนข้างหน้า
Abr001am

@ Agawa001 :-) คุณจะพบว่ามันค่อนข้างคล้ายกับ Matlab นอกจากนี้คุณยังสามารถถามหรือแสดงความคิดเห็นได้ที่นี่
หลุยส์เมนโด

3

วิธีที่สั้นกว่าเพื่อกำหนดอาร์เรย์ตัวเลขที่ว่างถ้าสแต็กนั้นว่างเปล่า

[]ที่จะผลักดันอาร์เรย์ตัวเลขที่ว่างเปล่าโดยปกติคุณจะใช้ อย่างไรก็ตามหากสแต็กว่างเปล่าคุณสามารถบันทึกไบต์โดยใช้vอย่างไรก็ตามหากสแต็คที่ยังว่างอยู่คุณสามารถบันทึกไบต์โดยใช้ฟังก์ชันนี้โดยค่าเริ่มต้นเชื่อมต่อเนื้อหาสแต็กทั้งหมดในแนวตั้งดังนั้นหากสแต็กว่างเปล่ามันจะสร้างอาร์เรย์ว่าง

คุณสามารถดูได้ในการดำเนินการเช่นที่นี่


2

บางฟังก์ชั่นจะขยายเมื่อเทียบกับ MATLAB หรือ Octave

หากคุณมาจาก MATLAB หรือ Octave คุณจะพบว่าฟังก์ชั่น MATL จำนวนมากนั้นคล้ายกับฟังก์ชั่นในภาษาเหล่านั้น แต่ในบางฟังก์ชั่นก็มีการขยายออกไป

เป็นตัวอย่างให้พิจารณา MATLAB ของreshapeฟังก์ชั่นซึ่งใน MATL eสอดคล้องกับ ตัวอย่างโค้ดreshape([10 20 30 40 50 60], 2, 3)และreshape([10 20 30 40 50 60], 2, [])หมายถึง "ปรับเปลี่ยนเวกเตอร์แถว[10 20 30 40 50 60เป็นเมทริกซ์ 2 × 3" หรือ "เป็นเมทริกซ์ 2 แถวที่มีคอลัมน์ได้มากเท่าที่ต้องการ" ดังนั้นผลลัพธ์ทั้งสองกรณีคืออาร์เรย์ 2 มิติ

10    30    50
20    40    60

สิ่งที่ต้องการreshape([10 20 30 40 50 60], 2, 2)หรือreshape([10 20 30 40 50 60], 5, [])ให้ข้อผิดพลาดเนื่องจากขนาดที่เข้ากันไม่ได้ อย่างไรก็ตาม MATL จะลบองค์ประกอบในกรณีแรก ( ลองออนไลน์! ) หรือเติมเลขศูนย์ในวินาที ( ลองออนไลน์! ) เพื่อสร้างตามลำดับ

10 30
20 40 

และ

10 60
20  0
30  0
40  0
50  0

ฟังก์ชั่นอื่น ๆ ที่มีการขยายการทำงานในการเปรียบเทียบกับคู่ MATLAB ของพวกเขา (ไม่ครบถ้วนสมบูรณ์รายการ) S( sort) Yb( strsplit) m( ismember) h( horzcat) v( vertcat) Zd( gcd) Zm( lcm) YS( circshift) YA( dec2base) ZA( base2dec) Z"( blanks)


1

รับดัชนีขององค์ประกอบที่ไม่ใช่ศูนย์แรกหากมี

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

ข้อกำหนดทั่วไปที่มีความแข็งแกร่งมากกว่านั้นคือการได้รับดัชนีขององค์ประกอบแรกหากมีอย่างน้อยหนึ่งรายการและ[]อื่น ๆ สิ่งนี้สามารถทำได้ด้วยifสาขาหลังจากfแต่มันมีราคาแพงไบต์ วิธีที่ดีกว่าคือfX<นั่นคือใช้ฟังก์ชั่นขั้นต่ำเพื่อการส่งออกของX< ส่งคืนอาร์เรย์ว่างเมื่ออินพุตเป็นอาร์เรย์ว่างfX<

ลองออนไลน์! (โปรดทราบว่าอาร์เรย์ที่ว่างเปล่าจะไม่แสดงเลย) หรือดูตัวอย่างนี้ในที่ทำงานที่นี่


1

สร้างช่วงตราบใดที่อาร์เรย์ที่กำหนด

TL; WR : ใช้fแทนn:ถ้าอาร์เรย์มีองค์ประกอบที่ไม่ใช่ศูนย์เท่านั้น


มันมักจะเป็นกรณีที่เราจำเป็นต้องสร้างอาร์เรย์[1 2 ... L]ที่Lมีจำนวนองค์ประกอบของอาร์เรย์ที่กำหนด n:วิธีมาตรฐานที่จะทำคือ ตัวอย่างเช่นรหัสtn:*จะใช้เวกเตอร์ตัวเลขเป็นอินพุตและคำนวณแต่ละรายการคูณด้วยดัชนี

หากอาร์เรย์ที่กำหนดนั้นรับประกันว่าจะมีรายการที่ไม่ใช่ศูนย์เท่านั้น (ตัวอย่างเช่นมันจะเกิดขึ้นจากจำนวนเต็มบวกหรือเป็นสตริงที่มีอักขระที่พิมพ์ได้) ซึ่งn:สามารถแทนที่ได้fซึ่งสร้างอาร์เรย์ที่มีดัชนีของรายการที่ไม่ใช่ศูนย์ ดังนั้นโค้ดด้านบนจึงกลายเป็นtf*ซึ่งจะช่วยประหยัด 1 ไบต์

บางตัวอย่างที่ซับซ้อนมากขึ้น: 1 , 2 , 3


1

อย่างมีประสิทธิภาพการกำหนดตัวอักษรอาร์เรย์ตัวเลข

ต่อไปนี้เป็นวิธีการสองสามวิธีที่สามารถใช้เพื่อบันทึกไบต์เมื่อกำหนดตัวอักษรอาร์เรย์ตัวเลข ลิงค์จะได้รับตัวอย่างคำตอบที่ใช้ สิ่งเหล่านี้ได้มาจากการใช้สคริปต์การวิเคราะห์ที่สร้างโดย@Suever @Suever

การต่อข้อมูลและตัวอักษรที่กำหนดไว้ล่วงหน้า

สำหรับอาร์เรย์มีตัวเลขเล็ก ๆ บางครั้งคุณสามารถใช้การเรียงต่อกัน (ฟังก์ชั่นhและv) เช่นเดียวกับตัวอักษรที่กำหนดไว้ล่วงหน้าเพื่อหลีกเลี่ยงการใช้พื้นที่เป็นตัวคั่น: เปรียบเทียบ[2 4], 2 4hและทั้งหมดที่กำหนดอาร์เรย์2Kh [2 4]ในทำนองเดียวกันที่มีกำหนดสแต็คที่ว่างเปล่า2K1v ตัวอย่าง[2; 4; 1]

ตัวอักษรภายในตัวอักษรอาร์เรย์ตัวเลข

สำหรับตัวเลขที่มีขนาดใหญ่ขึ้นเล็กน้อยคุณสามารถประหยัดช่องว่างที่ใช้ประโยชน์จากความจริงที่ว่าตัวอักษรบางตัวมีความหมายเป็นตัวเลขภายในตัวอักษรอาร์เรย์ ดังนั้นแทนที่จะคุณสามารถใช้[3 5 2 7;-4 10 12 5] ตัวอย่าง[IAHC;dX12A]

โดยเฉพาะภายในตัวอักษรอาร์เรย์

  • O, l, H I Kมีความหมายปกติของพวกเขา0, ... ,4
  • A, ... , Eหมายถึง5, ... ,9
  • X วิธี 10
  • a, ... dหมายความว่า-1, ... ,-4
  • JและGค่าเฉลี่ย1jและ-1j
  • P วิธี pi
  • Y วิธี inf
  • NNaNวิธี

สตริงและความแตกต่างติดต่อกัน

สำหรับตัวเลขขนาดใหญ่, การกำหนดสตริงและการคำนวณความแตกต่างของมันต่อเนื่องกัน (กับd) สามารถช่วย: แทนของคุณสามารถใช้[20 10 35 -6] '!5?b\'dใช้งานได้เนื่องจากdใช้จุดรหัสของตัวอักษรสำหรับคำนวณความแตกต่าง ตัวอย่าง

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