Missy Elliot, XKCD, dan ASCII Bytes

9

Terinspirasi oleh komik XKCD berikut:

masukkan deskripsi gambar di sini

Dalam "Work It" Missy Elliot, bagian dari paduan suara berbunyi sebagai berikut:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Mengingat hal itu, saya mengusulkan tantangan golf kode berikut:

Buat kode yang sesuai, dalam urutan:

  1. Mengambil input ASCII 8-bit dari STDIN; mis. n(Hex 6E, atau Bin 01101110)
  2. Menggeser 8 bit setiap byte dari level 1 bit (saya percaya ini disebut pergeseran bitwise ke bawah), misalnya 01101110menjadi 00110111("letakkan barang saya");
  3. Menghindari bit setiap byte, misalnya 00110111menjadi 11001000("flip it");
  4. Membalik bit untuk setiap byte, misalnya 11001000menjadi 00010011 ("membalikkannya");
  5. Jika nilai byte kurang dari 32, maka lakukan (95 + [byte value]), atau dengan kata lain (126-(31-[byte value])), pada byte sebelum mengonversi kembali ke ASCII ... Jika nilai byte masih kurang dari 32, ulangi langkah 5
  6. Jika nilai byte lebih besar dari 126, maka lakukan ([byte value] - 95), atau dengan kata lain (32+([byte value]-127)), pada byte sebelum mengkonversi kembali ke ASCII ... JIKA nilainya masih lebih besar dari 126, ulangi langkah 6.
  7. Tampilkan string yang baru dikonversi sebagai ASCII.

Contoh kode ini dalam aksi:

(Masukan, apakah itu layak?)

workit missy ("missy" menjadi input, "workit" adalah fungsinya)

Sekarang di belakang layar ...

(biarkan saya bekerja ... Menjadi biner)

01101101 01101001 01110011 01110011 01111001

(Letakkan barang saya ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(... Balikkan ...)

11001001 11001011 11000110 11000110 11000011

(... Dan balikkan!)

10010011 11010011 01100011 01100011 11000011

(Dikonversi kembali ke Desimal)

147 211 99 99 195

(Lakukan matematika yang diperlukan)

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

(Konversi kembali ke ASCII dan tampilkan, output)

4tccd

Aturan

  1. Kemenangan kode terpendek ... sesederhana itu ...
  2. Input dapat melalui fungsi, dengan prompt atau apa pun yang berfungsi untuk Anda, selama Anda dapat membuat Aturan 1 "berfungsi" untuk Anda ...;)
  3. Saya tidak mengejar reversibilitas, selama Anda dapat membuat kode melakukan apa yang saya minta, saya akan senang ...

Semoga berhasil!

WallyWest
sumber
3
Apakah kita peduli bahwa ini bukan proses yang dapat dibalik? Ketika bit shift dilakukan, bit paling tidak penting pada dasarnya dibuang.
Sammitch
1
Saya dapatkan 0 1 1 0 1 1 0 1dan 0 1 1 0 1 0 0 1untukmi
marinus
2
Saya selalu bertanya-tanya tentang apa lagu itu ...
stan
2
Aturannya tidak melakukan itu, bukan? Misalnya: Pberubah menjadi nilai byte 235dan mengurangkan 95daun Anda dengan 140. Masih tidak patut dicetak. Atau apakah saya salah paham?
Darren Stone
2
Hati-hati mengubah aturan. Anda memiliki banyak jawaban yang dikirimkan yang sesuai dengan definisi Anda saat ini.
Darren Stone

Jawaban:

5

APL  50  45

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

Mengambil input pada keyboard, misalnya:

      ⎕UCS n+95ׯ1++⌿126 31∘.≥n←2⊥⊖~(8/2)⊤⌊.5×⎕UCS⍞
missy
4tccd
marinus
sumber
Saya mengambil kebebasan untuk meningkatkan jawaban Anda menjadi 45 (menunggu persetujuan penyuntingan.) Butuh terlalu banyak dari Anda untuk mengirimkannya sebagai milik saya
Tobia
4

GolfScript 43 38 35

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

Penjelasan: Untuk setiap karakter dalam string, kami akan melakukan hal berikut:

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

Pemakaian:

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

Terima kasih atas bantuan dari PeterTaylor.

Ben Reich
sumber
Pintar, dan sejauh ini Anda memimpin!
WallyWest
Saya biasanya menemukan bahwa cara terbaik untuk mendapatkan jumlah digit yang dijamin ketika saya melakukan konversi basis adalah dengan menambahkan nilai yang sesuai sebelumnya. Yaitu bukannya 2base{0\+.,9<}doitu 512+2base(;. Perhatikan juga bahwa jika tujuannya hanya untuk mendapatkan output yang benar, Anda dapat menyusun ulang operasi, jadi {!}%Anda tidak perlu hanya ~input sebelum konversi basis (dan kemudian ganti 512+dengan 511&).
Peter Taylor
Terima kasih @PeterTaylor - trik 512 sempurna! Namun, dalam semangat pertanyaan, saya pikir kita harus sedikit bergeser sebelum menyangkal.
Ben Reich
Jika Anda menghitung 2/sebagai sedikit pergeseran maka Anda masih dapat menggeser sedikit, lalu ~, lalu konversi basis ...
Peter Taylor
@PeterTaylor Saya suka itu! Terima kasih untuk bantuannya.
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
sumber
2

J - 61

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

J, 55 54 karakter

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

Ruby, 115

Entri ini panjangnya tidak kompetitif. Jadi saya akan pergi dengan, "tetapi Anda bisa membacanya!" :-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}*''

Baca dari stdin:

missy
4tccd
Darren Stone
sumber
1

Python 2.7, 106

Jawaban lain yang agak panjang, tapi hei ini percobaan pertama saya:

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

Dimodifikasi berdasarkan dari Darren Stone dan komentar grc di bawah ...

Sinkingpoint
sumber
Anda dapat menjatuhkan ruang setelah a:.
Darren Stone
Anda dapat mengganti akhir Anda chrekspresi dengan ini selama tabungan 1-char: chr(x-(95,(-95,0)[x>32])[x<126]).
Darren Stone
Sedikit lebih pendek:print'\b%c'%(x+95*((x<32)-(x>126))),
grc
1

Python 2.7 - 73 86

Berkat perubahan aturan saya menemukan cara yang lebih sederhana untuk melakukan ini semua menggunakan manipulasi biner dan integer. Ini menghemat ruang lebih dari Quirlioms dengan tidak memerlukan variabel sementara:

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

Dan dalam bentuk penjelasan:

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

sumber