Rust에서의 골프 팁


24

하지만 녹이 (자바는 종종 짧은) 코드 골프 대회에서 매우 드물게 경쟁력, 아직도 골프에 재미가 될 수 있습니다. 녹 코드를 만드는 짧은 몇 가지 트릭은 무엇입니까?

각 답변에 하나의 팁만 게시하십시오.

답변:


12

함수 대신 클로저 사용

폐쇄 :

|n|n+1

함수보다 짧습니다.

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

두 개 이상의 문을 닫으면 중괄호가 필요하지만 여전히 함수보다 훨씬 짧습니다.


9

.iter (). enumerate () 피하십시오

IntoIterator Trait을 구현하는 x가 있고 요소의 색인과 요소에 대한 참조를 취하는 함수 f를 호출해야한다고 가정 해 봅시다. 이 작업을 수행하는 표준 방법은

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

대신에 당신은 할 수 있습니다

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

비정상적으로 긴 열거뿐만 아니라 iter에 대한 호출을 피하십시오!


8

mutable 변수가 많이 필요한 경우 각각 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

변환 &strString

이 작업을 수행하지 마십시오 :

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반복자를 사용할 수 있으며 반복 된 줄은 줄 바꿈으로 끝나지 않습니다. 글로브 수입은 수입에 필요한 BufRead필요한, lines사용할 수하는 StdinLock<'_>유형입니다.

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

3

후미 세미콜론 건너 뛰기

returning 함수 ()에서 마지막 표현식도 유형 ()인 경우 후행이 필요하지 않습니다 ;.

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

2

줄 바꿈 문자가있는 문자열을 사용할 때 소스 코드에서 리터럴 줄 바꿈을 사용 \n하고 문자열에서 줄 바꿈을 사용하면 1 바이트를 절약 할 수 있습니다 .

println!("Hello
World!");

1보다 작은 바이트 :

println!("Hello\nWorld!);

2

정수 부동 소수점 숫자를 사용할 때 후행 .0을 생략하여 1 바이트를 저장할 수 있습니다 .

let a=1.

1보다 작은 바이트 :

let a=1.0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.