Missy Elliot, XKCD y bytes ASCII

9

Inspirado en el siguiente cómic de XKCD:

ingrese la descripción de la imagen aquí

En "Work It" de Missy Elliot, parte del coro dice lo siguiente:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Teniendo esto en cuenta, propongo el siguiente código de desafío de golf:

Crea un código que lo haga, en orden:

  1. Toma la entrada ASCII de 8 bits de STDIN; por ejemplo n(Hex 6E o Bin 01101110)
  2. Cambia los 8 bits de cada byte a nivel de 1 bit (creo que se llama un desplazamiento a nivel de bits), por ejemplo, se 01101110convierte en 00110111("baja mi cosa");
  3. Invierte los bits de cada byte, por ejemplo, se 00110111convierte en 11001000("voltearlo");
  4. Invierte los bits para cada byte, por ejemplo, se 11001000convierte 00010011 ("revertirlo");
  5. Si el valor de un byte es menor que 32, realice (95 + [byte value]), o en otras palabras, (126-(31-[byte value]))en el byte antes de volver a convertirlo a ASCII ... Si el valor del byte aún es menor que 32, repita el paso 5
  6. Si el valor de un byte es mayor que 126, realice ([byte value] - 95), o en otras palabras, (32+([byte value]-127))en el byte antes de volver a convertirlo a ASCII ... SI el valor sigue siendo mayor que 126, repita el paso 6.
  7. Mostrar la cadena recién convertida como ASCII.

Un ejemplo de este código en acción:

(La entrada, ¿vale la pena?)

workit missy ("missy" es la entrada, "workit" es la función)

Ahora detrás de escena ...

(déjame trabajarlo ... en binario)

01101101 01101001 01110011 01110011 01111001

(Deja mi cosa ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(...Voltearlo...)

11001001 11001011 11000110 11000110 11000011

(... ¡Y revertirlo!)

10010011 11010011 01100011 01100011 11000011

(Convertido de nuevo a decimal)

147 211 99 99 195

(Realice las matemáticas necesarias)

147-95 211-95 99 99 195-95 => 52 116 99 99 100

(Convertir de nuevo a ASCII y mostrar, la salida)

4tccd

Reglas

  1. El código más corto gana ... así de simple ...
  2. La entrada puede ser a través de la función, por solicitud o lo que sea que funcione para usted, siempre que pueda hacer que la Regla 1 "funcione" para usted ...;)
  3. No busco la reversibilidad, siempre que pueda hacer que el código haga lo que le he pedido, estaré feliz ...

¡La mejor de las suertes!

WallyWest
fuente
3
¿Nos importa que este no sea un proceso reversible? Cuando se realiza el desplazamiento de bit, el bit menos significativo se desecha esencialmente.
Sammitch
1
Tengo 0 1 1 0 1 1 0 1y 0 1 1 0 1 0 0 1parami
marinus
2
Siempre hice lo que era de extrañar que la canción sobre ...
boothby
2
Las reglas no hacen eso, ¿verdad? Por ejemplo: se Pconvierte en el valor de byte 235y restando 95te deja con 140. Aún no imprimible. ¿O lo entiendo mal?
Darren Stone
2
Tenga cuidado al alterar las reglas. Tiene muchas respuestas enviadas que se ajustan a su definición actual.
Darren Stone

Respuestas:

5

APL  50  45

⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞

Toma entrada en el teclado, por ejemplo:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd
marinus
fuente
Me tomé la libertad de mejorar su respuesta a 45 (pendiente de aprobación de edición). Tomó demasiado de la suya para publicarla como mía
Tobia
4

GolfScript 43 38 35

