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.
Réponses:
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.
la source
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.
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
).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.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.
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.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;)
la source
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 .
la source
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 de
puts
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 exempleY=|X|
retourne la valeur absolue de XProblè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 codeProblè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
Q
pour 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#
la source
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 ladiff()
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
import
instructions. Par exemple,math
etsys
sont 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.)la source
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:C ++
C ++ est un langage très fort, mais il est assez long pour essayer de jouer au golf à 56 caractères
Hello world!
.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.
la source