Choisir les langues pour le golf [fermé]


28

Quels conseils pour choisir la bonne langue pour jouer au golf? Quels facteurs affectent la langue à choisir?

Voici quelques exemples de types de problèmes:

  • Problèmes nécessitant une solution d' E / S , console ou fichier
  • Problèmes nécessitant une analyse
  • Problèmes qui vous obligent à écrire votre solution en tant que définition de fonction
  • Problèmes mathématiques
  • Problème avec les nombres premiers
  • Résoudre des énigmes numériques
  • Exécution de méthodes numériques
  • Traitement des chaînes
  • Traitement des tableaux
  • Problèmes de tableau 2D délicats
  • Géométrie de calcul
  • Récursivité
  • Graphiques 2D
  • Graphiques 3D
  • l'audio
  • Réseautage / web
  • Traitement parallèle

Ne dites pas simplement des choses comme "Utiliser GolfScript | J" parce que vous les aimez.


Pour certains problèmes, c'est le système de type. Par exemple, si vous avez besoin de traiter des entiers supérieurs à 64 bits, vous voulez des langages qui ont cela intégré (par exemple Golfscript, Haskell) plutôt que des langages qui les rendent chers (par exemple Java).
Peter Taylor

J'en ai fait un wiki conformément à notre politique sur les questions de type "Astuces".
dmckee

99 bouteilles sont utiles si vous avez besoin d'une langue commençant par une lettre spécifique ...
Jesse Millikan

Félicitations à Ace, Trimsty, Algorithmshark et Hosch250 pour avoir contribué à faire de ce fil une meilleure ressource. Veuillez garder les soumissions à venir! C'était un appel de prime difficile entre algorithmshark et hosch250, qui ont tous deux donné beaucoup d'efforts détaillés, mais au final, Herr Shark obtient le feu vert pour montrer la voie.
Jonathan Van Matre

Choisissez la langue que vous souhaitez. C'est aussi un concours dans les langues. Des solutions plus uniques et intéressantes dans plus de langues sont bonnes.
Mego

Réponses:


-1

Cela dépend de ce dont on a besoin, C / C ++ est rapide, mais vous devez coder vous-même plus de travail. Python et Ruby sont plus lents mais sont beaucoup plus faciles à coder avec des méthodes intégrées qui raccourcissent beaucoup de travail et ils gèrent automatiquement des valeurs infiniment grandes (si l'on a la RAM). L'utilisation d'un langage fonctionnel comme Haskell est idéale pour une utilisation fonctionnelle purement mathématique si l'on peut formuler le problème de cette façon.


2
En tant qu'utilisateur principalement python, dans Py, vous payez pour votre facilité d'utilisation dans le nombre de caractères, bien qu'il existe des astuces vraiment hacky qui peuvent sauver des personnages. Haskel et Lisp, bien qu'amusants, ont tendance à fonctionner encore plus longtemps que Python.
arrdem

Cela ne devrait probablement pas être la réponse acceptée. La description des langues de haut niveau et de bas niveau n'a rien à voir avec le nombre de caractères.
Samy Bencherif

Oui, il est vraiment juste de tenir une réponse de 2011 à une question éditée le 23 février 2017. Peut-être devrions-nous arrêter de changer les questions après avoir répondu?
ewanm89

10

Mettre mes deux cents sur les langages de programmation de tableau , J et APL en particulier.

K / Kona, Q et Nial entrent également dans cette catégorie, mais ils ont généralement les mêmes avantages et critiques. Faites preuve de discrétion. J'utiliserai des exemples J ci-dessous, principalement parce qu'ils sont en ASCII et donc faciles à taper - rappelez-vous que les caractères APL comptent comme des octets simples, alors ne laissez pas cela être votre problème avec la langue comme choix pour le golf.

  • Problèmes mathématiques
  • Résoudre des énigmes numériques
  • Exécution de méthodes numériques
  • Problèmes de tableau 2D délicats

Ces deux sont de très bons langages de mathématiques et de manipulation de données, car ils lancent des tableaux autour d'un niveau élevé, et beaucoup de boucles se font implicitement , en disant, par exemple, ajoutez dix à chacun des 3, 4 et 5 ( 10 + 3 4 5) ou additionnez chacun ligne d'un tableau ( +/"1 arr- le bouclage est dans le "1).

  • Problème avec les nombres premiers

Avec des problèmes de nombre premier en particulier, J a des primitives intégrées rapides et courtes, comme le font certains dialectes d'APL. (Edit: je pense à Nars2000, qui est en partie dialecte et en partie implémentation complètement différente. APL n'a pas de code intégré pour les nombres premiers.) N-ème prime ( p:), non. des nombres premiers jusqu'à ( _1&p:), factorisation ( q:), GCD et LCM ( +.et *.), et ainsi de suite, il y en a beaucoup. Cependant, dans la pratique, la question précisera souvent que vous devez cuisiner vos propres implémentations principales, donc celles-ci ne voient pas trop d'utilité. Il existe toujours des façons soignées et sophistiquées d'obtenir les éléments de base dont vous avez besoin, cela devient juste un peu moins couper-coller.

  • Traitement des chaînes
  • Traitement des tableaux

