Escreva o quine mais curto possível em linguagem assembly .
Use qualquer ISA desejado, a menos que tenha uma print-quine
instrução ou equivalente. Os exemplos incluem x86, MIPS, SPARC, MMIX, IBM BAL, MIX, VAX, JVM, ARM, etc.
Você pode vincular à _printf
função da biblioteca padrão C (ou o equivalente em Java para o bytecode da JVM) para E / S.
O comprimento será avaliado tanto na contagem de instruções quanto no tamanho do segmento de dados. As soluções devem conter pelo menos duas instruções.
O quine deve imprimir o código de montagem , não o código de máquina montado.
Respostas:
x86 Linux, sintaxe AT&T: 244
(Eu compilei com isso
gcc -nostartfiles -lc quine.S -o quine
:)fonte
JVM Assembléia Bytecode (via Jasmin ) - 952
960990Infelizmente, o Jasmin não permite tantos truques legais quanto os da Microsoft
ilasm
. Mas a JVM possui um total de seisdup
instruções diferentes que fazem todos os tipos de coisas divertidas. Reordenar itens na pilha é algo que o .NET parece não suportar.De qualquer forma, acho que nenhuma das minhas duas entradas é um candidato sério ao código mais curto, mas acho que é difícil reduzi-las. Portanto, apenas para completar :-)
Versão comentada com informações sobre o que está na pilha:
História:
ldc
é mais curto quebipush
ouiconst_*
.fonte
gás para x86 Linux (89 bytes, sete instruções)
Tecnicamente, isso é trapaça.
Salve em um arquivo nomeado
a
e monte com os seguintes comandos para criar o executável nomeadoa.out
.A diretiva
.incbin
inclui um arquivo literalmente no local atual. Se você usar isso para incluir o próprio código-fonte, obterá uma boa solução.fonte
Formato Windows .COM: 307 caracteres
Monta, usando A86, em 51 bytes. Não requer bibliotecas externas além da função DOS Int21 AH = 9 (grave a string em stdout).
fonte
NASM, 223 bytes
Superando a resposta aceita!
fonte
.NET CIL - 623
669691723727Uma única linha, sem quebra de linha no final.
Primeira versão formatada e comentada (mesmo que não seja mais uma solução) - é improvável que eu me afaste muito do conceito geral:
História :
dup
é mais curto que escreverldloc.1
sempre.ldloc.1
podem ser escritasldloc 1
para tornar o último token literal. O bytecode resultante provavelmente é maior, mas é sobre o código do assembler, então eu não poderia me importar menos :-)object[]
variável local; Eu posso fazer tudo isso diretamente na pilha. Agradável.fonte
gás para Linux x86,
184176 bytesConstrua com
gcc -m32 -o a.out quine.S
. (Isso-m32
é opcional se o seu sistema operacional já tiver 32 bits.)Editado para adicionar: se modificarmos as regras para permitir
puts
a chamada em vez deprintf
, isso poderá ser feito em182174 bytes:(Observe que este, diferentemente do anterior, tem uma nova linha final.)
fonte
printf
acumular seus argumentos na pilha. Tecnicamente, não é seguro apenascall
repetir e esperar os mesmos argumentos, mas funciona na prática porque o gcc / clang nunca usa slots de argumentos como espaço temporário, o AFAIK.printf
from_start
(por exemplo, em um binário estático), portanto esse é um bom argumento para escrever um emmain
vez de a_start
. Esta resposta explica as várias maneiras de vincular libc de binários estáticos ou dinâmicos. (Em um binário dinâmico do Linux, o vinculador dinâmico será executado funções inicializador do glibc, assim você pode usarprintf
a partir do_start
ponto de entrada, mas isso não é o caso em cygwin IIRC.)ASM inicializável, 660 bytes
Originalmente por jdiez17 , jogado de verdade pelo seu.
fonte
x86-64, Sistema V AMD64 ABI, GASM: 432
fonte
xor eax,eax
se não se importa com o status de saída do seu programa. Ele ainda se imprime, mesmo que saia com um status diferente de zero. Você também pode usar empush
vez depushq
. Na verdade, por que você está fazendo um quadro de pilha? Solte opush rbp
/mov rsp, rbp
eleave
. Você também pode usar nomes mais curtos de etiqueta..Cs
tem 3 caracteres quando 1 seria bom..att_syntax noprefix
provavelmente não se paga mais..intel_syntax noprefix
deixaria você soltar esses seis$
prefixos também. mas provavelmente ainda não vale a pena. (Você pode usarlea ecx,.Cs
em vez da intel-sintaxemov ecx,offset .Cs
)TAL
Para executá-lo, chame
::tcl::unsuppoted::assemble
com o código como argumento.Apenas Tcl 8.6.
fonte
TASM de 80x86, 561 bytes
fonte