미시 엘리엇, 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

(십진수로 다시 변환)

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 10 1 1 0 1 0 0 1mi
스 marinus

2
나는 항상 그 노래가 무엇인지 궁금했습니다.
boothby

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 트릭이 완벽합니다! 질문의 정신에서, 나는 우리가 부정하기 전에 조금 교대해야한다고 생각합니다.
Ben Reich

2/비트 시프트로 계산 하면 여전히 비트 시프트를 수행 한 ~다음 기본 변환 을 수행 할 수 있습니다 .
Peter Taylor

@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

루비, 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

파이썬 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
  ),
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.