Missy Elliot, XKCD und ASCII Bytes


9

Inspiriert vom folgenden XKCD-Comic:

Geben Sie hier die Bildbeschreibung ein

In Missy Elliots "Work It" lautet ein Teil des Chors wie folgt:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Vor diesem Hintergrund schlage ich die folgende Code-Golf-Herausforderung vor:

Erstellen Sie den folgenden Code:

  1. Nimmt 8-Bit-ASCII-Eingabe von STDIN; zB n(Hex 6E oder Bin 01101110)
  2. Verschiebt die 8 Bits jedes Bytes um 1 Bit nach unten (ich glaube, es wird als bitweise Verschiebung nach unten bezeichnet), z. B. 01101110wird 00110111("lege mein Ding ab");
  3. Invertiert die Bits jedes Bytes, z. B. 00110111wird 11001000("flip it");
  4. Kehrt die Bits für jedes Byte um, z. B. 11001000wird 00010011 ("umgekehrt");
  5. Wenn der Wert eines Bytes kleiner als 32 ist, führen Sie das Byte aus, dh mit (95 + [byte value])anderen Worten, (126-(31-[byte value]))bevor Sie es wieder in ASCII konvertieren ... Wenn der Bytewert immer noch kleiner als 32 ist, wiederholen Sie Schritt 5
  6. Wenn der Wert eines Bytes größer als 126 ist, führen Sie das Byte aus, dh mit ([byte value] - 95)anderen Worten, (32+([byte value]-127))bevor Sie es wieder in ASCII konvertieren ... WENN der Wert immer noch größer als 126 ist, wiederholen Sie Schritt 6.
  7. Zeigen Sie die neu konvertierte Zeichenfolge als ASCII an.

Ein Beispiel für diesen Code in Aktion:

(Die Eingabe, ist es das wert?)

workit missy ("missy" ist die Eingabe, "workit" ist die Funktion)

Jetzt hinter den Kulissen ...

(Lass es mich arbeiten ... In Binär)

01101101 01101001 01110011 01110011 01111001

(Leg mein Ding hin ... Bitweise)

00110110 00110100 00111001 00111001 00111100

(...Dreh es um...)

11001001 11001011 11000110 11000110 11000011

(... und umgekehrt!)

10010011 11010011 01100011 01100011 11000011

(Zurück in Dezimal konvertiert)

147 211 99 99 195

(Führen Sie die erforderlichen Berechnungen durch)

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

(Zurück in ASCII konvertieren und die Ausgabe anzeigen)

4tccd

Regeln

  1. Der kürzeste Code gewinnt ... so einfach ist das ...
  2. Die Eingabe kann über eine Funktion, eine Eingabeaufforderung oder was auch immer für Sie funktioniert, erfolgen, solange Sie dafür sorgen können, dass Regel 1 für Sie "funktioniert" ...;)
  3. Ich bin nicht nach Reversibilität, solange Sie den Code dazu bringen können, das zu tun, worum ich ihn gebeten habe, werde ich glücklich sein ...

Viel Glück!


3
Interessiert es uns, dass dies kein reversibler Prozess ist? Wenn die Bitverschiebung durchgeführt wird, wird das niedrigstwertige Bit im Wesentlichen weggeworfen.
Sammitch

1
Ich bekomme 0 1 1 0 1 1 0 1und 0 1 1 0 1 0 0 1fürmi
Marinus

2
Ich habe mich immer gefragt, worum es in diesem Song geht ...
Standby

2
Die Regeln machen das nicht, oder? Zum Beispiel: Pwird zum Bytewert 235und das Subtrahieren 95lässt Sie mit 140. Immer noch nicht druckbar. Oder verstehe ich falsch?
Darren Stone

2
Seien Sie vorsichtig, wenn Sie die Regeln ändern. Sie haben viele Antworten eingereicht, die Ihrer aktuellen Definition entsprechen.
Darren Stone

Antworten:


5

APL  50  45

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

Nimmt Eingaben über die Tastatur vor, z.

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

Ich habe mir erlaubt, Ihre Antwort auf 45 zu verbessern (bis zur Genehmigung der Bearbeitung). Es hat zu viel von Ihnen gekostet, sie als meine eigene zu veröffentlichen
Tobia

4

GolfScript 43 38 35

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

Erläuterung: Für jedes Zeichen in der Zeichenfolge werden folgende Schritte ausgeführt:

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

Verwendungszweck:

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

Dank der Hilfe von Peter Taylor.


Clever, und bis jetzt sind Sie an der Spitze!
WallyWest

Normalerweise finde ich, dass der beste Weg, um eine garantierte Anzahl von Ziffern zu erhalten, wenn ich eine Basiskonvertierung durchführe, darin besteht, vorher einen geeigneten Wert hinzuzufügen. Dh stattdessen 2base{0\+.,9<}dowäre es 512+2base(;. Beachten Sie auch , dass , wenn die Absicht nur die korrekte Ausgabe erhalten können Sie die Operationen neu anordnen, so anstatt {!}%Sie müssen nur ~den Eingang vor Basisumwandlung (und ersetzen Sie dann die 512+mit 511&).
Peter Taylor

Danke @PeterTaylor - der 512 Trick ist perfekt! Im Geiste der Frage denke ich jedoch, wir sollten uns vor dem Negieren etwas verschieben.
Ben Reich

Wenn Sie 2/als Bitverschiebung zählen , können Sie dann immer noch Bitverschiebung ~, dann Basiskonvertierung ...
Peter Taylor

@ PeterTaylor Ich mag es! Danke für die Hilfe.
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 Zeichen

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

Muy beeindruckend!
WallyWest

1

Ruby, 115

Dieser Eintrag ist nicht wettbewerbsfähig lang. Also gehe ich mit, "aber du kannst es lesen!" :-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}*''

Liest aus stdin:

missy
4tccd

1

Python 2.7, 106

Noch eine ziemlich lange Antwort, aber hey, es ist mein erster Versuch:

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

Modifiziert basierend auf den Kommentaren von Darren Stone und grc unten ...


Sie können das Leerzeichen nach löschen a:.
Darren Stone

Sie können Ihren endgültigen chrAusdruck durch diesen ersetzen, um weitere 1-Zeichen-Einsparungen zu erzielen : chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone

Etwas kürzer:print'\b%c'%(x+95*((x<32)-(x>126))),
grc

1

Python 2.7 - 73 86

Dank der Änderung der Regeln habe ich einen viel einfacheren Weg gefunden, dies alles mit binärer und ganzzahliger Manipulation zu tun. Dies spart Platz gegenüber Quirlioms, da keine temporäre Variable benötigt wird:

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

Und in Erklärungsform:

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
  ),
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.