Missy Elliot, XKCD và ASCII Byte


9

Lấy cảm hứng từ truyện tranh XKCD sau đây:

nhập mô tả hình ảnh ở đây

Trong "Work It" của Missy Elliot, một phần của đoạn điệp khúc như sau:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Nắm bắt được điều đó, tôi đề xuất thử thách chơi gôn mã sau đây:

Tạo mã theo thứ tự:

  1. Lấy đầu vào ASCII 8 bit từ STDIN; ví dụ: n(Hex 6E hoặc Bin 01101110)
  2. Chuyển 8 bit của mỗi byte xuống mức 1 bit (tôi tin rằng nó được gọi là dịch chuyển bitwise xuống), ví dụ như 01101110trở thành 00110111("đặt điều của tôi xuống");
  3. Đảo ngược từng bit của từng byte, ví dụ 00110111trở thành 11001000("lật nó");
  4. Đảo ngược các bit cho mỗi byte, ví dụ 11001000trở thành 00010011 ("đảo ngược nó");
  5. Nếu giá trị của byte nhỏ hơn 32, thì thực hiện (95 + [byte value])hoặc nói cách khác (126-(31-[byte value])), trên byte trước khi chuyển đổi trở lại ASCII ... Nếu giá trị byte vẫn nhỏ hơn 32, lặp lại bước 5
  6. Nếu giá trị của byte lớn hơn 126, thì thực hiện ([byte value] - 95)hoặc nói cách khác (32+([byte value]-127)), trên byte trước khi chuyển đổi trở lại ASCII ... NẾU giá trị vẫn lớn hơn 126, lặp lại bước 6.
  7. Hiển thị chuỗi mới được chuyển đổi dưới dạng ASCII.

Một ví dụ về mã này đang hoạt động:

(Đầu vào, nó có đáng không?)

workit missy ("missy" là đầu vào, "workit" là hàm)

Bây giờ đằng sau hậu trường ...

(hãy để tôi làm việc đó ... thành nhị phân)

01101101 01101001 01110011 01110011 01111001

(Đặt điều của tôi xuống ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(...Lật nó...)

11001001 11001011 11000110 11000110 11000011

(... Và đảo ngược nó!)

10010011 11010011 01100011 01100011 11000011

(Chuyển đổi trở lại thập phân)

147 211 99 99 195

(Thực hiện các phép toán cần thiết)

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

(Chuyển đổi trở lại ASCII và hiển thị, đầu ra)

4tccd

Quy tắc

  1. Mã ngắn nhất sẽ thắng ... đơn giản như vậy ...
  2. Đầu vào có thể thông qua chức năng, bằng lời nhắc hoặc bất cứ điều gì phù hợp với bạn, miễn là bạn có thể làm cho Quy tắc 1 "hoạt động" cho bạn ...;)
  3. Tôi không phải là người có khả năng đảo ngược, miễn là bạn có thể làm cho mã làm những gì tôi đã yêu cầu, tôi sẽ rất vui ...

May mắn nhất!


3
Chúng tôi có quan tâm rằng đây không phải là một quá trình đảo ngược? Khi sự dịch chuyển bit được thực hiện, bit có ý nghĩa nhỏ nhất về cơ bản bị vứt đi.
Sammitch

1
Tôi nhận 0 1 1 0 1 1 0 10 1 1 0 1 0 0 1chomi
bến tàu

2
Tôi luôn tự hỏi bài hát đó nói về điều gì ...
boothby

2
Các quy tắc không làm điều đó, phải không? Ví dụ: Pbiến thành giá trị byte 235và trừ đi 95cho bạn 140. Vẫn không thể in được. Hay tôi hiểu lầm?
Darren Stone

2
Hãy cẩn thận thay đổi các quy tắc. Bạn có rất nhiều câu trả lời phù hợp với định nghĩa hiện tại của bạn.
Darren Stone

Câu trả lời:


5

APL  50  45

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

Đưa đầu vào trên bàn phím, ví dụ:

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

Tôi đã tự do cải thiện câu trả lời của bạn xuống còn 45 (đang chờ phê duyệt chỉnh sửa.) Mất quá nhiều từ bạn để đăng nó thành của riêng tôi
Tobia

4

GolfScript 43 38 35

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

Giải thích: Đối với mỗi ký tự trong chuỗi, chúng tôi sẽ làm như sau:

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

Sử dụng:

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

Nhờ sự giúp đỡ từ PeterTaylor.


Thông minh, và cho đến nay bạn đang dẫn đầu!
WallyWest

Tôi thường thấy rằng cách tốt nhất để có được một số chữ số được đảm bảo khi tôi thực hiện chuyển đổi cơ sở là thêm một giá trị phù hợp trước đó. Tức là thay vì 2base{0\+.,9<}donó sẽ được 512+2base(;. Cũng lưu ý rằng nếu mục đích chỉ là lấy đầu ra chính xác, bạn có thể sắp xếp lại các thao tác, thay vì {!}%bạn chỉ cần ~nhập vào trước khi chuyển đổi cơ sở (và sau đó thay thế 512+bằng 511&).
Peter Taylor

Cảm ơn @PeterTaylor - thủ thuật 512 là hoàn hảo! Tuy nhiên, theo tinh thần của câu hỏi, tôi nghĩ chúng ta nên thay đổi chút ít trước khi phủ nhận.
Ben Reich

Nếu bạn tính 2/là một chút thay đổi thì bạn vẫn có thể thay đổi bit, sau đó ~, sau đó chuyển đổi cơ sở ...
Peter Taylor

@PeterTaylor Tôi thích nó! Cảm ơn đã giúp đỡ.
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


1

Ruby, 115

Mục này là dài không cạnh tranh. Vì vậy, tôi sẽ đi với, "nhưng bạn có thể đọc nó!" :-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}*''

Đọc từ stdin:

missy
4tccd

1

Con trăn 2.7, 106

Một câu trả lời khá dài khác, nhưng đây là lần thử đầu tiên của tôi:

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

Được sửa đổi dựa trên ý kiến ​​của Darren Stone và grc bên dưới ...


Bạn có thể thả không gian sau a:.
Darren Stone

Bạn có thể thay thế chrbiểu thức cuối cùng của mình bằng biểu thức này để tiết kiệm 1 ký tự khác : chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone

print'\b%c'%(x+95*((x<32)-(x>126))),
Ngắn

1

Con trăn 2.7 - 73 86

Nhờ sự thay đổi trong các quy tắc, tôi đã tìm thấy một cách đơn giản hơn nhiều để thực hiện tất cả bằng cách sử dụng thao tác nhị phân và số nguyên. Điều này giúp tiết kiệm không gian trên Quirlioms bằng cách không cần một biến tạm thời:

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

Và trong mẫu giải thích:

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
  ),
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.