Octets Missy Elliot, XKCD et ASCII

9

Inspiré par la bande dessinée XKCD suivante:

entrez la description de l'image ici

Dans "Work It" de Missy Elliot, une partie du refrain se déroule comme suit:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Gardant cela à l'esprit, je propose le défi de golf de code suivant:

Créez un code qui le fasse, dans l'ordre:

  1. Prend une entrée ASCII 8 bits de STDIN; par exemple n(Hex 6E ou Bin 01101110)
  2. Décale le niveau de 8 bits de chaque octet vers le bas de 1 bit (je crois que cela s'appelle un décalage vers le bas), par exemple 01101110devient 00110111("mettre mon truc");
  3. Inverse les bits de chaque octet, par exemple 00110111devient 11001000("flip it");
  4. Inverse les bits pour chaque octet, par exemple 11001000devient 00010011 ("inversez-le");
  5. Si la valeur d'un octet est inférieure à 32, effectuez (95 + [byte value]), ou en d'autres termes, (126-(31-[byte value]))sur l'octet avant de reconvertir en ASCII ... Si la valeur de l'octet est toujours inférieure à 32, répétez l'étape 5
  6. Si la valeur d'un octet est supérieure à 126, effectuez ([byte value] - 95), ou en d'autres termes, (32+([byte value]-127))sur l'octet avant de reconvertir en ASCII ... SI la valeur est toujours supérieure à 126, répétez l'étape 6.
  7. Affichez la chaîne nouvellement convertie en ASCII.

Un exemple de ce code en action:

(L'entrée, ça vaut le coup?)

workit missy ("missy" étant l'entrée, "workit" est la fonction)

Maintenant dans les coulisses ...

(laissez-moi le travailler ... en binaire)

01101101 01101001 01110011 01110011 01111001

(Posez mon truc ... au niveau du bit)

00110110 00110100 00111001 00111001 00111100

(...Retournez...)

11001001 11001011 11000110 11000110 11000011

(... Et inversez-le!)

10010011 11010011 01100011 01100011 11000011

(Reconverti en décimal)

147 211 99 99 195

(Effectuez les calculs nécessaires)

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

(Convertir en ASCII et afficher la sortie)

4tccd

Règles

  1. Le code le plus court gagne ... aussi simple que ça ...
  2. L'entrée peut se faire via la fonction, par invite ou tout ce qui fonctionne pour vous, tant que vous pouvez faire en sorte que la règle 1 "fonctionne" pour vous ...;)
  3. Je ne recherche pas la réversibilité, tant que vous pouvez faire faire au code ce que je lui ai demandé de faire, je serai heureux ...

Bonne chance!

WallyWest
la source
3
Sommes-nous soucieux que ce ne soit pas un processus réversible? Lorsque le décalage binaire est effectué, le bit le moins significatif est essentiellement jeté.
Sammitch
1
Je reçois 0 1 1 0 1 1 0 1et 0 1 1 0 1 0 0 1pourmi
marinus
2
Je me suis toujours demandé de quoi
parlait
2
Les règles ne font pas cela, n'est-ce pas? Par exemple: se Ptransforme en valeur d'octet 235et la soustraction 95vous laisse avec 140. Encore non imprimable. Ou est-ce que je me méprends?
Darren Stone
2
Soyez prudent en modifiant les règles. Vous avez beaucoup de réponses soumises qui sont conformes à votre définition actuelle.
Darren Stone

Réponses:

5

APL  50  45

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

Prend des entrées sur le clavier, par exemple:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd
marinus
la source
J'ai pris la liberté d'améliorer votre réponse à 45 (en attente d'approbation de modification.) Il vous a fallu trop de temps pour l'afficher en tant que mienne
Tobia
4

GolfScript 43 38 35

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

Explication: Pour chaque caractère de la chaîne, nous ferons ce qui suit:

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

Usage:

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

Merci à PeterTaylor pour son aide.

Ben Reich
la source
Intelligent, et jusqu'à présent, vous êtes en tête!
WallyWest
Je trouve généralement que la meilleure façon d'obtenir un nombre garanti de chiffres lorsque je fais une conversion de base est d'ajouter au préalable une valeur appropriée. C'est-à-dire que 2base{0\+.,9<}doce serait le cas 512+2base(;. Notez également que si l'intention est uniquement d'obtenir la sortie correcte, vous pouvez réorganiser les opérations, plutôt que {!}%d'avoir simplement besoin de ~l'entrée avant la conversion de base (puis remplacez-la 512+par 511&).
Peter Taylor
Merci @PeterTaylor - l'astuce 512 est parfaite! Dans l'esprit de la question, cependant, je pense que nous devrions mordre un peu avant de nier.
Ben Reich
Si vous comptez 2/comme un décalage de bits, vous pouvez toujours effectuer un décalage de bits, puis ~, convertir de base ...
Peter Taylor
@PeterTaylor je l'aime! Merci pour l'aide.
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
la source
2

J - 61

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

J, 55 54 caractères

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

Rubis, 115

Cette entrée est longue sans concurrence. Je vais donc continuer, "mais vous pouvez le lire!" :-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}*''

Lit de stdin:

missy
4tccd
Darren Stone
la source
1

Python 2.7, 106

Une autre réponse assez longue, mais bon c'est mon premier essai:

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

Modifié en fonction des commentaires de Darren Stone et grc ci-dessous ...

Sinkingpoint
la source
Vous pouvez laisser tomber l'espace après a:.
Darren Stone
Vous pouvez remplacer votre dernière chrexpression avec cela pour une autre économie 1-char: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone
Un peu plus court:print'\b%c'%(x+95*((x<32)-(x>126))),
grc
1

Python 2.7 - 73 86

Grâce au changement de règles, j'ai trouvé un moyen beaucoup plus simple de tout faire en utilisant la manipulation binaire et entière. Cela économise de l'espace sur les Quirlioms en n'ayant pas besoin d'une variable temporaire:

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

Et sous forme d'explication:

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

la source