Missy Elliot, XKCD и ASCII Bytes

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, то перед преобразованием обратно в ASCII выполните (95 + [byte value])или, другими словами, (126-(31-[byte value]))на байте ... Если значение байта все еще меньше 32, повторите шаг 5
  6. Если значение байта больше 126, то перед преобразованием обратно в ASCII выполните ([byte value] - 95)или, другими словами, (32+([byte value]-127))в байте ... Если значение все еще больше 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
Нам важно, что это не обратимый процесс? Когда выполняется сдвиг битов, младший бит по существу выбрасывается.
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. Все еще непечатно. Или я неправильно понял?
Даррен Стоун
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 (в ожидании одобрения редактирования.) От вас потребовалось слишком много, чтобы опубликовать его как свой собственный
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&).
Питер Тейлор
Спасибо @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"
tmartin
источник
2

J - 61

u:-&95^:(>&126)"0+&95^:(<&32)"0#.|."1(1-0,0,}:)"1#:3&u:1!:1[1
missy
4tccd
рассекать
источник
2

J, 55 54 символов

u:+/(*126&>*.32&<)_95 0 95+/#.|."1#:255-<.-:a.i.1!:1[1
Gareth
источник
Муй импрессиво!
WallyWest
1

Руби, 115

Эта запись неконкурентно длинна. Так что я пойду с ", но вы можете прочитать это!" :-П

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

Модифицировано на основе комментариев Даррена Стоуна и grc ниже ...

Sinkingpoint
источник
Вы можете оставить место после a:.
Даррен Стоун
Вы можете заменить свое окончательное chrвыражение с этим еще экономией 1 символьными: chr(x-(95,(-95,0)[x>32])[x<126]).
Даррен Стоун
Немного короче: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
  ),

источник