Ein Problem mit 16 Programmiersprachen lösen / Sudo Null IT News

Videoblogger Conor Hoekstra verwendete verschiedene Programmiersprachen, um das gleiche Problem zu lösen. Dabei stellte sich heraus, dass Fortran viele Fans hat.

Auf dem YouTube-Kanal code_report, “der kompetitiven Programmierung gewidmet”gibt es eine interessante Arbeit Conor Hoekstra, ein leitender NVIDIA-Ingenieur, der an der RAPIDS-Suite für Daten- und Analyse-Pipelines arbeitet. Hoekstra durchstöbert gerne Lösungen von Programmierwettbewerben (LeetCode, HackerRank, Topcoder und Codeforces) und erstellt auch Videos zu verwandten Themen wie Datenstrukturen und Algorithmen.

Fortran hatte viele Fans

Um Ansätze zur Lösung des gleichen Problems in 16 verschiedenen Programmiersprachen zu untersuchen, wählte Hoekstra eine relativ einfache Aufgabe mit Programmierwettbewerb LeetCode: Bestimme die kleinste und die größte Zahl aus einer gegebenen Liste und finde dann ihren größten gemeinsamen Teiler.

Für die Lösung gewählte Sprachen:

  • C++

  • Rost

  • D

  • Clojure

  • Rubin

  • Elixier

  • Raku [Perl 6]

  • Haskell

  • Schläger

  • Julia

  • Python

  • APL

  • J

  • BQN

  • Pharo-Smalltalk

  • Fortran

(Das Video erklärt, dass die letzten beiden Sprachen auf Wunsch der Zuschauer hinzugefügt wurden. „Ich habe eine Umfrage auf Twitter durchgeführt und Fortran hat satte 27 Likes bekommen!“, erklärt Hoekstra. Also musste ich das auch einbeziehen.)

Unterschiede

Obwohl das ursprüngliche Problem einfach war, unterscheiden sich die Lösungsansätze in den verschiedenen Sprachen stark. Vor allem beim Umschalten auf Array-Sprache. Dort wird der Ansatz grundlegend anders sein als bei Python oder Ruby.

Python hat also bereits eingebaute Funktionen für alle notwendigen Operationen: um die kleinste Zahl zu finden, die größte Zahl, sogar für den „größten gemeinsamen Teiler“.

Aber die Dinge sahen ganz anders aus, als Hoekstra zur funktionalen Haskell-Sprache kam. Seine Funktion liftM2 zeigt die Minimal- und Maximalwerte für die gcd-Eingabe in einer Zeile an.

Und vor allem, seit Haskell verwendet Programmierstil „Stillschweigend“ oder punktfrei (Programmierstil ohne Zwischenvariablen, beinhaltet die Verwendung von Pipeline-Funktionen und Kombinatoren), die keine Argumente in Funktionsdefinitionen angeben, musste die Haskell-Lösung nicht einmal ein Array von Zahlen erwähnen.

Die Low-Level-Programmiersprache D erfordert, dass Funktionen importiert werden. Aber zumindest verwendet es eine generische Syntax, um Funktionen in bekannter Weise aus der objektorientierten Programmierung aufzurufen. Hoekstra fand es ziemlich niedlich.

Hoekstra beschwerte sich, dass es in Rust und C++ zu viele “Formalitäten” gebe. Sowohl min als auch max erfordern die Verwendung von iter(), um jeden Wert in einer Liste von Zahlen zu durchlaufen, und unwrap(), um den Wert aus einem komplexeren Modul zu extrahieren ErgebnisA, das Informationen zur Fehlerbehandlung enthält.

Und, wie Hoekstra anmerkte: „Um Zugriff auf die gcd-Funktion zu erhalten, müssen Sie eine Menge zusätzlicher Dinge im Namensraum num::integer:: durchgehen. Aber ansonsten ist es eine sehr gute Entscheidung.”

Da Hoekstra ein Fan von Array-Programmiersprachen ist, gibt es größere Unterschiede in seiner Forschung. Die Lösung in APL (rechts vom rosa Pfeil) ist nur fünf Zeichen lang. (Die ersten beiden Zeichen finden den Maximalwert, die letzten beiden Zeichen den Minimalwert und das grüne v in der Mitte den größten gemeinsamen Teiler.)

Es gibt eine ähnliche Struktur in der Programmiersprache J (eine andere Array-Programmiersprache, aber J ist eine erweiterte Version von APL, die ASCII-Diagramme anstelle von Unicode-Zeichen verwendet). Die Maximum-Suchfunktion wird hier durch das „>“-Symbol dargestellt, und die Minimum-Suchfunktion wird durch „<“ dargestellt.

Je weiter, desto exotischer wurden die Lösungen. BQN aus der APL-Familie (gem APL-Wiki) ist immer noch eine Array-gesteuerte Sprache, verwendet jedoch einen eigenen eindeutigen Zeichensatz. Da es keine eingebaute Funktion zum Finden des größten gemeinsamen Teilers hat, muss diese Funktion in einer separaten Codezeile definiert werden.

Hoekstra gab zu, dass er den Code einfach aus einer Online-Quelle kopiert habe. Sobald die Funktion in der ersten Zeile definiert war, konnte sie als Teil der Lösung in der zweiten Zeile aufgerufen werden.

Wettbewerb mit Zuschauern