Le traitement des tableaux et des chaînes est un peu un sac mélangé: si c'est quelque chose pour lequel APL / J est bon ou a un idiome primitif ou commun, c'est presque trivial; si c'est quelque chose de très séquentiel et pas très parallélisable, vous allez avoir du mauvais temps. Tout ce qui se trouve entre les deux est en suspens, mais en général, ils répondront favorablement.

  • Problèmes nécessitant une solution d'E / S, console ou fichier
  • Problèmes qui vous obligent à écrire votre solution en tant que définition de fonction

IO est bizarre. APL a une expression d'entrée d'un seul caractère, mais avec J vous devez passer au moins 8 à lire dans un numéro: ".1!:1]1. La sortie est un peu moins verbeuse, mais vous regardez toujours 6 ou 7 caractères perdus, dans la pratique. J en particulier l'aime vraiment beaucoup si vous pouvez prendre l'entrée en tant qu'arguments d'une fonction, au lieu d'avoir à fouiner avec IO lui-même.

En pratique, avec J et APL, la solution est généralement écrite comme une fonction que vous invoquez sur la console. Avec APL, vous pouvez simplement mettre des noms de variables pour vos arguments et encapsuler l'expression avec laquelle vous travailliez entre accolades et l'appeler un jour.

Mais avec J, il y a un peu de surcharge pour définir des fonctions explicitement - 3 :'...', et vous devez échapper à toutes les chaînes à l'intérieur - donc ce qui est généralement fait est quelque chose appelé programmation tacite: vous programmez au niveau de la fonction, en combinant les primitives d'une manière un peu comme celle de Haskell. Cela peut être à la fois une bénédiction et une malédiction, car vous n'avez pas à dépenser autant de caractères en référence à vos arguments, mais il est facile de se noyer entre parenthèses et de perdre des dizaines de personnages en essayant de pirater votre solution autrement courte et intelligente en quelque chose qui fonctionne.

  • Problèmes nécessitant une analyse
  • Géométrie de calcul

Je n'ai pas d'expérience avec le golf sur ces problèmes particuliers, mais je dirai ceci: au final, les langages de programmation de tableaux sont très bons pour canaliser et transformer beaucoup de données de la même manière. Si vous pouvez transformer le problème en un exercice de mélange des nombres, vous pouvez en faire un problème APL / J, pas de sueur.

Cela dit, tout n'est pas un problème APL / J. Contrairement à Golfscript, APL et J se sont avérés être bons pour le golf, à côté de leurs autres avantages;)


Excellente contribution! Merci d'être le premier dans la piscine.
Jonathan Van Matre

4

Pourquoi Perl n'a-t-il pas encore été félicité? C'est un excellent langage de golf, pour presque chacun d'entre eux, en particulier les trucs liés aux cordes (regex).

Burlesque est bon pour les programmes liés aux nombres, tandis que Ruby est idéal pour une manipulation de texte plus simple.

Il y a en fait une liste de langues et de scores de golf ici .


Je ne sais pas squat sur Perl, mais je suis d'accord.
ckjbgames

2

J'aime utiliser des langages de programmation obscurs pour (essayer de) faire le travail.

Voici mes favoris pour les détails que vous avez énumérés:

Problèmes nécessitant une solution d'E / S, console ou fichier

Des langues comme TI-Basic fonctionnent bien, mais je préfère Ruby à cause deputs

Problèmes nécessitant une analyse

GolfScript vous aidera certainement ici

Problèmes qui vous obligent à écrire votre solution en tant que définition de fonction

TI-84 Table - permet des fonctions comme Y=par exemple Y=|X|retourne la valeur absolue de X

Problèmes mathématiques

TI-Basic - conçu pour une calculatrice, il inclut donc les mathématiques;)

Problème avec les nombres premiers

Rien de spécial; Mathematica est probablement le bon outil pour le travail

Résoudre des énigmes numériques

TI-Basic car il boucle automatiquement à travers les tableaux

Exécution de méthodes numériques

TI-Basic ou Mathematica

Traitement des chaînes

Python - possède d'excellentes fonctions de chaîne.

Peu importe à quel point vous pensez que TI-Basic est, ne l'utilisez pas pour les chaînes ...

Traitement des tableaux

TI-Basic - boucle automatiquement à travers les tableaux ; par exemple incrémenter toutes les valeurs du tableau -L1+1→L1

Ruby - a également des fonctionnalités de tableau très puissantes, et bien sûr, !cela aidera également à compresser le code

Problèmes de tableau 2D délicats

Ruby ou Python fonctionne mieux ici, car TI-Basic ne prend pas en charge les tableaux 2D

Géométrie de calcul

