Міссі Еліот, байти XKCD та ASCII


9

Натхненний наступним коміксом XKCD:

введіть тут опис зображення

У «Місі Елліот» «Робота це» частина хору звучить так:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

Враховуючи це, я пропоную наступний виклик коду для гольфу:

Створіть такий код, щоб:

  1. Бере 8-бітний вхід ASCII від 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

(Відкладіть свою річ ... Побіто)

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
Чи нас хвилює, що це не оборотний процес? Коли виконується зсув бітів, найменш значимий біт по суті викидається.
Саммітч

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. Досі не друкується. Або я неправильно розумію?
Даррен Стоун

2
Будьте уважні, змінюючи правила. У вас є багато поданих відповідей, які відповідають вашому поточному визначенню.
Даррен Стоун

Відповіді:


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 (очікуючи на затвердження редагування.) У вашому знадобилося занадто багато, щоб опублікувати її як власну
Тобія

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&).
Пітер Тейлор

Дякуємо @PeterTaylor - хитрість 512 ідеально! В дусі питання, проте, я думаю, що ми повинні трохи змінитись перед тим, як заперечувати.
Бен Рейх

Якщо ви рахуєте 2/як трохи зсув, то ви все ще можете трохи змінити, а ~потім перетворити базу ...
Пітер Тейлор

@PeterTaylor Мені це подобається! Дякую за допомогу.
Бен Рейх

3

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

Рубі, 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

Пітон 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))),

Змінено на основі коментарів Даррена Стоун та GRC нижче ...


Ви можете скинути простір після a:.
Даррен Стоун

Ви можете замінити своє остаточне chrвираження з цим ще економією 1 символьними: chr(x-(95,(-95,0)[x>32])[x<126]).
Даррен Стоун

Трохи коротше:print'\b%c'%(x+95*((x<32)-(x>126))),
grc

1

Пітон 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
  ),
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.