Dans ce défi, les utilisateurs effectueront à tour de rôle trois tâches de codage assez simples dans des langages de programmation dont l’ancienneté est autorisée.
La première réponse doit utiliser un langage de programmation créé en 2015. Une fois qu'il existe au moins une réponse d'un langage de 2015, les réponses peuvent utiliser des langages de programmation créés en 2014. De même, les réponses utilisant des langages à partir de 2013 ne sont pas autorisées. jusqu'à ce qu'il y ait au moins une réponse en 2014.
En général, l'utilisation d'un langage de programmation à partir de l'année Y n'est pas autorisée tant qu'une réponse utilisant un langage à partir de l'année Y + 1 n'a pas été soumise. La seule exception est Y = 2015.
Trouver l'année de votre langue
Pour répondre à cette question, vous devez connaître l'année de fabrication de votre langage de programmation. Ceci est, bien sûr, un terme subjectif; certaines langues ont été développées au cours de plusieurs années et de nombreuses langues font encore l’objet d’une mise à niveau chaque année. Que l’année de fabrication d’une langue soit la première année d’application de cette langue par le grand public.
Par exemple, Python a été "fabriqué en" 1991 , bien que son développement soit en cours depuis 1989 et que la version 1.0 ne soit sortie qu'en 1994.
Si cette année est encore subjective, utilisez votre bon sens pour choisir l’année la plus appropriée. Ne vous perdez pas dans de légers désaccords sur les choix d’année. Veuillez fournir un lien vers une source indiquant à quelle date votre langue a été créée.
Différentes versions ou normes d'un langage de programmation (par exemple, Python 1, 2, 3) sont considérées comme le même langage avec la même année initiale.
Ainsi, à moins que l'année de votre langue soit 2015, vous ne pouvez soumettre votre réponse qu'une fois qu'une réponse a été soumise, l'année de la langue étant l'année précédant la vôtre.
Si une réponse valide avec la même année que la votre existe déjà, vous pouvez répondre. Peu importe que votre langue ait été développée plus tôt ou plus tard dans l'année.
les tâches
Vous devez exécuter les tâches 1 à 3. La tâche 0 est facultative.
Ces tâches ont été plus ou moins choisies pour correspondre à trois aspects importants de la programmation: fournir une sortie (tâche 1), une boucle (tâche 2) et une récursion (tâche 3).
Tâche 0 - Histoire de la langue (facultatif)
Rédigez au moins un paragraphe expliquant l’historique du langage de programmation que vous avez choisi: qui l’a développé, pourquoi, comment, etc. Ceci est particulièrement encourageant si vous étiez personnellement présent au moment de la création du langage et avez peut-être même joué un rôle dans son développement. N'hésitez pas à raconter des anecdotes personnelles sur l'effet de la langue sur vous ou sur votre travail, ou quelque chose du genre.
Si vous êtes trop jeune pour en savoir plus sur l'histoire de votre langue sans faire beaucoup de recherches, pensez à laisser une note aux utilisateurs plus âgés, leur indiquant qu'ils peuvent modifier votre message et ajouter un historique de première main.
Tâche 1 - "Bonjour le monde!" Une variante
Ecrivez un programme qui imprime
[language name] was made in [year made]!
dans la zone de sortie standard de votre langue (stdout pour les langues les plus récentes).
Par exemple, si le langage était Python, le résultat serait:
Python was made in 1991!
Tâche 2 - Art ASCII N
Ecrivez un programme qui permet à l’utilisateur de saisir un nombre entier positif impair (vous pouvez supposer que la saisie est toujours valide) et d’imprimer une lettre N ASCII créée à l’aide du caractère N
.
Si l'entrée est 1, la sortie est:
N
Si l'entrée est 3, la sortie est:
N N
NNN
N N
Si l'entrée est 5, la sortie est:
N N
NN N
N N N
N NN
N N
Si l'entrée est 7, la sortie est:
N N
NN N
N N N
N N N
N N N
N NN
N N
Le motif continue comme ça. La sortie peut contenir des espaces de fin.
Tâche 3 - GCD
Ecrivez un programme qui permet à l'utilisateur d'entrer deux nombres entiers positifs (vous pouvez en déduire que l'entrée est toujours valide) et affiche son plus grand diviseur commun . Ceci est défini comme le plus grand entier positif qui divise les deux nombres sans laisser de reste. Il peut être facilement calculé en utilisant l' algorithme d'Euclidean .
Exemples:
8
, 12
→ 4
12
, 8
→ 4
3
, 30
→ 3
5689
, 2
→ 1
234
, 876
→6
Vous pouvez utiliser une fonction intégrée, mais essayez de savoir si elle était dans la première version de votre langue. Sinon, essayez de ne pas l'utiliser.
Règles
- Vous pouvez répondre plusieurs fois, mais chaque nouvelle réponse doit utiliser une langue définie au moins 5 ans avant la langue de votre dernière réponse. Donc, si vous avez répondu avec une langue 2015, vous ne pourrez pas répondre jusqu'à ce que 2010 langues soient autorisées. Si vous commencez avec une réponse en 2010, vous ne pouvez pas faire une réponse en 2015 votre deuxième réponse car 2015 n'est pas avant 2010.
- Si possible, écrivez votre code pour qu'il fonctionne dans la toute première version de votre langue (ou dans une version aussi ancienne que possible). (Ce n'est pas une obligation car il peut être difficile de trouver d'anciens compilateurs / interprètes pour certaines langues.)
- Abstenez-vous de publier une langue qui a déjà été publiée, sauf si la réponse affichée contient des erreurs importantes ou si vous avez une façon très différente d'accomplir les tâches.
- Golfer votre code est correct mais pas obligatoire.
- Un retour à la ligne dans la sortie de tout programme convient.
- Pour les tâches 2 et 3, toutes les valeurs d'entrée inférieures à un maximum raisonnable comme 2 16 doivent fonctionner (256 au minimum).
- Votre langue doit avoir existé avant que cette question ne soit posée.
- Les très vieux langages de programmation peuvent avoir des formes d’entrée et de sortie différentes de celles que nous pensons aujourd’hui. C'est bon. Remplissez les tâches au mieux de vos capacités dans le contexte de votre langue.
Notation
Le score de votre soumission est:
upvotes - downvotes + (2015 - languageYear) / 2
Ainsi, 0,5 est ajouté au nombre de votes pour chaque année avant 2015, ce qui donne un avantage aux langues plus anciennes. La soumission avec le score le plus élevé gagne.
Liste de réponses
L'extrait de pile ci-dessous répertorie toutes les réponses valides selon leur année linguistique.
Vous devez commencer votre publication avec cette ligne Markdown pour vous assurer qu'elle est correctement répertoriée:
#[year] - [language name]
Par exemple:
#1991 - Python
Le nom de la langue peut être dans un lien (ce sera le même lien dans la liste de réponses):
#1991 - [Python](https://www.python.org/)
Les réponses qui ne suivent pas ce format, ou qui ont une année qui n’est pas encore autorisée, ou qui proviennent d’un utilisateur qui a déjà répondu au cours des 5 dernières années sont marquées comme non valides.
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>$(function(){function e(e,r){var a="https://api.stackexchange.com/2.2/questions/48476/answers?page="+e.toString()+"&pagesize=100&order=asc&sort=creation&site=codegolf&filter=!YOKGPOBC5Yad160RQxGLP0r4rL";$.get(a,r)}function r(e){if(e.items.forEach(function(e){var r=e.link,a=e.owner.display_name,i=e.body.match(/<h1\b[^>]*>(\d{4}) - (.*?)<\/h1>/);if(i&&i.length>=3)var h=parseInt(i[1]),u=i[2];h&&u&&n>=h&&h>=t&&(!d.hasOwnProperty(e.owner.user_id)||d[e.owner.user_id]-h>=p)?(d[e.owner.user_id]=h,h==t&&--t,o.hasOwnProperty(h)||(o[h]=[]),o[h].push({language:u,user:a,link:r,score:e.score+(n-h)/2})):s.push(' <a href="'+r+'">'+a+"</a>")}),e.has_more)runQuery(++a,r);else{for(var i=n,h=[];o.hasOwnProperty(i);){for(var u=$("<tr>").append($("<td>").text(i.toString())),l=$("<td>"),c=$("<td>"),g=$("<td>"),f=0;f<o[i].length;f++){var v=o[i][f];l.append(v.language),c.append($("<a>").html(v.user).attr("href",v.link)),g.append(v.score),f+1<o[i].length&&(l.append("<br><br>"),c.append("<br><br>"),g.append("<br><br>"))}u.append(l).append(c).append(g),h.push(u),--i}$("#answers").find("tbody").append(h),s.length>0?$("#invalid").append(s):$("#invalid").remove()}}var a=1,n=2015,t=n-1,p=5,o={},s=[],d={};e(1,r)})</script><style>html *{font-family: Helvetica, Arial, sans-serif;}table{border: 4px solid #a4a; border-collapse: collapse;}th{background-color: #a4a; color: white; padding: 8px;}td{border: 1px solid #a4a; padding: 8px;}div{font-size: 75%;}</style><table id='answers'> <tr> <th>Year</th> <th>Language</th> <th>User (answer link)</th> <th>Score</th> </tr></table><div id='invalid'><br>Invalid Answers:</div>
la source
Réponses:
2013 - Dogescript
Dogescript est un langage créé en 2013 par Zach Bruggeman. Ce n'est rien de plus qu'un remplacement de la syntaxe de Javascript pour le rendre lu comme le monologue interne de Shiba Inus.
Bonjour doge
ASCII Art
GCD
la source
s[i]
bit aussi!2015 - Retina
Retina est un langage de programmation basé sur les expressions rationnelles, que j’ai écrit pour pouvoir rivaliser dans les défis de PPCG avec des réponses uniquement pour les expressions rationnelles, sans avoir à supporter inutilement une surcharge d’appel dans un langage hôte. La rétine est Turing-complète. Pour le prouver, j'ai implémenté un solveur système à 2 balises ainsi que la règle 110 . Il est écrit en C # et supporte donc à la fois la version .NET (par défaut) et la version ECMAScript (via un indicateur).
Retina peut fonctionner dans plusieurs modes, mais le plus pertinent pour les calculs (et celui de Turing complet) est le mode Remplacer. En mode Remplacer, vous donnez à Retina un nombre pair de fichiers source. Ceux-ci sont ensuite appariés, le premier de chaque paire étant une expression rationnelle et le second un remplacement. Celles-ci sont ensuite exécutées dans l'ordre en manipulant l'entrée pas à pas. L'expression régulière peut également être précédée d'une configuration (délimitée par
`
). L'option la plus importante (qui rend Retina Turing-complete) est+
ce qui permet à Retina d'appliquer le remplacement en boucle jusqu'à ce que le résultat cesse de changer. Dans les exemples suivants, j'utilise aussi;
, qui supprime la sortie sur les étapes intermédiaires.Dans chacune des soumissions suivantes, chaque ligne est placée dans un fichier source distinct. (Vous pouvez également utiliser la nouvelle
-s
option et placer toutes les lignes dans un seul fichier.) Les fichiers / lignes vides sont représentés par<empty>
. Les fichiers / lignes contenant un seul espace sont représentés par<space>
.Les explications sont assez longues, je les ai donc déplacées à la fin du post.
Les programmes
"Bonjour le monde!" Une variante
ASCII Art N
Cela suppose que STDIN se termine par une nouvelle ligne.
GCD
Cela nécessite que STDIN ne se termine pas par une nouvelle ligne.
Des explications
"Bonjour le monde!" Une variante
C'est assez trivial. Il ne prend aucune entrée (c.-à-d. Une chaîne vide), ne correspond à rien et le remplace par
Retina was made in 2015!
. On peut aussi le faire fonctionner pour une entrée arbitraire, en remplaçant le motif par[\s\S]*
par exemple. Cela slurp STDIN et remplacerait tout par la sortie.ASCII Art N
Cela a beaucoup d'étapes. L'idée est de convertir l'entrée en unaire, de créer un N x N bloc de
N
s, puis de "sculpter" deux triangles. Passons par les différentes étapes. N'oubliez pas que;
supprime simplement les sorties intermédiaires, mais+
provoque l'application du remplacement dans une boucle.Simple: ajoutez a
#
à l'entrée. Ceci sera utilisé comme marqueur dans la conversion en unaire.Ceci convertit un chiffre en unaire. Il prend les chiffres déjà convertis
(\d*)
et les répète 10 fois. Et puis il prend le chiffre suivant et ajoute le nombre approprié de chiffres. La valeur réelle des chiffres est sans importance à ce stade. Lorsque le#
atteint la fin du nombre, l'expression régulière ne correspond plus et la conversion est terminée. À titre d’exemple, le numéro127
sera traité commeoù la dernière ligne contient exactement 127 caractères numériques.
Deux étapes simples qui éliminent cela
#
et convertissent ensuite tous les chiffres enN
. Dans ce qui suit, je vais utiliser l'entrée7
comme exemple. Alors maintenant, nous avonsL'étape suivante
remplace chacun
N
par la chaîne complète (rappelez-vous qu'il contient une nouvelle ligne finale) et supprime également la nouvelle ligne finale elle-même. Par conséquent, cela transforme la rangée unique en une grille carrée:Maintenant le triangle supérieur. Tout d’abord, nous commençons par transformer le N situé dans le coin inférieur droit en un espace:
Le lookahead garantit que nous modifions le correct
N
. Cela donneEt maintenant
est une expression rationnelle qui correspond à un élément situé
N
au-dessus ou dans le coin supérieur gauche d'un caractère d'espacement et le remplace par un espace. Comme le remplacement est répété, il s’agit essentiellement d’un remplissage intense, qui transforme le 3e octant de l’espace initial en plusieurs espaces:Et enfin, nous répétons la même chose avec le triangle du bas, mais nous utilisons un caractère différent, de sorte que les espaces déjà existants ne génèrent pas un remplissage saturé:
définit la graine:
ensuite
fait le remplissage d'inondation.
et enfin
Les transforme
S
en espaces et nous avons terminé:GCD
GCD in unary est en réalité très trivial avec regex. La majeure partie de ceci consiste en la conversion décimale à unaire et unaire à décimale. Cela pourrait être fait de manière plus compacte, mais ce n'est pas un code de golf, alors ...
Ces étapes sont essentiellement les mêmes que ci-dessus, à l'exception du fait que les deux nombres entrés sont convertis et que le résultat utilise
1
s au lieu deN
s (ce n'est pas important). Donc, si l'entrée était18 24
, alors cela produiraitMaintenant
est le calcul complet de GCD. Nous
1
comparons un diviseur commun en capturant un nombre de s, puis en utilisant des références arrières pour nous assurer que les deux nombres peuvent être écrits en répétant cette chaîne (et rien d'autre). En raison du fonctionnement du retour en arrière dans le moteur des expressions rationnelles (c’est-à-.+
dire glouton), cela donnera toujours le plus grand diviseur commun automatiquement. Comme la correspondance couvre toute la chaîne, nous écrivons simplement le premier groupe de capture à obtenir notre GCD.Enfin, la conversion unaire à décimale ...
Ajoutez un marqueur
#
, un délimiteur:
et tous les chiffres à la chaîne. Cela est nécessaire car vous ne pouvez pas générer de nouveaux caractères de manière conditionnelle dans un remplacement de regex. Si vous souhaitez un remplacement conditionnel, vous devez extraire les caractères de la chaîne elle-même, nous les mettons donc là.C'est l'inverse de l'expansion unaire plus tôt. Nous trouvons le plus grand multiple de 10 qui correspond à la chaîne actuelle. Ensuite, nous choisissons le chiffre suivant en fonction du reste et divisons le multiple par 10 tout en déplaçant le marqueur à travers les chiffres.
Et enfin, juste une étape de nettoyage pour se débarrasser du marqueur, du délimiteur et des chiffres auxiliaires.
la source
2013 - Snap !
Snap ! est un langage basé sur Scratch , créé à l’Université de Berkeley. Il s’agit d’une mise à niveau de Scratch avec des données de première classe et des blocs personnalisés (fonctions). Comme Scratch, il ne s'agit pas d'un texte, mais de "blocs" visuels qui s'emboîtent.
Snap ! , écrit en JavaScript, est le successeur de BYOB, qui a été écrit en Squeak Smalltalk. Snap ! a été publié en version bêta pour la consommation publique en mars 2013 .
Snap ! n'est en réalité pas un langage ésotérique. Il est utilisé comme langage de programmation pour le cours AP CS Beauty and Joy of Computing (BJC) à Berkeley et d’autres.
J'ai aidé avec des tests et des choses.
"Hello World" variante
ASCII Art "N"
Cela utilise stdlib pour certains des blocs.
Jolie base en boucle ici. Prend une entrée. Ensuite, nous additionnons tout simplement et disons (résultat pour n = 5):
J'ai pris la liberté ici de simplement utiliser 2 espaces au lieu de 1, parce que Snap! ne dit pas de choses en monospace.
GCD
L'algorithme euclidien n'est pas très rapide, mais il fonctionne et est assez simple. (Désolé, j'ai fait une faute de frappe dans le nom du bloc. Maintenant, j'ai fermé l'onglet sans sauvegarder. Il ne reste plus qu'à rester.)
Cette définition de fonction produira alors ce bloc:
la source
2007 - LOLCODE
Histoire de la langue
LOLCODE a été créé en 2007 par Adam Lindsay, chercheur à l'Université de Lancaster. Sa syntaxe est basée sur les memes lolcats popularisés par Cheezburger, Inc.
"Bonjour le monde!" Une variante
ASCII Art N
Les valeurs sont lues sous forme de chaînes (YARN) à partir de stdin using
GIMMEH
. Ils peuvent être convertis en nombres numériques (NUMBR) en les multipliant par 1.Les valeurs sont imprimées sur stdout en utilisant
VISIBLE
. Par défaut, une nouvelle ligne est ajoutée, mais vous pouvez la supprimer en ajoutant un point d'exclamation.GCD
SMOOSH
effectue une concaténation de chaîne.la source
IM IN YR toilet UPPIN YR butt
Noms de variables sympasx1
,x2
etc.1982 - PostScript
PostScript est un langage permettant de créer des graphiques vectoriels et d’imprimer.
Adobe a été fondé en 1982 et son premier produit était PostScript. Le langage a été utilisé dans les imprimantes: les commandes sont interprétées par l’imprimante pour créer une image raster, qui est ensuite imprimée sur la page. C'était un composant très courant des imprimantes laser jusque dans les années 1990. Mais il est évident que l’imprimante nécessite beaucoup de ressources en processeur et, à mesure que les processeurs d’ordinateur devenaient plus puissants, il était plus logique de rasteriser l’ordinateur sur l’ordinateur que sur l’imprimante. PostScript a en grande partie disparu sur les imprimantes grand public, bien qu'il existe encore sur de nombreuses autres imprimantes haut de gamme.
Le standard qui a remplacé PostScript est un format peu connu appelé PDF.
Lorsque je commençais à programmer, PostScript était tombé en désuétude, mais j’ai appris un peu à l’université comme autre moyen de créer des documents pour TeX. C’était assez différent des autres langages de programmation que j’avais utilisés (notation inversée, pile, impression sur une page plutôt que sur une console), mais c’était bien de dépoussiérer cet ancien langage pour s’amuser.
Comme PostScript est un langage d'impression, il semble plus approprié de l'utiliser pour imprimer quelque chose, puis d'envoyer une sortie à la console.
Tache 1
Les premières lignes constituent un canevas sur lequel s’appuyer. Ensuite, la
moveto
commande demande à PS de dessiner à une position particulière et d’show
imprimer la chaîne sur la page. Notez que les parenthèses marquent une chaîne dans PostScript, pas des guillemets.Tâche 2
J'ai écrit une fonction pour dessiner “l'art ASCII” N, mais les fonctions PostScript n'ont aucun moyen de prendre un argument. Au lieu de cela, vous placez vos arguments dans la pile, puis vous les récupérez. C'est la
/x exch def
ligne.Un exemple: supposons que la pile est
8 9 2
. D'abord, nous plaçons le nom/x
dans la pile, donc la pile est8 9 2 /x
. L'exch
opérateur échange les deux valeurs de la pile8 9 /x 2
. La pile est maintenant .def
Affiche ensuite les deux premières valeurs de pile et définit/x
la valeur2
. La pile est maintenant8 9
.Quand j'ai commencé à utiliser PostScript, j'ai trouvé cela un peu déroutant. J'avais lu sur la pile comme un concept théorique, mais c'était la première fois que je l'utilisais dans la pratique.
Le reste de la fonction consiste en un code de dessin: commencez dans le coin inférieur droit, en remplissant une ligne à la fois, de gauche à droite en diagonale.
Tâche 3
Encore une fois, j'ai utilisé une forme de l'algorithme d'Euclid, mais j'avais oublié que PostScript possède un opérateur modulo intégré. J'ai donc dû écrire le mien. Cela s'est avéré être un rappel utile des contraintes de la programmation par pile. Ma première implémentation de
modulo
était basée sur la récursivité:ce qui est bien jusqu'à ce que vous essayiez de l'exécuter quand
x
est grand ety
petit (par exemple 5689 et 2). Vous ne pouvez avoir que 250 éléments maximum sur la pile et je dépassais donc largement la limite de pile. Oops. Je devais revenir à la planche à dessin sur celui-là.Le code GCD lui-même est assez simple. Mais tout comme les fonctions ne peuvent pas prendre d'arguments, elles n'ont donc pas de valeur de retour. Au lieu de cela, vous devez placer le résultat dans la pile, de sorte que quelqu'un d'autre puisse le récupérer plus tard. C’est ce que les lignes
a
etb a gcd
font: quand elles ont fini d’évaluer, elles transmettent la valeur à la pile.Si vous mettez tout le code dans un document et l'imprimez, voici à quoi ressemble le résultat:
la source
2009 - > <>
Inspiré de Befunge,> <> (Fish) est un langage 2D ésotérique basé sur des piles, c’est-à-dire que le déroulement du programme peut être haut, bas, gauche ou droit. La version initiale de> <> en vedette multithreading où
[
et]
créé et fini les discussions, mais pour des raisons de simplicité ces instructions ont été modifiées pour créer et supprimer des nouvelles piles respectivement.L'interprète officiel actuel pour> <> peut être trouvé ici . Malheureusement, le lien vers l'ancien interprète sur le wiki Esolang est rompu.
"Bonjour le monde!" Une variante
Notez que la chaîne est écrite à l'envers -> <> n'a techniquement pas de chaînes, le seul type de données étant un étrange mélange de char, int et float.
"
bascule l'analyse des chaînes, en poussant chaque caractère sur la pile jusqu'à ce que la fermeture"
soit respectée.La seconde moitié du code pousse ensuite la longueur de la pile
l
, vérifie si elle est nulle?!
et si le programme se termine;
. Sinon, le pointeur d'instruction continue en affichant le haut de la pileo
avant d'exécuterbb+0.
, ce qui le téléporte en position(22, 0)
juste avantl
, créant ainsi une boucle.ASCII Art N
Avec espacement pour plus de clarté. Vous pouvez essayer ceci sur le nouvel interprète en ligne ici et voir le pointeur d’instructions faire le tour - n'oubliez pas de saisir un numéro dans la zone de texte "Pile initiale". Si vous utilisez l’interpréteur Python, utilisez le
-v
drapeau pour initialiser la pile, par exemplePour ce programme, nous mettons l'entrée
n
dans le registre avec&
et poussons un 0, que nous appelleronsi
des "itérations". Le reste du programme est une boucle géante qui va comme ceci:Ensuite, nous répétons la boucle depuis le début.
Les flèches
^>v<
changent la direction du flux du programme et les miroirs/\
reflètent la direction du flux du programme.GCD
Voici un exemple de ce à quoi pourrait ressembler un programme golfé> <>. Encore une fois, vous pouvez essayer ceci dans l' interpréteur en ligne (entrez deux valeurs séparées par des virgules dans le champ "Pile initiale", par exemple
111, 87
) ou en utilisant le-v
drapeau de l'interpréteur Python, par exempleCe programme utilise l'algorithme euclidien. Voici un GIF que j'ai préparé plus tôt:
Notez que> <> est toroïdal. Ainsi, lorsque l'
v
instruction en bas à gauche est exécutée, le pointeur d'instruction va vers le bas, tourne autour et réapparaît en haut.Edit: En faisant tourner le code entièrement de droite à gauche , @randomra a réussi à raser trois octets avec
Je suppose que je n'ai pas assez joué au golf :)
la source
><>
est un palindrome.2012 - Element
C’est un langage que j’ai inventé début 2012 pour être un langage simple pour jouer au golf. Par cela, je veux dire qu’il ya très peu, voire aucun opérateur surchargé. Les opérateurs sont également plus simples et moins nombreux que la plupart des langues de golf modernes.
Les caractéristiques les plus intéressantes de ce langage sont ses structures de données. Il y a deux piles et un hachage qui sont utilisés pour stocker des informations.
La pile m est la pile principale, où l'arithmétique et la plupart des autres opérations ont lieu. Lorsque des données sont saisies ou imprimées, c'est à partir de là où elles sont récupérées.
La pile C est la pile de contrôle. C'est là que l'arithmétique booléenne a lieu. Les valeurs les plus élevées de la pile c sont utilisées par les boucles If et While comme condition.
Le hash est l'endroit où les variables sont stockées. Le
;
et~
stocker et récupérer des données à partir du hachage, respectivement.Element est un langage très faiblement typé. Il utilise la capacité de Perl à interpréter librement les nombres comme des chaînes et inversement.
Pendant que j'y suis, je pourrais aussi bien inclure toute la documentation pour la langue. Vous pouvez trouver l' interprète original de 2012, écrit en Perl, ici . Mise à jour: j'ai créé une version plus utilisable, que vous pouvez trouver ici .
Tâche 1 - Imprimer le texte
L’une des parties les plus délicates du langage est l’absence de délimiteurs de chaîne, raison pour laquelle des caractères d’échappement sont nécessaires dans cette chaîne. Le
`
à la fin imprime la chaîne.Tâche 2 - Art ASCII N
Ici, vous assisterez à des manipulations de pile. Pour rendre l’explication un peu plus facile à mettre en forme, je remplacerai la nouvelle ligne par un
L
et l’espace par unS
.Après avoir fait quelques remarques extrêmes sur cette réponse, j’ai trouvé une solution de 39 octets, bien que ce soit beaucoup plus compliqué.
Tâche 3 - GCD
Ceci est une méthode basée sur la pile.
la source
2012 - Julia
Histoire de la langue
Julia a été créée en 2012 par Jeff Bezanson, Stefan Karpinski et Viral Shah, tandis que Jeff était étudiant à l'Institut de technologie du Massachussets (MIT), conseillé par le professeur Alan Edelman. Ils étaient motivés par le désir d'un langage de programmation open source, rapide et dynamique (entre autres choses), tout en maintenant la facilité d'utilisation dans diverses applications. Le produit était Julia, une nouvelle approche du calcul scientifique de haute performance.
"Bonjour le monde!" Une variante
Imprimer sur STDOUT chez Julia est assez simple!
ASCII Art N
Le code est mis en retrait pour des raisons de lisibilité, mais Julia n’impose aucune restriction quant aux espaces.
GCD
La dernière chose répertoriée dans la fonction est retournée implicitement.
la source
1988 - Mathematica
Ou devrais-je l'appeler Wolfram Language ?
Tâche 0
Le créateur de Mathematica est Stephen Wolfram, fondateur et PDG de Wolfram Research. Avant le développement de Mathematica, il était physicien. Il y avait une énorme quantité de calculs algébriques en physique, il est donc devenu un utilisateur de Macsyma .
Wolfram a obtenu son doctorat en 1979, à l'âge de 20 ans. Il pensait qu'il lui fallait un meilleur CAS que Macsyma pour faire de la physique. Il a donc commencé à écrire SMP (le "Programme de manipulation symbolique"). La première version de SMP a été publiée en 1981. SMP était le prédécesseur de Mathematica. Bien qu'il ait eu une influence profonde sur Mathematica, aucun de ses codes n'a jamais été utilisé pour Mathematica.
En 1986, Wolfram décida d'écrire un "système de calcul ultime". Il a commencé à écrire le code en 1986 et a fondé Wolfram Research en 1987. Enfin, Mathematica 1.0 est sorti le 23 juin 1988.
Je n'ai pas trouvé Mathematica 1.0. En fait, Mathematica 1.0 n’avait ni version Windows ni Linux. Mais j'ai trouvé Mathematica 2.0 sur un site web chinois. Il peut toujours être exécuté sur Windows XP.
Tache 1
Ou simplement:
Tâche 2
Dans Mathematica d'aujourd'hui, nous pouvons écrire:
Tout comme Julia et R , il s'agit d'une solution matricielle. Dans Mathematica, vous pouvez définir une matrice fragmentée à l'aide de la correspondance de motifs.
Cependant, a
SparseArray
été introduit dans Mathematica 5.0, nous ne pouvons donc pas l'utiliser dans Mathematica 1.0.Voici une solution qui fonctionne dans Mathematica 1.0:
Nous ne pouvons pas écrire
f[i_, 1 | i_ | n] = "N"
car aAlternatives
été introduit dans Mathematica 2.0.Tâche 3
Nous pouvons simplement utiliser la fonction intégrée:
Ou nous pouvons utiliser la définition du GCD:
Ou nous pouvons utiliser le LCM , bien que plus communément le LCM soit calculé à partir de GCD:
Ou nous pouvons utiliser l'algorithme euclidien avec un filtrage:
Ou en tant que fonction anonyme:
Toutes les fonctions ci-dessus ont été introduites dans Mathematica 1.0.
la source
1999 - XSLT
Le World Wide Web Consortium (W3C) a créé XSLT pour transformer XML en HTML, texte, etc. Les exemples suivants supposent que l'entrée est entourée de
<input>..</input>
balises.Tache 1
Celui-ci est simple. Il correspond à une
input
balise au niveau supérieur et la remplace par la sortie souhaitée.Tâche 2
Celui-ci définit 2 modèles récursifs,
loop
etspaces
.loop
avec des paramètresi
etn
générera la sortie souhaitée pourn
, à partir de la positioni
.spaces
avec paramètren
générera desn
espaces.Tâche 3
L'entrée pour cela doit être dans les
<input><num>..</num><num>..</num></input>
balises.Celui-ci est juste un modèle récursif
gcd
qui utilise l'algorithme euclidien.la source
2014 - CJam
CJam a été créé par l'utilisateur aditsu du groupe PPCG et a été publié vers avril 2014 .
"Bonjour le monde!" Une variante
CJam imprime automatiquement le contenu de la pile à la fin du programme
ASCII Art N
Explication du code:
Prend la hauteur / largeur de N comme entrée via STDIN. Essayez-le en ligne ici
GCD
Prend les deux nombres en entrée via STDIN. Essayez-le en ligne ici
la source
ri_S*0'NtW'Nta1$*\,Sf*'Nf+..e>N*
en CJam moderne.1990 - Haskell
Haskell est un langage fonctionnel pur populaire (ou devrais-je dire: le plus populaire ?). Il se démarque du grand public par son modèle d'évaluation inhabituel (par défaut, tout est paresseux ou, techniquement, non strict) et par son système de types basé sur Hindley-Milner qui, même maintenant, est l'un des plus puissants du marché.
Tache 1
Tâche 2
Démo, affiche toute la liste infinie (jusqu'à ce que l'utilisateur abandonne ou que le monde se termine ...)
Bien sûr, vous pouvez facilement accéder à un seul d'entre eux en accédant à un seul élément de la liste infinie:
Tâche 3
la source
1972 - INTERCAL
Et vous pensiez que Fortran et Cobol étaient bizarres. C'est insensé!
Tache 1
Je ne vais pas essayer d'expliquer le système d'entrées et de sorties d'INTERCAL; lisez simplement ceci et espérons que vous ne mourrez pas.
Tâche 2
Bonté divine. Cela m'a pris un peu pour comprendre. Les numéros d'étiquette sont en désordre et reflètent donc cela. Je ne vais pas essayer d'expliquer ceci à moins que quelqu'un ne le demande.
Tâche 3
Celui-ci est un peu plus simple. A cause de ... l'étrangeté d'INTERCAL, vous devez entrer les nombres comme ceci:
Par exemple, pour obtenir les PGCD de 42 et 16, je voudrais entrer:
Il imprime également le nombre en chiffres romains ... parce que c'est INTERCAL pour vous!
la source
PLEASE GIVE UP
. Je l'ai déjà fait .-.1967 - APL
En 1957, à l'Université Harvard, Ken Iverson commença à développer une notation mathématique pour la manipulation de tableaux. Au cours des années 1960, sa notation a été développée dans un langage de programmation chez IBM. La première implémentation partielle a été créée en 1963 et elle a même été utilisée dans une école secondaire pour enseigner aux étudiants les fonctions transcendantales. Une implémentation complète et utilisable devait attendre 1965. Pendant deux ans, elle n’a été utilisée en interne que par IBM. En 1967, IBM a rendu public un interpréteur APL fonctionnant sur l’ordinateur IBM 1130, achevé en 1966. Vous pouvez comprendre qu’il est un peu difficile de choisir une année, mais je pense que ce devrait être 1967, Comme c’était la première année, une mise en œuvre complète était mise à la disposition du public. Si quelqu'un est vraiment en désaccord, je pourrais le changer.
Le code source de APL \ 360 est en ligne , tout comme un émulateur. C'est ce que j'ai utilisé pour tester ces exemples. Il date de 1967 et, avec APL \ 1130 (pour l’IBM 1130 susmentionné), il s’agit plus ou moins du véritable original. Comme prévu, il est très primitif. Il manque de prise en charge pour des détails tels que les minuscules, tous les opérateurs travaillent uniquement avec des fonctions intégrées, et le jeu de fonctions intégrées est très rare (en particulier, il
∨
n’est que doubleor
et ne double pasgcd
). La description originale complète est disponible ici , cependant, j’ai remarqué que la version que j’avais n’était même pas complète en ce qui concerne ce document⍎
.J'ai fourni les programmes à la fois au format Unicode (afin que vous puissiez les lire) et à l'encodage d'origine (pour pouvoir les couper et les coller dans la fenêtre APL de l'émulateur).
Incroyablement, ces programmes fonctionnent correctement sans aucune modification (à l'exception du codage) dans les versions modernes de Dyalog, NARS2000 et GNU APL. Donc, je suppose que j'ai trouvé le moyen d'écrire en APL portable: supposons qu'on est en 1967!
Tache 1:
Unicode:
APL \ 360:
Tâche 2:
Unicode:
APL \ 360:
Tâche 3:
J'ai résolu ceci de la manière récursive standard. En théorie, vous pourriez faire quelque chose d'intelligent et orienté tableau, comme la réponse J; dans la pratique, cependant, elle utilise la mémoire O (N) et écrase rapidement le matériel et les logiciels de l'ère Flower-Power.
Unicode:
APL \ 360:
la source
1996 - Ocaml
J'attendais plus que le jour où quelqu'un remplisse l'année 1996 pour pouvoir remplir Ruby. Eh bien, pourquoi ne pas apprendre OCaml alors, semble similaire à haskell ...
Bonjour le monde
ASCII
Cordes Mutable!
GCD
Non
==
et infixemod
, c'est mignonla source
2005 - Prélude
Prelude est un langage très amusant dont le code source est composé de plusieurs "voix" qui sont exécutées en parallèle et dans lesquelles j'aime beaucoup résoudre des problèmes . Il s’agit de la représentation ASCII de sa langue sœur, Fugue , qui prend en fait des fichiers .midi comme code source et code les instructions trouvées dans Prelude sous forme d’intervalles dans les mélodies des voix.
Prelude est assez minimaliste, mais Turing est complet (à condition que vous utilisiez au moins deux voix). Comme je l'ai dit, les voix (lignes de code) sont exécutées simultanément, colonne par colonne. Chaque voix fonctionne sur sa propre pile, qui est initialisée à un nombre infini de zéros. Prelude prend en charge les instructions suivantes:
Quelques notes supplémentaires:
^
la voix du haut est copiée à partir de la voix du bas (et inversement).?
et!
dans la même colonne sont exécutés de haut en bas.?
et!
lire et écrire des caractères avec le code de caractères correspondant. Cependant, l'interpréteur Python a également un commutateur dans son code pour imprimer les nombres eux-mêmes. À des fins de test, j'utilise en fait une version modifiée qui peut également lire des chiffres au lieu de caractères. Cependant, on s'entend généralement pour dire que les entrées / sorties numériques peuvent être exprimées en octets. Par conséquent, ces modifications ne sont pas nécessaires pour créer des programmes valides traitant des nombres.(
et)
n'ont pas besoin d'être sur la même voix. La voix utilisée pour la condition est toujours celle où(
apparaît. Par conséquent, la position verticale de la)
est complètement hors de propos.(
est exécutée une seule fois avant le début de la boucle, que la boucle soit entrée ou non. De même, toute instruction de la même colonne que a)
est exécutée à la fin de chaque itération, que la boucle soit sortie ou non après cette itération.Je vais d'abord vous montrer les trois programmes sans trop de commentaires. Vous pouvez trouver des explications détaillées ci-dessous.
Les programmes
"Bonjour le monde!" Une variante
Si vous utilisez l'interpréteur Python, assurez-vous de cela
NUMERIC_OUTPUT = False
.ASCII Art N
Pour faciliter l'utilisation, ce programme tire profit de la lecture des entrées sous forme de nombres, mais les sorties ne doivent pas être numériques. Donc, si vous utilisez l'interpréteur Python modifié, définissez
GCD
Ceci s’utilise mieux avec toutes les entrées / sorties numériques, c’est-à-dire
Des explications
"Bonjour le monde!" Une variante
C'est assez simple. J'utilise 3 voix pour générer successivement les codes de caractère de tous les caractères
Prelude was made in 2005!
. Je commence par calculer8 + 9*8 = 80
, qui est le code de caractère deP
:Après cela, je ne fais que copier le code de caractère précédent et ajouter ou soustraire la différence au prochain. Voici le code, mais chaque code étant
!
remplacé par le caractère en cours d'impression (ainsi que_
pour les espaces et%
les chiffres):La dernière
55+!
affiche une fin de ligne, juste parce que c'est plus joli.En passant, le nombre de voix est assez arbitraire pour cette tâche, mais 3 est assez pratique car c'est le plus grand nombre de voix où chaque voix peut accéder directement à une autre voix.
ASCII Art N
Avec 5 voix, c’est certainement l’un des programmes les plus complexes que j’ai écrit jusqu’à présent. Les voix ont à peu près les buts suivants:
N-1
pour une utilisation dans la boucle interne.32
pour imprimer facilement des espaces.78
pour imprimer facilementN
s.Passons en revue le code partie par partie. Tout d'abord, je crée le
32
comme-4 + 9*4
et le78
comme6 + 9*8
:Maintenant, je suis
N
en train d’ imprimer un single (car nous en avons toujours besoin) en lisantN
et en stockant l’entréeN-1
etN-2
dans les deux premières voix:Ensuite, il y a une "boucle" conditionnée
N-1
. À la fin de la boucle, la deuxième voix est toujours réduite à0
et la boucle se ferme après la première itération. Donc, essentiellement, ceci seulementif(N > 1){...}
. Après la boucle, nous imprimons une nouvelle ligne de fin. Pour récapituler, nous avons maintenant le cadre suivant:À l'intérieur de cette condition, nous avons d'abord des
N-2
espaces et un simpleN
pour compléter la première ligne, et nous stockons égalementN-1
la première voix pour une utilisation future:Maintenant la vraie viande du code. Premièrement, il y a une boucle externe qui imprime des
N-1
lignes. Pour chaque ligne, nous imprimons d’ abord une nouvelle ligne et unN
. Ensuite, on boucle lesN-2
temps en imprimant soit des espaces, soit desN
s (nous en parlerons plus tard). Et finalement nous en imprimons un autreN
:Enfin, la partie amusante: imprimer chaque ligne (et obtenir la position de
N
droite). Il n'y a pas vraiment de if / else dans Prelude, je dois donc le construire moi-même en utilisant deux boucles sur des voix différentes. La condition peut facilement être obtenue en soustrayant les variables de boucle interne et externe - nous obtenons0
si nous voulons imprimerN
et quelque chose de non-nul si nous voulons imprimer un espace.L'idée de base d'un if / else dans Prelude est de mettre une boucle après la valeur pertinente - le code "if" (ou différent de zéro), et de la quitter immédiatement en appuyant sur a
0
. Sur une autre voix, vous conservez une valeur non nulle et une autre boucle après la boucle "if". Pendant la boucle "if", mettez un zéro au-dessus de cette autre voix afin d'empêcher l'exécution du "else". Il y a une certaine souplesse dans le choix de placer les valeurs zéro au-dessus des valeurs non nulles ou tout simplement d'éliminer les valeurs non nulles s'il y a un zéro inférieur, mais c'est l'idée générale. Si vous souhaitez continuer à utiliser la voix correspondante, vous devrez peut-être également procéder à un nettoyage ultérieur. Voici à quoi ressemble le code:Et c'est tout!
GCD
Ceci est "juste" une implémentation itérative de l'algorithme euclidien. Mais modulo dans Prelude est un peu gênant, principalement parce que vous ne pouvez pas facilement vérifier si un nombre est positif ou négatif. Ce code utilise une implémentation de signum que j'ai écrite il y a longtemps . C'est-à-dire qu'une grande partie du code transforme simplement un nombre en
-1
,0
ou1
. Cela peut alors être facilement transformé en une condition pour les nombres positifs ou négatifs en ajoutant ou en soustrayant1
.Nous avons donc quatre voix cette fois. La première voix conserve simplement la trace de
b
la condition de terminaison principale et la contient (c'est-à-dire que la boucle se termine lorsqu'elleb
devient0
). La deuxième voix contienta
et à l’aide des voix trois et quatrea % b
, avant d’échanger le résultat avec la précédenteb
. Enfin, les!
impressionsa
quandb == 0
.Regardons d' abord la partie signum :
Le numéro saisi
n
se trouve sur la première de ces voix (la deuxième voix du programme complet). Le résultat se retrouvera sur la voix du bas. Les deux autres voix devraient être vides (c'est-à-dire remplies de zéros). Notez que, sin == 0
, les deux boucles sont ignorées et que la voix du bas contient toujours0
ce que nous voulons.Si
n
non-nul, la première petite boucle est entrée. Nous poussons un zéro pour le quitter immédiatement, mettons deux copies den
sur la voix du milieu et un1
sur la voix du bas. Maintenant, l’idée de base est d’incrémenter l’une des copiesn
tout en décrémentant l’autre copien
jusqu’à ce que l’une d’elles atteigne zéro. Ce faisant, la1
voix du bas bascule tout le temps son signe (ce qui est facile à faire en le soustrayant de0
dessous en dessous de la pile). Ceci est configuré de telle sorte que lorsqu'un des numéros frappe zéro, la voix du bas contiendra le bon signe.Maintenant modulo est mis en œuvre en soustrayant
b
dea
jusqu'à ce que le résultat est négatif. Lorsque cela se produit, nous en ajoutons un àb
nouveau. C'est ce bit:Notez la construction if / else en bas, qui est similaire à celle utilisée pour la tâche 2.
la source
2007 - Scratch
Scratch est une langue créée par le MIT à des fins éducatives. Je suis très impliqué avec cela depuis 5 ans; plus sur cela plus tard.
Tous ces éléments peuvent être consultés ici .
Je suis très pressé pour le moment et je vous expliquerai les extraits plus tard. Espérons qu'ils soient assez explicites.
Tache 1
Tâche 2
Tâche 3
la source
1972 - C
Nous savons tous à propos de C, n'est-ce pas? C a été créé chez Bell Labs, avec Unix. Unix était écrit en grande partie en C. Tous les dérivés Unix modernes sont encore en grande partie écrits en C. La syntaxe de C a influencé de nombreux langages de programmation. C'est probablement le plus ancien langage de programmation encore largement utilisé pour les nouveaux développements.
C lui-même est un descendant de B, et j'espère qu'il figurera également dans cette liste. Il n'y avait pas de langage de programmation 'A': B est une variante de BCPL, qui à son tour est un CPL dépouillé. Aucune de ces langues n'a jamais été très populaire. Cependant, BCPL était la langue dans laquelle le premier programme "Hello World" a été écrit. Un autre fait intéressant est que B avait les deux
/* */
et des//
commentaires, mais C a laissé tomber les//
commentaires. Ils ont ensuite été réintroduits en C avec la norme C99.Les programmes C ici ont été testés avec le compilateur Unix V5 C, à partir de 1974. Il s’agit du plus ancien compilateur C que j’ai pu trouver et me mettre au travail. Ces programmes ne seront pas compilés sur un compilateur C moderne. (L’un des changements apportés est que les opérateurs de mutation ont
+=
été écrits comme auparavant=+
.)#include <
...>
n'existait pas encore. Ni beaucoup de la bibliothèque standard. Je devais écrire le mienatoi
. J'ai parcouru une partie du code source de la V5 pour déterminer les éléments autorisés et ceux qui ne le sont pas. La version que j'ai utilisée était la première à inclurestruct
s, mais comme je ne les utilisais pas et que la syntaxe ne semble pas avoir beaucoup changé jusqu'à la V7 (comme K & R C), cela pourrait également fonctionner avec les versions précédentes.J'ai fait de mon mieux pour écrire mon code dans le même style que celui utilisé par le code source V5. (Pas que ce soit terriblement cohérent, cependant.)
Recherchez ici des liens vers Unix V5, un émulateur et des instructions pour le faire fonctionner sur un ordinateur moderne.
Tache 1
Tâche 2
Tâche 3
la source
cat > file.c
. (Terminez avec Ctrl-D, comme toujours). En outre, C a moins changé que vous pourriez penser: si vous changez le=*
et=+
dans lesatoi
fonctions pour les équivalents modernes*=
et+=
, un CCG moderne va les compiler très bien et ils courent aussi. Presque aucun avertissement, même.2009 - Idris
Idris est un langage fonctionnel pur, typé de manière dépendante, qui insiste sur le fait qu'il est pratiquement utilisable pour des applications réelles, en plus d'offrir des possibilités de preuve extrêmement rigoureuses pouvant être atteintes avec des types dépendants.
Tache 1
Tâche 2
Celui-ci n'est pas un programme mais juste une fonction (plus précisément une valeur dépendante ), produisant la lettre N souhaitée sous forme de tableau à deux dimensions.
Tâche 3
Notez que j'ai dû choisir le nom
gcd'
cargcd
il est déjà défini dans le prélude d'Idris.la source
:
et::
, et changé_
àZ
.Z
est en fait le constructeur de0 : Nat
. Le trait de soulignement est utilisé dans Idris, tout comme dans Haskell.:)
2014 - Pyth
Puisque nous avons CJam, nous pourrions aussi bien avoir Pyth pour la complétude :)
Pyth est un langage de golf créé par @isaacg et compilé en Python. C'est remarquable pour être procédural et pour utiliser la notation préfixe. Pyth est apparu vers juin 2014 .
"Bonjour le monde!" Une variante
Notez l'absence de guillemet de fermeture, qui est facultatif si un programme Pyth se termine par une chaîne.
ASCII Art N
Essayez-le en ligne . L'équivalent Python est:
Ou élargi (les première et troisième lignes sont implicites):
GCD
Ce programme utilise l'algorithme euclidien et prend deux nombres séparés par une nouvelle ligne. Essayez-le en ligne .
i.uQ
est encore plus courte si nous utilisons le mode intégré pour GCD. Cela équivaut àprint(gcd(*eval(input())))
(prendre deux nombres séparés par des virgules en entrée).la source
1964 - Dartmouth BASIC
BASIC est une famille de langages de programmation de haut niveau à usage général dont la philosophie de conception met l'accent sur la facilité d'utilisation. En 1964, John G. Kemeny et Thomas E. Kurtz ont conçu le langage BASIC original au Dartmouth College du New Hampshire. Ils voulaient permettre aux étudiants dans des domaines autres que les sciences et les mathématiques d'utiliser des ordinateurs.
Je regarde ce manuel sur BASIC de 1964, et cet émulateur du système de partage du temps de Darthmouth sur lequel il était exécuté. Le serveur est toujours opérationnel, mais malheureusement, l'enregistrement d'un compte semble impossible. Pour l'instant, ces programmes devraient théoriquement fonctionner:
Tache 1
Tâche 2
Produire quelque chose comme:
Notez comment l’entrée est saisie dans le cadre du programme (
70 DATA 5
); laREAD
manière d'instruction au sommet récupère les données à partir de là. Il n'y a pas de concaténation de chaînes, mais la section 3.1 du manuel explique comment lesPRINT
résultats sont écrits dans des "zones" tabulées en sortie.Tâche 3
La version lente de l'algorithme d'Euclid:
Sortie:
la source
2010 - WTFZOMFG
WTFZOMFG est un langage ésotérique basé sur Brainfuck. Il a été créé par Jay Songdahl en 2010. "WTFZOMFG" est l'abréviation de "Qu'est-ce que c'est que cette fonction? Gophers de fichiers malveillants optimisés par Zen!" .
Voici un compilateur pour les systèmes * nix .
Tache 1
Tâche 2
Explication:
Pardon. Je ne suis pas bon pour écrire des explications.
Tâche 3
Algorithme euclidien. WTFZOMFG n'a pas de commande pour mod, je dois donc utiliser
d
(diviser),m
(multiplier) ets
(soustraire).la source
2009 - Go
Go est un langage de programmation développé par Google. Le développement a commencé en 2007, mais Go a été annoncé en novembre 2009.
Go est un langage à typage statique influencé par C qui met l'accent sur la concision, la simplicité et la sécurité.
Tache 1:
La première ligne déclare le package du code. Même un exemple simple d'impression d'une ligne doit faire partie d'un package. Et l'exécutable s'appelle toujours
main
.Tâche 2:
Go a une déclaration de variable assez concise (
i := 0
identique àvar i int = 0
) et le compilateur détermine le type. C'est généralement une fonctionnalité plus courante dans les langages dynamiques. En utilisant cette notation courte, il est également très facile d’attribuer des fonctions à des variables (f := func(x int) int {/* Code */}
) et de créer des fermetures.Tâche 3:
Ici vous pouvez voir la
a, b = b, a%b
syntaxe, ce qui est vraiment sympa. Je ne connais pas le nom exact, mais en Python, cela s'appelle le déballage des tuples. De la même manière, vous pouvez renvoyer plusieurs valeurs d’une fonction (func f() (int, string) { return 42, "Hallo"}
).Une autre chose qui se passe dans ce code est la boucle. La boucle for est la seule boucle de Go. Les boucles while ou do-while-lo n'existent pas. Mais vous pouvez facilement créer un équivalent pour la boucle while
for condition {}
ou une boucle infiniefor {}
.la source
1991 - Python
Histoire de la langue
À la fin des années 1980, Guido van Rossum a commencé à concevoir le python comme passe-temps. Son nom vient de Flying Circus de Monty Python, une émission télévisée britannique dont Rossum est fan. La première implémentation de Python a commencé en 1989 et a été publiée en 1991. Sa popularité a pris de l'ampleur au fil des ans et est devenue la langue de choix pour de nombreux cours d'initiation à l'informatique.
"Bonjour le monde!" Une variante
Notez les parenthèses autour de l'entrée à
print
. Bien que cette syntaxe fonctionne dans Python 2, vous omettriez généralement ces parenthèses dans Python 2. Cependant, ils sont requis dans Python 3. Comme suggéré par Zach Gates, des parenthèses sont utilisées tout au long du processus pour garantir que le code présenté ici fonctionnera d’une version à l’autre.ASCII Art N
Les fonctions sont définies à l'aide de
def
. La concaténation de chaînes est effectuée à l'aide de+
et la répétition de chaînes avec*
.GCD
Notez que Python nécessite des espaces blancs structurés.
la source
1968 - Algol 68
Algol 68 a été défini par le groupe de travail IFIP 2.1 comme successeur d’Algol 60.
C'est un langage orienté expression dans lequel tout a une valeur. Il est également orthogonal, dans lequel vous pouvez utiliser n’importe quelle construction. Cela signifie que les expressions peuvent être sur le RHS et le LHS d'une assignation, par exemple.
Toutes les structures de contrôle ont une forme abrégée ainsi qu'une forme longue utilisant des expressions. Il permet également de définir les opérateurs.
Les objectifs de la langue sont cités comme suit:
Ces programmes ont été testés avec l' interprète Algol 68 Genie , qui est une implémentation complète du langage.
Certaines caractéristiques que les programmeurs modernes peuvent trouver différentes sont que les instructions vides ne sont pas autorisées. Vous ne pouvez pas simplement ajouter
;
partout. Vous devez utiliser laSKIP
déclaration si vous voulez explicitement ne rien avoir. Cela permettait aussi très facilement de coder des programmes concurrents. Algol 68 a également notamment utilisé des mots-clés inverses comme terminateurs, tels que esac , od , fi, etc.La langue avait une représentation utilisée pour écrire le code qui utilisait de nombreuses polices représentant des mots-clés en gras et des identifiants en italique , par exemple. À l'époque, et probablement encore, aucun compilateur n'a implémenté cette fonctionnalité de la conception. Le langage permettait plusieurs représentations concrètes de programmes utilisant des modes de sauts . Cela permettait de préparer des programmes en utilisant des jeux de caractères limités, comme ceux que l’on pouvait trouver dans les ordinateurs des années 1960. Considérons le court fragment de programme, qui serait représenté par:
Cela pourrait être préparé pour un compilateur en mode premier sautant comme:
En mode par points , ce serait:
En cas de mode stropping, ce serait:
J'ai un grand penchant pour ce langage car j'ai travaillé sur l'une des implémentations du compilateur, ainsi que sur une programmation exclusive depuis de nombreuses années.
Tache 1
Le point à noter ici est la double parenthèse. En effet, print est une fonction prenant un seul argument, qui est un tableau de longueur variable représentant l'union de tous les types. Les parenthèses internes sont le constructeur de tableau. C'est comment le polymorphisme est géré dans ce langage fortement typé.
En cas de mode stropping:
Tâche 2
En cas de mode stropping:
Tâche 3
En cas de mode stropping:
la source
1962 - SNOBOL
Le "Langage StriNg Oriented et symBOlic". Au début, apparemment appelé l’interprète d’expression symbolique, «SEXI», qu’il a ensuite fallu modifier pour empêcher les nerds des années 1960 de rougir lorsqu’ils présentent leurs offres d’emploi. Histoire vraie.
C'était l'une des premières langues pouvant traiter les chaînes et les modèles de manière native. En effet, la première version de SNOBOL avait la chaîne comme seul type de données. Les maths ont ensuite été analysés. La mise en œuvre initiale a été effectuée sur l’IBM 7090. Cela semble être parti depuis longtemps, du moins, je n’ai pas pu le trouver. Ce que j’ai trouvé, c’est le document original qui le décrit ainsi qu’un interpréteur SNOBOL3 en Java, qui peut s’exécuter sur un ordinateur moderne .
Le premier SNOBOL ne comportait quasiment que l’ appariement de motifs et l’arithmétique de base. SNOBOL 3 a ensuite ajouté des fonctions et modifié les E / S, mais semble être resté compatible avec les versions antérieures. SNOBOL 4 a changé la syntaxe et à partir de là, il est devenu Icon , qui conserve la correspondance du motif mais ressemble presque à un langage de programmation "normal".
Les programmes que j'ai écrits utilisent uniquement la fonctionnalité décrite dans le document d'origine. Ils doivent donc fonctionner avec le SNOBOL d'origine, à l'exception de l'E / S, que j'ai créée dans le style SNOBOL3 afin que l'interpréteur Java puisse les exécuter. D'après le papier, il semble que la différence réside dans le fait que SNOBOL1 utilise une correspondance de modèle avec une
SYS
variable spéciale , alors que SNOBOL3 utilise des variables d'entrée et de sortie:SYS .READ *DATA*
DATA = SYSPPT
SYS .PRINT 'A STRING' AND VARIABLES
SYSPOT = 'A STRING' AND VARIABLES
Faire ces substitutions devrait vous donner un "vrai" SNOBOL 1. Bien sûr, vous ne pouvez pas le lancer.
Tache 1
Tâche 2
Cela montre les mathématiques, la gestion des chaînes et le contrôle de flux. SNOBOL3 a des fonctions utiles, comme
EQ
vérifier l’égalité; Le SNOBOL original ne l’a pas été, je ne les ai donc pas utilisés.Tâche 3
D'abord ennuyeux. La seule chose à noter est la vérification plus petite que la précédente, montrant exactement à quoi ressemblait vraiment SNOBOL:
(B - A) '-'
"le résultat de BA contient-il un moins?". SNOBOL3 peut aussi le faireLE(B,A)
, mais SNOBOL 1 ne le pourrait pas (du moins le document ne le mentionne pas).Bien sûr, lorsque vous utilisez un langage entièrement basé sur les chaînes et la correspondance de modèle, il serait dommage de ne pas utiliser réellement la correspondance et le remplacement de modèle. Ainsi, voici l’un de ces GCD unaires, comprenant des routines de conversion vers et depuis unary.
la source
2012 - TypeScript
TypeScript est un langage de programmation libre et open source développé et maintenu par Microsoft.
L'objectif principal est: N'importe quel navigateur. N'importe quel hôte. Tout OS. Open source. Il est sorti en octobre 2012
Bonjour TypeScript
ASCII Art
GCD
essayez-le en ligne et screencast .
la source
2011 - Dart
Dart est un langage de programmation Open Source développé par Google qui est développé en remplacement de Javascript (bien qu'il compile au javascript). Il a été dévoilé par Google en 2011 lors de la conférence GOTO.
"Bonjour le monde!" Une variante:
ASCII Art N:
La méthode Bruteforce fonctionne à 0 (n²), mais cela ne devrait pas vraiment avoir d'importance sauf si vous utilisez un nombre géant.
GCD
simple méthode Euclid portée du Snap! exemple ci-dessus.
la source
2010 - rouille
Rust est un langage de programmation compilé à usage général, multi-paradigme développé par Mozilla Research. Il est conçu pour être un "langage sûr, simultané et pratique", prenant en charge les styles fonctionnels purs, à acteur simultané, à procédure impérative et orientés objet. Wikipédia
Tache 1
Tâche 2
Explication:
prend en charge uniquement l’impression verticale (gauche et droite
|
) et diagonale (\
)Tâche 3
implémentation simple de l'algorithme euclidien
la source
2015 - MC Muffin
Muffin MC est un macro-langage complet, amusant (mais sérieux), fonctionnel et minimaliste écrit par Franck Porcher ( http://franckys.com ) à la mi-février 2015 par nécessité, en tant qu'outil (rapide) de responsabilisation feuille de calcul utilisée comme seul contrôleur frontal permettant de piloter et de piloter toutes les opérations liées aux stocks associées à un site marchand basé sur Prestashop pour une nouvelle marque de mode tahitienne: Mutiny Tahiti ( http://mutinytahiti.com - bientôt disponible) lancé).
Muffin MC est un acronyme pour MU minuscule F onctional F lexible IN line M acro C ommand language.
Pour répondre à nos exigences, les principales fonctionnalités de Muffin MC ont été conçues autour de constructions sémantiques intégrées de première classe, souples et efficaces, telles que des itérateurs , des évaluations paresseuses , des multi-foncteurs et des produits de chaîne .
Muffin MC tire ses racines de la programmation fonctionnelle (pragmatique), FLisp et Perl. Il prend totalement en charge la récursivité (sans aucune optimisation), est typé de manière dynamique et porté de manière dynamique (liaison peu profonde). Il offre à ses utilisateurs une seule structure de données, en dehors des types de données de base atomes (atomes, chaînes, chiffres): des listes!
Muffin MC sémantique de la liste (genre de) emprunte sur Set Power- sémantique, qui est la suivante :
Pour réconcilier avec cela, les éléments suivants peuvent aider:
En tant que tel, accéder à un élément de liste vide génère la liste vide, et non une erreur! En effet, Muffin MC s’efforce de réduire le plus possible le nombre d’erreurs en élargissant la sémantique de nombreuses opérations traditionnelles.
Tache 1
#(...)
est la macro-commande Muffin MC permettant d’appliquer une fonction sur une liste d’arguments non évaluée, ici la fonction intégréesay
empruntée à Perl.#(say 1 2 3 ...)
est fonctionnellement identique àmap {say $_} (1,2,3,...)
Tâche 2
Définir la fonction
ascii-art()
:Ascii-art()
Le formulaire de travail le plus court (88 octets):=(var val...)
est la commande macro Muffin MC pour définir une variable ou la réaffecter.$(var)
est la macro-commande Muffin MC pour accéder à la valeur d'une variable. Il accepte naturellement le formulaire$(v1 v2 ...)
pour accéder à plusieurs variables à la fois.=(* var1 val1 var2 val2 ...)
est l'extension de la macro-commande Muffin MC=(...)
pour traiter les assignations parallèles.Les variables
_1, _2
, ... ont une portée dynamique (mécanisme de liaison peu profond) et sont automatiquement définies pour se lier aux arguments de la fonction. Empruntées à Perl5, les variables système#
(nombre d'arguments) et@
(liste d'arguments) sont également définies automatiquement.Les fonctions sont simplement des variables liées à un nombre quelconque d' instructions Muffin MC .
Cette solution intéressante provient de la combinaison de deux fonctionnalités intégrées naturelles de Muffin MC :
La macro-commande Muffin MC
I(...)
, permettant de définir des cycleurs-itérateurs, utilisés ultérieurement avec la forme fonctionnelle#(my-iterator want-number-of-values)
,Le Muffin MC chaîne produit construction, une extension de l'interpolation de variables naturelle, qui, étant donné une chaîne
"F1 F2 F3..."
, où les F i s sont soit Muffin MC littéraux de chaîne ou Muffin MC commande macro (aka formes fonctionnelles), produira autant de chaînes que donnée par le produit cardinal (F1) x cardinal (F2) x ....Par exemple, si xa contient 2 valeurs, a et b, et y une autre variable, 3 1, 1 2 3, l'évaluation de la chaîne
"x=$(x) y=$(y))"
produira 6 valeurs différentes, à savoir, dans cet ordre:C’est l’une des fonctionnalités hautement souhaitables du projet MUTINY pour laquelle Muffin MC a été conçu.
Exécuter !
Comment ça marche
Notre algorithme est basé sur les éléments suivants:
Étant donné un appel à ascii-art (n), {n = 2p + 1 | p entier, p> = 0}, l’art de générer comprend n chaînes de n caractères, parmi lesquels deux, la plus à gauche et la plus à droite, sont fixes et sont toujours identiques: 'N'. Cela permet de réduire le problème en produisant uniquement les chaînes moyennes. Par exemple, pour n = 5, nous produirions les 5 chaînes intermédiaires suivantes, chacune composée de n-2 caractères (nous avons remplacé l'espace par un "_" pour une meilleure visualisation):
Ces cordes médianes peuvent facilement être produites en passant sur la séquence de 4 éléments
('_' '_' '_' 'N')
en 5 groupes de 3; étant donné n, l'entrée de la fonction, cette séquence est composée de n-2 caractères'_'
, suivis du caractère'N'
. Parcourir cette séquence ne nécessite rien d’autre que l’incorporer dans un itérateur intégré à Muffin MCI(sequence)
(un itérateur qui effectue un cycle permanent sur sa séquence de valeurs initiale).Nous produisons ensuite simplement les chaînes médianes, de longueur n-2, en demandant à notre itérateur de nous fournir ses n-2 valeurs suivantes (n - 2 caractères), qui sont concaténées ensemble pour produire la chaîne médiane attendue.
Les n chaînes médianes sont produites en répétant n fois le processus ci-dessus, en utilisant une carte pour collecter les n résultats (n chaînes de n-2 caractères).
Nous utilisons un autre puissant Muffin MC construction intégrée, à savoir le produit de chaîne , pour produire les n chaînes finales:
"N#(map...)N"
.Et c'est tout !
Tâche 3
Définir la fonction
gcd()
:gcd()
de » réelle forme la plus courte (37 octets - 2 octets grâce à Rodolvertice gagnent)Exécuter !
donne 9.
C'est ça.
Merci pour le beau jeu, et éventuellement pour votre intérêt. Le langage est disponible pour tous ceux qui souhaitent jouer avec, l’utiliser ou même l’étendre. Il suffit de demander et je serai heureux de l'envoyer.
À votre santé
Franck
PS L'implémentation actuelle de Muffin MC est en Perl5. Le code source contient environ 2000 lignes de Perl moderne, commentaires compris, et est fourni avec une suite de tests de non-régression, ce qui est très pratique pour apprendre les constructions et la sémantique pratiques de Muffin MC .
la source