Ich konzentriere mich auf Array-Programmiersprachen , insbesondere J und APL .
K / Kona, Q und Nial fallen ebenfalls in diese Kategorie, haben jedoch im Allgemeinen die gleichen Vorteile und Kritikpunkte. Verwenden Sie Diskretion. Ich werde im Folgenden J-Beispiele verwenden, hauptsächlich, weil diese ASCII-Zeichen und damit einfach zu tippen sind. Denken Sie daran, dass APL-Zeichen als einzelne Bytes gelten.
- Mathe Probleme
- Zahlenrätsel lösen
- Numerische Methoden ausführen
- Heikle Probleme mit 2D-Arrays
Diese beiden sind sehr gute mathematische und Datenmanipulation Sprachen, weil sie Arrays um ein hohes Niveau zu werfen, und eine Menge Schleifen geschieht implizit , indem er sagte, zum Beispiel hinzufügen zehn bis jeweils 3, 4 und 5 ( 10 + 3 4 5
) oder jede Summe Zeile eines Arrays ( +/"1 arr
--die Schleife befindet sich in der"1
).
- Problem beim Umgang mit Primzahlen
Insbesondere bei Primzahlproblemen hat J schnelle und kurz aufgebaute Primitive, ebenso wie einige Dialekte von APL. (Edit: Ich denke an Nars2000, das teilweise Dialekt und teilweise völlig andere Implementierung ist. APL hat keine eingebauten Primzahlen.) N-te Primzahl ( p:
), nein. von Primzahlen bis ( _1&p:
), Factoring ( q:
), GCD und LCM ( +.
und *.
) und so weiter gibt es eine Menge. In der Praxis wird jedoch häufig die Frage gestellt, ob Sie Ihre eigenen Hauptimplementierungen kochen müssen, damit diese nicht zu häufig verwendet werden. Es gibt immer noch nette und ausgefallene Möglichkeiten, um das Beste zu bekommen, was Sie brauchen.
- Stringverarbeitung
- Array-Verarbeitung
Die Verarbeitung von Arrays und Strings ist ein bisschen uneinheitlich: Wenn APL / J gut darin ist oder ein primitives oder gemeinsames Idiom dafür hat, ist es fast trivial. Wenn es etwas ist, das sehr sequentiell und nicht sehr parallelisierbar ist, werden Sie eine schlechte Zeit haben. Alles dazwischen ist in der Luft, obwohl sie normalerweise günstig reagieren.
- Probleme, die eine E / A-Lösung erfordern, entweder Konsole oder Datei
- Probleme, bei denen Sie Ihre Lösung als Funktionsdefinition schreiben müssen
IO ist komisch. APL hat einen Ein-Zeichen-Eingabeausdruck, aber mit J müssen Sie mindestens 8 ausgeben, um eine Zahl einzulesen:".1!:1]1
. Die Ausgabe ist etwas weniger ausführlich, aber in der Praxis werden immer noch 6 oder 7 Zeichen verschwendet. Besonders J gefällt es sehr, wenn Sie die Eingabe als Argumente für eine Funktion verwenden können, anstatt mit IO selbst herumspielen zu müssen.
In der Praxis wird die Lösung mit J und APL normalerweise als eine Funktion geschrieben, die Sie an der Konsole aufrufen. Mit APL können Sie einfach Variablennamen für Ihre Argumente eingeben und den Ausdruck, mit dem Sie gearbeitet haben, in geschweifte Klammern setzen und ihn einen Tag nennen.
Bei J gibt es jedoch einen gewissen Mehraufwand für das explizite Definieren von Funktionen 3 :'...'
- und Sie müssen alle darin enthaltenen Zeichenfolgen umgehen. Üblicherweise wird also eine so genannte implizite Programmierung durchgeführt: Sie programmieren auf Funktionsebene und kombinieren Primitive auf eine Art und Weise nicht anders als bei Haskell. Dies kann sowohl ein Segen als auch ein Fluch sein, da Sie nicht so viele Zeichen für Ihre Argumente aufwenden müssen, aber es ist leicht, in Klammern zu ertrinken und am Ende Dutzende von Zeichen zu verlieren, die versuchen, Ihre ansonsten kurze und clevere Lösung zu hacken etwas, das funktioniert.
- Probleme, die eine Analyse erfordern
- Rechengeometrie
Ich habe keine Erfahrung mit dem Golfen dieser speziellen Probleme, aber ich werde dies sagen: Letztendlich sind Array-Programmiersprachen sehr gut darin, viele Daten auf die gleiche Weise zu verarbeiten und zu transformieren. Wenn Sie das Problem in eine Übung zum Mischen von Zahlen verwandeln können, können Sie es zu einem APL / J-Problem machen, ohne ins Schwitzen zu geraten.
Das heißt, nicht alles ist ein APL / J-Problem. Im Gegensatz zu Golfscript waren APL und J einfach gut zum Golfen, zusammen mit ihren anderen Vorteilen;)