Missy Elliot, XKCD i ASCII Bytes

9

Inspirowany następującym komiksem XKCD:

wprowadź opis zdjęcia tutaj

W „Work It” Missy Elliot część refrenu brzmi następująco:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Mając to na uwadze, proponuję następujące wyzwanie golfowe:

Utwórz kod, który działa, w celu:

  1. Pobiera 8-bitowe wejście ASCII ze STDIN; np. n(Hex 6E lub Bin 01101110)
  2. Przesuwa o 8 bitów każdego bajtu w dół o 1 bit (wydaje mi się, że nazywa się to przesunięciem bitowym w dół), np. 01101110Staje się 00110111(„odłóż moją rzecz”);
  3. Odwraca bity każdego bajtu, np. 00110111Staje się 11001000(„odwróć”);
  4. Odwraca bity dla każdego bajtu, np. 11001000Staje się 00010011 („odwróć”);
  5. Jeśli wartość bajtu jest mniejsza niż 32, wykonaj (95 + [byte value]), lub innymi słowy, (126-(31-[byte value]))bajt przed konwersją z powrotem do ASCII ... Jeśli wartość bajtu jest nadal mniejsza niż 32, powtórz krok 5
  6. Jeśli wartość bajtu jest większa niż 126, wykonaj ([byte value] - 95), lub innymi słowy, (32+([byte value]-127))bajt przed konwersją z powrotem do ASCII ... JEŻELI wartość jest nadal większa niż 126, powtórz krok 6.
  7. Wyświetl nowo przekonwertowany ciąg jako ASCII.

Przykład tego kodu w akcji:

(Wkład, czy warto?)

workit missy („missy” jest wejściem, „workit” jest funkcją)

Teraz za kulisami ...

(pozwól mi pracować ... w binarny)

01101101 01101001 01110011 01110011 01111001

(Odłóż moją rzecz ... Bitowo)

00110110 00110100 00111001 00111001 00111100

(...Odwróć to...)

11001001 11001011 11000110 11000110 11000011

(... i odwróć to!)

10010011 11010011 01100011 01100011 11000011

(Przekształcony z powrotem na dziesiętny)

147 211 99 99 195

(Wykonaj niezbędną matematykę)

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

(Konwertuj z powrotem na ASCII i wyświetl, dane wyjściowe)

4tccd

Zasady

  1. Najkrótszy kod wygrywa ... tak prosty ...
  2. Dane wejściowe mogą być wprowadzane za pomocą funkcji, przez monit lub cokolwiek, co Ci odpowiada, pod warunkiem, że możesz sprawić, że Zasada 1 „zadziała” dla Ciebie ...;)
  3. Nie jestem po odwracalności, dopóki możesz zmusić kod do zrobienia tego, o co go poprosiłem, będę szczęśliwy ...

Powodzenia!

WallyWest
źródło
3
Czy zależy nam na tym, aby proces ten nie był odwracalny? Kiedy przeprowadzane jest przesunięcie bitów, najmniej znaczący bit jest zasadniczo wyrzucany.
Sammitch
1
Dostaję 0 1 1 0 1 1 0 1i 0 1 1 0 1 0 0 1zami
marinus
2
Zawsze zastanawiałem się, o czym była ta piosenka ...
stoisko
2
Zasady tego nie robią, prawda? Na przykład: Pzamienia się w wartość bajtu, 235a odejmowanie 95pozostawia 140. Nadal nie można drukować. A może źle zrozumiałem?
Darren Stone
2
Ostrożnie zmieniaj zasady. Masz wiele przesłanych odpowiedzi, które odpowiadają twojej obecnej definicji.
Darren Stone

Odpowiedzi:

5

APL  50  45

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

Pobiera dane z klawiatury, np .:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd
marinus
źródło
Pozwoliłem sobie ulepszyć twoją odpowiedź do 45 (w oczekiwaniu na zatwierdzenie edycji). Zbyt wiele zajęło twojemu opublikowanie jej jako mojej własnej
Tobia
4

GolfScript 43 38 35

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

Objaśnienie: Dla każdego znaku w ciągu wykonamy następujące czynności:

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

Stosowanie:

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

Dzięki pomocy PeterTaylor.

Ben Reich
źródło
Sprytne, a jak dotąd przewodzisz!
WallyWest
Zazwyczaj uważam, że najlepszym sposobem na uzyskanie gwarantowanej liczby cyfr podczas konwersji podstawowej jest wcześniejsze dodanie odpowiedniej wartości. Tj. Zamiast 2base{0\+.,9<}dotego byłoby 512+2base(;. Należy również pamiętać, że jeśli intencją jest jedynie, aby uzyskać prawidłowe wyjście można zmienić kolejność operacji, więc zamiast {!}%po prostu trzeba ~wejściowych przed konwersją bazy (i wtedy wymienić 512+z 511&).
Peter Taylor
Dzięki @PeterTaylor - sztuczka 512 jest idealna! Jednak w duchu tego pytania uważam, że powinniśmy nieco zmienić, zanim zaprzeczysz.
Ben Reich
Jeśli liczysz 2/jako przesunięcie bitowe, możesz nadal przesuwać bitowo, a ~następnie konwertować bazę ...
Peter Taylor
@PeterTaylor Podoba mi się! Dzięki za pomoc.
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"
tartin
źródło
2

J - 61

u:-&95^:(>&126)"0+&95^:(<&32)"0#.|."1(1-0,0,}:)"1#:3&u:1!:1[1
missy
4tccd
śmigać
źródło
2

J, 55 54 znaków

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

Ruby, 115

Ten wpis jest niekonkurencyjnie długi. Więc pójdę z „ale możesz to przeczytać!” :-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}*''

Czyta z stdin:

missy
4tccd
Darren Stone
źródło
1

Python 2.7, 106

Kolejna dość długa odpowiedź, ale hej, to moja pierwsza próba:

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

Zmodyfikowano na podstawie komentarzy Darrena Stone'a i grc poniżej ...

Sinkingpoint
źródło
Możesz upuścić miejsce później a:.
Darren Stone
Można wymienić ostatecznej chrekspresji z tego przez kolejne oszczędności 1-char: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone
Nieco krótszy:print'\b%c'%(x+95*((x<32)-(x>126))),
grc
1

Python 2.7 - 73 86

Dzięki zmianie reguł znalazłem znacznie prostszy sposób na zrobienie tego wszystkiego za pomocą manipulacji binarnych i całkowitoliczbowych. Oszczędza to miejsce na Quirlioms, nie potrzebując zmiennej tymczasowej:

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

I w formie wyjaśnienia:

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

źródło