{2/~512+2base(;-1%2base-32+95%32+}%

Explicación: Para cada carácter de la cadena, haremos lo siguiente:

2/ # "Put your thing down": do integer division (accomplishing a bit shift).
~ # "Flip it": negate the bits of the integer.
512+ #make sure the binary form will have sufficient initial 0s (the extra initial 1 will be removed).
2base #convert string to value in base 2 (as an array)
(; #remove the initial 1 added by the 512 addition
-1% # "Reverse it": reverse the array
2base #convert back to base 10
-32+95%32+ #this does the equivalent of the subtraction/addition logic

Uso:

echo 'missy' | ruby golfscript.rb workit.gs
> 4tccd

Gracias a la ayuda de Peter Taylor.

Ben Reich
fuente
¡Listo, y hasta ahora estás a la cabeza!
WallyWest
Por lo general, encuentro que la mejor manera de obtener un número garantizado de dígitos cuando hago una conversión base es agregar de antemano un valor adecuado. Es decir, en lugar de 2base{0\+.,9<}doserlo 512+2base(;. También tenga en cuenta que si la intención es solo obtener la salida correcta, puede reordenar las operaciones, por lo que en lugar de {!}%solo necesitar ~la entrada antes de la conversión de base (y luego reemplazar 512+con 511&).
Peter Taylor
Gracias @PeterTaylor: ¡el truco 512 es perfecto! Sin embargo, en el espíritu de la pregunta, creo que deberíamos cambiar un poco antes de negar.
Ben Reich
Si cuenta 2/como un cambio de bit, entonces todavía puede cambiar un poco, entonces ~, luego convertir base ...
Peter Taylor
@PeterTaylor ¡Me gusta! Gracias por la ayuda.
Ben Reich
3

K, 68 58

{"c"${$[a<32;95;a>126;-95;0]+a:6h$0b/:|~8#0b,0b\:x}'4h$'x}

.

k){"c"${$[a<32;95;a>126;-95;0]+a:6h$0b/:|~8#0b,0b\:x}'4h$'x}"missy"
"4tccd"
tmartin
fuente
2

J - 61

u:-&95^:(>&126)"0+&95^:(<&32)"0#.|."1(1-0,0,}:)"1#:3&u:1!:1[1
missy
4tccd
silbido
fuente
2

J, 55 54 caracteres

u:+/(*126&>*.32&<)_95 0 95+/#.|."1#:255-<.-:a.i.1!:1[1
Gareth
fuente
Muy impressivo!
WallyWest
1

Ruby, 115

Esta entrada es poco competitiva. Así que iré con "¡pero puedes leerlo!" :-PAGS

$><<gets.chars.map{|c|c=(c.ord.to_s(2)[0..-2].tr('01','10').reverse+'11').to_i(2)
(c+(c<32?95:c>126?-95:0)).chr}*''

Lee de stdin:

missy
4tccd
Piedra de Darren
fuente
1

Python 2.7, 106

Otra respuesta bastante larga, pero bueno, es mi primer intento:

for c in raw_input():x=sum(1<<7-i for i in range(8)if~ord(c)>>1+i&1);print'\b%c'%(x+95*((x<32)-(x>126))),

Modificado en base a los comentarios de Darren Stone y grc a continuación ...

Punto de hundimiento
fuente
Puedes dejar el espacio después a:.
Darren Stone
Puede reemplazar su última chrexpresión con esto por otro ahorro 1-char: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone
Un poco más corto:print'\b%c'%(x+95*((x<32)-(x>126))),
grc
1

Python 2.7 - 73 86

Gracias al cambio en las reglas, encontré una manera mucho más simple de hacer todo esto utilizando la manipulación binaria y de enteros. Esto ahorra espacio sobre Quirlioms al no necesitar una variable temporal:

for i in input():print chr((int(bin(ord(i)>>1^255)[:1:-1],2)-32)%95+32),

> python workit.py
"missy"
4 t c c d
> python workit.py
"P Diddy"
- 9 \ t T T d

Y en forma de explicación:

for i in input():  # Take an input, better quote it
                   # Is it worth it? Let me work it
  print chr(
    int(bin(
        ord(i)>>1  # Put my thing down by bitshifting it
             ^255  # XOR it with 255 to flip the bits and pad to 8 bits
        )[:1:-1]   # Then reverse it (but don't take the cruft
                   # python puts at the start of binary strings)
    ,2) 
    )-32)%95+32    # This pulls everything into the 32-126 range
  ),

fuente