Missy Elliot, XKCD e ASCII byte


9

Ispirato al seguente fumetto XKCD:

inserisci qui la descrizione dell'immagine

In "Work It" di Missy Elliot, parte del coro è la seguente:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Tenendo conto di ciò, propongo la seguente sfida del codice golf:

Crea codice che lo fa, in ordine:

  1. Accetta l'ingresso ASCII a 8 bit da STDIN; ad es. n(Hex 6E o Bin 01101110)
  2. Sposta gli 8 bit di ciascun byte al di sotto del livello di 1 bit (credo che sia chiamato spostamento bit per bit in basso), ad esempio 01101110diventa 00110111("metti giù la mia cosa");
  3. Inverte i bit di ogni byte, ad esempio 00110111diventa 11001000("capovolgilo");
  4. Inverte i bit per ogni byte, ad esempio 11001000diventa 00010011 ("inverti");
  5. Se il valore di un byte è inferiore a 32, quindi eseguire (95 + [byte value]), o in altre parole, (126-(31-[byte value]))sul byte prima di riconvertirlo in ASCII ... Se il valore del byte è ancora inferiore a 32, ripetere il passaggio 5
  6. Se il valore di un byte è maggiore di 126, quindi eseguire ([byte value] - 95), o in altre parole, (32+([byte value]-127))sul byte prima di riconvertirlo in ASCII ... SE il valore è ancora maggiore di 126, ripetere il passaggio 6.
  7. Visualizza la stringa appena convertita come ASCII.

Un esempio di questo codice in azione:

(L'input, ne vale la pena?)

workit missy ("missy" è l'input, "workit" è la funzione)

Ora dietro le quinte ...

(fammi lavorare ... in binario)

01101101 01101001 01110011 01110011 01111001

(Metti giù la mia cosa ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(... Capovolgilo ...)

11001001 11001011 11000110 11000110 11000011

(... E invertilo!)

10010011 11010011 01100011 01100011 11000011

(Convertito nuovamente in decimale)

147 211 99 99 195

(Esegui la matematica necessaria)

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

(Converti nuovamente in ASCII e visualizza l'output)

4tccd

Regole

  1. Il codice più corto vince ... così semplice ...
  2. L'input può essere tramite funzione, su richiesta o qualunque cosa funzioni per te, purché tu possa far sì che la Regola 1 "funzioni" per te ...;)
  3. Non sto cercando la reversibilità, finché puoi far fare al codice ciò che ti ho chiesto di fare, sarò felice ...

Buona fortuna!


3
Ci interessa che questo non sia un processo reversibile? Quando viene eseguito lo spostamento dei bit, il bit meno significativo viene essenzialmente gettato via.
Sammitch,

1
Ricevo 0 1 1 0 1 1 0 1e 0 1 1 0 1 0 0 1permi
Marin

2
Mi sono sempre chiesto di cosa trattasse quella canzone ...
stand

2
Le regole non lo fanno, vero? Ad esempio: Psi trasforma in valore byte 235e la sottrazione 95ti lascia con 140. Ancora non stampabile. O fraintendere?
Darren Stone,

2
Fai attenzione a modificare le regole. Hai molte risposte inviate conformi alla tua attuale definizione.
Darren Stone,

Risposte:


5

 50  APL 45

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

Riceve input dalla tastiera, ad esempio:

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

Mi sono preso la libertà di migliorare la tua risposta fino a 45 (in attesa dell'approvazione della modifica.) Ci è voluto troppo dal tuo per pubblicarla come mia
Tobia

4

GolfScript 43 38 35

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

Spiegazione: Per ogni carattere nella stringa, faremo quanto segue:

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

Grazie per l'aiuto di PeterTaylor.


Intelligente, e finora sei in testa!
WallyWest,

Di solito trovo che il modo migliore per ottenere un numero garantito di cifre quando eseguo una conversione di base sia quello di aggiungere in anticipo un valore adatto. Cioè invece 2base{0\+.,9<}doche sarebbe 512+2base(;. Si noti inoltre che se l'intenzione è solo quella di ottenere l'output corretto, è possibile riordinare le operazioni, quindi piuttosto che {!}%è necessario solo ~l'input prima della conversione di base (e quindi sostituire il 512+con 511&).
Peter Taylor,

Grazie @PeterTaylor - il trucco 512 è perfetto! Nello spirito della domanda, tuttavia, penso che dovremmo spostarci un po 'prima di negare.
Ben Reich,

Se conti 2/come un po 'di spostamento, puoi ancora spostare un po' di spostamento, quindi ~, quindi convertire base ...
Peter Taylor

@PeterTaylor Mi piace! Grazie per l'aiuto.
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"

2

J - 61

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

2

J, 55 54 caratteri

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

Muy impressivo!
WallyWest,

1

Ruby, 115

Questa voce è lunga non competitiva. Quindi vado con "ma tu puoi leggerlo!" :-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}*''

Legge da stdin:

missy
4tccd

1

Python 2.7, 106

Un'altra risposta piuttosto lunga, ma hey è il mio primo tentativo:

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

Modificato in base ai commenti di Darren Stone e grc di seguito ...


È possibile rilasciare lo spazio dopo a:.
Darren Stone,

È possibile sostituire il finale chrdi espressione con questo per un altro risparmio 1-char: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone,

Un po 'più breve:print'\b%c'%(x+95*((x<32)-(x>126))),
GRC

1

Python 2.7 - 73 86

Grazie al cambio di regole ho trovato un modo molto più semplice di fare tutto ciò usando la manipolazione binaria e intera. Ciò consente di risparmiare spazio su Quirlioms non necessitando di una variabile temporanea:

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 in forma esplicativa:

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
  ),
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.