ミッシーエリオット、XKCD、ASCIIバイト


9

次のXKCDコミックに触発されました。

ここに画像の説明を入力してください

Missy Elliotの「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(Hex 6E、またはBin 01101110)
  2. 1ビットレベル(私はそれはビット単位のシフトダウンと呼ばれると信じて)、例えばダウンシフトの各バイトの8ビットが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

(10進数に変換)

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 1し、0 1 1 0 1 0 0 1ためにmi
マリナス

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 2014年

通常、基本変換を行うときに保証された桁数を取得する最善の方法は、事前に適切な値を追加することです。すなわちそれの代わりに2base{0\+.,9<}doでしょう512+2base(;。また、そうではなく、意図がある場合にのみ、正しい出力を使用すると、操作の順序を変更することができます取得することに注意して{!}%あなただけに必要な~基本変換前入力(そして置き換える512+とし511&)。
Peter Taylor

ありがとう@PeterTaylor-512トリックは完璧です!でも質問の精神では、否定する前に少しシフトすべきだと思います。
ベン・ライヒ

2/ビットシフトとしてカウントする場合は、ビットシフトを行うことができ、次に~、ベースコンバージョン...
Peter Taylor 14年

@PeterTaylor好きです!助けてくれてありがとう。
ベン・ライヒ

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"



1

Ruby、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))),
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
  ),
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.