Imprima a frase And she said, 'But that's his.'
usando apenas os seguintes caracteres: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Sem pontuação ou caracteres não alfabéticos. Você pode usar qualquer linguagem de programação que desejar. Espaço em branco é completamente permitido. O programa mais curto vence.
code-golf
kolmogorov-complexity
restricted-source
Falcão-de-cara-azul
fonte
fonte
a-zA-Z
. Em teoria, eu poderia usarw
rite eE
val para criar as instruções necessárias, mas nenhuma delas+-*,%'"
pode ser construída sem usar (pelo menos) uma das+-*,%'"0-9
.(programmer-of (language 'lisp))
não gosta disso.Respostas:
De espaço em branco ,
417414349265 bytes265 bytes graças a Kevin Cruijssen
Experimente online!
Explicado:
fonte
Whitespace is completely allowed.
Vejo que você entendeu isso literalmente.NNN
para sair, pois ele já pára com um erro quando você está adicionando antes do print_char, para que ele nem venha após o Jump_to_Label. Além disso, por que armazenar o arquivo63
no início e recuperá-lo no loop? Você pode simplesmente pressioná-lo antes de adicionar. E, por que o Label-nrTTSSSSTN
? Um rótulo pode até estar vazio; portanto, bastaNSSN
criar o rótulo eNSNN
pular para o rótulo quando você estiver usando apenas um rótulo.63
? Não tenho 100% de certeza de que é a menor constante possível aqui. Se estiver, algo está errado com meu programa de geração constante que escrevi para um desafio anterior. :)102
é a mais eficiente: 281 bytes (ou aqui com destaque ). (NOTA: Eu também usei uma cópia para salvar 4 bytes para o espaço entreehs dnA
(copiado do espaço entre elesdias ehs
).)Perl 5 ,
13310295 bytesExperimente online!
Explicação:
Regexes, print e chop todos se aplicam à variável
$_
por padrão.Substitui a cadeia vazia por
And she saidZ ZBut thatZs hisZZGjGGf
.Substitui cada um
Z
pelo resultado da avaliaçãochr oct oct oct ord chop
. Isso remove o último caractere de$_
, pega seu código-chave, interpreta-o como octal três vezes e converte-o novamente em um caractere. Por exemplo,j
→ 106 → 70 → 56 → 46 →.
.Devido à maneira como a substituição funciona, as modificações
$_
que acontecem durante a avaliação da substituição são perdidas, o que$_
ocorre agoraAnd she said, 'But that's his.'GjGGf
.Exclui tudo
G
,j
ef
entra$_
.fonte
print
comsay
a -2 caracteres. O meta consenso atual diz que os sinalizadores da linha de comando, como-M5.010
não contam para a contagem de bytes.> <> ,
916915903 bytesNo começo, pensei que uma solução em> <> era impossível, mas depois percebi ... quem precisa de condicionais ou controle lógico? : D
Experimente Online
Empurro repetidamente os números (o número 15) para a pilha, depois empurro o comprimento da pilha e imprimo o caractere com esse valor ASCII. Se eu precisar diminuir o comprimento da pilha, reduza a pilha três valores por vez usando
p
, ou um de cada vez usandog
se estiver dentro de três do alvo. O programa termina chamandoi
(entrada), que pressiona a uma-1
vez que não há entrada e, em seguida, imprime para causar um erro.Este é o programa Python 3 que eu usei para criar a solução, depois que pensei em como fazê-lo:
Experimente Online
fonte
p
: crie um 59 na pilha enquanto move do espaço para os
in esaid
, em seguida, coloque-o no código no caminho ded
para,
. (Observe que (15,15) tem 15 por este ponto.)l
ep
colocar vários caracteres úteis no retângulo (10,10) - (15,15) e recuperá-losg
onde for mais conveniente.8086 Assembly no IBM PC,
1463845664 bytesEsclarecimento: A fonte real da linguagem assembly é a entrada, não o código de máquina gerado.
A dificuldade é que a maioria das instruções x86 (como ADD, SUB, JMP, saltos condicionais, acesso à memória) têm dois argumentos e, portanto, precisam de uma vírgula ou precisam de um endereço de memória. Portanto, não podemos usar adição, subtração, ifs ou loops!
Durante minha primeira tentativa, consegui "construir" números usando uma combinação de incremento, decremento, multiplicação, divisão, truques de bytes e as instruções obscuras do BCD (como AAA, DAS). Depois disso, percebi que essa idéia poderia ser usada para criar código de auto-inspeção e auto-modificação.
Tentativa 1. (1463 bytes)
Use as instruções disponíveis para construir códigos ASCII e o endereço 0xb800 do buffer de tela. O cálculo de cada caractere na sequência foi jogado à mão.
Tentativa 2. (não concluída)
Percebeu que existe um código de operação para cada número inteiro no intervalo 0x40-0x5f. Este intervalo inclui AZ. Assim, por exemplo, INC CX corresponde a 0x41 = 'A'. (Esta tabela opcode é muito útil.)
Tentei construir 3 seqüências de "dados" e colocá-las em camadas umas sobre as outras. O primeiro como está (maiúsculo), o segundo "deslocado" para a zona 0x60-0x7f (minúsculo) e o último "deslocado" para a zona 0x20-0x3f (pontuação).
O código auto-modificável produziria um loop ou três para iterar sobre os dados.
Tentativa 3. (845 bytes)
Como a abordagem anterior, mas para reduzir os dados, a string seria codificada apenas uma vez, com "caracteres de controle" misturados para alternar os conjuntos de caracteres.
Tentativa 4. (664 bytes)
Como se livrar dos caracteres de controle que exigem muitas instruções corrigidas para lidar com ramificações? Dado que apenas duas letras maiúsculas são usadas, me perguntei se eu poderia "inverter" a tabela opcode para codificar letras minúsculas usando o intervalo 0x40-0x4f e pontuação usando o intervalo 0x90-0x9f (subtraindo 0xc0). O "A" e o "B" podem ser colocados separadamente.
No entanto, apenas metade dos opcodes no intervalo 0x90-0x9f é utilizável e não se alinham com os necessários. Então pensei que talvez pudesse embaralhá-los usando um XOR e encontrei um que funcionasse. E aqui está.
Golfe:
Monte com
e execute no DOSBOX (execute o CLS primeiro). Se parece com isso:
Comentado:
fonte
INC AX
enquanto a não comentada éINC AL
.label1 db
uma linha própria. Irá gerar um aviso, mas nenhum erro.Perl 6 ,
1299127212201215 bytesObrigado ao Grimy por -27 bytes.
-52 bytes porque, em primeiro lugar, não precisamos das orelhas de coelho.
Agradecimentos a Jo King por -5 bytes.
Experimente online!
Produz a string com uma nova linha à direita. Se você não quiser isso, substitua o último
say
por aprint
. Você também pode substituir as novas linhas na fonte por espaços.Explicação
Esse código imprime a seqüência de caracteres caractere. Cada caractere é formado, alimentando o código de caractere apropriado na
chr
função e minúsculas,lc
se necessário.Atualmente, todos os valores são gerados gerando uma sequência com o número correto de caracteres; em alguns casos, o número de caracteres é o inverso do código de caractere de destino. Teoricamente, seria possível usar funções matemáticas como
log
eexp
diretamente, mas não achei muito fácil usá-las.Para o uso como números, nós temos
e
,pi
etau
; no lado direito dex
ouxx
, eles são implicitamente pavimentados. Todos eles têm 17 caracteres em suas representações de seqüência de caracteres, então usamose
para contagem mínima de caracteres. Também temosi
(4 caracteres),False
(5 caracteres) eNaN
(3 caracteres). Podemos multiplicar comprimentos de string comx
;xx
multiplica um mais o comprimento da corda pelo lado direito e adiciona um.chop
remove um caractere da string, caso estejamos um longe do alvo.As instruções de impressão são encadeadas usando
and
, que tem uma precedência bastante baixa. É quase um milagre que exista; caso contrário, teríamos que usar ponto e vírgula ilegal.Encontrei as expressões dos personagens à mão. Pode valer a pena procurá-los programaticamente para encontrar expressões mais curtas.
fonte
Largura ,
6664 bytesExperimente online!
Imprime para depuração. Para imprimir em stdout, acrescente
ww
o final do código, que aparece e gera a parte superior da pilha.Explicação
Em Largura, cada letra se correlaciona com um número, com base em quão "larga" é, de acordo com esta tabela . Isso atribui a cada letra um número de 0 a 9. Em seguida, esses números são usados para realmente executar o código.
Em particular, uma letra que corresponde
7
a iniciará uma string literal. Ele lerá conjuntos de duas letras de uma só vez, até ler a letra original novamente. Cada conjunto de duas letras será convertido em seus números de largura, lidos como um número decimal entre 0 e 99, e o caractere igual a eles será seu índice na seguinte string:Por exemplo, o índice de
!
é 1, assim01
serão os números de largura corretos. Assim,if
,iI
,jt
, etc serão todos correlato a um literal de cadeia de!
.Nesse caso, traduzi os 31 caracteres da saída necessária para letras apropriadas, usando
Q
como aspas. A parte superior da pilha é impressa para depuração quando o programa termina.fonte
código de máquina x86 (32 bits), 256 bytes
Quando imprimo meu código no console da página de códigos 437, vejo o seguinte:
Ele contém alguns caracteres de espaço em branco; portanto, aqui está o mesmo código quando substituo todos os caracteres de tabulação por
→
e todos os caracteres de espaço não separável (com o código 255) por*
:Hexdump:
Algumas explicações sobre como funciona:
Instruções úteis são:
push imm8
,push imm16
epush imm32
, seguido porpop
gerar constantes. Isso também pode gerar zero (inah
) ao pressionar um byte (imm8
).and [ecx+32], ah
- assumindo ah = 0, isso define o byte como zero. Acontece que o comprimento da string de saída é 32, então o código preenche o buffer do início ao fim.or [ecx+32], edx
- assumindo que o byte de saída está definido como zero, isso copiaedx
(4 bytes) para a saída. Eu uso uma variante com emdx
vez deedx
perto do final do buffer, porque ele não deve gravar além do buffer de saída. A restrição no código torna impossível escrever bytes únicos dessa maneira!imul edx, [ecx+32], whatever
- esta é a principal idéia de embaralhar. Com entropia suficiente[ecx+32]
e qualquer número, ele pode gerar qualquer saída. Eu o uso para gerar 2 ou 3 bytes dos valores necessários. Alguma complicação é que, ao gravá-lo na saída, ele deve ser lógicoOR
com o que já estiver lá. Às vezes, isso tornava necessário zerar a memória mais uma vez.jmp
instrução é usada para retornar. Eu o escolhi porque sua codificação é0xff
, o que corresponde a um espaço ininterrupto na página de códigos 437. Um pouco exagerado nas regras, mas, caso contrário, acho que a tarefa é impossível ...Código fonte do assembly, junto com um programa C que o executa (usa a sintaxe do Visual Studio):
fonte
dec ecx
+and [ecx+32], ah
material pode ser tomada fora.0xff
viola "Sem pontuação ou caracteres não alfabéticos"?PostScript,
889874837835 bytesExperimente online!
Isso usa 32 cópias dos números inteiros
89 25 20 6
. Todos os códigos de caracteres da cadeia de destino podem ser obtidos com operações nesses números inteiros, em ordem de pilha: por exemplo, 'A' (ASCII 65) é 89 - (25 e (20 + 6)). Muitas quatro tuplas de números inteiros têm essa propriedade; este foi escolhido porque é particularmente fácil de gerar.O padrão é 1, então isso cria uma sequência de comprimento 1 (inicializada em
\0
).dup
não é uma cópia profunda: cria uma segunda referência para a mesma string. rrand empurra a semente aleatória, que assume como padrão 0. Stack is now["\0", "\0", 0]
.count
empurra o número de itens na pilha; portanto, calcula 3 ^ (3 * (5 * 6)) = 89.4 * 5 = 20, 5 * 5 = 25, 6 = 6. A pilha está agora
["\0", "\0", 0, 89, 25, 20, 6]
.Duplique a pilha inteira, cinco vezes. Assim, terminamos com 32 cópias da nossa pilha inicial de 7 elementos. Precisamos apenas de 31 cópias, pois a sequência de destino tem 31 caracteres, mas a cópia extra não dói.
Calcule um código dos quatro números inteiros, escreva-o no índice 0 da sequência e imprima a sequência.
Suprime o prompt padrão.
fonte
Ruby ,
420 354338 bytesExperimente online!
Em ordem crescente de jankiness:
Palavras que começam com uma letra maiúscula podem ser impressas definindo uma classe com esse nome e chamando
display
dentro do corpo da definição de classe.Outras palavras podem ser exibidas definindo métodos com esse nome, que retorna um símbolo, e convertendo-o em uma String para remover os dois pontos principais.
Outros caracteres podem ser exibidos chamando
putc
seu código ASCII. Podemos gerar os números apropriados reutilizando oString def
truque para obter uma string e, em seguida, obtendo a soma de seus bytes usando um módulo determinado por seu tamanho. Infelizmente, não temos como chamar métodos em um objeto além da definição de classe desse objeto, o que dificulta a transmissão de argumentos. Portanto, o hack final é redefinirString#inspect
, que é chamado implicitamente ao passar uma String para op
método, para que calcule e produza o caractere apropriado como efeito colateral, antes de gerar um erro para quep
não seja possível concluir a execução e imprimir um nova linha. Então, precisamos resgatar o erro no código principal.Edit: Jordan fez o byte contar muito menos, ahem, alto com algum controle de fluxo de controle inteligente, e eu cortei mais alguns bytes substituindo
raise
por uma chamada de método inexistente de uma letra, que gera um NameError.Edit 2: Note-se que, com
print String
extraído em um método, é mais barato usá-lo com uma definição de método do que usar o truque de definição de classe, uma vez que é permitido que os métodos sejam case case.fonte
sum size
fica a soma do módulo, mas todo o resto dá uma olhada!> <> ,
233122 bytesExperimente online!
Isso começou como um golf da resposta do mbomb , mas eu descobri uma mudança fundamental que economiza um grande número de bytes, por isso estou publicando como minha própria resposta.
A geração de caracteres não alfabéticos para a saída é feita pressionando repetidamente os valores para a pilha e usando
l
para empurrar o comprimento da pilha. No entanto, isso não precisa ser gerado imediatamente: usandop
, esse caractere pode ser colocado em qualquer célula cujas coordenadas estejam entre 10 e 15 inclusive, para serem recuperadas posteriormente comg
. Da mesma forma, os caracteres alfabéticos podem ser colocados no código-fonte inicial e lidos da seguinte forma: como o código de caracteres não alfabéticos mais alto na entrada é 46 (.
), isso significa que a pilha não precisa ser pressionada mais que os 62 necessários para armazenar todos os 31 caracteres da saída.Além disso, a
v
é colocado no código da coluna 7. Quando o ponteiro da instrução se aproxima e o atingev
, a sequênciago
é executada repetidamente para ler as coordenadas pressionadas e gerar os caracteres correspondentes. Eventualmente, a pilha fica vazia eg
finaliza o programa com um erro.Os primeiros 7 bytes de código são reutilizados conforme as 7 e 7 últimas coordenadas pressionadas. A colocação da
v
coluna 9 economizaria teoricamente mais dois bytes, mas teria forçado os caracteresAinsv
a um quadrado 2x2 no código, o que é impossível. Uma versão anterior usava a coluna 15, mas exigia uma linha extra no código-fonte e terminava seis bytes a mais.fonte
r
para mover o alinhamento para onde eu quiser. No entanto, jogar golfe nesse programa machuca um pouco o meu cérebro.CJam , 262 bytes
Experimente online! As novas linhas são mostradas aqui apenas para maior clareza; cada linha representa um caractere.
Uau, isso foi divertido. Restringir-nos a comandos alfabéticos apresenta alguns desafios interessantes:
{
e}
, não há praticamente nenhuma oportunidade para o fluxo de controle (excetof
, que eu não achei uma oportunidade de usar).\
,_
,;
, ou$
, não temos meios para manipulação de pilha.Isso significa que o objetivo principal será obter os pontos de código relevantes na pilha e convertê-los em caracteres com
c
.O problema é que também não temos os comandos aritméticos mais básicos, bem como literais inteiros. Isso é bom, pois o
m
namespace contém inúmeras operações matemáticas avançadas e há muitas variáveis predefinidas para números úteis.Acabei fazendo uso intenso de raízes quadradas (
mQ
emq
), da função exponencialme
e da conversão de base (b
), que também podem ser usadas para emular a multiplicação ([X 0] Yb
calcula X * Y). Além disso, às vezes é mais fácil construir o ponto de código em maiúsculas; nesse caso, podemos usarel
(converter em minúsculas) no caractere resultante.Ainda não estou satisfeito com alguns dos mais longos. Ah bem.
Explicação
Esta é uma explicação caractere por caractere da saída. Antes de começar, aqui estão algumas maneiras curtas de criar números:
T
,X
,Y
,Z
respectivamente.A
throughK
.Sci
(S
empurra uma string contendo um espaço,c
obtém o primeiro caractere dessa string ei
converte esse caractere em seu ponto de código).S
também é usado para espaços.GmQ
(raiz quadrada inteira de 16).AZbYb
(converta 10 na base 3, produzindo[1 0 1]
e converta a matriz de números resultante na base 2, produzindo 5).Ymei
(calcule exp (2) e converta em número inteiro).A
n
d
s
h
e
a
i
,
'
B
u
t
.
fonte
HYbYCtYbc
,HYbXAtYbc
eHYbXBtYbc
.Peixe morto ~ , 943 bytes
Experimente online!
Não são permitidos loops
:(
fonte
mal , 198 bytes
Experimente online!
Isso foi bem divertido.
fonte
Stax ,
133958479 bytesExecute e depure
fonte
MATL ,
187158 bytesExperimente online!
Versão mais legível: Experimente online! Tentativa manual de construção da string. Provavelmente há muito espaço para jogar golfe, cortando a corda em pedaços convenientes, usando
P
eh
para virar e construir uma corda. Espero que alguém aceite o desafio de me superar. O principal desafio é que você não pode usar+
ou-
, portanto, a aritmética básica geralmente não é possível.Luzes:
KQthpYq
: o 25º (KQthp
) primoYq
é 97, correspondendo à letraa
. A letras
(115) é gerada de maneira semelhante a partir do 113, o 30º número primo. É então amplamente reutilizado na área de transferênciaJ
.his
é encurtado armazenando oh
de antes na área de transferênciaJ
. Desde que armazenado anteriormentes
, construímoshis
ao contrário, para que ainda possamos recuperar os
uso recentey
e invertê-lo após o usoP
.h
paravle
)fonte
v
iria mexer com o queh
eu tinha anteriormente. Acho que eu deveria ter isso em vez de apenas assumir. Além disso, obrigado pelo aviso, a exclusão excessiva de zelo aconteceu. Estou curioso para ver se você pode fazer melhor do que isso ...U
significa^2
que poderia ter me poupado alguns bytes ...MATL , 118 bytes
Experimente online!
Versão mais legível (cada linha corresponde a um caractere, exceto operações de reorganização da pilha).
Explicação
O programa produz os pontos de código dos caracteres necessários, como números independentes. No final, todos esses números são concatenados em um vetor de coluna, remodelados como um vetor de linha e convertidos em caracteres. O resultado é exibido implicitamente.
Alguns dos truques usados:
0
é usado na maioria dos espaços, porque custa apenas um byte (O
).15
é usado (gerado comoKUq
), pois pode ser reutilizado adicionando-o a100
(chard
) para fornecer115
(s
). Em outra ocasião,5
é usado para o espaço (gerado comoKQ
), para que possa ser subtraído posteriormente de44
(,
) para fornecer39
('
).J
é usada para armazenar caracteres que serão repetidos: primeiros
e depois'
. Da mesma forma, a área de transferênciaH
armazena100
, o que é útil parad
e para gerar outros caracteres.Q
(adicionar1
),q
(subtrair1
),E
(multiplicar por2
) eU
(quadrado), juntamente com os literais predefinidos nas pranchetasI
(3
) eK
(4
).h
) e calculando sua soma (s
) ou diferenças consecutivas (d
).100
(d
) é gerado como4
em binário interpretado como um número decimal.110
(n
) é obtido de65
(A
) convertendo para string ('65'
: pontos de código[54 53]
), adicionando1
aos pontos de código ([55 54]
), somando-os e somando-os1
.w
), subida de bolhab
).fonte
O
vez deKWE
espaços. E você confirmou minha suspeita de que provavelmente é melhor sacrificar outra pranchetaH
.dc ,
240222209 bytesExperimente online!
Meu primeiro pensamento foi o mesmo que @seshoumara, basta colocar coisas suficientes na pilha para gerar todos os valores ASCII dos caracteres. Ocorreu-me que
+
, uma vez que-
, e*
são operadores de caracteres únicos, posso apenas recriá-los e ter a capacidade de usar aritmética! Certamente isso seria menor!E, não ficaria surpreso se soubesse jogar mais bytes, mas por enquanto ... essa abordagem complicada conseguiu amarrar a ingênua (ish).OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd
é a parte da abordagem semelhante à @ seshoumara, mas só chegamos a 46, o que é.
. Fazemos isso porque precisamos ir até 45,-
e também precisamos de um período em nossa string, portanto, avançar um pouco mais no período é (eu acho) mais barato. Ao longo do caminho, armazenamos alguns valores: 5, 32, 39 são úteis mais tarde. 5 para itens utilitários, 32 e 39 para seus valores ASCII. Originalmente, eu fazia de 1 a 5, mas isso era caro e conseguia simplesmente evitar o uso de 4; useZ
(digite um valor, pressione o número de dígitos que possui) em um número de três, dois ou um dígito para esses valores. Aos 42, 43 e 45, que convertê-los para strings (*
,+
e,-
respectivamente) e armazená-los como macros (B
,A
eC
respectivamente). Isso significa que, sem usar os caracteres*+-
, agora podemos usar esses operadores.A partir daqui, basicamente começamos a gerar os valores ASCII usando o poder da matemática em vez da simples acumulação, armazenando algumas das repetições ao longo do caminho. 100, 105 e 115 surgem o suficiente para que armazená-los (em registros ou outros) fizesse sentido. Originalmente, deixei a pilha cheia de 10s e usei para fazer 100s; acabou economizando bytes para preencher a pilha com 32 segundos e usá-los como espaços posteriormente. Uma versão um pouco mais legível da seção ASCII:
OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP
.Raspou 18 bytes: armazenando o número 5 como o radical de entrada em vez de um registro; o número 32 como precisão em vez de um registro; o número 115 como raiz de saída em vez de um registrador; em seguida, teve que mudar
KZ
paraIZ
gerar 1s eOZ
paraKZ
gerar 2s.Raspou mais 13 bytes inundando a pilha com 32s; definindo precisão para 39; usando manipulação de pilha para evitar armazenar 116; cortando alguns trabalhos duplos que acidentalmente deixei.
fonte
a
recriar esses operadores e depois chamá-los comx
. Isso mostra o comportamento dos dados é código do dc. Quando tiver tempo, aplicarei seu truque mais recente de armazenamento de dados em parâmetros, em vez de registradores. Você acha que poderíamos obter uma solução CC ainda mais curta, abusando da maneira como P trabalha para imprimir mais letras de cada vez, se tivermos sorte de inserir o grande número necessário usando apenas hexadecimal?P
16750 ou 0x416E. Se por acaso tivéssemos sorte e um dos substrings fosse composto exclusivamente pelos valores AF, isso poderia nos dar um atalho. Isso seria um pouco de sorte! Caso contrário, estaríamos inserindo números grandes de alguma forma, apresentando-os de alguma forma, ou adicionando e multiplicando muito por 256. O que parece ... mais robusto do que um monte deP
s.Japonês , 87 bytes
Tente
Explicação
A primeira linha gera
'
e atribui a variávelU
.A segunda linha atribui
2
à variávelV
.A terceira linha gera
.
e atribui a variávelW
.A última linha, então, constrói a string, um caractere de cada vez, no sentido inverso.
fonte
Qc dGaB
Vermelho , 272 bytes
Se as aspas duplas forem necessárias:
Vermelho , 344 bytes
Não funciona no TIO, mas funciona no intérprete vermelho.
Explicação:
As palavras são triviais - imprimo-as (imprima sem nova linha) como literais com
quote
. Vermelho tem uma palavra embutida para espaço -sp
, assim comocomma
edot
."
e'
mais interessante: Eu prin-los subtraindo um espaço deB
eG
, respectivamente, a partir de um literalB
eG
, convertendo-os primeiro a string commold
e depois caracteres (para uso subtração sobre eles) wtihto sp
( Red tem conversão de protótipo - converter o string para o tipo desp
, que é caractere).fonte
'
, então a solução de 272 bytes é a mesma.Quarto (gforth), 351
Pena que não consigo redefinir CHAR ou EMIT para palavras de uma letra, pois isso exigiria o uso de
:
e;
(por exemplo: C CHAR ;
) ou'
(por exemplo' CHAR ALIAS C
)De fato, se eu pudesse definir palavras, poderia fazer
: P CHAR EMIT ;
e depoisP x
imprimirx
. Ah bem.Não consigo nem criar um buffer, gravar essa sequência de caracteres para lá e usá-la como entrada, já que gravar na memória requer o uso
!
ouC!
fonte
AlphaBeta ,
180 177 175163 bytesExperimente online!
WIP
fonte
Pepe , 266 bytes
Eu mantenho a pilha r vazia e tenho 's' na pilha R
Isso não está no TIO, mas você pode tentar aqui
fonte
dc , 240 bytes
A idéia principal é aumentar continuamente a pilha em 1 (
K
), salvando (sX
) o tamanho da pilha (z
) em registros personalizados quando corresponder a cada código ASCII exclusivo. Printing (P
) é feito por toda parte.Experimente online!
Fiz alguma otimização, como não salvar uma letra se não for usada depois disso, como duplicar (
d
) uma letra, por exemplo, t, na pilha para salvar um byte, já que recall (lX
) tem 2 bytes.fonte
80186+ código da máquina, formato .com do MS-DOS,
822787 bytesApenas tabulações e espaços são usados além das letras. Dado que a maioria dos códigos de operação no intervalo permitido são certos incrementos, decrementos, pushes, pops e ANDs e ORs indiretos do registro, além do IMUL, utilizo o fato de que o registrador de pilha se envolve quando atinge o final do segmento para modificar o código ao contrário! A montagem 80186+ é necessária porque estou pressionando valores imediatos.
Origem anotada (formato TASM):
fonte
Befunge-98 (FBBI) ,
125124121 bytesExperimente online! Saídas para um arquivo chamado
\n
(uma única nova linha). Obrigado a Jo King por seu roteiro.A saída inclui 10 novas linhas finais.
Para apenas uma nova linha à direita, +1 byte , alterando a seguinte linha:
Experimente online!
Explicação:
O ponteiro de instruções se move da seguinte maneira:
O programa coloca os caracteres não alfabéticos em posição, antes de enviar essa linha para um arquivo.
O Befunge-98 inclui instruções
a
...f
, que enviam o valor hexadecimal correspondente para a pilha. Para gerar outros números, ele passa esses valores paray
("Get SysInfo") como argumentos para obter:Colocando a maior parte do código em y = 23,
ayy
pode ser usado para acesso repetido ao tamanho da pilha, que é usada para gerar códigos de caracteres.fonte
Pitão , 210 bytes
Experimente online!
Encontrei alguns números que poderiam ser expressos usando apenas letras (como
T
= 10,Z
= 0,lG
= comprimento (alfabeto) = 26,Cd
= código (espaço) = 32) e algumas funções que poderiam ser executadas usando apenas letras (comot
= decremento,h
= incremento,hF
= aplicação repetida de incremento = adição) e, em seguida, executei uma pesquisa de força bruta para encontrar as combinações mais curtas dessas funções e números que resultaram em cada uma das letras de que eu precisava.fonte
Código de montagem x86 de 16 bits, 665 bytes
(o binário é alfabético, não a fonte)De alguma forma, esqueci a regra que permite espaços em branco. Certamente o código pode ser jogado como resultado.
Bytecode:
Fonte:
Funciona assim:
move o ponteiro da pilha para o final do código, via POP AX (não pode POP SP porque não é alfabético);
constrói a instrução para despachar uma chamada do DOS (algoritmicamente porque não é alfabética);
constrói os caracteres não alfabéticos;
coloca a string na pilha;
coloca a instrução de despacho na pilha no final exato do código, para que a execução flua diretamente para essa instrução;
constrói a instrução para imprimir uma string;
exibe a string e eles imediatamente travam. : - / (Uma saída normal exigiria mais código)
fonte
Japonês , 74 bytes
Tente
fonte
05AB1E ,
145121109 bytesExperimente online!
fonte
80186 código de máquina + DOS, 91 bytes
Versão em texto:
Versão em texto, com tabulações (código 9) substituídas por
9
e espaços (código 32) substituídos por*
:Hexdump:
O código da máquina aparece em um arquivo com extensão
.com
. Quando o executo, ele imprime a mensagem necessária e, em seguida, trava (executando dados aleatórios).Explicação de alto nível sobre o que faz:
,'.$
)int 21
instrução, que imprime a mensagemCódigo de montagem (pode ser compilado com
tasm
):Ele usa a
popa
instrução para exibir todos os registros, porque o regularpop
não pode preencher todos os registros necessários (por exemplo,pop di
é um código de operação proibido).Os endereços de bytes a serem corrigidos estão no intervalo 0x100 ... 0x160. Por sorte, eles podem ser representados como uma soma de 3 bytes com valores permitidos:
bp
si
oudi
A correção de bytes na mensagem funciona de maneira lógica
OR
em 0x20 (caractere de espaço) e uma pequena constante (4, 7, 12 ou 14). A pequena constante é obtida inicializandocx
edx
até 9 (caractere de tabulação) e fazendoINC
ouDEC
conforme necessário.O patch do código usa a
IMUL
instrução Encontrei as constantes de 16 bits necessárias para multiplicar usando a pesquisa de força bruta.Finalmente, o endereço da mensagem (0x13b) é obtido por multiplicação. Para economizar espaço, peguei uma das constantes de uma das instruções, que contém um valor imediato
0x96d
. Aqui, a9
peça escolhe uma função de impressão do DOS e a6d
peça é um parâmetro livre. Acontece que6d
é a única possibilidade que pode dar 0x13b após a multiplicação.Desmontagem da parte do código:
Fato engraçado: Normalmente, eu usaria em
offset message
vez do codificado13bh
, mas nesse caso, porque no momento da análise de seu endereço é desconhecido, o tasm gera deslocamento imediato de 16 bits, desperdiçando 1 byte de código:fonte