Missy Elliot, XKCD e bytes ASCII

9

Inspirado nos seguintes quadrinhos do XKCD:

insira a descrição da imagem aqui

No "Work It" de Missy Elliot, parte do refrão é a seguinte:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Tendo isso em mente, proponho o seguinte desafio de código de golfe:

Crie um código que faça, em ordem:

  1. Recebe entrada ASCII de 8 bits do STDIN; por exemplo n(Hex 6E ou Bin 01101110)
  2. Turnos de 8 bits de cada byte baixo nível de 1 bit (creio que é chamado da tecla shift bit a bit), por exemplo, 01101110torna-se 00110111( "colocar a minha coisa para baixo");
  3. Inverte os bits de cada byte, por exemplo, 00110111torna-se 11001000("flip it");
  4. Inverte os bits para cada byte, por exemplo, 11001000torna-se 00010011 ("inverta");
  5. Se o valor de um byte for menor que 32, execute (95 + [byte value])ou, em outras palavras, (126-(31-[byte value]))o byte antes de converter novamente em ASCII ... Se o valor do byte ainda for menor que 32, repita a etapa 5
  6. Se o valor de um byte for maior que 126, execute ([byte value] - 95)ou, em outras palavras, (32+([byte value]-127))o byte antes de converter novamente para ASCII ... SE o valor ainda for maior que 126, repita a etapa 6.
  7. Exiba a sequência recém-convertida como ASCII.

Um exemplo deste código em ação:

(A entrada, vale a pena?)

workit missy ("missy" é a entrada, "workit" é a função)

Agora nos bastidores ...

(deixe-me trabalhar ... em binário)

01101101 01101001 01110011 01110011 01111001

(Largue as coisas ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(... Virá-lo ...)

11001001 11001011 11000110 11000110 11000011

(... E inverta isso!)

10010011 11010011 01100011 01100011 11000011

(Convertido de volta para decimal)

147 211 99 99 195

(Faça a matemática necessária)

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

(Converta de volta para ASCII e exiba a saída)

4tccd

Regras

  1. O código mais curto ganha ... simples assim ...
  2. A entrada pode ser via função, por prompt ou o que funcionar para você, desde que você possa fazer com que a Regra 1 "funcione" para você ...;)
  3. Não estou atrás da reversibilidade, desde que você possa fazer o código fazer o que eu pedi, ficarei feliz ...

Boa sorte!

WallyWest
fonte
3
Preocupamo-nos que este não seja um processo reversível? Quando a troca de bits é realizada, o bit menos significativo é essencialmente jogado fora.
Sammitch
11
Eu recebo 0 1 1 0 1 1 0 1e 0 1 1 0 1 0 0 1parami
marinus
2
Eu sempre quis saber o que essa música era sobre ...
Boothby
2
As regras não fazem isso, fazem? Por exemplo: se Ptransforma no valor de byte 235e a subtração 95deixa você com 140. Ainda não imprimível. Ou entendo mal?
Darren Pedra
2
Cuidado ao alterar as regras. Você tem muitas respostas enviadas que estão em conformidade com sua definição atual.
Darren Pedra

Respostas:

5

APL  50  45

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

Recebe entrada no teclado, por exemplo:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd
marinus
fonte
Tomei a liberdade de melhorar a sua resposta até 45 (pendente editar aprovação.) Levou muito do seu para publicá-la como minha própria
Tobia
4

GolfScript 43 38. 35

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

Explicação: Para cada caractere na sequência, faremos o seguinte:

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

Obrigado pela ajuda de PeterTaylor.

Ben Reich
fonte
Inteligente, e até agora você está na liderança!
Wally West
Normalmente, acho que a melhor maneira de obter um número garantido de dígitos quando faço uma conversão básica é adicionar um valor adequado antecipadamente. Ou seja, em vez 2base{0\+.,9<}dodisso seria 512+2base(;. Observe também que, se a intenção é apenas obter a saída correta, você pode reordenar as operações, portanto, em vez de {!}%precisar apenas ~da entrada antes da conversão base (e depois substituir 512+por 511&).
Peter Taylor
Obrigado @PeterTaylor - o truque 512 é perfeito! No espírito da pergunta, porém, acho que devemos mudar um pouco antes de negar.
Ben Reich
Se você contar 2/como uma mudança pouco, então você ainda pode mordeu turno, em seguida ~, em seguida, base de converso ...
Peter Taylor
@PeterTaylor Eu gosto! Obrigado pela ajuda.
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
fonte
2

J - 61

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

J, 55 54 caracteres

u:+/(*126&>*.32&<)_95 0 95+/#.|."1#:255-<.-:a.i.1!:1[1
Gareth
fonte
Muy impressivo!
precisa saber é o seguinte
1

Ruby, 115

Esta entrada é incompetitivamente longa. Então eu vou com ", mas você pode ler!" :-P

$><<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}*''

Lê de stdin:

missy
4tccd
Darren Stone
fonte
1

Python 2.7, 106

Outra resposta bastante longa, mas ei, é a minha primeira tentativa:

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 com base nos comentários de Darren Stone e grc abaixo ...

Ponto de afundamento
fonte
Você pode deixar o espaço depois a:.
Darren Pedra
Você pode substituir a sua última chrexpressão com este por mais poupança 1 char-: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Pedra
Um pouco mais curto:print'\b%c'%(x+95*((x<32)-(x>126))),
grc
1

Python 2.7 - 73 86

Graças à mudança nas regras, encontrei uma maneira muito mais simples de fazer isso usando manipulação binária e número inteiro. Isso economiza espaço nos Quirlioms por não precisar de uma variável temporária:

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

E na forma de explicação:

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
  ),

fonte