Так ... эээ ... это немного смущает. Но у нас нет простого "Привет, мир!" вызов еще (несмотря на то, что 35 вариантов помечены как hello-world и считаются). Хотя это не самый интересный кодовый гольф на распространенных языках, поиск кратчайшего решения в некоторых esolangs может быть серьезной проблемой. Например, насколько мне известно, неизвестно, было ли найдено самое короткое из возможных решений Brainfuck.
Кроме того, хотя вся Википедия (запись в Википедии была удалена, но на сайте archive.org есть копия
), esolangs и Rosetta Code имеют списки «Hello, World!» программы, ни одна из которых не заинтересована в том, чтобы иметь самый короткий для каждого языка (есть также этот репозиторий GitHub ). Если мы хотим быть значимым сайтом в сообществе Code Golf, я думаю, что мы должны попытаться создать окончательный каталог самых коротких "Hello, World!" программы (аналогично тому, как наш основной вызов квин содержит некоторые из самых коротких известных квин на разных языках). Итак, давайте сделаем это!
Правила
- Каждое представление должно быть полной программой.
- Программа не должна принимать никаких данных и печатать
Hello, World!
в STDOUT (этот точный поток байтов, включая заглавные буквы и знаки пунктуации) плюс необязательный завершающий перевод строки и ничего больше.
- Программа не должна ничего писать в STDERR.
Если кто-то хочет злоупотребить этим, создав язык, на котором печатается пустая программа Hello, World!
, а затем поздравляю, он просто проложил путь к очень скучному ответу.
Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить. Разрешается (и даже поощряется) самостоятельно писать этот переводчик для ранее не реализованного языка.
- Представления оцениваются в байтах в соответствующей (ранее существующей) кодировке, обычно (но не обязательно) UTF-8. Некоторые языки, такие как папки , немного сложнее оценить - если есть сомнения, пожалуйста, спросите на Meta .
- Речь идет не о поиске на языке с кратчайшим «Hello, World!» программа. Это о поиске самого короткого "Привет, мир!" программа на каждом языке. Поэтому я не буду отмечать любой ответ как «принятый».
- Если выбранный вами язык является тривиальным вариантом другого (потенциально более популярного) языка, у которого уже есть ответ (например, диалекты BASIC или SQL, оболочки Unix или тривиальные производные Brainfuck, такие как Alphuck), рассмотрите возможность добавления примечания к существующему ответу, что такое же или очень похожее решение также является самым коротким на другом языке.
В качестве примечания, пожалуйста , не опускайте скучные (но действительные) ответы на языках, где гольфу не так уж и много - они все еще полезны для этого вопроса, так как он пытается составить каталог как можно более полным. Тем не менее, делайте в первую очередь откровенные ответы на языках, где авторам пришлось приложить усилия для игры в гольф.
Для вдохновения, проверьте Hello World Collection .
Каталог
Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
## Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
## Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать имя языка ссылкой, которая будет отображаться во фрагменте кода:
## [><>](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!"
, самая короткая на многих разных и не связанных языках, должна ли она быть опубликована отдельно?Ответы:
Застрял, 0 байт
Ну, не могу быть короче этого ... Пустая программа будет выводить
Hello, World!
в Stuck .источник
Hello, World!
было просто то, что я положил в качестве заполнителя в начале разработки. Я не собирался оставлять его так долго, просто не удосужился его удалить.PHP, 13 байт
Да. Оно работает.
источник
<?php
в коде его нет, поэтому PHP вообще его не интерпретирует :)Brainfuck, 78 байт
Открытая награда: если кто-то может улучшить этот счет, я передам им награду (+500).@KSabнашелрешение7672 байта!Попробуйте онлайн!
Первые 28 байтов
--<-<<+[+[<+>--->->->-<<<]>]
инициализируют ленту со следующим отношением повторения (мод 256):f n = 171 · (-f n-1 - f n-2 - f n-3 + 1) , с f 0 = 57 , f 1 = 123 и f 2 = 167 .
Коэффициент 171 возникает потому, что 3 -1 ≡ 171 (мод 256) . Когда текущее значение переводится на одну ячейку обратно (через
<+>---
), вычитая 3 каждый раз, эффективно умножает значение на 171.При n = 220 переводимое значение равно нулю, итерация останавливается. Десять байтов, предшествующих точке остановки, следующие:
Он содержит все компоненты, необходимые для производства
Hello, World!
, в стиле "охота и клевание", с небольшими изменениями.Я также нашел альтернативное 78-байтовое решение:
Попробуйте онлайн!
Я считаю, что этот лучше первого по нескольким причинам: он использует меньше ячеек, оставшихся дома, он изменяет меньше ячеек в целом и завершается быстрее.
Подробнее
Рекуррентные отношения имеют удивительно краткие представления в Brainfuck. Общий макет выглядит следующим образом:
который представляет:
f n = c 1 · f n-1 + c 2 · f n-2 + c 3 · f n-3 + ... + k
с участием
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 и т. д.
Кроме того, значение
<+>
может быть изменено для умножения диапазона на константу, не влияя на точку останова, и перед добавлением члена может быть добавлен>{k}
член, чтобы снова изменить диапазон на константу, опять же, не влияя на точку останова.Другие примеры
Последовательность Фибоначчи
N-гональные числа
Треугольные числа
Определяется как f n = 2 · f n-1 - f n-2 + 1 , с f 0 = 0 , f 1 = 1 .
Квадратные числа
Пятиугольные числа
и т.п.
BF Crunch
Я опубликовал код, который использовал для поиска некоторых из этих решений на github . Требуется .NET 4.0 или выше.
Вывод дается в три строки:
Например, конечный результат для
bfcrunch "hello world" 70 -r -i23
:Это соответствует полной программе:
Другие записи
Привет, мир!
Упаковка, 78 байт :
или же
Без упаковки, 87 байтов (ранее 92 байта (mitchs) ):
Привет, мир!
Упаковка, 80 байт :
Без упаковки, 81 байт (ранее 92 байта (hirose) ):
Привет, мир!
Упаковка, 74 байта :
Без упаковки, 84 байта :
Версия Esolangs
Привет, мир! \ N
Упаковка, 76 байт :
Это использует одну ячейку слева от дома, и, следовательно, будет рассматриваться 77.
Без упаковки, 83 байта :
Rdebath утвержден . Вывод profilebf:
inversed.ru (Петр Карпов)
Привет, мир!
Упаковка, 70 байт (ранее 78 1 ):
Без упаковки, 77 байт (ранее 89?):
Автор утверждает, что самое короткое кодовое слово "Hello World!" составляет 89 байт, но не дает ссылки. Настоящим я также требую запись для этого.
Привет, мир!
Обтекание, 65 байтов (ранее 66 байтов):
Это на самом деле также и ручная кодировка (лучшее, что я смог найти, - 68 байтов ). Первая ячейка инициализируется 259 (3) и уменьшается на 7 на каждую итерацию, выполняя цикл 37 раз. Следующая ячейка уменьшается на 6, в результате чего получается 256 - 6 · 37 = 34 . Остальные ячейки уменьшаются на 4 каждый раз, добавляя одну ячейку за каждую итерацию, и каждая новая ячейка инициализируется до 252 (-4). Результат следующий:
1 Данное решение (79 байт) может быть тривиально уменьшено на единицу:
источник
interface a{static void main(String[]A){System.out.print("No!");}}
ArnoldC , 71 байт
Просто для LOL ..
источник
IT'S SHOWTIME
иTALK TO THE HAND
должно быть на первой и последней строчках.Семя ,
601642344203 байтаРезультирующая программа Befunge-98 (основанная на этом )
источник
Морнингтон Полумесяц ,
36143568 байтСпасибо NieDzejkob за сохранение 46 байт с использованием более коротких названий строк.
Попробуйте онлайн!
Это, безусловно, неоптимально, но это половина размера решения на esolangs.
Hello, World
создается путем нарезки следующих имен станций и объединения результатов:Наконец, я вычисляю код символа
!
as(2<<4)+1 == 33
. Все эти части объединяются в Паддингтоне и, наконец, печатаются в Морнингтонском Полумесяце.Примечание: язык не определяет, можно ли ездить на одну и ту же станцию дважды подряд, но переводчик разрешает это, поэтому я воспользовался этим.
источник
зло , 70 байт
Он использует следующие четыре команды:
источник
брейкфук, 72 байта
Попробуйте онлайн!
И оригинальное 76-байтовое решение без упаковки :
Попробуйте онлайн!
Другие кратчайшие (насколько мне известно) решения, которые я нашел
'Привет, мир!' 77 байт:
Попробуйте онлайн!
'Привет, мир!' 70 байт:
Попробуйте онлайн!
Они были найдены с помощью программы на С ++, которую я написал здесь: https://github.com/ksabry/bfbrute
Примечание. Изначально я хотел очистить этот код перед тем, как опубликовать его, чтобы сделать его более читабельным и удобным для использования, но, поскольку я не нашел его более года, я решил опубликовать его как есть. Он интенсивно использует шаблоны и постоянные времени компиляции для любых потенциальных оптимизаций, и в нем есть закомментированный код из моего тестирования, но нет полезных комментариев, извините, но это немного ужасно.
В коде нет ничего ужасно умного, в его ядре грубая сила, однако он довольно оптимизирован. Основная оптимизация заключается в том, что он сначала выполняет итерации по всем программам без циклов (без
[
или без]
) до заданной длины (в настоящее время 16) и кэширует массив всех изменений, которые он будет вносить в массив данных. Он будет хранить только одну программу на уникальный массив изменений так, например , только один из>+<<->
и<->>+<
будет храниться. Затем он перебирает все возможные программы, которые состоят из любой программы в этом кэше с любой комбинацией циклов между ними. После выполнения каждой программы она выполняет простую жадную охоту и клюет на символы и добавляет это в конец программы.После выполнения этого через пространство всех программ я заметил, что почти все самые короткие программы (до длины ~ 19) были в форме
*[*[*]*]
. Ограничение поиска программами этой формы значительно ускорило поиск. Текущий держатель записи был найден на длине 27. На самом деле он был рассчитан на длину 74, но я заметил определенную последовательность,.>.>.>.
которой посчастливилось иметь 0 в ячейке данных справа, что позволяет упростить его до[.>]<
уменьшения до 72Я позволил этому работать некоторое время и завершил поиск с текущими параметрами до длины 29, я подозреваю, что будет трудно превзойти текущий, просто поднимаясь выше, я думаю, что наиболее многообещающим подходом, вероятно, будет увеличение пространства поиска в какой-то разумный способ.
источник
Пит, 90 кодеков
Это изображение 30 на 3. В качестве альтернативы, при размере кода 10:
Используется макет с тремя высотами, так что мне нужно указывать только один раз. Если это все еще возможно для игры в гольф, я, вероятно, мог бы побрить самое большее другой столбец, так как там нет никакого опрокидывания без опциона там.
Редактировать: @ primo в 84 коде решения .
источник
Стог сена , 17 байт
Стог сена - это двумерный язык программирования, который выполняется до тех пор, пока не найдет иголку в стоге сена
|
, при выполнении операций на основе стека. Все программы начинаются с верхнего левого угла и могут использовать символы направления><^v
для перемещения по программе. Направление унаследовано, поэтому вам не нужно продолжать использовать>
направление, направление будет меняться только при попадании в другой символ направления.По умолчанию интерпретатор читает слева направо, поэтому мы можем просто поставить «Hello, World!» на стопку, используйте
o
для печати, затем поместите иглу, чтобы закончить выполнение.Бонус: более захватывающая версия:
источник
o
результаты выводятся как числа. Разве это не должно бытьc
в конце? Где-нибудь есть соответствующая документация? Это супер интересно!o
выводит верхний элемент стека как есть, то есть, если число там, оно печатает это.c
просто бросил бы это чарсу. Так что, если у вас есть строка или символ на вершине стека,o
это то, что вы хотите :) В конечном итоге эти документы будут обновлены ..Помогите, WarDoq! 1 байт
Помогает не только WarDoq! есть встроенная функция для наиболее распространенного написания фразы, она даже удовлетворяет нашему обычному определению языка программирования.
Попробуйте это в официальном онлайн-переводчике (код входит в Input ).
источник
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."
Таким образом, вы можете сделать комментарии только из пробелов ??? Я полагаю, что даже самый полезный язык в мире должен иметь одну бесполезную особенность +1,MarioLANG ,
259249242240235 байтЭто было проверено в реализации Ruby .
После запутывания "Привет, мир!" в MarioLANG я немного изучал игру в гольф. Вышеупомянутое самое короткое, что я нашел до сих пор.
Как и прежде, я начал с решения Brainfuck, которое устанавливает четыре ячейки с ближайшим кратным 10 от символов
He,
и пробела и преобразовал его в MarioLANG . Затем вы можете немного сократить код, используя вспомогательный пол в цикле, который почти вдвое уменьшает ширину цикла. Обратите внимание, что нижняя часть выполняется только в один раз меньше верхней, поэтому вы больше не получаете точные кратные начального счетчика во всех 4 ячейках.Наконец, я хотел использовать пустое пространство перед петлей, поэтому я добавил несколько лифтов, чтобы использовать там вертикальное пространство. И тогда я понял, что могу свернуть код после цикла (см. Предыдущую ревизию) под циклом, чтобы использовать больше вертикального пространства, что позволило сэкономить еще пять байтов.
Это, вероятно, еще далеко от совершенства, но я думаю, что это приличное улучшение по сравнению с наивным решением.
Metagolf
Время для некоторой автоматизации ...
Я начал настраивать решатель в Mathematica, чтобы найти оптимальное решение. В настоящее время предполагается, что структура кода является фиксированной: счетчик установлен на 12, 4 ячейки для печати с фиксированным назначением
He,<space>
и тем же порядком этих ячеек. То, что это изменяется, является числом+
s в цикле, а также необходимыми исправлениями впоследствии:Получается, что для начального счетчика 12 мое решение ручной работы уже оптимально. Однако использование 11 вместо этого сохраняет два байта. Я перепробовал все значения счетчиков от 6 до 20 (включительно) со следующими результатами:
Примечание. Этот решатель предполагает, что линейный код после цикла находится в верхней строке, а приведенный выше код - это сложенное решение. Общее решение может быть короче, если решатель узнает о свертывании, потому что теперь я получаю еще 3
+
секунды в первой части бесплатно, а следующие 4 инструкции будут стоить всего 1 байт вместо 2.источник
Темный , 106 байт
Я просто позволю некоторым цитатам из спецификации языка говорить о блеске этого esolang:
источник
Родная весна , 58 байт
Задний пробел является значительным.
Позвольте мне рассказать вам историю. Когда-то была электростанция, которая питала близлежащий инкубаторий по выращиванию лосося. В инкубатории для лосося вылупился молодой бездомный лосось, который отправился в путешествие вверх по реке, чтобы найти весну. Он нашел такой источник с поэтическим названием «Привет, мир!», Где он созрел и породил нового молодого лосося. Обе рыбы теперь плавали вниз по течению, в поисках широкого океана. Но в непосредственной близости от устья реки в реке была сеть - зрелая рыба была поймана, и только молодой удалось проскользнуть и достичь океана и остальной части вселенной. Тем временем, в инкубатории вылупилось больше лосося, который также путешествовал вверх по течению и нерестился, и так далее, и так далее.
Однако огромное количество тающего снега путешествовало по другому руслу реки. И сразу после нашего первого молодого лосося из источников "Hello, World!" достиг океана, таяние снега поразило вселенную и ... э-э ... уничтожило его. И они жили долго и счастливо ... или я думаю, что нет.
На самом деле это была семантика вышеуказанной программы. Домашняя весна странная.
источник
Шеф-повар , 465 байт
Протестировано с интерпретатором Ruby. Делает алфавитный суп.
Я пытался быть настолько совместимым с оригинальной спецификацией, насколько мог, поэтому, несмотря на то, что используемый мной интерпретатор позволяет вам бросить
the
s вPour contents
инструкции, я этого не сделал.Чаша для смешивания довольно дорогая, так что может быть лучше. Я попытался использовать базовое преобразование для кодирования сообщения, но, к сожалению, в спецификации не уточняется,
Divide
использует ли целочисленное деление или деление с плавающей запятой, а интерпретатор, который у меня есть, использует последнее. Там также нет оператора по модулю, который тоже не помогает.источник
Пит, 84 кодекса
28x3, здесь показано с шириной кода 10.
Создано с помощью PietDev , протестировано с помощью npiet . Компоновка программы следующая:
Желтая заливка указывает кодеки, где путь перекрывается, оранжевая заливка указывает кодеки, которые должны быть одного цвета, для целей управления потоком.
Чтобы помочь в создании этого, я написал рудиментарный интерпретатор для стекового языка с подобными командам командами, которые я назвал «pasm» ( источник ). Вывод этого интерпретатора (с этим вводом ) следующий:
Команды указателя, переключения или прокрутки не используются. Нет кодов также впустую; фактически два используются повторно.
источник
Пробелы ,
192150146 байтПробелу нужны только пробелы, символы табуляции и перевода строки, тогда как другие символы игнорируются.
Что может быть проблематичным для отображения здесь.
Таким образом, в коде ниже пробелы и вкладки были заменены.
И ';' был помещен перед linefeeds для ясности.
Чтобы запустить код, сначала замените. и> пробелами и табуляцией.
Hexdump кода
Код сборки пробелов:
Примечания:
Я должен был написать программу, чтобы вычислить, что добавление 107 дает оптимальный вариант для предложения. Поскольку размер байта, который принимает целое число в коде, изменяется. : 4 + int (abs (log2 ($ n)))
Код будет по-прежнему выполняться без метки "e:" и выхода из whitespace.kauaveel.ee . Но это может сделать код пробела недопустимым в других компиляторах пробелов. Таким образом, эти байты не были выведены из решения.
Необходимо отметить, что
Как отметил Кевин Круйссен в комментариях, разрешив «выход по ошибке» в соответствии с мета-символом, пробел может быть закодирован до 126 символов.
Монтаж:
источник
SSN
(значение ошибки) вместоSSSN
(push 0 ), что разрешено в соответствии с мета . Попробуйте онлайн (с добавлением выделения и пояснений) или попробуйте онлайн .dup jumpz e
иe: exit
удаленной. Но по крайней мере на whitespace.kauaveel.ee он продолжает работать до тех пор, пока браузер не пожалуется. Я бы предпочел не менять свою версию на это, несмотря на более низкий гольф и метаданные, позволяющие «выйти по ошибке». Но вы можете отправить свою версию в качестве нового ответа.SSN
в начале, в этом случае он ошибается с Can't делать Infix Plus, когда в стеке только один элемент (107). ( Попробуйте онлайн. ) Я просто оставлю свой комментарий здесь, когда у кого-то есть такое же предложение. И я думаю, что я уже добавил ваш ответ около года назад. ;)Ява, 79
Более ранние версии Java могли позволять вам использовать статический блок (51 байт), но в настоящее время я не знаю способа обойти этот
main
метод.источник
enum
вместоclass
.interface
и исключить егоpublic
. Я отверг редактировать следующую политику , но так как они не могут комментировать, я думал , что пусть вы знаете , так что вы можете использовать его , если вам нравится.CSS, 30 байт
Каскадные таблицы стилей (CSS) не являются типичным языком программирования, но они могут довольно хорошо фиксировать вывод. Это делается путем создания псевдоэлемента после каждого элемента с содержимым
Hello, World!
. Таким образом,<html>
выбран только один элемент ( ), это предполагает, что мы используем самый простой HTML-документ, т.е.Это работает в большинстве основных браузеров, с заметным исключением Firefox, который применяется селектором к
<html>
и<body>
элементам. Вот почему фрагменты стека не работают, потому что всегда есть элемент body, который также стилизуется. Ниже приведена слегка измененная версия для тестирования.источник
* *
для выбораbody
.* :after
казалось, также работает.HTML, 13 байт
Текст автоматически вставляется в
<body>
и отображается.источник
машинный код x86_64 для Linux, 32 байта
Когда Linux запускает новый процесс, все регистры (кроме RSP) равны нулю, поэтому мы можем получить RAX = 1, только изменив младший байт. X86-64 System V ABI не гарантирует этого, но именно это и делает Linux. Этот код работает только как
_start
в статическом исполняемом файле.Инструкция call помещает следующий адрес, который содержит строку приветствия, в стек. Мы вставляем адрес строки в
rsi
.Затем другие аргументы устанавливаются для
syscall
tosys_write
, который печатает строку.Программа завершается с
syscall
доsys_exit
.sys_write
возвращает количество записанных байтов, поэтому верхние байты RAX равны нулю после первогоsyscall
(если только он не вернул ошибку), поэтомуmov al, 60
дает нам RAX =__NR_exit
только в 2 байтах.Вы можете сделать эту программу segfault, закрыв ее stdout (
./a.out >&-
), поэтомуsys_write()
она вернется-EBADF
, втораяsyscall
вернется-ENOSYS
, а затем выполнение прекратится. Но нам не нужноwrite()
изящно обрабатывать ошибки.источник
__NR_write
1. Это не является стандартным для разных систем x86-64 Unix. Вы также зависите от поведения Linux обнуления всех регистров, кроме RSP, перед входом в новый процесс (так что это работает, только если вы создаете его как статический исполняемый файл, в противном случае динамический компоновщик оставит мусор в старших байтахrax
и вы '' достану-ENOSYS
). ABI System V x86-64 говорит, что регистры могут содержать произвольные значения мусора при входе в систему_start
, само ядро Linux выбирает их ноль, чтобы избежать утечек информации.mov al, 1
/mov edi, eax
(2 байта), вместо того, чтобы нуждаться в префиксе REX для DIL, потому что__NR_write == STDOUT_FILENO = 1
mov esi, msg
(NASM) акаmov esi, OFFSET msg
(GAS.intel_syntax
) . Поставь свою строку после последнейsyscall
.call/pop
на 1 байт меньше, чем 64-битный REA-относительный LEA, но лучше всего использовать mov.Гексагония ,
3732 байтаПопробуйте онлайн!
Я с гордостью представляю свой второй язык 2D-программирования и (насколько мне известно) первый в истории 2D-язык на гексагональной сетке.
Исходный код не выглядит очень 2D, не так ли? Ну, пробел необязателен в гексагонии. Сначала исходный код дополняется до следующего центрированного гексагонального числа с помощью no-ops (
.
). Следующее такое число - 37, поэтому в конце мы вставляем пять операций. Затем исходный код переставляется в обычный шестиугольник:Это также работает. Попробуйте онлайн!
Hexagony обладает множеством довольно прикольных функций, включая 6 различных указателей инструкций и макет памяти, который представляет собой линейный график гексагональной сетки, но этот код использует только один IP и один край памяти, поэтому давайте пока не будем об этом беспокоиться.
Вот обзор соответствующих команд:
;
выводит текущее значение по модулю 256 в виде байта в STDOUT./
это зеркало, которое ведет себя так, как вы ожидаете (в результате чего IP поворачивается на 120 градусов).@
завершает программуТеперь последний улов заключается в том, что источник охватывает все 3 пары ребер. Кроме того, если IP покидает сетку через один из шести углов, есть два возможных ряда, к которым можно перейти. Какой из них выбран, зависит от того, является ли текущее значение положительным или не положительным. Следующая аннотированная версия показывает, где IP повторно вводится каждый раз, когда он покидает сетку:
Поэтому, если мы удалим все изменения направления, эта программа сводится к следующему линейному коду:
Что с
Q2
,P0
аP1
? Письма печатаются легко, потому что мы можем просто установить ребро на соответствующее значение. Для запятой, пробела и восклицательного знака, это не работает. Мы также не можем просто установить их значение с44
, когда берется по модулю . Таким образом, мы можем сохранить байт для каждого из этих трех символов. (К сожалению, это никогда не возможно получить с одной цифрой от значения, которое ячейка уже имеет. Забавно, где это32
,33
соответственно, потому что край памяти отлична от нуля , чтобы начать с, и из - за семантики отдельных цифр , которые будут сеять всякого рода опустошения. Если бы мы хотели это сделать, нам пришлось бы сбросить значение ребра до нуля, например,*
,+
,-
,&
или^
первым. Однако, поскольку значение берется по модулю 256 перед печатью, нам не нужно устанавливать значения точно на 44, 32 или 33. Например,Q2
установим значение ребра равным81*10 + 2 = 812
, что44
256
это работа являетсяo
вWorld
, потому что это может также быть получен изW9
.)Вы можете использовать этот скрипт CJam, чтобы найти все комбинации букв и цифр, которые приводят к данному символу.
Я не уверен, является ли это оптимальным. Я сомневаюсь, что это возможно сделать в шестиугольнике с длиной стороны 3 (где у вас было бы доступно только 19 символов), но возможно было бы решить это в шестиугольнике с длиной стороны 4 с менее чем 32 командами, например что в конце сетки больше нет операций.
источник
Q2
,P0
ИP1
очень умный. Я не знал часть по модулю 256.M8;
(илиg4;
), который я использовал с тех пор пару раз. До сих пор мне никогда не приходило в голову вернуться к этому ответу после того, как я внес это изменение.H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Мальболже, 112 байт
Я посмотрю, есть ли более короткий. С прошлого раза компьютер стал лучше, поэтому я могу генерировать его немного быстрее.
Для шоу, вот "Hello World!" без запятой.
источник
('<;_#"~6Z|{y1UTvt,PrpMo,llj"Fgge{A??P=^t:8&7YtFVqjSQ@PNM)u(I8%$#"D2AA/[TYXQu88MLp3n1Gk.D-ge
(92 байта)Фурье , 15 байт
БОЛЬШИЕ ИЗМЕНЕНИЯ в Фурье!
Попробуйте это на FourIDE!
Да, дни печатали в ASCII - коде каждого символа ушли навсегда: Фурье Теперь вроде поддерживает строку. Когда вы заключаете строку в обратные кавычки, эта строка будет выведена.
Обратите внимание, что вы не можете сделать ничего, кроме вывода этой строки: вы не можете сохранить ее в переменной, она не сохраняется в аккумуляторе и нет инструментов для работы со строками.
Здесь вы можете найти крушение поезда, которое было старым Фурье. ;)
Попробуйте онлайн!
Некоторые из вас, вероятно, уже встречались с Фурье и могут быть достаточно хорошо знакомы с языком. Весь язык основан на аккумуляторе: глобальной переменной, которую используют почти все операторы.
Наиболее важной частью кода является
a
оператор. Это берет числовое значение аккумулятора и преобразует его в символ, используя код Pythonchr(accumulator)
. Это тогда напечатано в STDOUT.К сожалению, у меня еще не было возможности использовать Фурье ( подтолкнуть , подмигнуть; ), в основном из-за отсутствия строк и строковых операторов. Несмотря на это, он все еще пригоден для решения многих других задач (см. Раздел примеров на странице EsoLangs).
Обратите внимание, что это короче, чем моя запись в списке Esolangs, потому что я даже не думал, что смогу играть в гольф больше. А потом, когда я писал задачу по игре в гольф на струнах Фурье, я понял, что могу пойти немного короче.
Запись
Если вы задавались вопрос о переменном синтаксисе, Geobits написал программу , которая использует переменные и является такими же длинами:
Попробуйте онлайн!
источник
C-- , 155 байт
К сожалению, единственный известный компилятор C - Quick C-- больше не поддерживается. Это боль в шее , чтобы построить, но это возможно ...
источник
C 30 байт
Довольно ванильно, но я не могу придумать, как обычно скомпилировать способ сделать это немного короче (разве может какой-то трюк с сырым ассамом подойдет?). Тем не менее, побеждает большинство esolangs!
источник
main(){puts("Hello, World!");return 0;}
и 53#include <stdio.h> int main(){puts("Hello, World!");}
байта соответственно. Чуть больше, если вы считаете, что main (void) требуется.main(){return!puts("Hello, World!");}
два байта короче.h
на 29 байт короче. Примечание: вам придется скомпилировать его,-Dh='main(){puts("Hello, World!");}'
я наполовину троллю, наполовину забавляюсь злоупотреблением компилятором.__FILE__
(8 байт) и называл файлmain(){puts("Hello, World!");}
. Тогда это абсолютно не обманывает;)Не читается ,
843755732666645629577 байтПредполагается, что нечитаемые программы будут отображаться шрифтом переменной ширины, поэтому они учитывают имя языка. Я немного разочарован тем, что мои более изощренные подходы оказались намного длиннее. Циклы безумно дороги в нечитаемом ...
Попробуйте онлайн!
Как это устроено
Нечитаемый имеет только десять функций; шесть из них используются в этом коде:
После использования моей односимвольной записи и добавления пробелов и комментариев приведенный выше код выглядит следующим образом. Многострочные операторы выполняются снизу вверх.
Я сгенерировал реальный исходный код, запустив незакомментированную версию вышеупомянутого псевдокода через эту программу CJam .
источник
Befunge 98 ,
1918 BytesНовый ответ (из подземного монорельса)
объяснение
"
запускает строковый режимHello, World!@,kc
"
снова, заканчивая строковый режимc
)k
принимает верхнее значение стека и выполняет следующую команду, указатель команды может видеть это много раз,
извлекает значение из стека и выводит его как символ. Это было выполнено 12 раз последнейk
инструкцией, и еще один раз, когда интерпретатор фактически читает,
инструкцию@
заканчивает программуРазница со старым ответом заключается в том, что мы ловко используем
"
символ повторно , используя циклическое поведение Befunge, когда оно достигает конца строки. Поскольку это может быть менее интуитивно понятно, я позволяю и старому. Кроме того, вы, возможно, заметили, что в стеке все еще будут содержаться некоторые символы (ck,@
) из-за этого приятного трюка, оставляя некоторый беспорядок, если мы когда-нибудь захотим что-то сделать после этого.Старый ответ
Это работает для веселья и befunge 98
объяснение
""
помещается в стек. ('H'
сейчас на вершине.)c
(12) помещается в стекk
принимает верхнее значение стека и выполняет следующую команду, указатель команды может видеть это много раз.,
извлекает значение из стека и выводит его как символ. Это было выполнено 12 раз последнейk
инструкцией, и еще один раз, когда интерпретатор фактически читает,
инструкцию@
заканчивает программуисточник
k
c
для93+
."ck,@!dlroW ,olleH
"
чтобы начать строку, добавляет всю оставшуюся часть строки к этой строке, оборачивает и нажимает то же самое,"
чтобы завершить строку. Теперь вся программа, кроме той,"
которая была помещена в стек,!dlroW ,olleH
сверху. Затем он печатает верхние 12 символов так же, как ваш и останавливается на@
.JSFuck ,
629362896277 байтЭто может быть упомянуто как один из самых длинных "самых коротких Hello, World!" » (На самом деле я не знаю, является ли это оптимальной, но это самая короткая, которую мне удалось получить).
Предупреждение: работает только в Firefox и Safari
Существует также немного более длинная версия (+4 байта), которая также работает в Chrome и Microsoft Edge:
Показать фрагмент кода
Для тех, кто не знаком с JSFuck, речь идет о написании JavaScript, как если бы было только шесть символов, и иногда он может стать довольно сумасшедшим.
В этой таблице показано, как символы используются в Hello, World! Программа закодирована в JSFuck. Простой текстовый код просто
alert("Hello, World!")
.Вот строки
"fill"
,"fontcolor"
и т.д. , должны быть записаны в виде"f"+"i"+"l"+"l"
, который"f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"
должен быть закодирован.Глобальные идентификаторы
self
,atob
иbtoa
пишутся какFunction("return self")()
.Function
сам должен быть[]["fill"]["constructor"]
.Запятая
","
хитрая, я не уверен на 100%, как она работает, но она использует[]["concat"]
функцию для создания массива. Я опубликую обновление, когда у меня будет время, чтобы сделать больше тестов.Я закодировал это, используя JScrewIt - кредит GOTO 0 для создания такого сложного инструмента:
alert("Hello, World!")
Это отличается от моего ответа на этот вопрос наличием запятой после «Привет».
Интересно, что синтаксис ES6
требуется еще больше байтов для кодирования (+1500 или около того) из-за более высокой сложности кодирования двух обратных символов, а не
("
и")
.источник
Пада ,
8368 байтЯ считаю, что это оптимально для линейной программы (то есть той, которая не использует операторы потока управления
?
и*
). В целом это может быть оптимально, но я не знаю, как использовать эти дополнительные операторы в таком небольшом объеме кода (или как исследовать возможности программно).Язык недавно претерпел некоторые изменения после того, как я начал обсуждать его с автором по электронной почте. Однако на прошлой неделе я написал эталонную реализацию текущего состояния языковой спецификации, поэтому приведенный выше код действительно работает.
Metagolf
Первоначально я использовал результаты своей эталонной реализации для решения этой задачи и создал на этой основе решение, созданное вручную. Однако это был просто эвристический подход.
Поэтому вместо этого я написал решатель в Mathematica, который на самом деле знает о структурах данных и операторах Pada, чтобы найти оптимальное решение. В среднем он растет линейно с длиной строки (хотя некоторые комбинации символов немного медленнее других) и занимает около 1,5 часов
Hello, World!
.Так, как я пошел о написании решателя. Во-первых, мы заметили, что нам нужно рассмотреть только 6 операторов:
~.oOqQ
(плюс необходимыеw
для каждого из напечатанных символов). Использование стеков или битовых блокировок бесполезно в линейном коде, и я не верю этому,?
и его*
можно эффективно использовать менее чем в 68 байтах.Состояние Pada (без учета стеков и блокировок) состоит из 7 переключателей и 8 битов, расположенных следующим образом:
Так что это возможные состояния. Мой первый шаг предварительной обработки состоял в том, чтобы установить ориентированный граф состояний, где каждое ребро соответствует одной операции. Таким образом, граф имеет 32768 вершин, каждая из которых имеет степень превышения 6 (по одному исходящему ребру для каждой из 6 рассматриваемых операций). Мы можем использовать этот график, чтобы найти кратчайший путь между любыми двумя состояниями (сам этот график может быть весьма полезен для игры в гольф Pada).
215 = 32768
Теперь для каждого символа мы хотим достичь состояния, в котором
w
печатается этот символ. Сколько таких штатов?w
читает байт из бита, на который он сброшен (циклически). Таким образом, есть 8 возможных поворотов битов символа, которые могут все печатать этот символ. Для каждого из этих вращений установлены три переключателя (чтобы сделатьw
падение в правильном положении). Это оставляет 4 произвольных переключателя. Таким образом, у нас есть возможные состояния для каждого в нашем коде.8 * 24 = 128
w
С их помощью мы можем решить еще одну проблему с графом: построить граф с исходной вершиной, затем одним «слоем» для каждого символа и вершиной-приемником. Слои состоят из 128 состояний для каждой вершины, исходный узел соответствует начальному состоянию программы (все переключатели влево и все биты равны нулю). Узел приемника, в частности, не соответствует ни одному состоянию. У нас есть направленные ребра от каждой вершины в одном слое до каждой вершины в следующем слое, где вес ребра - это расстояние между двумя состояниями в нашем предыдущем графе. Все веса ребер от последнего слоя до приемника равны 0. То есть мы можем предварительно вычислить все эти веса ребер. Это самый дорогой этап вычислений, который занял 1,5 часа
Hello, World!
.С помощью этого графика мы можем довольно быстро найти кратчайший путь от источника до приемника (на моей машине это заняло 0,05 с). Для
Hello, World!
желаемых состояний есть:где младшие 7 битов соответствуют коммутаторам, а старшие 8 битов - битам Пады.
Теперь мы вернемся к первому графу и найдем фактические ребра (то есть операции), соответствующие кратчайшему пути между каждой парой последующих состояний, и завершим каждое из них знаком a
w
. Вуаля, оптимальное решение (на основе вышеуказанных предположений).Вот полный Mathematica, если кто-то хочет метагольфить другую строку в Pada:
источник