Missy Elliot, XKCD และ ASCII Bytes


9

แรงบันดาลใจจากการ์ตูน XKCD ต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ใน Missy Elliot's "ทำงานมัน" ส่วนหนึ่งของคอรัสจะเป็นดังนี้:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

จำไว้ว่าในใจฉันขอเสนอการแข่งขันกอล์ฟรหัสต่อไปนี้:

สร้างรหัสตามลำดับ:

  1. รับอินพุต ASCII 8 บิตจาก STDIN เช่นn(Hex 6E หรือ Bin 01101110)
  2. เลื่อน 8 บิตของแต่ละไบต์ลงไปในระดับ 1 บิต (ฉันเชื่อว่ามันเรียกว่าการเลื่อนบิตล่าง) เช่น01101110จะกลายเป็น00110111("วางสิ่งที่ฉันลง");
  3. แปลงบิตของแต่ละไบต์เช่น00110111กลายเป็น11001000("พลิก");
  4. ฝืนบิตสำหรับแต่ละไบต์เช่น11001000กลายเป็น00010011 ("ย้อนกลับ");
  5. หากค่าของไบต์น้อยกว่า 32 ให้ดำเนินการ(95 + [byte value])หรือกล่าวอีกนัยหนึ่ง(126-(31-[byte value]))เป็นไบต์ก่อนที่จะแปลงกลับเป็น ASCII ... หากค่าไบต์ยังคงน้อยกว่า 32 ให้ทำซ้ำขั้นตอนที่ 5
  6. หากค่าของไบต์มีค่ามากกว่า 126 ให้ดำเนินการ([byte value] - 95)หรือกล่าวอีกนัยหนึ่ง(32+([byte value]-127))เป็นไบต์ก่อนที่จะแปลงกลับเป็น ASCII ... หากค่ายังคงมากกว่า 126 ให้ทำซ้ำขั้นตอนที่ 6
  7. แสดงสตริงที่แปลงใหม่เป็น ASCII

ตัวอย่างของการใช้งานโค้ดนี้:

(อินพุตมันคุ้มค่าหรือไม่)

workit missy ("missy" เป็นอินพุต "workit" เป็นฟังก์ชัน)

ตอนนี้อยู่เบื้องหลัง ...

(ให้ฉันทำงาน ... เป็นไบนารี)

01101101 01101001 01110011 01110011 01111001

(วางของฉันลง ... Bitwise)

00110110 00110100 00111001 00111001 00111100

(...กลับมัน...)

11001001 11001011 11000110 11000110 11000011

(... และย้อนกลับ!)

10010011 11010011 01100011 01100011 11000011

(แปลงกลับเป็นทศนิยม)

147 211 99 99 195

(ดำเนินการทางคณิตศาสตร์ที่จำเป็น)

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

(แปลงกลับเป็น ASCII และจอแสดงผลเอาต์พุต)

4tccd

กฎระเบียบ

  1. รหัสที่สั้นที่สุดชนะ ... ง่ายเหมือนที่ ...
  2. อินพุตสามารถทำได้ผ่านฟังก์ชั่นโดยทันทีหรืออะไรก็ตามที่เหมาะกับคุณตราบใดที่คุณสามารถทำให้กฎ 1 "ทำงานได้" สำหรับคุณ ... ;)
  3. ฉันไม่ได้กลับตัวได้ตราบใดที่คุณสามารถทำให้โค้ดทำสิ่งที่ฉันขอให้ทำฉันจะมีความสุข ...

ขอให้โชคดี!


3
เราสนใจไหมว่านี่ไม่ใช่กระบวนการย้อนกลับได้? เมื่อทำการเปลี่ยนบิตบิตที่สำคัญน้อยที่สุดจะถูกโยนทิ้งไป
Sammitch

1
ฉันได้รับ0 1 1 0 1 1 0 1และ0 1 1 0 1 0 0 1สำหรับmi
marinus

2
ฉันสงสัยอยู่เสมอว่าเพลงนั้นเกี่ยวกับอะไร
บูธโดย

