Sprachen für das Golfen auswählen [geschlossen]

28

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.

Ming-Tang
quelle
Bei einigen Problemen ist es das Typensystem. Wenn Sie beispielsweise mit Ganzzahlen arbeiten müssen, die größer als 64 Bit sind, möchten Sie Sprachen, in denen diese integriert sind (z. B. Golfscript, Haskell), anstelle von Sprachen, die sie teuer machen (z. B. Java).
Peter Taylor
Ich habe dies zu einem Wiki gemäß unserer Richtlinie für Fragen vom Typ "Tipps" gemacht.
dmckee
99 Flaschen ist hilfreich, wenn Sie eine Sprache benötigen, die mit einem bestimmten Buchstaben beginnt ...
Jesse Millikan
Ein dickes Lob an Ace, Trimsty, Algorithmshark und Hosch250, die dazu beigetragen haben, diesen Thread zu einer besseren Ressource zu machen. Bitte halten Sie die Einreichungen kommen! Es war ein harter Kopfgeldanruf zwischen algorithmshark und hosch250, die beide viel gaben Detailarbeit haben, aber am Ende bekommt Herr Shark das Nicken, um den Weg zu .
Jonathan Van Matre
Wählen Sie die gewünschte Sprache. Es ist auch ein Wettbewerb innerhalb der Sprachen. Einzigartigere, interessantere Lösungen in mehr Sprachen sind gut.
Mego

Antworten:

-1

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.

ewanm89
quelle
2
Als primärer Python-Benutzer zahlen Sie in Py für die einfache Verwendung der Zeichenanzahl, obwohl es einige wirklich hackige Tricks gibt, mit denen Sie Zeichen speichern können. Während Haskel und Lisp Spaß haben, laufen sie in der Regel sogar länger als Python.
Arrdem
Dies sollte wahrscheinlich nicht die akzeptierte Antwort sein. Die Beschreibung von High-Level- und Low-Level-Sprachen hat eigentlich nichts mit der Anzahl der Zeichen zu tun.
Samy Bencherif
Ja, es ist wirklich fair, eine 2011-Antwort auf eine am 23. Februar 2017 bearbeitete Frage zu halten. Vielleicht sollten wir aufhören, die Fragen zu ändern, nachdem sie beantwortet wurden?
ewanm89
10

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;)

Algorithmushai
quelle
Hervorragender Beitrag! Vielen Dank, dass Sie als Erster in den Pool gekommen sind.
Jonathan Van Matre
4

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 .

cjfaure
quelle
Ich weiß nicht, was Perl angeht, aber ich stimme zu.
ckjbgames
2

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 wegenputs

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=zB Y=|X|den absoluten Wert von X zurückzugeben

Mathe 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 Code

Heikle 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 QQuellcode des Programms ausgeben muss und Quomplex den Quellcode automatisch ausgibt, sofern nicht *(output) angegeben ist oder keine Ausgabe erfolgt, definiert mit#

Timtech
quelle
2

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 die diff()Funktion eine symbolische Differenzierung durchführen kann.) .

Wenn Sie ein Python2-Programmierer sind, können Sie mit Sage auch schummeln, indem Sie die langen importAnweisungen überspringen . Zum Beispiel mathund syssind bereits standardmäßig importiert. (Beachten Sie, dass dies möglicherweise nicht funktioniert, wenn Ihr Python2-Programm von der Ganzzahldivision abhängt.)

ace
quelle
Gute Infos! Vielen Dank für Ihren Beitrag.
Jonathan Van Matre
1

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:

Für die Eingabe muss ein ScannerObjekt erstellt werden. Es ist schwierig, ein einzelnes Zeichen einzugeben. Hier muss angegeben werden, welche Typen Sie eingeben.
Das Parsen ist aufgrund der forSchleife einfach genug . Die Enhanced forLoop ist dafür hervorragend geeignet.
Java unterstützt Methoden, aber die Methodendeklaration ist ziemlich lang.
Java ist hervorragend in Mathematik sowie in allen anderen Hochsprachen.
Java ist schwierig zu verwenden, wenn das Problem das Ändern von Zeichenfolgen umfasst. Sie können keine Änderungen an einer vorhandenen Zeichenfolge vornehmen.
Javas Arrays sind einfach zu benutzen.
Java ist gut in der Rekursion.
Java enthält eingebaute Grafiken. Sie sind sehr einfach zu bedienen.

C ++

C ++ ist eine sehr starke Sprache, aber es ist etwas langwierig, wenn man versucht, mit 56 Zeichen Golf zu spielen Hello world!.

Eingabe und Ausgabe sind einfach. Sie müssen nicht angeben, welche Typen Sie eingeben - dies erfolgt automatisch. Sie müssen jedoch die iostream-Bibliothek einschließen.
Das Parsen ist sehr einfach.
Die Funktionsdeklaration ist einfach, enthält jedoch viele wichtige Zeichen. C ++ ist hervorragend in Mathematik, enthält jedoch weder PI noch E wie Java.
Die Zeichenfolgen von C ++ sind einfach zu verwenden und können bei Bedarf geändert werden.
Ich benutze vectors wo möglich anstelle von arrays, aber beide sind einfach zu benutzen.
C ++ ist gut in der Rekursion.
C ++ enthält keine integrierten Grafiken.

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.

Die Eingabe ist einfach, aber alles wird als Zeichenfolge eingegeben. Sie müssen alle Eingaben manuell in die gewünschten Werte konvertieren.
Das Parsen und Schleifen ist sehr einfach.
Python-Funktionsdeklarationen sind recht einfach und kurz.
Python kann gut rechnen.
Pythons Saiten sind einfach zu benutzen.
Arrays sind einfach zu bedienen.
Python ist gut in der Rekursion.
Python enthält keine eingebauten Grafiken.

hosch250
quelle
Ich denke, durch die erweiterte for-Schleife sprechen Sie von einer range-for-Schleife. C ++ unterstützt dies seit C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). Es ist syntaktisch der Java for-range-Schleife ähnlich und erfordert, dass die Klasse des iterierbaren Objekts begin () und end () oder begin (T) und end (T) implementiert, um für das angegebene Objekt überladen zu werden. Es ist auch für Strings im C-Stil und integrierte Arrays implementiert und funktioniert für alle Standard-Bibliothekscontainer.
foobar
@foobar Ja, ich habe darüber gesprochen. Danke für die Info, das habe ich mir gewünscht, seit ich Java genommen habe.
Hosch250
Java now has a 61-byte solution, but your point still stands.
MilkyWay90