TI-Basic a des caractéristiques géométriques et peut être utilisé pour la plupart des mathématiques jusqu'au calcul et à l'algèbre linéaire


PRIME

Looping

Soit Arduino ou Quomplex . Arduino a un intégré void loop(){}et Quomplex a les boucles infinies contenues entre crochets ( [])

Dessin / GUI

Game Maker Language possèdedes fonctionnalités de dessin très puissantes et TI-Basic est également un outil généralement utile en raison de la prise en charge du dessin sur le graphique.

Quines

Soit HQ9 + ou Quomplex car HQ9 + a le Qpour sortir le code source du programme et Quomplex imprimera automatiquement son code source à moins que *(sortie) ne soit spécifié ou qu'il ne produise aucune sortie, définie avec#


2

Si vous résolvez un problème mathématique et que vous n'avez pas Mathematica, essayez Sage . Il est basé sur Python, donc si vous connaissez déjà Python, vous n'avez pas besoin de beaucoup de temps pour apprendre sa syntaxe.

Exemples:

Il est également utile pour le tracé de graphiques et la résolution d'équations (par exemple, vous pouvez utiliser la solve()fonction dans Sage, ou si cela est interdit par les règles, il permet une implémentation facile du processus de Newton Raphson car il a la diff()fonction qui peut effectuer une différenciation symbolique) .

De plus, si vous êtes un programmeur Python2, utiliser Sage peut vous permettre de tricher en sautant les longues importinstructions. Par exemple, mathet syssont déjà importés par défaut. (Notez que cela peut ne pas fonctionner si votre programme Python2 dépend de la division entière.)


Bonne info! Merci d'avoir contribué.
Jonathan Van Matre

1

Je connais trois langages - Java, C ++ et Python 3. Je ne connais aucun de ces derniers à un niveau élevé, mais c'est mon expérience avec eux.

Java:

Je n'utiliserais plus jamais Java pour jouer au golf. Il faut plus de 80 caractères pour écrire Hello World!. Cependant, il a ses points forts:

L'entrée nécessite la création d'un Scannerobjet. Il est difficile de saisir un seul caractère. Cela nécessite de spécifier les types que vous saisissez.
L'analyse est assez simple à cause de la forboucle. La forboucle améliorée est excellente pour cela.
Java prend en charge les méthodes, mais la déclaration de méthode est assez longue.
Java est excellent en mathématiques, ainsi que tous les autres langages de haut niveau.
Java est difficile à utiliser lorsque le problème implique de modifier des chaînes. Vous ne pouvez pas modifier une chaîne existante.
Les tableaux de Java sont simples à utiliser.
Java est bon en récursivité.
Java inclut des graphiques intégrés. Ils sont très faciles à utiliser.

C ++

C ++ est un langage très fort, mais il est assez long pour essayer de jouer au golf à 56 caractères Hello world!.

L'entrée et la sortie sont faciles. Vous n'avez pas besoin de spécifier les types que vous saisissez - cela se fait automatiquement. Cependant, vous devez inclure la bibliothèque iostream.
L'analyse est très simple.
La déclaration de fonction est simple, mais mange beaucoup de caractères importants. C ++ excelle en mathématiques, mais il n'inclut pas PI ou E, comme Java.
Les chaînes de C ++ sont faciles à utiliser et modifient au besoin.
J'utilise vectors si possible au lieu de arrays, mais les deux sont faciles à utiliser.
C ++ est bon en récursivité.
C ++ n'inclut pas de graphiques intégrés.

Python 3

Python 3 est similaire à C ++ et Java. Il est beaucoup plus court car il n'est pas fortement typé - en d'autres termes, il devine simplement quelles sont les variables.

L'entrée est facile, mais tout est entré sous forme de chaînes. Vous devez convertir manuellement toutes les entrées en toutes les valeurs souhaitées.
L'analyse et la boucle sont très simples.
Les déclarations de fonction Python sont assez simples et courtes.
Python est bon en mathématiques.
Les chaînes de Python sont simples à utiliser.
Les tableaux sont simples à utiliser.
Python est bon en récursivité.
Python n'inclut pas de graphiques intégrés.


Je suppose que par boucle for-for améliorée, vous parlez d'une boucle range-for. C ++ prend cela en charge depuis C ++ 11 ( en.cppreference.com/w/cpp/language/range-for ). Elle est syntaxiquement similaire à la boucle Java for-range et nécessite que la classe de l'objet itératif implémente begin () et end () ou begin (T) et end (T) pour être surchargé pour l'objet donné. Il est également implémenté pour les chaînes de style C et les tableaux intégrés et fonctionne pour tous les conteneurs de bibliothèque standard.
foobar

@foobar Oui, j'en parlais. Merci pour l'info, je le souhaite depuis que j'ai pris Java.
Hosch250

Java a maintenant une solution de 61 octets, mais votre argument est toujours valable.
MilkyWay90
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.