Missy Elliot,XKCD和ASCII字节


9

受到以下XKCD漫画的启发:

在此处输入图片说明

在艾略特小姐的《 Work It》中,部分合唱内容如下:

Is it worth it, let me work it

I put my thing down, flip it and reverse it

考虑到这一点,我提出以下高尔夫挑战代码:

创建按以下顺序执行的代码:

  1. 从STDIN接受8位ASCII输入;例如n(十六进制6E或Bin 01101110)
  2. 将每个字节的8位向下移位1位(我相信这被称为逐位向下移位),例如01101110变为00110111(“放下我的东西”);
  3. 反转每个字节的位,例如00110111变为11001000(“翻转”);
  4. 反转每个字节的位,例如11001000变为00010011 (“ reverse it”);
  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 (“ missit”为输入,“ 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 2014年

1
我得到0 1 1 0 1 1 0 10 1 1 0 1 0 0 1mi
海产

2
我总是这样想知道这首歌是关于...
布思

2
规则不这样做,对吗?例如:P将其转换为字节值,235然后减去95则为140。仍然无法打印。还是我误会了?
达伦·斯通

2
小心更改规则。您提交了很多符合您当前定义的答案。
达伦·斯通

Answers:


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

高尔夫脚本 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<}do512+2base(;。还要注意的是,如果意图是只得到正确的输出,你可以重新排序操作,所以不是{!}%你只需要~输入基本转换之前(再更换512+511&)。
彼得·泰勒

感谢@PeterTaylor-512技巧很完美!但是,本着问题的精神,我认为我们应该在否定之前先有所改变。
Ben Reich 2014年

如果算上2/一个位移,那么仍然可以位移,然后~进行基转换...
Peter Taylor

@PeterTaylor我喜欢!谢谢您的帮助。
Ben Reich 2014年

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

红宝石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:
达伦·斯通

您可以chr以此替换最终表达式,以节省1个字符: chr(x-(95,(-95,0)[x>32])[x<126])
达伦·斯通

简短一点:print'\b%c'%(x+95*((x<32)-(x>126))),
grc 2014年

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
  ),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.