하지만 녹이 (자바는 종종 짧은) 코드 골프 대회에서 매우 드물게 경쟁력, 아직도 골프에 재미가 될 수 있습니다. 녹 코드를 만드는 짧은 몇 가지 트릭은 무엇입니까?
각 답변에 하나의 팁만 게시하십시오.
답변
함수 대신 클로저 사용
폐쇄 :
|n|n+1
함수보다 짧습니다.
fn f(n:i32)->i32{n+1}
두 개 이상의 문을 닫으면 중괄호가 필요하지만 여전히 함수보다 훨씬 짧습니다.
답변
.iter (). enumerate () 피하십시오
IntoIterator Trait을 구현하는 x가 있고 요소의 색인과 요소에 대한 참조를 취하는 함수 f를 호출해야한다고 가정 해 봅시다. 이 작업을 수행하는 표준 방법은
x.iter().enumerate().map(f)
대신에 당신은 할 수 있습니다
(0..).zip(x).map(f)
비정상적으로 긴 열거뿐만 아니라 iter에 대한 호출을 피하십시오!
답변
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
또한 서로 다른 유형이 될 수 있습니다. 단점은 초기화하는 데 더 많은 문자가 필요합니다.
답변
변환 &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
답변
예를 들어 문자열 형식을 사용하는 경우 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.
따라서 번호가 지정되지 않은 포맷터가 항목에 순서대로 할당되므로 인덱스를 건너 뛸 수 있습니다. 포맷 할 때 항목 당 하나의 번호가 지정되지 않은 포맷터 만 사용할 수 있습니다. 그 후에는 포맷이 끝납니다.
답변
리딩 라인
다양한 것을 고려한 후에는 일반적으로 줄을 검색하는 가장 짧은 방법이라고 생각합니다. 줄은 개행 문자를 가지며, 트리밍 ( .trim()
) 또는 슬라이싱으로 수행 할 수없는 경우 제거 할 수 있습니다 .
let y=&mut"".into();std::io::stdin().read_line(y);
여러 줄의 경우 lines
반복자를 사용할 수 있으며 반복 된 줄은 줄 바꿈으로 끝나지 않습니다. 글로브 수입은 수입에 필요한 BufRead
필요한, lines
사용할 수하는 StdinLock<'_>
유형입니다.
use std::io::*;let y=stdin();y.lock().lines()
답변
후미 세미콜론 건너 뛰기
returning 함수 ()
에서 마지막 표현식도 유형 ()
인 경우 후행이 필요하지 않습니다 ;
.
fn main(){print!("Hello, world!")}