Essa tarefa é bastante simples e utiliza três caracteres "operadores" distintos. Sua tarefa é, dada uma simples seqüência de letras, executar a seguinte tarefa para codificá-lo usando <
, >
, *
. Você pode optar por usar letras maiúsculas ou minúsculas, não precisa lidar com as duas.
Explicação de cifra
A cifra é simples, você está usando operações de incremento e decremento para passar da letra 1 até a letra final, *
sendo sua função "enviar". O operador para "incremento" será >
e "decremento" será <
.
Um exemplo usando a palavra adbc
:
- Comece com a primeira letra da palavra, imprima essa letra.
a
- Em seguida, use
>
e<
(como brainfuck) para "navegar" a letra atual para a próxima.a>
resultaria em 'aumento'a
de 1 para a letrab
.a<
resultaria emz
que você está abaixando a letra (ela envolve, você sempre deve escolher a direção que resulta no menor número de operações). - Depois de produzir a combinação minimalizada correta de
<
e>
produzir a*
para indicar que chegamos à próxima letra.
As etapas para codificar adbc
seriam:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Exemplos
As etapas para codificar aza
seriam:
a # a
a<* # az
a<*>* # aza
Mais exemplos:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Regras
- Estamos codificando, não decodificando, então não estrague tudo.
- Você pode assumir que a mensagem conterá letras
[A-Z]
ou[a-z]
sua escolha. - Você pode usar qualquer caractere que não seja da letra / numérico / reservado para indicar
*
(EG$
). - Você deve ter o final
*
, não está implícito nas repetições. - Você pode assumir que não há cadeias vazias, mas um único caractere é possível.
- Se for equidistante para a próxima letra, você poderá escolher uma direção.
- Isso é código-golfe , vitórias mais baixas na contagem de bytes.
Por favor, explique sua resposta, pois ajuda outras pessoas a aprender dessa maneira.
abcdefghijklmnopqrstuvwxyz
e não é sua própria entrada?zl
deveria usar>
.alphabet
é na minha opiniãoa>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
ezl
deve serz>>>>>>>>>>>>*
e parabanana
deveria existe uma segunda soluçãob<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. A @jorg boas capturas, corrigida todas elas, foi um esforço manual.Respostas:
Geléia , 17 bytes
Usa um caractere de espaço no lugar de
*
(um espaço⁶
, ou uma nova linha⁷
, salva um byte”*
).Funciona com qualquer maiúscula somente ou entrada somente minúsculas.
Experimente online! ou consulte uma suíte de testes (onde esses espaços são substituídos posteriormente
*
para facilitar a leitura).Quão?
fonte
Código de máquina 8086,
70 6867 bytesComo funciona:
fonte
Python 3 , 87 bytes
Experimente online!
Funciona com letras minúsculas ou maiúsculas.
O programa cria a sequência de saída
r
conforme itera sobre os caracteres na sequência de entrada. Ele armazena o caractere anterior comop
e calcula a operação de incremento para passarp
para o novo caracterec
.O intervalo entre os caracteres é
ord(c)-ord(p)
e(ord(c)-ord(p)-13)%26-13
leva o módulo 26 para o intervalo[-13..12]
. Um resultado negativo significa que é mais curto renunciar e um resultado positivo significa intensificar. Isso precisa ser convertido em uma sequência de caracteres>
ou<
dependendo do sinal. Em vez de usarabs
ou uma condição, aproveitamos a multiplicação de strings do Python,s*n
fornecendo a string vazia quandon
negativa. Na expressão'<'*-d+'>'*d
, a parte assinada incorretamente não contribui.O estado inicial é tratado dividindo a entrada em seu primeiro caractere e o restante com a descompactação do Python 3
r,*s=input()
. O caractere inicial é usado para começar a criar a string, bem como o caractere "anterior" inicial.Obrigado a ovs por sugerir a mudança para o Python 3 para descompactar.
fonte
Python 3 ,
11093 bytesExperimente online!
fonte
JavaScript (ES6),
118109107 bytesA sequência de entrada não diferencia maiúsculas de minúsculas.
Como funciona
Ao contrário do Python, o operador do módulo JS retorna um número com o mesmo sinal que o dividendo, em vez do divisor. Além disso, o
repeat()
método JS gera um erro quando recebe um número negativo, em vez de retornar uma sequência vazia (e é significativamente mais longa do que uma simples*
).Esses são comportamentos bastante desfavoráveis para esse desafio. Portanto, é melhor identificarmos em que caso exato estamos, em vez de confiar nos truques de matemática. (O que não significa que esses truques não existam, mas que eu não os encontrei.)
Abaixo está uma tabela que descreve os 4 casos possíveis, onde
d
está a distância assinada entre o caractere atual e o anterior:Casos de teste
Mostrar snippet de código
fonte
PHP, 127 bytes
Casos de teste
PHP, 137 bytes
Casos de teste
fonte
JavaScript (ES6),
111103 bytesOriginalmente versão que teve 111 bytes antes de eu adaptado @ truque de configuração de Arnauld
n
enquanto computaçãop
, eu acho que provavelmente há um outro truque usandos
em vez den
mas está ficando tarde, então eu não vou incomodar .:fonte
Haskell (lambdabot),
161153 bytesExperimente online!
Explicação:
fonte
EXCEL VBA 130 bytes
Execute-o na janela Imediata do Excel VBA.
Explicação:
Simples para loop que, com a função String, repita o número de vezes ">" ou "<" n em que n é a diferença ascii entre a cadeia de caracteres ie1 + 1.
fonte
Java 7-, 232 bytes
Praticamente a solução trivial. Ungolfed e comentou:
fonte
C, 170 bytes
Live detalhado
fonte
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 bytesEu segui uma rota diferente para as outras soluções JS, mas não funcionou muito bem - eis o que tenho até agora:
Original, 131 bytes
Mostrar snippet de código
fonte
([x,...s])=>x+s.map(...)
salva 12 bytes. Observe que você também deve anexar um caractere de impressão ao final. Sugiro usar um número, que custará apenas 2 bytes em`1`+1
vez de`*`
.join
resultado resultaria em uma saída inválida para entradas de letra única. No entanto, mover o caractere de impressão dentro domap
método custa apenas 1 byte.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
para 111 bytesreduce
solução, mas isso acabou sendo 115 bytes.C ++,
210190 bytesMinha primeira tentativa no golfe!
k armazena qual de <,> ou * imprimir. No início, ele simplesmente imprime o primeiro elemento da matriz e executa um loop para um do primeiro ao último elemento da matriz. j armazena o elemento anterior e, comparando se j mais perto de * a, <ou> defina k como <,> respectivamente e, em seguida, imprima k, execute esse loop até que j se torne igual a p. Depois de cada final do segundo loop, imprima *.
fonte
*p!=0
pode ser substituído por*p
. Tenho certeza de que o espaçochar *a
também é desnecessário. Você também precisará#include <iostream>
eusing namespace std;
(embora eu ache que pode ser mais barato adicionar apenasstd::
) fazer desta uma resposta completa.std::
ouusing namespace std;
Você provavelmente também precisará#include <iostream>
na sua contagem de bytes.05AB1E , 17 bytes
Experimente online!
Explicação
Usos
>
,<
e<space>
para denotar incremento , decremento , enviarfonte
Haskell ,
167168126 bytesAgora, usando a solução aritmética do xnor. Ligue com
e str
ondestr :: String
está a sequência a ser codificada.fonte
Haskell , 109 bytes
Experimente online! Usa a abordagem do xnor . Ligue com
f "somestring"
.fonte