Alors… euh… c'est un peu gênant. Mais nous n'avons pas un simple "Hello, World!" défi encore (malgré avoir 35 variantes étiquetées avec bonjour-monde , et comptant). Bien que ce ne soit pas le code de golf le plus intéressant dans les langues courantes, trouver la solution la plus courte dans certains esolangs peut être un sérieux défi. Par exemple, à ma connaissance, on ne sait pas si la solution de Brainfuck la plus courte possible a déjà été trouvée.
De plus, alors que toute la Wikipedia (l’entrée de Wikipedia a été supprimée mais qu’il existe une copie sur archive.org
), les esolangs et le code Rosetta ont des listes de "Hello, World!" programmes, aucun d’entre eux ne souhaite avoir le plus court pour chaque langue (il existe également ce référentiel GitHub ). Si nous voulons être un site important dans la communauté du code golf, je pense que nous devrions essayer de créer le catalogue ultime du plus court "Hello, World!" programmes (de la même manière que notre défi Quine de base contient certaines des quines les plus courtes connues dans diverses langues). Alors faisons ceci!
Les règles
- Chaque soumission doit être un programme complet.
- Le programme ne doit prendre aucune entrée et imprimer
Hello, World!
sur STDOUT (ce flux d'octets exact, y compris la capitalisation et la ponctuation) plus une nouvelle ligne de fin optionnelle, et rien d'autre.
- Le programme ne doit rien écrire dans STDERR.
Si quelqu'un veut en abuser en créant un langage dans lequel le programme vide s'imprime Hello, World!
, alors félicitations, ils ont simplement ouvert la voie à une réponse très ennuyeuse.
Notez qu'il doit y avoir un interprète pour que la soumission puisse être testée. Il est permis (et même encouragé) d’écrire cet interprète vous-même pour une langue non encore implémentée.
- Les soumissions sont notées en octets , dans un codage approprié (préexistant), généralement (mais pas nécessairement) UTF-8. Certaines langues, comme les dossiers , sont un peu difficiles à noter - en cas de doute, demandez-les sur Meta .
- Il ne s'agit pas de trouver la langue avec le plus court "Hello, World!" programme. Il s’agit de trouver le plus court "Hello, World!" programme dans toutes les langues. Par conséquent, je ne marquerai aucune réponse comme "acceptée".
- Si votre langue de choix est une variante triviale d'une autre langue (potentiellement plus populaire) qui possède déjà une réponse (pensez aux dialectes BASIC ou SQL, aux shells Unix ou aux dérivés triviaux de Brainfuck comme Alphuck), pensez à ajouter une note à la réponse une solution identique ou très similaire est également la plus courte dans l’autre langue.
Notez également que les réponses ennuyeuses (mais valables) ne sont pas valables dans les langues où il n’ya pas grand chose à jouer au golf. Cependant, faites surtout des réponses dans des langues où les auteurs devaient réellement s’efforcer de jouer au code.
Pour vous inspirer, consultez la collection Hello World .
Le catalogue
L'extrait de pile au bas de cet article génère le catalogue à partir des réponses a) sous forme de liste des solutions les plus courtes par langue et b) sous forme de classement global.
Pour vous assurer que votre réponse apparaît, commencez votre réponse par un titre, en utilisant le modèle Markdown suivant:
## Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores en les effaçant. Par exemple:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs numéros dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou si vous souhaitez répertorier séparément les pénalités d'indicateur d'interprétation), assurez-vous que le score réel est le dernier numéro de l'en-tête:
## Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de code:
## [><>](https://esolangs.org/wiki/Fish), 121 bytes
/* Configuration */
var QUESTION_ID = 55422; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 8478; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
else console.log(body);
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
lang = jQuery('<a>'+lang+'</a>').text();
languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang_raw.toLowerCase() > b.lang_raw.toLowerCase()) return 1;
if (a.lang_raw.toLowerCase() < b.lang_raw.toLowerCase()) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body {
text-align: left !important;
display: block !important;
}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 500px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.sstatic.net/Sites/codegolf/all.css?v=ffb5d0584c5f">
<div id="language-list">
<h2>Shortest Solution by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
"Hello, World!"
, est le plus court dans de nombreuses langues différentes et non liées, doit-il être affiché séparément?Réponses:
Coincé, 0 octet
Eh bien, je ne peux pas être plus court que ça ... Un programme vide sera affiché
Hello, World!
dans Stuck .la source
Hello, World!
chose était juste quelque chose que j'avais mis en tant que placeholder tôt dans le développement. Je n'avais pas l'intention de le laisser si longtemps, mais je n'ai jamais réussi à l'enlever.PHP, 13 octets
Oui. Ça marche.
la source
<?php
de code dans le code, ce quiBrainfuck, 78 octets
Prime sans limite: Si quelqu'un peut améliorer ce score, je lui transmettrai la prime (+500).@KSaba trouvé unesolution de7672 octets!Essayez-le en ligne!
Les 28 premiers octets
--<-<<+[+[<+>--->->->-<<<]>]
initialisent la bande avec la relation de récurrence suivante (mod 256):f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) , avec f 0 = 57 , f 1 = 123 et f 2 = 167 .
Le facteur 171 est dû au fait que 3 -1 171 (mod 256) . Lorsque la valeur actuelle est convertie, une cellule (sous
<+>---
) en soustrayant 3 à chaque fois multiplie effectivement la valeur par 171.Si n = 220, la valeur à traduire est zéro et l’itération s’arrête. Les dix octets précédant le point d'arrêt sont les suivants:
Celui-ci contient tous les composants nécessaires pour produire
Hello, World!
, à la chasse et au bec, des ajustements mineurs.J'ai également trouvé une solution alternative à 78 octets:
Essayez-le en ligne!
Je considère que celui-ci est meilleur que le premier pour plusieurs raisons: il utilise moins de cellules de chez lui, il modifie moins de cellules au total et se termine plus rapidement.
Plus de détails
Les relations de récurrence ont des représentations étonnamment concises dans Brainfuck. La disposition générale est la suivante:
qui représente:
f n = c 1. f n-1 + c 2. f n-2 + c 3. f n-3 + ... + k
avec
f 0 = s 1 , f 1 = s 2 + c 1, f 0 + k , f 2 = s 3 + c 2, f 0 + c 1, f 1 + k , etc.
De plus, le
<+>
peut être modifié pour multiplier la plage par une constante sans affecter le point d'arrêt, et un terme peut être ajouté avant>{k}
pour décaler la plage d'une constante, sans affecter également le point d'arrêt.Autres exemples
Séquence de Fibonacci
N-gonal nombres
Nombres triangulaires
Défini comme suit: f n = 2. F n-1 - f n-2 + 1 , avec f 0 = 0 , f 1 = 1 .
Nombres Carrés
Nombres pentagonaux
etc.
BF Crunch
J'ai publié le code que j'ai utilisé pour trouver certaines de ces solutions sur github . Nécessite .NET 4.0 ou supérieur.
La sortie est donnée en trois lignes:
Par exemple, le résultat final pour
bfcrunch "hello world" 70 -r -i23
est:Cela correspond au programme complet:
Autres enregistrements
Bonjour le monde!
Emballage, 78 octets :
ou
Non-wrapping, 87 octets (auparavant 92 octets (mitchs) ):
Bonjour le monde!
Emballage, 80 octets :
Non-wrapping, 81 octets (auparavant 92 octets (hirose) ):
Bonjour le monde!
Emballage, 74 octets :
Non enveloppant, 84 octets :
Version Esolangs
Bonjour tout le monde! \ N
Emballage, 76 octets :
Ceci utilise une cellule restante de la maison et serait donc considéré comme 77.
Non-wrapping, 83 octets :
Rdebath approuvé . sortie profilebf:
inversed.ru (Peter Karpov)
Bonjour le monde!
Emballage, 70 octets (auparavant 78 1 ):
Non-wrapping, 77 octets (auparavant 89?):
L'auteur affirme que le plus court code "Hello World!" est de 89 octets, mais ne fournit aucune référence. Je réclame le disque pour ceci aussi.
Bonjour le monde!
Emballage, 65 octets (auparavant 66 octets):
C’est aussi codé à la main (le meilleur que j’ai pu trouver en calculant est de 68 octets ). La première cellule est initialisée à 259 (3) et décrémentée de 7 à chaque itération en boucle 37 fois. La cellule suivante est décrémentée de 6, ce qui donne 256 - 6 · 37 = 34 . Le reste des cellules est décrémenté de 4 à chaque fois, en ajoutant une cellule à chaque itération, chaque nouvelle cellule étant inialisée à 252 (-4). Le résultat est le suivant:
1 La solution donnée (79 octets) peut être réduite de manière triviale par un:
la source
interface a{static void main(String[]A){System.out.print("No!");}}
ArnoldC , 71 octets
Juste pour les lols ..
la source
IT'S SHOWTIME
etTALK TO THE HAND
devrait être sur les premières et dernières lignes.Graine ,
601642344203 octetsLe programme résultant Befunge-98 (basé sur ceci ) est
la source
Croissant Mornington ,
36143568 octetsMerci à NieDzejkob d’avoir économisé 46 octets en utilisant des noms de lignes plus courts.
Essayez-le en ligne!
Ceci est très certainement sous-optimal, mais représente la moitié de la solution sur les esolangs.
Hello, World
est construit en découpant les noms de stations suivants et en concaténant les résultats:Enfin, je calcule le code de caractère de
!
as(2<<4)+1 == 33
. Toutes ces parties sont concaténées à Paddington et finalement imprimées à Mornington Crescent.Remarque: la langue ne précise pas s'il est possible de se rendre deux fois de suite à la même station, mais l'interprète le permet. Je l'utilise donc.
la source
mal , 70 octets
Il utilise les quatre commandes suivantes:
la source
brainfuck, 72 octets
Essayez-le en ligne!
Et la solution originale de 76 octets sans emballage :
Essayez-le en ligne!
Autres solutions les plus courtes connues (à ma connaissance) que j'ai trouvées
'Bonjour le monde!' 77 octets:
Essayez-le en ligne!
'Bonjour le monde!' 70 octets:
Essayez-le en ligne!
Ceux-ci ont été trouvés en utilisant un programme c ++ que j'ai écrit ici: https://github.com/ksabry/bfbrute
Remarque: au départ, je voulais nettoyer ce code avant de le publier afin de le rendre quelque peu lisible et utilisable, mais comme je n'y suis pas parvenu depuis plus d'un an, je pense que je vais simplement le poster tel quel. Il fait un usage intensif des modèles et compile les constantes de temps pour toutes les optimisations potentielles. Il contient un tas de codes commentés de mes tests, mais aucun commentaire utile alors désolé, mais c'est un peu horrible.
Il n’ya rien de très malin dans le code, c’est un code brutal, mais il est tout à fait optimisé. L'optimisation majeure consiste à parcourir d'abord tous les programmes sans boucles (no
[
ou]
) jusqu'à une longueur spécifiée (16 actuellement) et à mettre en cache un tableau de toutes les modifications qu'il apportera au tableau de données. Il ne stocker qu'un seul programme par gamme unique de changements afin par exemple que l' un des>+<<->
et<->>+<
sera stocké. Il parcourt ensuite tous les programmes possibles qui sont composés de tout programme de ce cache avec une combinaison de boucles entre eux. Après avoir exécuté chaque programme, il effectue une simple chasse aux gourmands et pointe les personnages et les ajoute à la fin du programme.Après avoir parcouru tous les programmes, j’ai remarqué que presque tous les programmes les plus courts (jusqu’à environ 19 ans) étaient de la forme
*[*[*]*]
. Restreindre la recherche aux programmes de cette forme a considérablement accéléré la recherche. Le détenteur actuel du record a été trouvé avec une longueur de 27. Celui-ci a en fait été calculé comme étant de longueur 74, mais j’ai remarqué une séquence particulière.>.>.>.
qui a eu la chance d’avoir un 0 dans la cellule de données à sa droite, ce qui permet de la simplifier pour la[.>]<
réduire. à 72.Je l'ai laissé fonctionner pendant un bon bout de temps et complété la recherche avec les paramètres actuels jusqu'à la longueur 29, je suppose qu'il sera difficile de battre le système actuel en allant tout simplement plus haut. Je pense que l'approche la plus prometteuse serait probablement d'augmenter l'espace de recherche dans une manière intelligente.
la source
Piet, 90 codels
Ceci est une image 30 par 3. Sinon, à la taille de code 10:
Le utilise une disposition de 3 haut afin que je n'ai besoin de pointeur une fois. Si cela reste golfable, je pourrais probablement raser tout au plus une autre colonne, car il existe un système push-pop no-op.
Edit: la solution de 84 codes de @ primo .
la source
Meule de foin , 17 octets
Haystack est un langage de programmation 2D qui s'exécute jusqu'à ce qu'il trouve l'aiguille dans la botte de foin
|
, tout en effectuant des opérations basées sur des piles. Tous les programmes démarrent dans le coin supérieur gauche et peuvent utiliser les caractères directionnels><^v
pour se déplacer dans le programme. La direction est héritée, vous n’avez donc pas besoin de continuer à utiliser>
pour aller à droite, la direction ne changera que si elle frappe un caractère directionnel différent.Par défaut, l'interprète lit en haut à gauche et va à droite, on peut donc mettre "Hello, World!" sur la pile, utilisez-la
o
pour l’imprimer, puis placez l’aiguille pour terminer l’exécution.Bonus: une version plus excitante:
la source
o
le nombre de sorties. Ça ne devrait pas êtrec
à la fin? Y a-t-il une documentation appropriée quelque part? C'est super intéressant!o
affiche l’élément supérieur de la pile tel quel, c’est-à-dire que si un nombre est présent, il l’imprimera.c
jetterais simplement cela à un caractère. Donc, si vous avez une chaîne ou un caractère sur le dessus de la pileo
, ce sera ce que vous voulez :) Finalement, ces documents seront mis à jour ..Aidez-moi, WarDoq! , 1 octet
Non seulement Help, WarDoq! ont une syntaxe intégrée pour la plupart des orthographes courantes de la phrase, elle répond même à notre définition habituelle du langage de programmation.
Essayez-le dans l' interprète en ligne officiel (le code est entré en entrée ).
la source
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."
Vous ne pouvez donc avoir que des commentaires d'espaces ??? Je suppose que même la langue la plus utile au monde doit avoir une fonctionnalité inutile +1,MarioLANG ,
259249242240235 octetsCela a été testé dans l'implémentation Ruby .
Après avoir obscurci "Hello, World!" à MarioLANG, j’ai un peu cherché à jouer au golf. Ce qui précède est le plus court que j'ai trouvé jusqu'à présent.
Comme auparavant, je suis parti d'une solution Brainfuck qui définit quatre cellules au multiple de 10 le plus proche, composé des caractères
He,
et de l'espace, et l'a converti en MarioLANG . Vous pouvez ensuite raccourcir un peu le code en utilisant le plancher auxiliaire dans la boucle, qui divise presque par deux la largeur de la boucle. Notez que le bas n'est exécuté qu'une fois de moins que le haut, de sorte que vous n'obtenez plus des multiples exacts du compteur initial dans les 4 cellules.Enfin, je voulais utiliser l’espace perdu en face de la boucle et j’ai donc ajouté une série d’ascenseurs pour pouvoir utiliser l’espace vertical situé à cet endroit. Et ensuite, j'ai réalisé que je pouvais plier le code après la boucle (voir la révision précédente) en dessous de la boucle pour utiliser un peu plus d'espace vertical, ce qui économisait cinq octets supplémentaires.
C'est probablement encore loin d'être parfait, mais c'est une amélioration décente par rapport à la solution naïve, je pense.
Métagolf
Il est temps d'automatiser ...
J'ai commencé à configurer un solveur dans Mathematica pour trouver une solution optimale. Il suppose actuellement que la structure du code est fixe: compteur défini à 12, 4 cellules pour l'impression, avec l'affectation fixe
He,<space>
et le même ordre de ces cellules. Ce qui varie, c'est le nombre de+
s dans la boucle ainsi que les corrections nécessaires par la suite:Il s'avère que pour un compteur initial de 12, ma solution artisanale est déjà optimale. Cependant, utiliser 11 à la place enregistre deux octets. J'ai essayé toutes les valeurs de compteur de 6 à 20 (inclus) avec les résultats suivants:
Remarque: Ce solveur suppose que le code linéaire après la boucle est tout en haut de la ligne et que le code ci-dessus est cette solution repliée. Il pourrait y avoir une solution globale plus courte en informant le solveur du pliage, car j’obtiens maintenant 3
+
s supplémentaires dans la première partie gratuitement, et les 4 instructions suivantes ne coûteraient qu’un octet au lieu de 2.la source
Sombre , 106 octets
Je laisserai simplement quelques citations de la spécification de langue parler de la brillance de cet esolang:
la source
Homespring , 58 octets
L'espace de fuite est important.
Laissez-moi vous raconter une histoire. Il était une fois une centrale électrique qui alimentait une écloserie de saumon à proximité. L'écloserie de saumon a éclos un jeune saumon sans abri qui s'est embarqué dans un voyage en amont pour trouver un printemps. Il a effectivement trouvé un tel printemps, avec le nom poétique "Hello, World!", Où il a mûri et a engendré un nouveau jeune saumon. Les deux poissons ont maintenant nagé en aval, à la recherche du vaste océan. Mais juste avant l'embouchure de la rivière, il y avait un filet dans la rivière - le poisson mature était capturé et seul le jeune réussissait à se faufiler et atteignait l'océan et le reste de l'univers. Entre-temps, l'écloserie avait éclos davantage de saumons qui s'étaient également rendus en amont et avaient frayé et ainsi de suite.
Cependant, de grandes quantités de neige fondante s'étaient déplacées sur un autre bras de la rivière. Et juste après notre premier jeune saumon des sources de "Hello, World!" a atteint l'océan, la fonte des neiges a touché l'univers et ... euh ... l'a détruit. Et ils ont vécu heureux pour toujours… ou je suppose qu'ils ne l'ont pas fait.
Celles-ci étaient en réalité la sémantique du programme ci-dessus. Homespring est bizarre.
la source
Chef , 465 octets
Testé avec l'interprète Ruby. Fait la soupe à l'alphabet.
J'ai essayé d'être aussi conforme que possible à la spécification d'origine , alors même si l'interprète que j'ai utilisé vous laisse tomber les
the
s dans lePour contents
instruction, je ne l'avais pas encore fait.Le bol de mélange est assez cher, il pourrait donc y avoir une meilleure approche. J'ai essayé d'utiliser la conversion de base pour coder le message, mais malheureusement, la spécification ne précise pas si elle
Divide
utilise une division entière ou en virgule flottante, et l'interpréteur que j'ai utilise utilise cette dernière. Il n'y a pas non plus d'opérateur modulo, ce qui n'aide pas non plus.la source
Piet, 84 codels
28x3, ici représenté avec la largeur de code 10.
Créé avec PietDev , testé avec npiet . La présentation du programme est la suivante:
Le remplissage jaune indique les codes où le chemin se chevauche, le remplissage orange indique les codes qui doivent être de la même couleur, à des fins de contrôle du flux.
Pour aider à la création de ceci, j'ai écrit un interpréteur rudimentaire pour un langage basé sur des piles avec des commandes ressemblant à des commandes, que j'ai surnommé "pasm" ( source ). La sortie de cet interpréteur (avec cette entrée ) est la suivante:
Aucune commande de pointeur, de commutateur ou de défilement n'est utilisée. Aucun code n'est gaspillé non plus; en fait, deux sont réutilisés.
la source
Espaces blancs ,
192150146 octetsLes espaces ne nécessitent que des espaces, des tabulations et des sauts de ligne, les autres caractères étant ignorés.
Ce qui peut être gênant à afficher ici.
Donc, dans le code ci-dessous, les espaces et les onglets ont été remplacés.
Et un ';' a été placé devant les sauts de ligne pour plus de clarté.
Pour exécuter le code, remplacez d'abord. et> par des espaces et des tabulations.
Hexdump de code
Code d'assemblage des espaces:
Remarques:
J'ai dû écrire un programme juste pour calculer que l'ajout de 107 donne le golf optimal pour la phrase. Depuis la taille en octets qu'un entier prend dans les changements de code. : 4 + int (abs (log2 ($ n)))
Le code sera toujours exécuté sans la partie "e:" libellée et sortie sur whitespace.kauaveel.ee . Mais cela pourrait rendre le code d'espaces non valide sur d'autres compilateurs d'espaces. Ces octets ne sont donc pas liés à la solution.
Il faut noter que
Comme Kevin Cruijssen l'a souligné dans les commentaires, en autorisant une "sortie par erreur" selon la méta, le Whitespace peut comporter plus de 126 caractères pour le code de golf .
Assemblée:
la source
SSN
(valeur d'erreur) au lieu deSSSN
(appuyer sur 0 ), qui est autorisé selon la méta . Essayez-le en ligne (avec surlignage et explication ajoutés) ou essayez-le en ligne .dup jumpz e
et lee: exit
enlevé. Mais au moins sur whitespace.kauaveel.ee, il continue à boucler jusqu'à ce que le navigateur se plaint. Je préférerais ne pas changer ma version à cela, malgré le golf inférieur et la méta permettant "sortie par erreur". Mais vous êtes libre de soumettre votre version en tant que nouvelle réponse.SSN
au début, auquel cas il commet une erreur avec Can't do Infix Plus lorsqu'il ne contient qu'un seul élément sur la pile (le 107). ( Essayez-le en ligne. ) Je laisserai simplement mon commentaire ici si quelqu'un a la même suggestion. Et je vous ai déjà écrit votre réponse il y a environ un an, je pense. ;)Java, 79
Les versions antérieures de Java peuvent vous autoriser à utiliser un bloc statique (51 octets), mais je ne connais pas actuellement un moyen de contourner la
main
méthode.la source
enum
au lieu declass
.interface
et en amerrissant lepublic
spécificateur. J'ai rejeté la politique de modification suivante, mais comme ils ne peuvent pas commenter, j'ai pensé vous en informer afin que vous puissiez l'utiliser si vous le souhaitez.CSS, 30 octets
Les feuilles de style en cascade (CSS) ne sont pas un langage de programmation typique, mais elles peuvent assez bien produire des sorties fixes. Ceci est fait en créant un pseudo-élément après chaque élément avec le contenu
Hello, World!
. Donc, un seul élément (<html>
) est sélectionné, cela suppose que nous utilisons le document HTML le plus élémentaire, c'est-à-direCela fonctionne dans la plupart des principaux navigateurs, à l'exception notable de Firefox, qui applique le sélecteur aux éléments
<html>
et<body>
. C'est aussi la raison pour laquelle les extraits de pile ne fonctionnent pas, car il y a toujours un élément body qui est également stylé. Vous trouverez ci-dessous une version légèrement modifiée à tester.la source
* *
pour sélectionnerbody
.* :after
semblait également fonctionner.HTML, 13 octets
Le texte est automatiquement inséré dans le
<body>
, et est affiché.la source
Code machine x86_64 pour Linux, 32 octets
Lorsque Linux démarre un nouveau processus, tous les registres (sauf RSP) sont nuls. Nous pouvons donc obtenir RAX = 1 en modifiant uniquement l'octet inférieur. L’ABI System V x86-64 ne le garantit pas, mais c’est ce que fait réellement Linux. Ce code ne fonctionne que
_start
dans un exécutable statique.L'instruction d'appel pousse l'adresse suivante, qui contient la chaîne hello world, dans la pile. Nous sautons l'adresse de la chaîne dans
rsi
.Ensuite , les autres arguments sont mis en place pour
syscall
lasys_write
qui imprime la chaîne.Le programme se termine par un
syscall
tosys_exit
.sys_write
renvoie le nombre d'octets écrits, donc les octets supérieurs de RAX sont nuls après le premiersyscall
(à moins qu'il ne renvoie une erreur),mov al, 60
nous donne donc RAX =__NR_exit
dans seulement 2 octets.Vous pouvez faire que ce programme segfault en fermant sa stdout (
./a.out >&-
), doncsys_write()
retournera-EBADF
, la secondesyscall
reviendra-ENOSYS
, puis l'exécution tombera de la fin. Mais nous n'avons pas besoin de gérer leswrite()
erreurs avec élégance.la source
__NR_write
est 1. Cela n’est pas standard sur différents systèmes Unix x86-64. Vous dépendez également du comportement de Linux qui consiste à remettre à zéro tous les registres à l'exception de RSP avant d'entrer dans un nouveau processus (donc cela ne fonctionne que si vous le construisez comme un exécutable statique, sinon l'éditeur de liens dynamique laissera des ordures dans les octets supérieurs derax
et vous '. Je vais avoir-ENOSYS
) L’ABI System V x86-64 indique que les registres peuvent contenir des valeurs arbitraires lors de l’entrée dans_start
, le noyau Linux lui-même choisit zéro pour éviter les fuites d’informations.mov al, 1
/mov edi, eax
(2 octets) au lieu d'avoir besoin d'un préfixe REX pour DIL, car__NR_write == STDOUT_FILENO = 1
mov esi, msg
(NASM) akamov esi, OFFSET msg
(GAS.intel_syntax
) . Mettez votre chaîne après le derniersyscall
.call/pop
est plus court d'un octet que LEA relatif RIP 64 bits, mais mov est préférable.Hexagony ,
3732 octetsEssayez-le en ligne!
Je suis fier de présenter mon deuxième langage de programmation 2D et (à ma connaissance) le tout premier langage 2D sur une grille hexagonale.
Le code source n'a pas l'air très 2D, n'est-ce pas? Eh bien, les espaces sont facultatifs dans Hexagony. Tout d'abord, le code source est complété avec le numéro hexagonal centré suivant avec no-ops (
.
). Le nombre suivant est 37, nous insérons donc cinq non-opérations à la fin. Ensuite, le code source est réorganisé en hexagone régulier:Ceci est également exécutable. Essayez-le en ligne!
Hexagony a un tas de fonctionnalités assez géniales, y compris 6 pointeurs d'instructions différents et une structure de mémoire qui est le graphique linéaire d'une grille hexagonale, mais ce code utilise seulement une adresse IP et un bord de mémoire, alors ne nous inquiétons pas de cela pour l'instant.
Voici un aperçu des commandes pertinentes:
;
affiche la valeur actuelle, modulo 256, sous forme d’octet dans STDOUT./
est un miroir qui se comporte comme vous le souhaitiez (l’adresse IP prend alors un virage à 120 degrés).@
termine le programme.Le problème final est que la source entoure les 3 paires d’arêtes. De plus, si l’IP quitte la grille par l’un des six coins, il y a deux rangées possibles. Le choix dépend de si la valeur actuelle est positive ou non positive. La version annotée suivante montre où l’IP rentre chaque fois qu’il quitte la grille:
Donc, si nous supprimons tous les changements de direction, ce programme se résume au code linéaire suivant:
Qu'est - ce avec
Q2
,P0
etP1
? Les lettres s’impriment facilement parce que nous pouvons simplement définir le bord à la valeur correspondante. Pour la virgule, l'espace et le point d'exclamation, cela ne fonctionne pas. Nous ne pouvons pas non seulement leur valeur fixé avec44
,32
,33
respectivement, parce que le bord de la mémoire est non nul pour commencer, et en raison de la sémantique des chiffres individuels qui infligerait toutes sortes de ravages. Si nous voulions le faire, nous aurions dû réinitialiser la valeur de bord à zéro avec quelque chose comme*
,+
,-
,&
ou^
premier. Cependant, étant donné que la valeur est prise modulo 256 avant d'être imprimée, il n'est pas nécessaire de définir exactement les valeurs sur 44, 32 ou 33. Par exemple, si vous utilisez moduloQ2
règlera la valeur de bord à81*10 + 2 = 812
, qui est44
256
. De cette façon, nous pouvons enregistrer un octet sur chacun de ces trois caractères. (Malheureusement, il est jamais possible d'y arriver avec un seul chiffre de la valeur de la cellule a déjà. Amusante, où il ne le travail esto
enWorld
, parce que cela peut également être obtenu à partirW9
.)Vous pouvez utiliser ce script CJam pour rechercher toutes les combinaisons lettre-chiffre donnant un caractère donné.
Je ne suis pas sûr que ce soit optimal. Je doute qu’il soit possible de le faire dans un hexagone de longueur latérale 3 (où vous n’auriez que 19 caractères disponibles), mais il serait peut-être possible de le résoudre en hexagone de longueur latérale 4 avec moins de 32 commandes, telles que qu'il n'y a plus de no-ops à la fin de la grille.
la source
Q2
,P0
etP1
est très intelligent. Je ne connaissais pas la partie modulo 256.M8;
(oug4;
), ce que j'ai utilisé plusieurs fois depuis. Je n’avais jamais pensé jusqu’à présent à revenir sur cette réponse après avoir apporté ce changement.H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Malbolge, 112 octets
Je vais voir s'il y en a un plus court. Vous avez un meilleur ordinateur depuis la dernière fois, je peux donc générer un peu plus rapidement.
Pour le spectacle, voici "Hello World!" sans la virgule.
la source
('<;_#"~6Z|{y1UTvt,PrpMo,llj"Fgge{A??P=^t:8&7YtFVqjSQ@PNM)u(I8%$#"D2AA/[TYXQu88MLp3n1Gk.D-ge
(92 bytes)Fourier , 15 octets
GRANDS CHANGEMENTS À Fourier!
Essayez-le sur FourIDE!
Oui, le temps de saisir le code ASCII de chaque caractère est révolu: Fourier maintenant, genre de soutient des chaînes. Lorsque vous enfermez une chaîne dans des backticks, cette chaîne sera sortie.
Notez que vous ne pouvez rien faire d'autre que sortir cette chaîne: vous ne pouvez pas la stocker dans une variable, elle n'est pas stockée dans l'accumulateur et il n'y a pas d'outils de manipulation de chaîne.
Ici, vous pouvez trouver le naufrage du train qui était vieux Fourier. ;)
Essayez-le en ligne!
Certains d’entre vous auront probablement déjà rencontré Fourier et connaissent peut-être assez bien la langue. L'ensemble du langage est basé sur un accumulateur: une variable globale utilisée par la plupart des opérateurs.
La partie la plus importante du code est l'
a
opérateur. Ceci prend la valeur numérique de l'accumulateur et la convertit en un caractère utilisant le code Pythonchr(accumulator)
. Ceci est ensuite imprimé sur STDOUT.Malheureusement, je n'ai pas encore eu la chance d'utiliser Fourier ( coup de pouce , clin d'oeil , clin d'oeil) ), principalement à cause de l'absence de chaînes et d'opérateurs de chaînes. Même dans ce cas, il reste utilisable pour de nombreux autres défis (voir la section exemples de sa page EsoLangs).
Notez que ceci est plus court que mon entrée dans la liste Esolangs parce que je ne pensais pas réellement que je pourrais jouer au golf plus longtemps . Et puis, en écrivant le défi du golf à cordes de Fourier, j'ai réalisé que je pouvais aller un peu plus court.
Remarque
Si vous vous interrogiez sur la syntaxe des variables, Geobits a écrit un programme qui utilise des variables et a la même longueur:
Essayez-le en ligne!
la source
C-- , 155 octets
Malheureusement, le seul compilateur C connu, Quick C--, n'est plus maintenu. Il est une douleur dans le cou pour construire, mais il est possible ...
la source
C, 30 octets
Vraiment vanille, mais je ne peux pas penser à un moyen couramment compilable de le faire plus court (à moins que peut-être une astuce brute ne marche pas?). Pourtant, bat la plupart des esolangs!
la source
main(){puts("Hello, World!");return 0;}
et 53#include <stdio.h> int main(){puts("Hello, World!");}
octets. Un peu plus si vous pensez que le principal (vide) est requis.main(){return!puts("Hello, World!");}
deux octets de moins.h
est plus court de 29 octets. Note: vous devrez le compiler avec-Dh='main(){puts("Hello, World!");}'
je suis à moitié trafiqué, à moitié amusant avec les abus du compilateur.__FILE__
(8 octets) et nomme le fichiermain(){puts("Hello, World!");}
. Alors c'est totalement pas tricher;)Illisible ,
843755732666645629577 octetsLes programmes illisibles sont supposés être affichés avec une police à largeur variable, ils respectent donc le nom de la langue. Je suis un peu déçu que mes approches plus sophistiquées se soient avérées beaucoup plus longues. Les boucles sont incroyablement chères dans Illisible ...
Essayez-le en ligne!
Comment ça fonctionne
Illisible n'a que dix fonctions; six d'entre eux sont utilisés dans ce code:
Après avoir utilisé ma notation à caractère unique et ajouté des espaces et des commentaires, le code ci-dessus ressemble à ce qui suit. Les instructions multilignes sont exécutées de bas en haut.
J'ai généré le code source réel en exécutant la version non commentée du pseudo -code ci-dessus via ce programme CJam .
la source
Befunge 98 ,
1918 octetsNouvelle réponse (de undergroundmonorail)
Explication
"
démarre le mode chaîneHello, World!@,kc
"
nouveau, terminant le mode chaînec
)k
prend la valeur supérieure de pile et exécute la commande suivante que le pointeur d'instruction peut voir autant de fois,
extrait une valeur de la pile et la sort comme un caractère. Il a été exécuté 12 fois par la dernièrek
instruction et une fois de plus lorsque l'interprète lit l',
instruction.@
termine le programmeLa différence avec l'ancienne réponse est que nous réutilisons intelligemment le
"
personnage en utilisant le comportement de boucle de Befunge quand il atteint la fin de la ligne. Comme il est peut-être moins intuitif, je laisse l’ancien aussi. En outre, vous avez peut-être remarqué que la pile contiendra toujours des caractères (ck,@
) à cause de cette astuce, laissant des dégâts si nous voulions faire quelque chose par la suite.Ancienne réponse
Cela fonctionne pour funge et befunge 98
Explication
""
est poussé à la pile. ('H'
est maintenant sur le dessus.)c
(12) est poussé à la pilek
prend la valeur supérieure de stack et exécute la commande suivante que le pointeur d'instruction peut voir à plusieurs reprises.,
extrait une valeur de la pile et la sort comme un caractère. Il a été exécuté 12 fois par la dernièrek
instruction et une fois de plus lorsque l'interprète lit l',
instruction.@
termine le programmela source
k
c
pour93+
."ck,@!dlroW ,olleH
"
pour démarrer la chaîne, ajoute le reste de la ligne à cette chaîne, revient à la ligne et frappe le même"
pour mettre fin à la chaîne. Maintenant, tout le programme sauf celui"
a été poussé à la pile, avec!dlroW ,olleH
en haut. Ensuite, il imprime les 12 premiers caractères de la même manière que le vôtre et s’arrête à@
.JSFuck ,
629362896277 octetsCela peut être mentionné comme l’un des programmes les plus longs " Bonjour, Monde! " (En fait, je ne sais pas si c’est optimal, mais c’est le plus court que j’ai réussi à obtenir).
Attention: ne fonctionne que dans Firefox et Safari
Il existe également une version légèrement plus longue (+4 octets) qui fonctionne également dans Chrome et Microsoft Edge:
Afficher l'extrait de code
Pour ceux qui ne connaissent pas JSFuck, il s'agit d'écrire du code JavaScript comme s'il n'y avait que six caractères, et cela peut parfois devenir assez fou.
Ce tableau montre comment les caractères utilisés dans Hello, World! programme sont encodés en JSFuck. Le code en clair est juste
alert("Hello, World!")
.Ici, les chaînes
"fill"
,"fontcolor"
etc. doivent être écrites comme suit"f"+"i"+"l"+"l"
:"f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"
à coder.Les identificateurs globaux
self
,atob
etbtoa
écris commeFunction("return self")()
.Function
lui-même devrait être[]["fill"]["constructor"]
.La virgule
","
est délicate, je ne suis pas sûr à 100% de son fonctionnement, mais la[]["concat"]
fonction est utilisée pour créer un tableau. Je posterai une mise à jour lorsque j'aurai le temps de faire d'autres tests.J'ai encodé ceci en utilisant JScrewIt - crédits à GOTO 0 pour la création d'un outil aussi sophistiqué:
alert("Hello, World!")
Cela diffère de ma réponse à cette question pour la présence de la virgule après "Bonjour".
Fait intéressant, la syntaxe ES6
prend encore plus d'octets à encoder (environ +1500) en raison de la complexité accrue de l'encodage de deux backticks plutôt que de
("
et")
.la source
Pada ,
8368 octetsJe pense que ceci est optimal pour un programme linéaire (c'est-à-dire qui n'utilise pas les opérateurs de flux de contrôle
?
et*
). Dans l’ensemble, c’est peut-être optimal, mais je ne sais pas comment utiliser ces opérateurs supplémentaires dans une si petite quantité de code (ni comment explorer les possibilités par programmation).La langue a récemment subi quelques modifications après que j'ai commencé à en discuter avec l'auteur par courrier électronique. Cependant, j'ai écrit une implémentation de référence pour l'état actuel de la spécification de langage la semaine dernière, de sorte que le code ci-dessus est réellement exécutable.
Métagolf
À l'origine, j'avais utilisé le résultat de mon implémentation de référence pour relever ce défi et créé une solution conçue à la main à partir de cela. Cependant, ce n’était qu’une approche heuristique.
Au lieu de cela, j’ai donc écrit un solveur dans Mathematica, qui connaît les structures de données et les opérateurs de Pada afin de trouver une solution optimale. En moyenne, il croît linéairement avec la longueur de la chaîne (bien que certaines combinaisons de caractères soient un peu plus lentes que d'autres) et prenait environ 1,5 heure
Hello, World!
.Alors, comment je me suis mis à écrire le solutionneur. Tout d’abord, nous remarquons qu’il ne faut prendre en compte que 6 opérateurs:
~.oOqQ
(plus le nécessairew
pour chacun des caractères imprimés). L'utilisation des piles ou des verrous de bits n'est pas utile en code linéaire, et je ne le crois pas,?
et*
peut être utilisée efficacement en moins de 68 octets.L'état de Pada (ignorant les piles et les verrous) consiste en 7 commutateurs et 8 bits, disposés comme suit:
C'est donc des états possibles. Ma première étape de prétraitement a été de créer un graphe d’états dirigé où chaque bord correspond à une seule opération. En d'autres termes, le graphique comporte 32 768 sommets, chacun avec un degré extérieur égal à 6 (un bord sortant pour chacune des 6 opérations considérées). Nous pouvons utiliser ce graphique pour trouver le chemin le plus court entre deux états (ce graphique à lui seul peut être très utile pour jouer au golf à Pada).
215 = 32768
Maintenant, pour chaque personnage, nous voulons atteindre un état où
w
ce personnage est imprimé. Combien y a-t-il de tels états?w
lit l'octet à partir du bit sur lequel il est déposé (de manière cyclique). Il y a donc 8 rotations possibles des bits du caractère qui peuvent tous imprimer ce caractère. Pour chacune de ces rotations, trois interrupteurs sont fixes (afin de fairew
chuter dans la bonne position). Cela laisse 4 commutateurs arbitraires. Nous avons donc des états possibles pour chacun dans notre code.8 * 24 = 128
w
Avec ceux-ci, nous pouvons résoudre un autre problème de graphe: construire un graphe qui a un sommet source, puis un "calque" pour chaque caractère et un sommet creux. Les couches sont constituées de 128 états pour chaque sommet, le nœud source correspond à l'état initial du programme (tous les commutateurs sont à gauche et tous les bits sont à zéro). Le noeud collecteur ne correspond à aucun état en particulier. Nous avons des arêtes dirigées de chaque sommet d'une couche à chaque sommet de la couche suivante, où l'épaisseur de l'arête est la distance entre les deux états de notre graphique précédent. Les poids des arêtes de la dernière couche à l'évier sont tous égaux à 0. Autrement dit, nous pouvons précalculer tous ces poids d'arête. C’est l’étape la plus coûteuse du calcul et elle a pris 1,5 heure
Hello, World!
.Avec ce graphique mis en place, nous pouvons trouver le chemin le plus court de la source à l’évier assez rapidement (il a fallu 0,05 s sur ma machine). Pour
Hello, World!
les états souhaités sont:où les 7 bits les moins significatifs correspondent aux commutateurs et les 8 bits les plus significatifs aux bits de Pada.
Maintenant, revenons au premier graphique et trouvons les arêtes réelles (opérations) correspondant au chemin le plus court entre chaque paire d'états suivants, et finissons-en chacun par un
w
. Voilà, une solution optimale (basée sur les hypothèses ci-dessus).Voici le Mathematica complet si quelqu'un veut métagolfer une corde différente à Pada:
la source