Definiremos o ASCII Odd / Even Cipher através do pseudocódigo abaixo:
Define 'neighbor' as the characters adjacent to the current letter in the string
If the one of the neighbors is out of bounds of the string, treat it as \0 or null
Take an input string
For each letter in the string, do
If the 0-based index of the current letter is even, then
Use the binary-or of the ASCII codes of both its neighbors
Else
If the ASCII code of the current letter is odd, then
Use the binary-or of itself plus the left neighbor
Else
Use the binary-or of itself plus the right neighbor
In all cases,
Convert the result back to ASCII and return it
If this would result in a code point 127 or greater to be converted, then
Instead return a space
Join the results of the For loop back into one string and output it
Por exemplo, para entrada Hello
, a saída é emmol
, desde
- As
H
voltas para as\0 | 'e'
quais ée
- As
e
voltas para'e' | 'l'
, ou101 | 108
, que é109
oum
- O primeiro
l
também se volta para101 | 108
oum
- A segunda
l
volta para108 | 111
, que é111
ouo
- As
o
voltas para108 | \0
, oul
Entrada
- Uma frase composta apenas por caracteres ASCII imprimíveis, em qualquer formato adequado .
- A sentença pode ter períodos, espaços e outras pontuações, mas sempre terá apenas uma linha.
- A frase terá pelo menos três caracteres.
Resultado
- A cifra resultante, com base nas regras descritas acima, retornou como uma sequência ou saída.
As regras
- Um programa completo ou uma função são aceitáveis.
- Lacunas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
Entrada em uma linha, saída na seguinte. Linhas em branco separam exemplos.
Hello
emmol
Hello, World!
emmol, ww~ved
PPCG
PSWG
Programming Puzzles and Code Golf
r wogsmmoonpuu ~ meannncoooeggonl
abcdefghijklmnopqrstuvwxyz
bcfefgnijknmno~qrsvuvw~yzz
!abcdefghijklmnopqrstuvwxyz
aaccgeggoikkomoo qsswuww yy
Test 123 with odd characters. R@*SKA0z8d862
euutu133www|todddchizsscguwssr`jS{SK{z~|v66
o
alteraçõesl
no primeiro exemplo, tenho certeza de que suas especificações garantem que o primeiroo
não seja alteradol
no segundo exemplo. Deve mudar para'l' | ','
, seja o que for, certo?'l' | ','
que é108 | 44 --> 1101111 | 0101100
, o que se torna108
, o que él
. O,
alinhamento acontece com ol
, portanto, não há alterações quando o binário - ou ocorre.Respostas:
Geléia ,
3331 bytesUma abordagem direta que certamente pode ser reduzida.
Experimente online!
fonte
Perl,
6362 bytesInclui +4 para
-lp
Dê entrada no STDIN
oddeven.pl
:Isso funciona como mostrado, mas para obter a pontuação reivindicada, isso deve ser colocado em um arquivo sem final
;
e nova linha e as\xhh
fugas devem ser substituídas por seus valores literais. Você pode fazer isso colocando o código acima no arquivo e executando:fonte
Python 2,
138131 bytesExperimente online (contém todos os casos de teste)
Menos golfe:
Experimente online (sem limites)
Eu adiciono os
\x00
dois lados da string para não precisar me preocupar com isso durante a leitura bit a bit. Eu faço loop nos caracteres originais da string, fazendo operações bit a bit e adicionando-as ao resultado, seguindo as regras de paridade.fonte
|=
... equivalente em PowerShell seria$a=$a-bor$b
a?b:c
como o JS.C - 101 bytes
Nem precisamos verificar se é o último item da cadeia, porque as cadeias em C são terminadas em nulo.
Explicação
Bastante simples:
Use & 1 para testar expressões ímpares / iguais e ternárias para substituir if / elses. Incremente o caractere * p para reduzir o número de colchetes necessários.
fonte
Mathematica, 152 bytes
Explicação
Converte string em códigos ASCII
Particiona os códigos ASCII no comprimento 3, desloca 1 partições, com 0s preenchidos.
Aplica uma função para cada partição.
If...else if... else
no Mathematica .Verifica se o índice (# 2) é ímpar. (
Max
é para aplainar); desde o índice Mathematica começa em 1, eu useiOddQ
aqui, nãoEvenQ
Toma os códigos ASCII dos vizinhos esquerdo e direito.
Verifica se o código ASCII do caractere correspondente é ímpar.
Pega os códigos ASCII do caractere e do vizinho esquerdo.
Pega os códigos ASCII do personagem e do vizinho certo.
Aplica-se ou operação.
Substitui todos os números maiores que 126 por 32 (espaço).
Converte o código ASCII em caracteres e os une.
fonte
From/ToCharacterCode
funções. Então parece que suaDrop
notação uso infix lata:#~Drop~{2}
. E parece que você está aplicandoBitOr
a todas as saídas possíveis doWhich
então por que não aplicá-lo depois e apenas uma vez?Rubi
133128108106 bytesJordan me ajudou a economizar 20 bytes e cia_rana me ajudou a economizar 2 bytes :)
s
é tomado como a sequência de entrada.Exemplo de saída com
s="Test 123 with odd characters. R@*SKA0z8d862"
:Explicação
O código acima é muito ilegível, então aqui está uma explicação. O código é meio hacky, eu sou novo no ruby, então aposto que há uma maneira mais curta de fazer isso :)
fonte
print
vez dep
: p->s{p s[-i=-1]+s.bytes.each_cons(3).map{|x,y,z|i+=1;a=i%2>0?x|z :y%2>0?y|x :y|z;a>126?' ':a.chr}*""+s[-2]}
J, 42 bytes
Usa a propriedade de que verbos em J podem ser aplicados de forma alternada usando um gerúndio
`
para certos advérbios, como infix\
.Uso
Explicação
fonte
JavaScript (ES6),
125118114 bytesEmbaraçosamente muito tempo, mas
charCodeAt
eString.fromCharCode
sozinhos são 29 bytes. : - /Como funciona
Cada personagem na posição
i
é traduzido com a seguinte fórmula, que abrange todas as regras de uma só vez:Onde
C(n)
retorna o código ASCII do n-ésimo caractere da sequência de entrada.Demo
fonte
PHP,
10797 bytesprovavelmente jogável.
fonte
C #, 145 bytes
Programa completo com método não destruído e casos de teste:
Acabou sendo mais do que eu pensava ...
fonte