Este desafio é criado em comemoração à minha primeira língua esotérica, Backhand !
O backhand é uma linguagem unidimensional com um fluxo de ponteiro não linear. O ponteiro move três etapas por vez, executando apenas a terceira instrução.
O programa 1..1..+..O..@
adicionará 1 + 1 e a saída 2 antes de terminar. As instruções intermediárias são ignoradas, portanto, 1<>1()+{}O[]@
é exatamente o mesmo programa.
Quando o ponteiro está prestes a sair do final da fita, ele inverte a direção e avança para o outro lado, assim [email protected]+.
como o mesmo programa. Note que conta apenas a instrução final uma vez. Isso nos permite comprimir a maioria dos programas lineares, como1O+1@
Seu desafio aqui é escrever um programa ou função que use uma string e emitir as instruções que seriam executadas se o programa fosse interpretado como Backhand (você não precisa manipular nenhuma instrução real de Backhand). Você deve produzir apenas até que o ponteiro apareça no último caractere da string (nesse ponto a execução normalmente retornaria).
Mas espere , isso não é tudo! Quando o seu próprio programa é interpretado dessa maneira, o código resultante deve gerar um dos itens abaixo:
(Mostly) works
Turing complete
'Recreational'
(as aspas podem ser'
ou"
, mas não as duas)Perfectly okay
Only a few bugs
Por exemplo, se o seu código-fonte for code 2 backhand
, o programa ce cankb od2ahd
deve exibir uma dessas frases.
Casos de teste:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
E um programa de referência escrito, é claro, Backhand ( isso pode ser um pouco complicado) Ok, acho que o corrigi).
Regras.
- As brechas padrão são proibidas
- A entrada do primeiro programa conterá apenas ASCII e novas linhas imprimíveis (ou seja, bytes
0x20
-0x7E
além de 0x0A) - Você pode escolher se o seu segundo programa é convertido do primeiro por bytes ou por caracteres UTF-8.
- Segundo programa:
- O case não importa, portanto, sua saída pode ser
pErFectLy OKay
se você desejar. - Qualquer quantidade de espaço em branco à direita / à esquerda (nova linha, guias, espaços) também é aceitável.
- O segundo programa deve ter o mesmo idioma que o primeiro, embora não necessariamente o mesmo formato (programa / função)
- É um prazer incluir sugestões dos comentários sobre frases extras (desde que não sejam muito curtas)
- O case não importa, portanto, sua saída pode ser
- Como se trata de código-golfe , seu objetivo é obter a resposta mais curta para o seu idioma!
- Em duas semanas, concederei uma recompensa de 200 à resposta mais curta do Backhand.
fonte
"---!---!"
(ou qualquer sequência em que o último caractere apareça mais de uma vez) #Respostas:
R , 187 bytes
Experimente online!
O espaço único no final é necessário para que
\n
nunca seja impresso quando o programa é aplicado a si próprio.Explicação
Parte 1:
Ungolfed:
Parte 2:
A função produz isso quando atua em todo o programa:
fonte
Python 2 ,
1631301271211159996 bytesExperimente online!
Saídas:
fonte
Perl 6 ,
10186 bytesUau, -25 bytes graças ao nwellnhof, melhorando drasticamente o primeiro programa
Experimente online!
Espero que mais pessoas aproveitem a recuperação assim. O programa Backhanded é
Que comenta apenas
{"(Mostly) works"}
.fonte
05AB1E ,
43403837 bytes-2 bytes (40 → 38) graças a @Emigna .
Experimente online . (PS: alterne o idioma de 05AB1E (herdado) para 05AB1E para caso de teste
0123456789
. A versão herdada é mais rápida, mas mostra resultados incorretos para entradas numéricas com zeros à esquerda.)O programa 'backhanded' se tornará:
Qual será a saída
perfectly okay
em minúsculas completa.Experimente online.
Programa base de explicação:
Programa de explicações 'backhanded':
Passo a passo, acontece o seguinte:
„ÃеÝ
: STACK torna-se["perfectly okay"]
[
: Iniciar loop infinitoN©
: STACK torna-se["perfectly okay", 0]
I
: STACK permanece["perfectly okay", 0]
porque não há entrada#
: STACK se torna["perfectly okay"]
e o loop continuaN
: STACK torna-se["perfectly okay", 0]
#
: STACK se torna["perfectly okay"]
e o loop continuaN©
: STACK torna-se["perfectly okay", 1]
I
: STACK permanece["perfectly okay", 1]
porque não há entrada#
: STACK se torna["perfectly okay"]
e o loop é interrompido devido a1
(verdade)perfectly okay
Veja as etapas aqui com o depurador no TIO ativado.
Veja esta dica 05AB1E meu (seção Como usar o dicionário? ) Para entender por que
„€€Ã€„Ѐ€µ'€Ý
sãothe pointed
,dm one
e,been
e„ÃеÝ
éperfectly okay
.Versão antiga de 38 bytes:
Experimente online . (PS: alterne o idioma de 05AB1E (herdado) para 05AB1E para casos de teste
0123456789
e@
. A versão herdada é mais rápida, mas mostra resultados incorretos para entradas de número com zeros à esquerda ou entradas de caractere único.)O programa 'backhanded' se tornará:
(Onde
q
sai do programa e faz todo o resto não funcionar.)Experimente online.
fonte
/
deve ser `\`?N>3*©
vez deXU
save 2. Também acho que deve haver alguma maneira de imprimir todo o loop, o que economiza ainda mais bytes./
deveria ter sido\
.. E obrigado pelo -2. Eu realmente tenho a sensação de que pode ser jogado mais. Parece demasiado longo para a funcionalidade básica da impressão de cada 3º valor, incluindo o retorno.[ûDN3*©è?®IgD#<ÖNĀ*#
sem o if-else de antemão, que é 2 bytes mais curto que o if-else com loop. Infelizmente, ainda precisamos doq
programa backhanded, por isso também serão 38 bytes . Mas tenho a sensação de que quebra definitivamente pode ser melhorado de alguma forma manter em insumos mente single-char, índice 0, e divisibilidade pelo comprimento-1, ao mesmo tempo ..Python 2 , 130 bytes
Experimente online!
fonte
JavaScript (ES6), 130 bytes
Tentativa precoce. Não é muito satisfatório.
Experimente online!
Quando o código é processado por si só, os seguintes caracteres são isolados:
que dá:
fonte
Geléia , 34 bytes
Um programa completo ou link monádico que aceita uma lista de caracteres que imprime ou produz (respectivamente).
Experimente online! Ou veja a suíte de testes .
O código analisado com backhand é então:
Um programa completo ou link niládico imprimindo ou produzindo (respectivamente) Turing completo .
Quão?
o código analisado em retrocesso é então:
fonte
Encantos Rúnicos , 294 bytes
Experimente online!
Versão não compactada (e quase legível):
Experimente Online!
Isso é o mais perto que posso chegar.
A compressão adicional exigiria descobrir uma maneira de lidar com os vários pontos de troca de loop sem que eles colidissem com outras coisas. A primeira linha (que é a única parte que precisa ser passada como entrada para si mesma) é requerida para permanecer separada: a sequência inteira não pode caber na segunda linha sem causar problemas (
_
para os espaços necessários):Isso
?
não pode ser movido para longe do!
qual ele próprio não pode ser movido para fora\
e nenhuma das mensagens permitidas permite que nenhum desses três caracteres esteja nessa posição.A alternativa seria usar o redirecionamento de fluxo, mas isso leva a um problema na linha inferior:
Como temos que evitar a troca de loop no programa principal.
Problemas conhecidos:
abcdefghijklmnopqrstuvwxyz
mas não a totalidade de sua própria fonte). E há um limite, independentemente de quantas mesclagens ocorrerem. Pode lidar com até 58 bytes de entrada como está (além disso, aumentar o número de IPs exige descobrir como fazer a mesclagem sem usar mais espaço). Pode caber mais duas entradas IP na linha de retorno de loop (à direita daU
linha iniciando\y<<
na versão descompactada ou uma esquerda na linha acima day<<
na versão compactada) aumentando o comprimento máximo de entrada para 78.1\ \ 1\ \ +\ \ O\ \ @
). Essa é uma limitação da análise de entrada do idioma.0
s (como quando se transforma em um número na pilha, o valor0
é perdido). Mais uma vez, limitação da análise de entrada do idioma.Como funciona
Entrada:
Loop principal (qualquer coisa que apareça na pilha é precedida por um dup):
@
. Verdadeiro: finalize. (Comando Terminar executado)Loop secundário:
fonte