Então ... isso é um pouco embaraçoso. Mas não temos um simples "Olá, mundo!" desafio ainda (apesar de ter 35 variantes marcadas com hello-world e contando). Embora este não seja o código de golfe mais interessante nos idiomas comuns, encontrar a solução mais curta em certos esolangs pode ser um sério desafio. Por exemplo, que eu saiba, não se sabe se a solução Brainfuck mais curta possível já foi encontrada.
Além disso, enquanto toda a Wikipedia (a entrada da Wikipedia foi excluída, mas há uma cópia em archive.org
), esolangs e Rosetta Code têm listas de "Olá, Mundo!" programas, nenhum deles está interessado em ter o menor para cada idioma (também existe este repositório GitHub ). Se queremos ser um site importante na comunidade de código-golf, acho que devemos tentar criar o catálogo definitivo dos mais curtos "Olá, mundo!" programas (semelhante à forma como nosso desafio básico sobre quine contém alguns dos quines mais curtos conhecidos em vários idiomas). Então vamos fazer isso!
As regras
- Cada envio deve ser um programa completo.
- O programa não deve receber nenhuma entrada e imprimir
Hello, World!
em STDOUT (esse fluxo de bytes exato, incluindo maiúsculas e pontuação), além de uma nova linha de rastreamento opcional e nada mais.
- O programa não deve gravar nada no STDERR.
Se alguém quiser abusar disso criando uma linguagem em que o programa vazio é impresso Hello, World!
, então parabéns, eles apenas abriram o caminho para uma resposta muito chata.
Observe que deve haver um intérprete para que o envio possa ser testado. É permitido (e até encorajado) escrever esse intérprete para um idioma anteriormente não implementado.
- As submissões são pontuadas em bytes , em uma codificação apropriada (pré-existente), geralmente (mas não necessariamente) em UTF-8. Alguns idiomas, como Pastas , são um pouco difíceis de pontuar - em caso de dúvida, pergunte no Meta .
- Não se trata de encontrar o idioma com o menor "Olá, mundo!" programa. Trata-se de encontrar o menor "Olá, Mundo!" programa em todas as línguas. Portanto, não marcarei nenhuma resposta como "aceita".
- Se o seu idioma de escolha for uma variante trivial de outro idioma (potencialmente mais popular) que já tenha uma resposta (pense em dialetos BASIC ou SQL, shell do Unix ou derivados triviais do Brainfuck como Alphuck), considere adicionar uma nota à resposta existente de que o solução igual ou muito semelhante também é a mais curta no outro idioma.
Como observação lateral, por favor , não reduza as respostas chatas (mas válidas) em idiomas onde não há muito para jogar golfe - elas ainda são úteis para esta pergunta, pois ela tenta compilar um catálogo o mais completo possível. No entanto, fazer respostas principalmente upvote nas línguas em que os autores realmente tive que colocar esforço para jogar golfe o código.
Para inspiração, confira a coleção Hello World .
O Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [><>](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!"
, for o mais curto em vários idiomas diferentes e não relacionados, ele deve ser publicado separadamente?Respostas:
Preso, 0 bytes
Bem, não pode ficar mais curto que isso ... Um programa vazio será exibido
Hello, World!
no Stuck .fonte
Hello, World!
coisa era apenas algo que eu havia colocado como espaço reservado no início do desenvolvimento. Eu não pretendia deixá-lo por tanto tempo, apenas nunca consegui removê-lo.PHP, 13 bytes
Sim. Funciona.
fonte
<?php
no código, fazendo com que ele não se interpretada pelo PHP em todos os :)Brainfuck, 78 bytes
Recompensa em aberto: se alguém puder melhorar essa pontuação, passarei a recompensa (+500) para eles.A @KSabencontrou umasolução de7672 bytes!Experimente online!
Os primeiros 28 bytes
--<-<<+[+[<+>--->->->-<<<]>]
inicializam a fita com a seguinte relação de recorrência (mod 256):f n = 171 · (-f N-1 - f n-2 - f n-3 + 1) , com f 0 = 57 , f 1 = 123 , e f 2 = 167 .
O fator 171 surge porque 3 -1 ± 171 (mod 256) . Quando o valor atual é convertido, uma célula volta (via
<+>---
) subtraindo 3 cada vez que multiplica efetivamente o valor por 171.Em n = 220, o valor a ser traduzido é zero e a iteração para. Os dez bytes anteriores ao ponto de parada são os seguintes:
Ele contém todos os componentes necessários para produzir
Hello, World!
, de maneira caçada e picada, com pequenos ajustes.Eu também encontrei uma solução alternativa de 78 bytes:
Experimente online!
Considero que este é melhor que o primeiro por várias razões: usa menos células restantes de casa, modifica menos células no total e termina mais rapidamente.
Mais detalhes
Relações de recorrência têm representações surpreendentemente concisas em Brainfuck. O layout geral é o seguinte:
que representa:
f n = c 1 · f n-1 + c 2 · f n-2 + c 3 · f n-3 + ... + k
com
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.
Além disso,
<+>
pode ser alterado para multiplicar o intervalo por uma constante sem afetar o ponto de parada, e um termo pode ser adicionado antes>{k}
de alterar o intervalo por uma constante, novamente sem afetar o ponto de parada.Outros exemplos
Sequência de Fibonacci
Números gonais
Números triangulares
Definido como f n = 2 · f n-1 - f n-2 + 1 , com f 0 = 0 , f 1 = 1 .
Números quadrados
Números pentagonais
etc.
BF Crunch
Publiquei o código que usei para encontrar algumas dessas soluções no github . Requer .NET 4.0 ou superior.
A saída é dada em três linhas:
Por exemplo, o resultado final para
bfcrunch "hello world" 70 -r -i23
é:Isso corresponde ao programa completo:
Outros registros
Olá Mundo!
Embrulho, 78 bytes :
ou
Sem quebra automática , 87 bytes (anteriormente 92 bytes (mitchs) ):
Olá Mundo!
Embrulho, 80 bytes :
Sem quebra automática, 81 bytes (anteriormente 92 bytes (hirose) ):
Olá Mundo!
Embrulho, 74 bytes :
Sem quebra automática, 84 bytes :
Versão Esolangs
Olá mundo! \ N
Embrulho, 76 bytes :
Isso usa uma célula deixada em casa e, portanto, seria considerada 77.
Sem quebra automática, 83 bytes :
Rdebath aprovado . saída profilebf:
inversed.ru (Peter Karpov)
Olá Mundo!
Embrulho, 70 bytes (anteriormente 78 1 ):
Sem quebra automática, 77 bytes (anteriormente 89?):
O autor afirma que o mais curto código de mão "Olá Mundo!" tem 89 bytes, mas não fornece referência. Por meio deste, reivindico o registro para isso também.
Olá Mundo!
Invólucro, 65 bytes (anteriormente 66 bytes):
Na verdade, isso também é codificado à mão (o melhor que eu poderia encontrar pela trituração é 68 bytes ). A primeira célula é inicializada para 259 (3) e diminuída por 7 a cada iteração, repetindo 37 vezes. A célula seguinte é decrementada por 6, resultando em 256 - 6,37 = 34 . O restante das células é decrementado em 4 a cada vez, adicionando uma célula a cada iteração, com cada nova célula inicializada para 252 (-4). O resultado é o seguinte:
1 A solução fornecida (79 bytes) pode ser trivialmente reduzida em um:
fonte
interface a{static void main(String[]A){System.out.print("No!");}}
ArnoldC , 71 bytes
Apenas para risos ..
fonte
IT'S SHOWTIME
eTALK TO THE HAND
deve estar na primeira e na última linha.Semente ,
601642344203 bytesO programa Befunge-98 resultante (com base nisso ) é
fonte
Mornington Crescent ,
36143568 bytesAgradecemos a NieDzejkob por salvar 46 bytes usando nomes de linhas mais curtos.
Experimente online!
Isso certamente é subótimo, mas é metade do tamanho da solução em esolangs.
Hello, World
é construído dividindo os seguintes nomes de estações e concatenando os resultados:Finalmente, estou calculando o código de caractere de
!
as(2<<4)+1 == 33
. Todas essas peças são concatenadas em Paddington e finalmente impressas em Mornington Crescent.Nota: O idioma não especifica se é possível viajar para a mesma estação duas vezes seguidas, mas o intérprete permite, então eu o usei.
fonte
mal , 70 bytes
Ele usa os quatro comandos a seguir:
fonte
brainfuck, 72 bytes
Experimente online!
E a solução original de 76 bytes, sem embalagem :
Experimente online!
Outras soluções mais curtas conhecidas (que eu saiba) que encontrei
'Olá Mundo!' 77 bytes:
Experimente online!
'Olá Mundo!' 70 bytes:
Experimente online!
Eles foram encontrados usando um programa c ++ que escrevi aqui: https://github.com/ksabry/bfbrute
Nota: Originalmente, eu queria limpar esse código antes de publicá-lo, para torná-lo realmente um pouco legível e utilizável, mas como eu não o entro há mais de um ano, acho que vou publicá-lo como está. Ele faz uso pesado de modelos e constantes de tempo de compilação para possíveis otimizações e possui vários códigos comentados dos meus testes, mas nenhum comentário útil é desculpa, mas é um pouco horrível.
Não há nada terrivelmente inteligente sobre o código, é o forcer bruto em seu núcleo, no entanto, é bastante otimizado. A principal otimização é que ele itera primeiro todos os programas sem loops (nenhum
[
ou]
) até um comprimento especificado (16 atualmente) e armazena em cache uma matriz de todas as alterações que ela fará na matriz de dados. Ele armazenará apenas um único programa por matriz única de alterações, por exemplo, apenas uma delas>+<<->
e<->>+<
será armazenada. Ele itera através de todos os programas possíveis que são compostos de qualquer programa nesse cache com qualquer combinação de loops entre eles. Depois de executar cada programa, ele faz uma simples caça e ganância nos personagens e acrescenta isso ao final do programa.Depois de executar isso no espaço de todos os programas, notei que quase todos os programas mais curtos (de até 19 anos) eram do formato
*[*[*]*]
. Restringir a pesquisa a programas deste formulário acelerou a pesquisa consideravelmente. O atual detentor do registro foi encontrado no comprimento 27. Na verdade, este foi calculado para o comprimento 74, mas notei uma sequência específica.>.>.>.
que teve a sorte de ter um 0 na célula de dados à sua direita, permitindo que fosse simplificado para[.>]<
reduzi-lo para 72.Deixei que funcione por um bom tempo e completei a pesquisa com os parâmetros atuais até o comprimento 29, suspeito que será difícil superar o atual simplesmente subindo mais alto, acho que a abordagem mais promissora provavelmente aumentaria o espaço de pesquisa em alguma maneira inteligente.
fonte
Piet, 90 codéis
Esta é uma imagem 30 por 3. Alternativamente, no tamanho do codel 10:
O usa um layout de 3 alto, para que eu só precise apontar uma vez. Se isso ainda é jogável, eu provavelmente poderia fazer a barba no máximo em outra coluna, já que há um não-op de empurrar lá.
Edit: a solução de codel de 84 da @ primo .
fonte
Palheiro , 17 bytes
O Haystack é uma linguagem de programação 2D que é executada até encontrar a agulha no palheiro
|
, enquanto executa operações baseadas em pilha. Todos os programas iniciam no canto superior esquerdo e podem usar os caracteres direcionais><^v
para se mover pelo programa. A direção é herdada; portanto, você não precisa continuar usando>
para ir para a direita; a direção só mudará quando atingir um caractere direcional diferente.Por padrão, o intérprete lê do canto superior esquerdo, indo para a direita, para que possamos colocar "Olá, mundo!" na pilha, use-a
o
para imprimi-la e coloque a agulha para concluir a execução.Bônus: Uma versão mais emocionante:
fonte
o
saídas como um número. Não deveria serc
no final? Existe documentação adequada em algum lugar? Isso é super interessante!o
gera o item da pilha superior como está, ou seja, se houver um número, ele será impresso.c
simplesmente lançaria isso a um char. Então, se você tem uma corda ou caractere no topo da pilhao
seria o que você quer :) Eventualmente, estes documentos serão atualizados ..Ajuda, WarDoq! , 1 byte
Não apenas ajuda, WarDoq! Se você tiver um recurso interno para as grafias mais comuns da frase, ele ainda satisfaz nossa definição usual de linguagem de programação.
Experimente no intérprete online oficial (o código entra em Input ).
fonte
"Space: Begin a comment. The next non-space character ends the comment and is interpreted as usual."
Então você só pode ter comentários feitos de espaços ??? Suponho que mesmo a linguagem mais útil do mundo tenha um recurso inútil +1,MarioLANG ,
259249242240235 bytesIsso foi testado na implementação do Ruby .
Depois de ofuscar "Olá, Mundo!"no MarioLANG, eu pensei em jogar um pouco. O acima é o mais curto que encontrei até agora.
Como antes, comecei a partir de uma solução Brainfuck que define quatro células para o múltiplo mais próximo de 10 para os caracteres
He,
e o espaço e o converteu no MarioLANG . Em seguida, você pode reduzir um pouco o código usando o piso auxiliar no loop, que quase reduz pela metade a largura do loop. Observe que a parte inferior é executada apenas uma vez a menos que a parte superior, para que você não obtenha mais múltiplos exatos do contador inicial em todas as quatro células.Por fim, eu queria usar o espaço desperdiçado na frente do loop, então adicionei vários elevadores para fazer uso do espaço vertical lá. E então eu percebi que poderia dobrar o código depois o loop (consulte a revisão anterior) abaixo do loop para usar um pouco mais de espaço vertical, que economizou mais cinco bytes.
Provavelmente ainda está longe de ser perfeito, mas acho que é uma melhoria decente em relação à solução ingênua.
Metagolf
Tempo para alguma automação ...
Comecei a configurar um solucionador no Mathematica para encontrar uma solução ideal. Atualmente, assume-se que a estrutura do código é fixa: contador definido para 12, 4 células para impressão, com a atribuição fixa
He,<space>
e a mesma ordem dessas células. O que varia é o número de+
s no loop, bem como as correções necessárias posteriormente:Acontece que, para um contador inicial de 12, minha solução artesanal já é ótima. No entanto, o uso de 11 salva dois bytes. Tentei todos os valores de contador de 6 a 20 (inclusive) com os seguintes resultados:
Nota: Este solucionador supõe que o código linear após o loop esteja na linha superior, e o código acima é a solução dobrada. Pode haver uma solução geral mais curta, tornando o solucionador ciente da dobra, porque agora eu recebo mais 3
+
s na primeira parte de graça, e as próximas 4 instruções custariam apenas 1 byte em vez de 2.fonte
Escuro , 106 bytes
Vou deixar algumas citações da especificação da linguagem falarem pelo brilho deste esolang:
fonte
Homespring , 58 bytes
O espaço à direita é significativo.
Deixe-me te contar uma historia. Era uma vez uma usina que alimentava um incubatório de salmão próximo. O incubatório de salmão chocou um jovem salmão sem teto que embarcou em uma jornada rio acima para encontrar uma nascente. Ele encontrou essa primavera, com o nome poético "Olá, Mundo!", Onde amadureceu e gerou um novo salmão jovem. Agora os dois peixes nadavam rio abaixo, em busca do vasto oceano. Mas pouco antes da foz do rio, havia uma rede no rio - o peixe maduro foi capturado e apenas o jovem conseguiu deslizar e alcançar o oceano e o resto do universo. Enquanto isso, o incubatório havia chocado mais salmão, que também viajava rio acima e desovava e assim por diante.
No entanto, grandes quantidades de neve derretida viajavam por um braço diferente do rio. E logo após o nosso primeiro salmão jovem das nascentes de "Olá, Mundo!" atingiu o oceano, o derretimento da neve atingiu o universo e ... destruiu-o. E eles viveram felizes para sempre ... ou acho que não.
Essas eram, na verdade, a semântica do programa acima. Homespring é estranho.
fonte
Chef , 465 bytes
Testado com o intérprete Ruby. Faz sopa de letrinhas.
Tentei ser o mais compatível possível com as especificações originais , mesmo que o intérprete que usei permita que você solte os
the
s nasPour contents
instruções, não o fiz.A tigela é bem cara, então pode haver uma abordagem melhor. Tentei usar a conversão de base para codificar a mensagem, mas infelizmente a especificação não esclarece se
Divide
usa divisão de número inteiro ou ponto flutuante, e o intérprete que eu tenho usa a última. Também não há operador de módulo, o que também não ajuda.fonte
Piet, 84 codéis
28x3, mostrado aqui com a largura do codel 10.
Criado com o PietDev , testado com o npiet . O layout do programa é o seguinte:
Preenchimento amarelo indica codelos onde o caminho se sobrepõe; preenchimento laranja indica codelos que devem ser da mesma cor, para fins de controle de fluxo.
Para ajudar na criação disso, escrevi um intérprete rudimentar para uma linguagem baseada em pilha com comandos semelhantes a piet, que chamei de "pasm" ( fonte ). A saída deste intérprete (com esta entrada ) é a seguinte:
Nenhum comando ponteiro, comutador ou rolo é usado. Também não são desperdiçados codels; de fato, dois são reutilizados.
fonte
Espaço em branco ,
192150146 bytesO espaço em branco precisa apenas de espaços, tabulações e linhas de alimentação enquanto outros caracteres são ignorados.
O que pode ser problemático para exibir aqui.
Portanto, no código abaixo, os espaços e tabulações foram substituídos.
E um ';' foi colocado na frente dos feeds de linha para maior clareza.
Para executar o código, primeiro substitua. e> por espaços e tabulações.
Hexdump do código
Código de montagem de espaço em branco:
Observações:
Eu tive que escrever um programa apenas para calcular que a adição de 107 dá o golfe ideal para a frase. Como o tamanho do bytes que um número inteiro recebe no código é alterado. : 4 + int (abs (log2 ($ n)))
O código ainda será executado sem o rótulo "e:" e a parte de saída em whitespace.kauaveel.ee . Mas isso pode tornar o código de espaço em branco inválido em outros compiladores de espaço em branco. Portanto, esses bytes não foram extraídos da solução.
Deve-se notar que
Como Kevin Cruijssen apontou nos comentários, ao permitir uma "saída por erro" conforme meta, o espaço em branco pode ter mais de 126 caracteres no código de golfe .
Montagem:
fonte
SSN
(valor do erro) em vez deSSSN
(push 0 ), que é permitido de acordo com a meta . Experimente on-line (com destaque e explicação adicionais) ou faça o teste online .dup jumpz e
e ae: exit
removida. Mas pelo menos em whitespace.kauaveel.ee ele continua em loop até o navegador reclamar. Prefiro não mudar minha versão para isso, apesar do menor nível de golfe e da meta que permitem "sair por erro". Mas você pode enviar sua versão como uma nova resposta.SSN
no início; nesse caso, ele erro com o Can't do Infix Plus quando ele tem apenas um único item na pilha (o 107). ( Experimente online. ) Vou deixar meu comentário aqui quando alguém tiver a mesma sugestão. E eu já adicionei sua resposta a um ano atrás, eu acho. ;)Java, 79
Versões anteriores do Java podem permitir que você use um bloco estático (51 bytes), mas atualmente não conheço uma maneira de ignorar o
main
método.fonte
enum
vez declass
.interface
e descartando opublic
especificador. Rejeitei a política de edição a seguir, mas como eles não podem comentar, pensei em informar você para que você possa usá-lo, se quiser.CSS, 30 bytes
O Cascading Style Sheets (CSS) não é uma linguagem de programação típica, mas pode produzir resultados fixos razoavelmente bem. Isso é feito criando um pseudoelemento após cada elemento com o conteúdo
Hello, World!
. Portanto, apenas um elemento (<html>
) é selecionado, isso pressupõe que estamos usando o documento HTML mais básico, ou seja,Isso funciona na maioria dos navegadores principais, com a exceção notável do Firefox, que aplica o seletor aos elementos
<html>
e<body>
. É também por isso que os snippets de pilha não funcionam, porque sempre há um elemento body que também é estilizado. Abaixo está uma versão ligeiramente modificada para testar.fonte
* *
para selecionarbody
.* :after
também parecia funcionar.HTML, 13 bytes
O texto é inserido automaticamente no
<body>
e é exibido.fonte
código de máquina x86_64 para Linux, 32 bytes
Quando o Linux inicia um novo processo, todos os registros (exceto o RSP) são zero, então podemos obter RAX = 1 modificando apenas o byte baixo. A ABI do System V x86-64 não garante isso, mas é o que o Linux realmente faz. Esse código funciona apenas como
_start
em um executável estático.A instrução de chamada coloca o próximo endereço, que contém a string hello world, na pilha. Nós colocamos o endereço da string em
rsi
.Em seguida, os outros argumentos são configurados para
syscall
asys_write
, que imprime a sequência.O programa termina com um
syscall
parasys_exit
.sys_write
retorna o número de bytes gravados; portanto, os bytes superiores do RAX são zero após o primeirosyscall
(a menos que retorne um erro); portanto,mov al, 60
fornece RAX =__NR_exit
em apenas 2 bytes.Você pode fazer este programa segfault fechando seu stdout (
./a.out >&-
), entãosys_write()
retornará-EBADF
, o segundosyscall
retornará-ENOSYS
e, em seguida, a execução cairá no final. Mas não precisamos lidar com oswrite()
erros normalmente.fonte
__NR_write
é 1. Isso não é padrão em diferentes sistemas x86-64 Unix. Você também depende do comportamento do Linux de zerar todos os registros, exceto o RSP, antes de entrar em um processo novo (portanto, isso só funciona se você o compilar como um executável estático; caso contrário, o vinculador dinâmico deixará lixo nos bytes superiores derax
e você ' vou pegar-ENOSYS
). A ABI do System V do x86-64 diz que os registros podem conter valores arbitrários de lixo na entrada_start
; o próprio kernel do Linux escolhe zero eles para evitar vazamentos de informações.mov al, 1
/mov edi, eax
(2 bytes), em vez de necessitar de um prefixo REX para DIL, porque__NR_write == STDOUT_FILENO = 1
mov esi, msg
(NASM), também conhecido comomov esi, OFFSET msg
(GAS.intel_syntax
) . Coloque sua corda depois da últimasyscall
.call/pop
é 1 byte menor que o LEA relativo a RIP de 64 bits, mas mov é melhor.Hexagonia ,
3732 bytesExperimente online!
Apresento orgulhosamente minha segunda linguagem de programação 2D e (que eu saiba) a primeira linguagem 2D em uma grade hexagonal.
O código fonte não parece muito 2D, parece? Bem, espaço em branco é opcional no Hexagony. Primeiro, o código fonte é preenchido com o próximo número hexagonal centralizado com no-ops (
.
). O próximo número é 37, então inserimos cinco no-ops no final. Em seguida, o código fonte é reorganizado em hexágono regular:Isso também é executável. Experimente online!
O Hexagony possui vários recursos bastante interessantes, incluindo 6 ponteiros de instruções diferentes e um layout de memória que é o gráfico de linhas de uma grade hexagonal, mas esse código usa apenas um IP e uma borda de memória, então não vamos nos preocupar com isso por enquanto.
Aqui está uma visão geral sobre os comandos relevantes:
;
imprime o valor atual, módulo 256, como um byte para STDOUT./
é um espelho que se comporta como você esperaria (causando um desvio de 120 graus no IP).@
finaliza o programa.Agora, o problema final é que a fonte envolve todos os 3 pares de arestas. Além disso, se o IP deixar a grade em um dos seis cantos, há duas linhas possíveis para as quais pular. Qual é escolhido depende se o valor atual é positivo ou não positivo. A seguinte versão anotada mostra onde o IP entra novamente sempre que sai da grade:
Portanto, se removermos todas as mudanças de direção, este programa se resumirá ao seguinte código linear:
O que é com
Q2
,P0
eP1
? As letras são impressas facilmente, pois podemos definir a borda com o valor correspondente. Para a vírgula, o espaço e o ponto de exclamação, isso não funciona. Nós também não pode apenas definir o seu valor com44
,32
,33
, respectivamente, porque a borda de memória é diferente de zero para começar, e devido à semântica de dígitos individuais que iria causar todos os tipos de estragos. Se quiséssemos fazer isso, teríamos de redefinir o valor borda a zero com algo como*
,+
,-
,&
ou^
em primeiro lugar. No entanto, como o valor é obtido no módulo 256 antes de ser impresso, não precisamos definir os valores exatamente como 44, 32 ou 33. Por exemplo,Q2
definiremos o valor da borda como81*10 + 2 = 812
, que é44
quando tomado módulo256
. Dessa forma, podemos salvar um byte em cada um desses três caracteres. (Infelizmente, nunca é possível chegar lá com um único dígito a partir do valor da célula já. Amusingly, onde ele faz o trabalho é oo
deWorld
, porque isso pode também ser obtido a partirW9
.)Você pode usar esse script CJam para encontrar todas as combinações de dígitos de letras que resultam em um determinado caractere.
Não tenho certeza se isso é ideal. Duvido que seja possível fazê-lo em um hexágono de comprimento lateral 3 (onde você teria apenas 19 caracteres disponíveis), mas talvez seja possível resolvê-lo em um hexágono com comprimento lateral 4 com menos de 32 comandos, como que existem mais no-ops no final da grade.
fonte
Q2
,P0
eP1
é muito inteligente. Eu não conhecia a parte do módulo 256.M8;
(oug4;
), que eu usei algumas vezes desde então. Até agora, nunca me ocorreu revisitar esta resposta depois que fiz essa alteração.H;e;P;2Q/d;l;r/l;$@;o];o;W;03&;
Malbolge, 112 bytes
Vou ver se há um mais curto. Tenho um computador melhor desde a última vez, para que eu possa gerar um pouco mais rápido.
Para o show, aqui está "Olá, mundo!" sem a vírgula.
fonte
('<;_#"~6Z|{y1UTvt,PrpMo,llj"Fgge{A??P=^t:8&7YtFVqjSQ@PNM)u(I8%$#"D2AA/[TYXQu88MLp3n1Gk.D-ge
(92 bytes)Fourier , 15 bytes
GRANDES MUDANÇAS para Fourier!
Experimente no FourIDE!
Sim, os dias de digitação do código ASCII de cada caractere se foram para sempre: Fourier agora suporta seqüências de caracteres. Quando você coloca uma string nos backticks, essa string é emitida.
Observe que você não pode fazer outra coisa senão produzir essa sequência: você não pode armazená-la em uma variável, ela não é armazenada no acumulador e não existem ferramentas de manipulação de sequência.
Aqui, você pode encontrar o acidente de trem que era velho Fourier. ;)
Experimente online!
Agora, alguns de vocês provavelmente já conheceram Fourier e podem estar bastante familiarizados com o idioma. Toda a linguagem é baseada em um acumulador: uma variável global que praticamente todos os operadores usam.
A parte mais importante do código é o
a
operador. Isso pega o valor numérico do acumulador e o converte em um caractere usando o código Pythonchr(accumulator)
. Isso é impresso em STDOUT.Infelizmente, ainda não tive a chance de usar Fourier ( nudge nudge , wink wink ), principalmente devido à falta de strings e operadores de strings. Mesmo assim, ainda é utilizável para muitos outros desafios (consulte a seção de exemplos da página EsoLangs).
Observe que isso é mais curto que minha entrada na lista Esolangs porque eu realmente não achava que poderia jogar mais. E então, ao escrever o desafio do golfe por cordas de Fourier, percebi que poderia diminuir um pouco.
Nota
Se você estava pensando sobre a sintaxe da variável, o Geobits escreveu um programa que usa variáveis e tem o mesmo comprimento:
Experimente online!
fonte
C-- , 155 bytes
Infelizmente, o único compilador C - conhecido, o Quick C - não é mais mantido. É uma dor no pescoço construir, mas é possível ...
fonte
C, 30 bytes
Bastante baunilha, mas não consigo pensar em uma maneira comum de ser compilável para fazê-lo mais curto (a menos que talvez algum tipo de truque cru de asm possa funcionar?). Ainda assim, supera a maioria dos esolangs!
fonte
main(){puts("Hello, World!");return 0;}
e 53#include <stdio.h> int main(){puts("Hello, World!");}
bytes, respectivamente. Um pouco mais se você achar que o principal (nulo) é necessário.main(){return!puts("Hello, World!");}
é dois bytes mais curto.h
é 29 bytes mais curto. Nota: você terá que compilá-lo com-Dh='main(){puts("Hello, World!");}'
eu estou meio trollando, meio me divertindo com abuso de compilador.__FILE__
(8 bytes) e nomeie o arquivomain(){puts("Hello, World!");}
. Em seguida, ele é totalmente não fazer batota;)Ilegível ,
843755732666645629577 bytesOs programas ilegíveis devem ser exibidos com uma fonte de largura variável, para que honrem o nome do idioma. Estou um pouco decepcionado que minhas abordagens mais sofisticadas acabaram sendo muito mais longas. Loops são incrivelmente caros em Ilegível ...
Experimente online!
Como funciona
Ilegível tem apenas dez funções; seis deles são usados neste código:
Depois de usar minha notação de caractere único e adicionar alguns espaços em branco e comentários, o código acima se parece com o seguinte. Instruções de várias linhas são executadas de baixo para cima.
Eu gerei o código fonte real executando a versão não comentada do pseudocódigo acima através deste programa CJam .
fonte
Befunge 98 ,
1918 bytesNova resposta (de undergroundmonorail)
Explicação
"
inicia o modo de sequênciaHello, World!@,kc
"
novamente, encerrando o modo de sequênciac
)k
pega o valor máximo da pilha e executa o próximo comando que o ponteiro da instrução pode ver que muitas vezes,
exibe um valor da pilha e o gera como um caractere. Foi executado 12 vezes pela últimak
instrução e mais uma vez quando o intérprete realmente lê a,
instrução@
termina o programaA diferença com a resposta antiga é que reutilizamos o
"
personagem de maneira inteligente , usando o comportamento de loop do Befunge quando ele atinge o final da linha. Como pode ser menos intuitivo, também deixo o antigo. Além disso, você deve ter notado que a pilha ainda contém alguns caracteres (ck,@
) por causa desse truque, deixando alguma bagunça se quisermos fazer algo depois disso.Resposta antiga
Isso funciona para funge e befunge 98
Explicação
""
é empurrado para a pilha. ('H'
agora está no topo.)c
(12) é empurrado para a pilhak
pega o valor máximo da pilha e executa o próximo comando que o ponteiro da instrução pode ver isso várias vezes.,
exibe um valor da pilha e o gera como um caractere. Ele foi executado 12 vezes pela últimak
instrução e mais uma vez quando o intérprete realmente lê o,
instrução@
termina o programafonte
k
c
para93+
."ck,@!dlroW ,olleH
"
início da string, adiciona o resto da linha a essa string, envolve e bate no mesmo"
para finalizar a string. Agora, todo o programa, exceto o que"
foi enviado para a pilha, está!dlroW ,olleH
no topo. Em seguida, imprime os 12 principais caracteres da mesma forma que o seu e para@
.JSFuck ,
629362896277 bytesIsso pode ser mencionado como um dos mais longos "programas mais curtos do Hello, World! " (Na verdade, eu não sei se isso é ideal, mas é o mais curto que consegui).
Aviso: só funciona no Firefox e Safari
Também há uma versão um pouco mais longa (+4 bytes) que também funciona no Chrome e no Microsoft Edge:
Mostrar snippet de código
Para aqueles que não estão familiarizados com o JSFuck, trata-se de escrever JavaScript como se houvesse apenas seis caracteres, e isso pode ficar bem louco às vezes.
Esta tabela mostra como os caracteres usados no Hello, World! programa são codificados no JSFuck. O código de texto simples é justo
alert("Hello, World!")
.Aqui, as cadeias
"fill"
,"fontcolor"
etc. devem ser escritas como"f"+"i"+"l"+"l"
,"f"+"o"+"n"+"t"+"c"+"o"+"l"+"o"+"r"
para serem codificadas.Os identificadores globais
self
,atob
ebtoa
são escritos comoFunction("return self")()
.Function
em si deveria ser[]["fill"]["constructor"]
.A vírgula
","
é complicada, não tenho 100% de certeza de como funciona, mas usa a[]["concat"]
função para criar uma matriz. Vou postar uma atualização quando tiver tempo para fazer mais testes.Eu codifiquei isso usando JScrewIt - créditos no GOTO 0 por criar uma ferramenta tão sofisticada:
alert("Hello, World!")
Isso difere da minha resposta a esta pergunta pela presença de vírgula após "Olá".
Curiosamente, a sintaxe do ES6
leva ainda mais bytes para codificar (+1500 ou mais) devido à maior complexidade de codificar dois backticks em vez de
("
e")
.fonte
Pada ,
8368 bytesEu acredito que isso é ideal para um programa linear (ou seja, um que não use os operadores de fluxo de controle
?
e*
). Pode ser ideal no geral, mas não sei como usar esses operadores adicionais em uma quantidade tão pequena de código (ou como explorar as possibilidades programaticamente).O idioma passou recentemente por algumas alterações depois que comecei a discuti-lo com o autor por email. No entanto, eu escrevi uma implementação de referência para o estado atual da especificação de idioma na semana passada, portanto, o código acima é realmente executável.
Metagolf
Originalmente, eu havia usado o resultado da minha implementação de referência para esse desafio e criado uma solução artesanal com base nisso. No entanto, essa foi apenas uma abordagem heurística.
Então, em vez disso, escrevi um solucionador no Mathematica que realmente conhece as estruturas de dados e os operadores do Pada para encontrar uma solução ideal. Em média, cresce linearmente com o comprimento da string (embora algumas combinações de caracteres sejam um pouco mais lentas que outras) e demorou cerca de 1,5 horas
Hello, World!
.Então, como eu escrevi o solucionador? Primeiro, percebemos que precisamos considerar apenas 6 operadores:
~.oOqQ
(mais o necessáriow
para cada um dos caracteres impressos). Usar as pilhas ou os bloqueios de bits não é útil no código linear, e eu não acredito nisso?
e*
pode ser usado efetivamente em menos de 68 bytes.O estado de Pada (ignorando as pilhas e bloqueios) consiste em 7 switches e 8 bits, organizados da seguinte maneira:
Então, isso é possível estados. Minha primeira etapa de pré-processamento foi configurar um gráfico direcionado de estados em que cada extremidade corresponde a uma única operação. Ou seja, o gráfico possui 32768 vértices, cada um com grau externo 6 (uma borda de saída para cada uma das 6 operações consideradas). Podemos usar este gráfico para encontrar o caminho mais curto entre dois estados (este gráfico por si só pode ser bastante útil para jogar golfe no Pada).
215 = 32768
Agora, para cada personagem, queremos alcançar um estado em
w
que esse personagem seja impresso. Quantos estados existem?w
lê o byte do bit em que é descartado (ciclicamente). Portanto, existem 8 rotações possíveis dos bits do caractere que podem imprimir esse caractere. Para cada uma dessas rotações, três interruptores são fixos (para fazer aw
queda na posição correta). Isso deixa 4 opções arbitrárias. Portanto, temos estados possíveis para cada um em nosso código.8 * 24 = 128
w
Com eles, podemos resolver outro problema de gráfico: construa um gráfico que tenha um vértice de origem, depois uma "camada" para cada caractere e um vértice de afundamento. As camadas consistem nos 128 estados de cada vértice, o nó de origem corresponde ao estado inicial do programa (todas as opções à esquerda e todos os bits são zero). O nó coletor não corresponde a nenhum estado em particular. Temos arestas direcionadas de todos os vértices em uma camada para todos os vértices na próxima camada, onde o peso da aresta é a distância entre os dois estados em nosso gráfico anterior. Os pesos das arestas da última camada até a pia são todos 0. Ou seja, podemos pré-calcular todos esses pesos. Essa é a etapa mais cara da computação e levou 1,5 horas para
Hello, World!
.Com esse gráfico configurado, podemos encontrar o caminho mais curto da fonte até o coletor rapidamente (foram necessários 0,05s na minha máquina). Para
Hello, World!
os estados desejados são:onde os 7 bits menos significativos correspondem aos comutadores e os 8 bits mais significativos aos bits de Pada.
Agora voltamos ao primeiro gráfico e encontramos as arestas reais (ou seja, operações) correspondentes ao caminho mais curto entre cada par de estados subsequentes e terminamos cada um deles com a
w
. Voilà, uma solução ideal (com base nas premissas acima).Aqui está o Mathematica completo, se alguém quiser metagolfar uma string diferente no Pada:
fonte