Was sind einige Tipps für die Wahl der richtigen Sprache zum Golfspielen? Welche Faktoren beeinflussen die zu wählende Sprache?
Hier sind einige Beispielproblemtypen:
- Probleme, die eine E / A- Lösung erfordern , entweder Konsole oder Datei
- Probleme, die eine Analyse erfordern
- Probleme, bei denen Sie Ihre Lösung als Funktionsdefinition schreiben müssen
- Mathe Probleme
- Problem beim Umgang mit Primzahlen
- Zahlenrätsel lösen
- Numerische Methoden ausführen
- Stringverarbeitung
- Array-Verarbeitung
- Heikle Probleme mit 2D-Arrays
- Rechengeometrie
- Rekursion
- 2D-Grafik
- 3D-Grafik
- Audio
- Netzwerk / Web
- Parallelverarbeitung
Sagen Sie nicht einfach Dinge wie "Use GolfScript | J", weil Sie sie mögen.
Antworten:
Je nachdem, was man braucht, ist C / C ++ schnell, aber Sie müssen mehr von der Arbeit selbst programmieren. Python und Ruby sind langsamer, lassen sich jedoch mit integrierten Methoden, die viel Arbeit verkürzen und automatisch unendlich große Werte verarbeiten (sofern der Arbeitsspeicher vorhanden ist), viel einfacher programmieren. Die Verwendung einer funktionalen Sprache wie Haskell eignet sich hervorragend für den rein mathematischen funktionalen Gebrauch, wenn man das Problem auf diese Weise einrahmen kann.
quelle
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.
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
).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.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.
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.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;)
quelle
Warum wurde Perl noch nicht gelobt? Es ist eine ausgezeichnete Golfsprache für fast jedes dieser Dinge, besonders für Sachen, die mit dem Thema Saiten zu tun haben (Regex).
Burlesque eignet sich für nummerbezogene Programme, Ruby für eine einfachere Textbearbeitung.
Es gibt tatsächlich eine Liste von Sprachen und Golf - Scores über hier .
quelle
Ich benutze gerne obskure Programmiersprachen, um meine Arbeit zu erledigen.
Hier sind meine Favoriten für die Details, die Sie aufgelistet haben:
Probleme, die eine E / A-Lösung erfordern, entweder Konsole oder Datei
Sprachen wie TI-Basic funktionieren gut, aber ich bevorzuge Ruby wegen
puts
Probleme, die eine Analyse erfordern
GolfScript wird Ihnen hier definitiv helfen
Probleme, bei denen Sie Ihre Lösung als Funktionsdefinition schreiben müssen
TI-84 Tabelle - erlaubt Funktionen wie
Y=
zBY=|X|
den absoluten Wert von X zurückzugebenMathe Probleme
TI-Basic - für einen Taschenrechner gemacht, enthält also Mathe;)
Problem beim Umgang mit Primzahlen
Nichts Besonderes; Mathematica ist wahrscheinlich das richtige Werkzeug für diesen Job
Zahlenrätsel lösen
TI-Basic durchläuft Arrays automatisch
Numerische Methoden ausführen
TI-Basic oder Mathematica
Stringverarbeitung
Python - hat einige großartige String-Funktionen.
Egal, wie gut Sie TI-Basic finden , verwenden Sie es nicht für Streicher ...
Array-Verarbeitung
TI-Basic - Durchläuft Arrays automatisch ; zB inkrementiere alle Werte im Array -
L1+1→L1
Ruby - hat auch sehr leistungsstarke Array-Funktionen, und natürlich
!
hilft das auch beim Komprimieren von CodeHeikle Probleme mit 2D-Arrays
Ruby oder Python funktionieren hier am besten, da TI-Basic keine 2D-Arrays unterstützt
Rechengeometrie
TI-Basic verfügt über geometrische Merkmale und kann für die meisten mathematischen Aufgaben bis hin zu Analysis und linearer Algebra verwendet werden
BONUS
Looping
Entweder Arduino oder Quomplex . Arduino hat eine eingebaute
void loop(){}
und Quomplex hat die Endlosschleifen in Klammern ([]
)Zeichnen / GUI
Game Maker Language verfügt über sehr leistungsfähige Zeichenfunktionen, und TI-Basic ist auch ein allgemein nützliches Werkzeug, da es das Zeichnen in der Grafik unterstützt.
Quines
Entweder HQ9 + oder Quomplex, da HQ9 + den
Q
Quellcode des Programms ausgeben muss und Quomplex den Quellcode automatisch ausgibt, sofern nicht*
(output) angegeben ist oder keine Ausgabe erfolgt, definiert mit#
quelle
Wenn Sie ein mathematisches Problem lösen und kein Mathematica haben, versuchen Sie es mit Salbei . Es basiert auf Python. Wenn Sie also Python bereits kennen, brauchen Sie nicht viel Zeit, um seine Syntax zu erlernen.
Beispiele:
Es ist auch nützlich zum Zeichnen von Diagrammen und zum Lösen von Gleichungen (z. B. können Sie die
solve()
Funktion in Sage verwenden. Wenn dies durch die Regeln verboten ist, können Sie den Newton Raphson-Prozess auf einfache Weise implementieren, da diediff()
Funktion eine symbolische Differenzierung durchführen kann.) .Wenn Sie ein Python2-Programmierer sind, können Sie mit Sage auch schummeln, indem Sie die langen
import
Anweisungen überspringen . Zum Beispielmath
undsys
sind bereits standardmäßig importiert. (Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn Ihr Python2-Programm von der Ganzzahldivision abhängt.)quelle
Ich kenne drei Sprachen - Java, C ++ und Python 3. Ich kenne keine dieser Sprachen auf hohem Niveau, aber dies ist meine Erfahrung mit ihnen.
Java:
Ich würde Java nie wieder zum Golfen verwenden. Es dauert über 80 Zeichen, nur um zu schreiben
Hello World!
. Es hat jedoch seine Stärken:C ++
C ++ ist eine sehr starke Sprache, aber es ist etwas langwierig, wenn man versucht, mit 56 Zeichen Golf zu spielen
Hello world!
.Python 3
Python 3 ähnelt C ++ und Java. Es ist viel kürzer, da es nicht stark typisiert ist - mit anderen Worten, es errät nur, was die Variablen sind.
quelle