2
กฎไม่ได้ทำอย่างนั้นพวกเขา? ตัวอย่างเช่น: Pกลายเป็นค่าไบต์235และลบใบคุณมี95 140ยังไม่สามารถพิมพ์ได้ หรือฉันเข้าใจผิด?
Darren Stone

2
ระวังการเปลี่ยนแปลงกฎ คุณมีคำตอบที่ส่งจำนวนมากซึ่งสอดคล้องกับคำจำกัดความปัจจุบันของคุณ
Darren Stone

คำตอบ:


5

APL  50  45

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

รับอินพุตบนคีย์บอร์ดเช่น:

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

ฉันใช้เสรีภาพในการปรับปรุงคำตอบของคุณเป็น 45 (รอการอนุมัติการแก้ไข) มันใช้เวลามากเกินไปที่จะโพสต์เป็นของฉันเอง
Tobia

4

GolfScript 43 38 35

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

คำอธิบาย: สำหรับอักขระแต่ละตัวในสตริงเราจะทำสิ่งต่อไปนี้:

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

การใช้งาน:

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

ขอบคุณที่ช่วยจาก PeterTaylor


ฉลาดและจนถึงตอนนี้คุณก็เป็นผู้นำ!
WallyWest

ฉันมักจะพบว่าวิธีที่ดีที่สุดในการรับจำนวนหลักที่รับประกันเมื่อฉันทำการแปลงฐานคือการเพิ่มค่าที่เหมาะสมไว้ล่วงหน้า คือแทนที่จะมันจะเป็น2base{0\+.,9<}do 512+2base(;นอกจากนี้โปรดทราบว่าหากความตั้งใจเพียงเพื่อให้ได้ผลลัพธ์ที่ถูกต้องคุณสามารถจัดลำดับการดำเนินการใหม่ได้ดังนั้นแทนที่จะ{!}%ต้อง~ป้อนข้อมูลก่อนการแปลงฐาน (และแทนที่512+ด้วย511&)
Peter Taylor

ขอบคุณ @PeterTaylor - เคล็ดลับ 512 ข้อนั้นสมบูรณ์แบบ! แต่ด้วยจิตวิญญาณของคำถามฉันคิดว่าเราควรเปลี่ยนไปเล็กน้อย
Ben Reich

ถ้าคุณนับ2/เป็นกะบิตแล้วคุณยังสามารถกัดกะแล้ว~แล้วฐานแปลง ...
ปีเตอร์เทย์เลอร์

@PeterTaylor ฉันชอบมัน! ขอบคุณสำหรับความช่วยเหลือ
Ben Reich




1

ทับทิม, 115

รายการนี้มีความยาวแบบไม่ต่อเนื่อง ดังนั้นฉันจะไปด้วย "แต่คุณสามารถอ่านได้!" :-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}*''

อ่านจากstdin:

missy
4tccd

1

Python 2.7, 106

อีกคำตอบที่ค่อนข้างยาว แต่นี่เป็นครั้งแรกที่ฉันลอง:

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

แก้ไขตามความคิดเห็นของ Darren Stone และ grc ด้านล่าง ...


a:คุณสามารถวางพื้นที่หลัง
Darren Stone

คุณสามารถแทนที่สุดท้ายของคุณchrแสดงออกกับเรื่องนี้อีกเงินฝากออมทรัพย์ 1 chr(x-(95,(-95,0)[x>32])[x<126])ถ่าน:
Darren Stone

สั้นกว่านี้เล็กน้อย:print'\b%c'%(x+95*((x<32)-(x>126))),
grc

1

Python 2.7 - 73 86

ขอบคุณการเปลี่ยนแปลงกฎฉันพบวิธีที่ง่ายกว่ามากในการทำสิ่งนี้ทั้งหมดโดยใช้การจัดการแบบไบนารีและจำนวนเต็ม สิ่งนี้ช่วยประหยัดพื้นที่บน Quirlioms โดยไม่ต้องการตัวแปรชั่วคราว:

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

และในรูปแบบคำอธิบาย:

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
  ),
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.