Definiremos el cifrado impar / par ASCII a través del pseudocódigo siguiente:
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 ejemplo, para la entrada Hello
, la salida es emmol
, ya que
- Los
H
turnos a los\0 | 'e'
cuales ese
- Los
e
giros a'e' | 'l'
, o101 | 108
, que es109
om
- El primero
l
también se convierte en101 | 108
om
- El segundo se
l
convierte en108 | 111
, que es111
oo
- Los
o
turnos a108 | \0
, ol
Entrada
- Una oración compuesta únicamente de caracteres ASCII imprimibles, en cualquier formato adecuado .
- La oración puede tener puntos, espacios y otros signos de puntuación, pero solo será una línea.
- La oración tendrá al menos tres caracteres de longitud.
Salida
- El cifrado resultante, basado en las reglas descritas anteriormente, devuelto como una cadena o salida.
Las normas
- Un programa completo o una función son aceptables.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
Ejemplos
Entrada en una línea, salida en lo siguiente. Las líneas en blanco separan ejemplos.
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
cambiosl
en el primer ejemplo, estoy bastante seguro de que sus especificaciones aseguran que el primeroo
no cambiel
en el segundo ejemplo. Debería cambiar a'l' | ','
, sea lo que sea, ¿verdad?'l' | ','
, que es108 | 44 --> 1101111 | 0101100
, que se convierte108
, que esl
. El,
pasa a alinearse con ell
, así que no hay ningún cambio cuando el binario o se lleva a cabo.Respuestas:
Jalea ,
3331 bytesUn enfoque directo que seguramente se puede acortar.
Pruébalo en línea!
fuente
Perl,
6362 bytesIncluye +4 para
-lp
Dar entrada sobre STDIN
oddeven.pl
:Esto funciona como se muestra, pero para obtener la puntuación reclamada, esto debe colocarse en un archivo sin
;
línea final y nueva y los\xhh
escapes deben reemplazarse por sus valores literales. Puede hacer esto poniendo el código anterior en el archivo y ejecutando:fuente
Python 2,
138131 bytesPruébelo en línea (contiene todos los casos de prueba)
Menos golfizado:
Pruébelo en línea (sin golf)
Agrego
\x00
a ambos lados de la cadena para que no tenga que preocuparme por eso durante el proceso bit a bit. Recorro los caracteres originales de la cadena, hago operaciones bit a bit y las agrego al resultado, siguiendo las reglas de paridad.fuente
|=
... equivalente en PowerShell sería$a=$a-bor$b
a?b:c
como JS.C - 101 bytes
Ni siquiera tenemos que verificar si es el último elemento de la cadena porque las cadenas en C tienen terminación nula.
Explicación
Bastante simple:
Use & 1 para probar expresiones impares / pares y expresiones ternarias para reemplazar if / elses. Incremente el char * p para reducir la cantidad de paréntesis requeridos.
fuente
Mathematica, 152 bytes
Explicación
Convierte cadenas a códigos ASCII
Particiona los códigos ASCII a la longitud 3, compensa 1 particiones, con ceros rellenos.
Aplica una función para cada partición.
If...else if... else
en Mathematica .Comprueba si el índice (# 2) es impar. (
Max
es para aplanar); desde Mathematica índice comienza en 1, he utilizadoOddQ
aquí, noEvenQ
Toma los códigos ASCII de los vecinos izquierdo y derecho.
Comprueba si el código ASCII del carácter correspondiente es impar.
Toma los códigos ASCII del personaje y el vecino izquierdo.
Toma los códigos ASCII del personaje y el vecino correcto.
Aplica u-operación.
Reemplaza todos los números mayores que 126 con 32 (espacio).
Convierte el código ASCII nuevamente en caracteres y se une a ellos.
fuente
From/ToCharacterCode
funciones. Entonces parece que suDrop
lata notación infija uso:#~Drop~{2}
. Y parece que se está aplicandoBitOr
a cada salida posible de la,Which
¿por qué no aplicarlo después y solo una vez?Rubí
133128108106 bytesJordan me ayudó a ahorrar 20 bytes y cia_rana me ayudó a ahorrar 2 bytes :)
s
se toma como la cadena de entrada.Ejemplo de salida con
s="Test 123 with odd characters. R@*SKA0z8d862"
:Explicación
El código anterior es muy ilegible, así que aquí hay una explicación. El código es un poco hacky, dejo de ser nuevo en Ruby, así que apuesto a que hay una forma más corta de hacerlo :)
fuente
print
lugar 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
Utiliza la propiedad de que los verbos en J se pueden aplicar de forma alterna usando un gerundio
`
para ciertos adverbios como infix\
.Uso
Explicación
fuente
JavaScript (ES6),
125118114 bytesVergonzosamente largo, pero
charCodeAt
yString.fromCharCode
solo son 29 bytes. : - /Cómo funciona
Cada carácter en la posición
i
se traduce con la siguiente fórmula, que cubre todas las reglas a la vez:donde
C(n)
devuelve el código ASCII del enésimo carácter de la cadena de entrada.Manifestación
fuente
PHP,
10797 bytesProbablemente golfable.
fuente
C #, 145 bytes
Programa completo con método no protegido y casos de prueba:
Esto resultó ser más largo de lo que pensaba ...
fuente