Código original:
[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"
Entrada:
__=; (( __++, __-- ));
(( ___ = __, ___++));
(( ____ = ___, ____++));
(( _____ = ____, _____++));
(( ______ = _____, ______++));
(( _______ = ______, _______++));
(( ________ = _______, ________++));
(( _________ = ________, _________++));
${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'
Explicação:
Isso codifica "eco Olá, mundo!" como seqüências de escape octais (\ xxx).
Exceto que você também não pode usar números, então a primeira parte cria variáveis para os números de 0 a 7. Você pode usá-los para criar uma sequência com sequências octais que serão avaliadas para fornecer o comando real.
Mas eval
também é alfanumérico. Então, ao invés disso, isso canaliza essa string como entrada para outra instância de bash
. $0
contém o nome do comando usado para chamar o Bash, que normalmente é apenas bash
(ou -bash
para um shell de login) se você o estiver executando normalmente (por meio do TIO ou colando-o em um terminal). (Isso significa que, se você tentar executar isso colando-o em um script, as coisas darão terrivelmente errado ao tentar se bifurcar várias vezes.)
Mas de qualquer maneira, você não pode dizer $0
diretamente. Em vez disso, $__
contém o nome de $0
("0") e você pode usar a expansão indireta para acessá-lo ( ${!__}
refere-se ao conteúdo de $0
).
E isso, finalmente, fornece todas as peças necessárias.
05AB1E , Adnan
Experimente online!
Quão?
fonte
totalmente humano , Python 2
Uma solução é
fonte
Pyth : Sr. Xcoder
G
é o built-in para o alfabeto em minúsculas. O código verifica a igualdade em relação a isso.fonte
Geléia: EriktheOutgolfer
Gelatina , 11 bytes
Experimente online!
Explicação
O código original pode ser explicado da seguinte forma:
Então, basta pegar "Olá, mundo!" e obtenha pontos de código, ajuste-os ao quadrado, jogue de volta aos pontos de código, gire para a direita 5 vezes e, em seguida, aplique o quadrado e achatar o resultado.
fonte
Oitava por Stewie Griffin
Não tenho certeza se esta é a solução correta (no TIO ele imprime o
\00
personagem), mas no meuoctave-cli
shell fica assim:Também no desafio original, ele diz que imprima nada (ou o caractere nulo) ; portanto, se nada for o mesmo,
\00
então tudo ficará bem.Experimente online!
fonte
0
por a10
).Hello, World!
e uma nova linha." é uma citação exata do desafio. E, de fato, isso torna a resposta trivial.Python 3 por rexroni
Evite erros ao sair mais cedo.
Experimente online!
fonte
JavaScript (ES6) Por Ephellon Dantzler
{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}
Experimente online!
Isso foi bem fácil.
Eu notei que nenhuma entrada de string não seria possível produzir,
Hello, World!
porque a coisa toda dentroString.fromCharCode
retornará apenas múltiplos de 4 e!
tem um código de caractere 33. Então, claramente, precisamos apenas hackear o programa inteiro. Hackear embutidos em JavaScript é trivial se não tentarmos impedi-los (e mesmo se o fizermos, geralmente existem muitas soluções alternativas ...).fonte
JavaScript (ES6), Voile
Proxy simples que retorna o caractere desejado apenas a cada 3 vezes.
Experimente online!
fonte
Ruby, de Histocrat
A entrada mágica é:
1767707618171221 30191World!
Experimente online.
Explicação:
1767707618171221
é primo e, escrito na base 36, é"hello"
. Quando em maiúscula, isso produz"Hello"
, que é impresso usando$><<
$><<", #$'"if/30191/
procura o número30191
na entrada e grava em stdout uma string composta por vírgula, espaço e o que estiver na entrada após a30191
(usando o$POSTMATCH
, que é referido aqui por sua variante curta$'
).fonte
Lua 5.1 por tehtmi
Passe isso como o primeiro argumento:
Supondo que o código original esteja em um arquivo
tehtmi.lua
, execute (no bash ou em um shell semelhante):Também funciona no Lua 5.3, que é o que o TIO usa. Por que você não tenta online ? Eu não testei em uma implementação que usa o núcleo "5.1 da Lua da PUC-Rio" (porque realmente não consigo encontrar nenhuma informação), mas minha solução provavelmente também funciona lá.
Quão?
Ele executa o primeiro argumento como código, mas apenas se contiver menos de 5 caracteres em minúsculas.
O truque é correr
print("Hello, World!")
. Outra maneira de executar isso é usando_G["print"]("Hello, World!")
, que usa apenas strings.Mas não podemos usar a string diretamente devido à restrição de contagem em minúsculas; no entanto, você pode executar
("").char
para obter a funçãostring.char
, que pode converter de uma série de bytes em uma string. Eu o atribuai a uma variável maiúscula (para não atingirmos o limite), para que possamos usá-la para construirprint
asHello, World!
strings e as strings que podem ser usadas como acima.fonte
next
vez dechar
que não funciona no Lua 5.3 devido à randomização da ordem de iteração.JavaScript (ES6) por Voile
A entrada deve ser uma sequência que contenha isso:
Experimente usando o seguinte:
Se você não se importa com o requisito de nova linha à direita para a saída, substitua as últimas 6 linhas por:
Como eu fiz isso
As restrições na entrada são que é uma sequência, cada linha tem dois bytes de comprimento ou menos e que o comprimento total é de 80 bytes ou menos. Minha primeira tentativa depois de entender que foi corretamente:
Nota: os
\
s devem ignorar as novas linhas na string na entrada. Isso é incrivelmente crucial para a resposta, e não acredito que me deparei com ela por acidente. (Eu estava familiarizado com isso antes, mas esqueci)Mas isso não funcionou, pois
=>
o argumento deve estar na mesma linha. Felizmente, tive a ideia de agrupar algo semelhante em uma string e colocar uma avaliação em minha opinião para reduzi-la a uma linha, resultando em minha resposta final. Após a avaliação na entrada, o seguinte é gerado como uma sequência (que é avaliada para uma função e depois executada):Foi realmente difícil de entender, mas eu consegui no final.
Além disso, o primeiro crack de todos os tempos!
fonte
Cubically por MD XF
Eu imagino que isso seja sempre perigoso, mas acho que tenho uma rachadura, enquanto estou correto, pois há um erro no intérprete (que acabei de compilar).
Minha entrada
A saída é
Hello, World!\n\n\n\n\n\n\n\n\n\n.....
com novas linhas intermináveis.Mas notei a última seção do código:
define o bloco de notas para
0x0A
(nova linha) de forma assustadora, lê a entrada na face 7 (a face de entrada) e imprime as 6 faces (face do bloco de notas) repetidamente até que a face 7 seja zero. Se você definir a face 7 como zero, deverá receber apenas uma nova linha. No entanto, recebi novas linhas infinitas e minha 13ª entrada foi zero, e posso verificar se a face 7 é sempre zero inserindo um "número de impressão da face 7" no loop:depois imprime
\n0
pares intermináveis .Eu estou olhando as especificações na página do github cubicamente e esse comportamento se parece muito com um bug. Alterar o último caractere do programa original de a
7
para um0
resulta no comportamento esperado. O intérprete TIO exibe o mesmo comportamento incorreto.fonte
CJam , Erik , o Outgolfer
Experimente online!
Quão?
fonte
C # (.NET Core) , Grzegorz Puławski
A solução que encontrei faz uso muito substancial de caracteres não imprimíveis, portanto, tentar colá-lo aqui não funcionou bem. Os valores de bytes para a entrada são:
Ou a versão da sequência está disponível no campo de entrada do link TIO.
Experimente online!
O programa original pegaria os caracteres distintos na entrada, depois reverteria a entrada e multiplicaria os elementos das duas listas. Assim, criei uma string com 26 caracteres, onde os 13 primeiros caracteres eram distintos, todos os 13 últimos também apareceram nos 13 primeiros, e cada par de índices
[i, 26-i]
multiplicado pelo valor de byte do i-ésimo caractereHello, World!
.fonte
Ly , LyricLy
Experimente aqui (embora a página não renderize a nova linha).
n
recebe entrada, tenta dividir em espaços e converter em entradas, essas são colocadas na pilha.o
imprime pontos ordinais e8+
faz o que alguém poderia pensar. Portanto, a entrada precisa ser 8 a menos que os pontos de código na ordem inversa, dividida por espaços.fonte
2
que funcionaria - isso é apenas a página herokuapp não a processando?C (gcc), de Felix Palmen
Código original:
Argumentos:
Experimente online!
Explicação:
W(c)
está calculando o endereço de uma string da lista de argumentos a ser impressa. Começa com o endereço do césimo argumento (O(c)
), que é o 42º argumento neste caso, e subtrai o primeiro caractere do segundo argumento (**O(2)
) como um deslocamento inteiro, e depois adicionax
, que é o número de argumentos.W(c)
usa o segundo argumento, para que você saiba que precisa haver pelo menos três deles (0, 1, 2). Então "Olá, mundo!" pode ir no primeiro argumento e, para abordá-lo, você precisa de um caractere cujo valor ASCII se encaixe na equação "42-x + 3 = 1". Isso passa a ser ",".fonte
JavaScript: ThePirateBay
Eu substituo os métodos
valueOf()
etoString()
dos objetos analisados para que a coerção falhe com aTypeError
.fonte
6502 Assembly (C64) - Felix Palmen
A explicação está um pouco envolvida.
O código primeiro verifica uma vírgula (necessidade de sintaxe) e, em seguida, lê dois argumentos, o primeiro dos quais é uma PALAVRA, armazenado little-endian nos locais de memória 0014 e 0015, o último dos quais é armazenado no registro X.
Isso é bastante inteligente, usando nossa entrada para reescrever o programa. Eventualmente, reescreve o contador para o loop de saída no final do programa.
Aí vem a parte desonesta:
no C64, o d018 é um byte muito importante. Ele armazena os pontos de referência para itens que envolvem a saída da tela. Veja aqui para mais informações. Se isso der um valor errado, ele travará o seu C64. Para imprimir as letras maiúsculas e minúsculas necessárias, é necessário US $ 17.
Agora começamos nosso loop de saída:
Essa constante é o que foi escrito antes. Determina claramente quanto tempo o loop é executado. Já é o valor certo, mas precisamos manter 0e lá novamente.
O restante é apenas a informação que precisamos imprimir, começando no endereço de memória c025.
Então, é só seguir a matemática a partir daí.
fonte
$FF
lá, mas depois decidi deixá-la.Código 6502 da máquina (C64) - Felix Palmen
A resposta correta é
O código é bastante complicado, envolvendo muita auto-modificação. Então, em vez de fazer a engenharia totalmente reversa, você pode usá-lo para se quebrar.
Aqui está uma desmontagem do código um pouco mais útil, para ajudar a entender o que aconteceu. A sintaxe é para o KickAssembler.
Rotulá-lo dessa forma foi suficiente para eu ver que o código XORs um monte de constantes que estão ocultas para imprimir o que precisamos. Como o XOR é reversível, se você inserir a saída desejada, ele informará qual é a chave.
Então eu mudei a última linha
para imprimir a última entrada necessária em vez de travar em uma entrada errada.
E é isso!
Se houver algum interesse, decifrarei mais o código.
fonte
vice
. Mas seja como for, é a solução correta.drops A in mystery+1, over the constant
" <- esse é realmente omystery+4
seu rótulo. As ofensas estão em bytes :) e no FWIW, a auto-modificação é bastante comum mesmo no código 6502 sério , desde que o código seja executado a partir da RAM.Explode , Passo Galinha
Experimente online!
fonte
C (tcc) por Joshua
Experimente online!
fonte
MATL by Luis Mendo
Experimente online!
fonte
Geléia por Jonathan Allan
Código original:
Experimente online!
Entrada:
Explicação:
fonte
C (GCC no TIO) por MD XF
Experimente online!
Quão?
Ele tenta imprimir o segundo argumento como uma string, que é um ponteiro que podemos determinar na entrada. Acontece que no local a memória
4195875
inicia a"Hello, World!\n"
string.O número foi determinado adicionando
print("%p", "Hello, World!");
antes deprintf
, convertendo o número hexadecimal em decimal e testando-o no TIO original. No entanto, ele me mostrou aprintf
string de formato. Ao experimentar alguns números, descobri que a string está localizada antes da string de formato.Portanto, na memória, ficaria assim (como uma string C):
Isso também significa que qualquer atualização no compilador pode interromper a solução.
fonte
JavaScript (Node.js) por Voile
['Hello, World!','','','','','','','','','','','','']
Experimente online!
fonte
Röda por fergusq
Experimente online!
Explicação em breve ...
fonte
JavaScript (ES6), Voile
Experimente online!
fonte
PHP por LP154
Experimente online!
(O TIO não tem a classe PDO definida, portanto, a demonstração acima usa um teclado de código que faz)
Outra solução:
Experimente online!
fonte
JavaScript (ES6), Voile
Dado o limite de 81 caracteres, essa provavelmente não é a solução pretendida
Experimente online!
fonte