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


24

ในขณะที่Rustนั้นเป็นสิ่งที่ไม่ค่อยมีการแข่งขันในการแข่งขันการแข่งขันรหัส (Java มักจะสั้นกว่า) แต่ก็ยังสนุกกับการเล่นกอล์ฟ

กรุณาโพสต์เพียงหนึ่งเคล็ดลับในแต่ละคำตอบ

คำตอบ:


12

ใช้การปิดแทนฟังก์ชั่น

ปิด:

|n|n+1

สั้นกว่าฟังก์ชั่น:

fn f(n:i32)->i32{n+1}

การปิดนานกว่าคำสั่งเดียวต้องใช้เครื่องหมายปีกกา แต่ยังสั้นกว่าฟังก์ชันมาก


9

หลีกเลี่ยง. it (). แจกแจง ()

สมมุติว่าคุณมี x บางตัวที่ใช้ IntoIterator Trait และคุณต้องเรียกใช้ฟังก์ชัน f ที่รับดัชนีขององค์ประกอบและการอ้างอิงถึงมัน วิธีมาตรฐานในการทำเช่นนี้คือ

x.iter().enumerate().map(f)

แต่คุณสามารถทำได้

(0..).zip(x).map(f)

และช่วยตัวเองไม่เพียง แต่แจงยาวผิดปกติ แต่ยังโทรไป iter!


8

หากคุณต้องการตัวแปรที่เปลี่ยนแปลงได้จำนวนมากอาจทำให้เสียพื้นที่จำนวนมากในการประกาศและกำหนดค่าเริ่มต้นเนื่องจากแต่ละตัวต้องใช้คำหลัก mut และคุณไม่สามารถทำอะไรเช่น a = b = c = 0 วิธีแก้ปัญหาคือประกาศอาร์เรย์ที่ไม่แน่นอน

let mut a=[0;5];

คุณใช้ 3 ไบต์พิเศษทุกครั้งที่ใช้กับตัวแปรปกติ:

a[0]+=1;

แต่บ่อยครั้งที่มันยังสามารถคุ้มค่า

การใช้สิ่งอันดับสำหรับเคล็ดลับเดียวกันมักเป็นตัวเลือกที่ดีกว่า:

let mut t=(1,4,"this", 0.5, 'c');

นี่คือข้อดีของการบันทึกไบต์ในแต่ละการใช้กับอาร์เรย์:

t.0=2

นอกจากนี้ยังช่วยให้พวกเขาเป็นประเภทที่แตกต่างกัน ข้อเสียต้องใช้อักขระมากขึ้นในการเริ่มต้น


4

แปลง&strเป็นString

อย่าทำสิ่งเหล่านี้:

s.to_string()  // 13 bytes
s.to_owned()   // 12 bytes

สิ่งนี้สั้นกว่าเสมอ:

s.repeat(1)    // 11 bytes

ถ้าsเป็นตัวอักษรสตริง:

format!(s)     // 10 bytes

ตัวอย่างเช่น: ใช้format!("")แทนString::new()การบันทึก 2 ไบต์

หากการอนุมานประเภททำงานได้:

s.into()       // 8 bytes

4

เมื่อใช้การจัดรูปแบบสตริงตัวอย่างเช่นprint!()คุณสามารถใช้ตัวจัดรูปแบบทั้งแบบตัวเลขและไม่กำหนดหมายเลขเพื่อบันทึกหนึ่งไบต์ต่อรายการเพื่อจัดรูปแบบ:

แสดงได้ดีที่สุดด้วยตัวอย่าง:

fn main(){
    print!("{}{}{}. Yes, {0}{}{2}. All you other{1}{2}s are just imitating.",
           "I'm",
           " Slim",
           " Shady",
           " the real");
}

ผลลัพธ์ใด:

I'm Slim Shady. Yes, I'm the real Shady. All you other Slim Shadys are just imitating.

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


3

อ่านบรรทัด

หลังจากพิจารณาสิ่งต่าง ๆ ฉันคิดว่าโดยทั่วไปแล้วจะเป็นวิธีที่สั้นที่สุดในการรับสาย บรรทัดนั้นมีการขึ้นบรรทัดใหม่สามารถลบออกได้โดยการตัดแต่ง ( .trim()) หรือหากไม่สามารถทำได้โดยการตัด

let y=&mut"".into();std::io::stdin().read_line(y);

สำหรับหลายบรรทัดlinesสามารถใช้ตัววนซ้ำได้บรรทัดที่ซ้ำไม่สิ้นสุดในบรรทัดใหม่ จำเป็นต้องนำเข้าแบบ glob เพื่อนำเข้าBufReadจำเป็นlinesต้องมีสำหรับStdinLock<'_>ชนิด

use std::io::*;let y=stdin();y.lock().lines()

3

การข้ามอัฒภาคต่อท้าย

ในฟังก์ชันที่ส่งคืน()โดยที่นิพจน์สุดท้ายเป็นประเภท()คุณไม่จำเป็นต้องมีการติดตาม;:

fn main(){print!("Hello, world!")}

2

เมื่อทำงานกับสตริงที่มีการขึ้นบรรทัดใหม่คุณสามารถบันทึกหนึ่งไบต์หากคุณใช้ตัวแบ่งบรรทัดตามตัวอักษรในซอร์สโค้ดเทียบกับการมี a \nในสตริง

println!("Hello
World!");

น้อยกว่า 1 ไบต์:

println!("Hello\nWorld!);

2

เมื่อใช้หมายเลขทศนิยมทั้งจำนวนคุณสามารถละเว้นการต่อท้าย.0เพื่อบันทึกหนึ่งไบต์

let a=1.

น้อยกว่า 1 ไบต์:

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