Rustでのゴルフのヒント


24

一方で錆が(Javaはしばしば短い)コードゴルフ大会で非常に、非常にまれ競争力がある、それはまだでゴルフに楽しいことができます。錆コードを作成するための短いいくつかのトリックは何ですか?

各回答には1つのヒントのみを投稿してください。

回答:


12

関数の代わりにクロージャーを使用する

閉鎖:

|n|n+1

関数よりも短い:

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

1つの文よりも長いクロージャにはブレースが必要ですが、それでも関数よりもはるかに短いです。


9

.iter()。enumerate()を避ける

IntoIterator Traitを実装するxがあり、要素のインデックスとその参照を取得する関数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

変換&strString

これらは絶対にしないでください:

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

これは常に短くなります。

s.repeat(1)    // 11 bytes

s文字列リテラルの場合:

format!(s)     // 10 bytes

たとえば、2バイトを節約するformat!("")代わりに使用しString::new()ます。

型推論が機能する場合:

s.into()       // 8 bytes

4

たとえばで文字列の書式設定をprint!()使用する場合、番号付きおよび番号なしの両方のフォーマッタを使用して、書式設定する項目ごとに1バイトを保存できます。

例を示すのが最適です:

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.

したがって、番号なしのフォーマッタは順番にアイテムに割り当てられます。これにより、それらのインデックスをスキップできます。フォーマットするアイテムごとに1つのアンナンバードフォーマッタしか使用できないことに注意してください。


3

行を読む

さまざまなことを検討した後、一般的にこれが行を取得する最短の方法だと思います。行には改行があり、トリミング(.trim())で削除できます。または、スライスで削除できない場合は削除できます。

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

複数行の場合、lines反復子を使用できますが、反復行は改行で終わりません。タイプを使用可能にBufReadするためlinesにインポートするには、globインポートが必要ですStdinLock<'_>

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

3

末尾のセミコロンをスキップする

()最後の式もtypeである関数を返す()場合、末尾は不要です;

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

2

改行を含む文字列を操作する場合、ソースコードでリテラルの改行を使用する場合と文字列にaを含める場合は、1バイトを節約\nします。

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.