Python Human Rust World Reincarnated Record - Parser Edition für mehrere Zeilen -

Einführung

Hallo, mein Name ist Manabindung. Wenn eine Person eine neue Programmiersprache lernt, ist es natürlich, dass sie diese im Lichte des Wissens aufnimmt, das sie bisher gelernt hat. Ist es so etwas wie "diese Funktion dieser Sprache, mit anderen Worten, so sieht sie in dieser Sprache aus"? Ich finde diese Paraphrase-Erklärungsmethode sehr wertvoll und frage mich, ob sie in jeder Sprache erklärt werden kann. In diesem Artikel habe ich für diejenigen, die "Ich bin so sehr an Python gewöhnt, aber was soll ich tun, wenn ich dies mit Rust tun möchte?", Eine Spur wie das Markieren mit einer zerrissenen Pfanne hinterlassen. Es ist ein Artikel zu gehen. Dieses Mal möchte ich darüber sprechen, wie eine Sequenz beim Übergeben einer Sequenz angeordnet wird, was bei der Wettbewerbsprogrammierung häufig der Fall ist.

Umgebung

Die zu verwendende Umgebung ist Windows. Ich spreche nicht kritisch darüber, damit Sie sich nicht zu viele Sorgen machen müssen.

PS C:\> cargo --version
cargo 1.43.0 (3532cf738 2020-03-17)
PS C:\> python --version
Python 3.8.2

Mögliches Problem A.

Die diesmal angenommene Eingabe ist wie folgt. Stellen Sie sich eine Liste vor, in der die Zahlenspalte a gespeichert ist.

n            #Anzahl der Nummern
a1 a2... an  #Nummernfolge

Zum Beispiel

4
5 9 10 6

Python-ähnliches Denken

Das Thema des Python-ähnlichen Denkens ist riesig, aber der beste Weg, darüber nachzudenken, besteht darin, zuerst die Zahl n zu verwerfen, eine Teilung auf die Zahlenfolge anzuwenden, sie in int umzuwandeln und sie mit einer Karte zu sammeln. Ist es einfach?

input()
n = list(map(int, input().split()))
print(n)

Wie mit Rust lösen?

Wenn Sie nicht an Standardeingabemakros denken und diese als Funktionen speichern,

fn main(){
    input();
    let n: Vec<i32> = (&input()).split(" ").map(|s| s.parse().unwrap()).collect();
    println!("{:?}", n);
}
fn input() -> String{
    let mut buf = String::new();
    std::io::stdin().read_line(&mut buf).unwrap();
    buf.trim_end().to_string()
}

Wenn Sie es wie oben schreiben, können Sie es ohne Schwierigkeiten leicht verstehen. Apropos, was ich tue, ich werfe n weg, bringe eine Reihe von Zahlen als & str-Typ ein, teile sie und analysiere sie dann (Rust ist klug, also interpretiere ich die Anzeige des Typs auf der linken Seite gut. Es wird es i32) machen, den Fall ignorieren, in dem die Eingabe beim Entpacken seltsam ist, die Werte mit map sammeln und es mit collect zu einer geeigneten Sammlung machen. Informationen zur Eingabefunktion finden Sie unter Meine früheren Artikel (das obige Beispiel unterscheidet sich vom Trimmen).

Mögliches Problem B.

Was ist, wenn: Ignorieren Sie das Alphabet und speichern Sie a und b in einer zweidimensionalen Liste.

n          #Die Anzahl der Daten
x1 a1 b1   # x:Alphabet
x2 a2 b2   # a:Zahlen
...        # b:Zahlen
xn an bn

Zum Beispiel

2
a 2 3
b 8 6

Python-ähnliches Denken

Ist es eine allgemeine Idee, n als Anzahl der Schleifen zu speichern, bei der Eingabe einer Datenzeile das erste Zeichen zu treffen und das zweite und die nachfolgenden Zeichen zu lesen?

n = int(input())
l = []
for _ in range(n):
    l.append([int(e) for e in input().split()[1:]])
print(l)

Wie mit Rust lösen?

fn main(){
    let raw = input();
    let n: i32 = raw.parse().unwrap();
    let mut v: Vec<Vec<i32>> = Vec::new();
    for _ in 0..n {
        let raw = input();
        let s: Vec<&str> = raw.split(" ").collect();
        v.push([1, 2].iter().map(|i| s[*i as usize].parse::<i32>().unwrap()).collect());
    }
    println!("{:?}", v);
}
fn input() -> String{
    let mut buf = String::new();
    std::io::stdin().read_line(&mut buf).unwrap();
    buf.trim_end().to_string()
}

Wenn Sie "let raw = input ();" schreiben, können Sie den Standardeingabewert an "raw" binden, was die Verwaltung der für diese Sprache spezifischen Ausleihe und Ausleihe erleichtert. Ich möchte, dass Sie sich um [1, 2] .iter (). Map (). Collect (); kümmern, und es wird viel einfacher sein, auf diese Weise für Typeneingaben mit einer festen Breite zu schreiben. Ich werde. Wenn Sie ein Array mit fester Länge mit [] verwenden und es über iter in die Karte einfügen, können Sie die Reihenfolge und den Ort des Elementzugriffs einfacher steuern. In diesem Beispiel scheint es, dass Sie get oder etwas verwenden können, aber ich werde eine Niederlageerklärung hinterlassen, dass es funktioniert hat.

Fazit

** Master Map! ** ** ** ** Vergessen Sie nicht zu sammeln und auszupacken! ** ** **

abschließend

Dieses Mal fühlte es sich an wie eine Person, die es sich nicht anders überlegen konnte, in einer anderen Welt durcheinander zu kommen. Wie war es? Ich hoffe, ich kann diese Art von Bewusstsein weiterhin in Qiita belassen ... für den Fall, dass ich es vergesse. Es hat einen Titel wie eine Serie, aber ich weiß nicht, ob es einen nächsten gibt, weil ich mich daran erinnern muss, dass Rust-> ihn mit atCoder-> verwendet und ihn Qiita gegeben hat. Bitte freuen Sie sich auf Mr. Manas nächste Arbeit. `` Vielen Dank, dass Sie so weit gelesen haben. Ich hoffe, es hilft.

Recommended Posts

Python Human Rust World Reincarnated Record - Parser Edition für mehrere Zeilen -
Python-Radius-Parser