Den Reaktionen des Publikums nach zu urteilen, genossen sie den Sprachwettbewerb und waren bereit, ihre eigenen Erfahrungen zu teilen.

„Einige Leute waren an der Lösung für Cobol interessiert, also beschloss ich, es selbst zu versuchen: Nur 91 Zeilen …

Bisher hat das Video Hunderte von Kommentaren erhalten, in denen die besten Lösungen vorgeschlagen wurden.

Die Julia-Lösung ähnelte der Python-Lösung, nur dass der „Splat“-Operator (in diesem Fall ein Auslassungszeichen) bedeutet, dass mehr als ein Wert überprüft wird:

Die Zuschauer schlugen jedoch eine einfachere Syntax vor. Julia verfügt über zwei integrierte Min- und Max-Suchfunktionen, die keine Auslassungspunkte erfordern. Es gibt auch eine Funktion, die beide “Extrema”-Werte zurückgibt. Und dann wurde die Lösung noch einfacher, als Hoekstra den Funktionskleberoperator nahm, um eine punktfreie Lösung zu erstellen (mit einer Sammelfunktion, die die beiden Werte in ein Listenformat umwandelt, das an gcd übergeben werden kann).

„Meiner Meinung nach ist dies die schönste Lösung von allen“, fügte Hoekstra hinzu, „unter anderem, weil sie die Eleganz punktfreier Lösungen demonstriert.“

Das Publikum schlug dann einige raffiniertere Verbesserungen an Hekstras Raku-Lösung (die früher als Perl 6 bekannte Sprache) vor. In Raku ist gcd eine „Infix“-Funktion, die ähnlich wie mathematische Operatoren (wie Plus oder Minus) zwischen zwei Werte gesetzt werden kann. Und dann können die beiden Werte, zwischen denen es platziert wurde, die Ergebnisse von Methoden im Objektstil sein, die von einem Array von Zahlen aufgerufen werden.

Ironischerweise stellte sich heraus, dass die Lösung von Pharo Smalltalk der von Raku ähnlich war (mit einer eigenen gcd:-Funktion, die als „Infix“-Operator zwischen zwei Funktionen erschien, die ein Minimum und ein Maximum zurückgaben).

Die Zuschauer stellten jedoch fest, dass Raku auch über eine spezielle Minmax-Funktion verfügt, die beide Werte gleichzeitig zurückgibt, was zu einer weiteren einzeiligen Lösung führt, bei der dieses Ergebnis zur Eingabe für die gcd-Funktion wird.

Hoekstra hielt diese Lösung für vorzuziehen.

Zum Spaß mit Fortran

Im ersten Video hielt Hoekstra die Fortran-Lösung für die schlechteste, weil sie auch mit einer Menge Formalitäten und Komplikationen gespickt sei. Aber er stellte klar, dass „dies das erste Stück Fortran-Code ist, das ich in meinem Leben geschrieben habe, also gibt es wahrscheinlich bessere Lösungen … Nach 40 Minuten des Debuggens und Ausführens dieses Codes beschloss ich, dass es an der Zeit war, ihn abzuschließen. “

Aber in einem Folgevideo gab Hoekstra zu, eine erstaunliche Resonanz von der Fortran-Community erhalten zu haben. Jacob Williams, Fortran-Programmierer und Orbitalmechaniker am Johnson Space Center der NASA, antwortete, dass er ungefähr 5 Minuten gebraucht habe, um das Problem zu lösen (mit gcd aus dem Rosetta-Code).

Auch das Video von Hoekstra fand Anklang Milan Kurcic, langjähriger Fortran-Programmierer und Autor von Modern Fortran. Couric dankte Hoekstra für die Aufnahme von Fortran in seine Rezension und bot eine alternative Lösung an, die die größte gemeinsame Nennerfunktion enthält:

Es stellte sich heraus, dass die temporäre Variable res nicht benötigt wird, da das Ergebnis einfach zurückgegeben werden kann, ohne ihr einen separaten Wert zuzuweisen. Und einige Syntax-Updates in Fortran ermöglichen es Ihnen jetzt, die Länge einer Liste mit nur einem Doppelpunkt anstelle der unhandlichen Variablen numsSize anzugeben. Auf diese Weise können Sie eine ganze Codezeile loswerden. Insgesamt können Sie anstelle eines riesigen Codes nur zwei Zeilen im Hauptteil der Funktion haben!

Der offizielle Twitter-Kanal von Fortran hat sogar den ursprünglichen Tweet von Hoekstra mit dem Video retweetet und kommentiert, dass sie in Zukunft an der Verbesserung ihrer Tutorials arbeiten werden. So sollte die Community laut dem Ingenieur funktionieren, wenn sie neue Leute für ihre Sprache gewinnen will.

Was es sonst noch Interessantes im Cloud4Y Blog gibt

→ Wie man einen Tresor mit einem Griff öffnet

→ OpenCat – Erstelle deine eigene Roboterkatze

→ So drucken Sie einen mechanischen Farbfernseher auf einem 3D-Drucker

→ WD-40: ein Tool, das fast alles kann

→ Vergessene Erfinder

Abonnieren Sie unsere Telegramm-Kanal, um den nächsten Artikel nicht zu verpassen. Wir schreiben nur über das Geschäft. Und wir erinnern Sie auch an die zweite Staffel unserer Serie IT-bash-bash. Es kann unter eingesehen werden Youtube und In Kontakt mit.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *