Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Codierung zu üben.
Herausforderung, meine Lösungen
Sie erhalten ein Array von Ganzzahlen, @ints.
Schreiben Sie ein Skript, um die glückliche Ganzzahl zu finden, falls sie gefunden wird, andernfalls geben Sie -1 zurück. Wenn es mehr als eine gibt, geben Sie die größte zurück.
Eine glückliche Ganzzahl ist eine Ganzzahl, deren Häufigkeit im Array ihrem Wert entspricht.
Diese Aufgabe ist relativ einfach und erfordert daher nicht viel Erklärung. Ich erstelle ein Diktat (Hash in Perl) der Häufigkeit jeder Ganzzahl, genannt freq. Dann iteriere ich durch die Tasten von freq (höchster Wert zuerst). Wenn die Häufigkeit der Ganzzahl mit dem Wert übereinstimmt, gebe ich diese Zahl zurück. Wenn der Iterator erschöpft ist, gebe ich -1 zurück.
def lucky_integer(ints: list) -> str: freq = Counter(ints) for i in sorted(freq, reverse=True): if i == freq[i]: return i return -1
$ ./ch-1.py 2 2 3 4 2 $ ./ch-1.py 1 2 2 3 3 3 3 $ ./ch-1.py 1 1 1 3 -1
Sie erhalten zwei Listen mit ganzen Zahlen, @list1 und @list2. Die Elemente in @list2 sind unterschiedlich und auch in @list1.
Schreiben Sie ein Skript, um die Elemente in @list1 so zu sortieren, dass die relative Reihenfolge der Elemente in @list1 mit der in @list2 übereinstimmt. Elemente, die in @list2 fehlen, sollten in aufsteigender Reihenfolge am Ende von @list1 platziert werden.
Während Python über die Indexfunktion für Listen verfügt, löst es eine ValueError-Ausnahme aus, wenn das Element nicht in der Liste enthalten ist. Deshalb habe ich eine Funktion namens find_index erstellt, die die Position von val in lst zurückgibt, wenn sie gefunden wird, oder die Länge der Liste zurückgibt, wenn nicht.
def find_index(lst: list, val: int): return lst.index(val) if val in lst else len(lst)
Die Perl-Lösung hat auch die gleiche Funktion und verwendet den first_index von List::MoreUtil, um die Position zu finden.
sub find_index( $lst, $val ) { my $idx = first_index { $_ == $val } @$lst; return $idx == -1 ? scalar(@$lst) : $idx; }
Ich verwende die Sortierfunktion, um die erste Liste zu sortieren. Jedes Element wird nach einem Tupel aus der Indexposition und der Ganzzahl sortiert. Dadurch wird sichergestellt, dass der erste Teil der resultierenden Liste entsprechend der Position in der zweiten Liste sortiert wird, während die übrigen Werte numerisch sortiert werden.
def relative_sort(list1: list, list2: list) -> list: return sorted(list1, key=lambda i: (find_index(list2, i), i))
Die Perl-Lösung verwendet dieselbe Logik, aber eine völlig andere Syntax.
sub main ($lists) { my $list1 = $lists->[0]; my $list2 = $lists->[1]; my @solution = sort { find_index( $list2, $a ) <=> find_index( $list2, $b ) or $a <=> $b } @$list1; say '(', join( ', ', @solution ), ')'; }
Für die Eingabe über die Befehlszeile nehme ich einen JSON-String, der eine Liste mit ganzen Zahlen sein sollte.
$ ./ch-2.py "[[2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5],[2, 1, 4, 3, 5, 6]]" (2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9) $ ./ch-2.py "[[3, 3, 4, 6, 2, 4, 2, 1, 3],[1, 3, 2]]" (1, 3, 3, 3, 2, 2, 4, 4, 6) $ ./ch-2.py "[[3, 0, 5, 0, 2, 1, 4, 1, 1],[1, 0, 3, 2]]" (1, 1, 1, 0, 0, 3, 2, 4, 5)
Das obige ist der detaillierte Inhalt vonDie glückliche Sorte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!