문자열에서 비트로의 전환


10

직무

코드 포인트가 0-128 (제외) 인 하나 이상의 ASCII 문자 입력 문자열이 제공되면 다음을 수행하십시오.

  1. 각 문자를 7 비트 ASCII 코드로 변환하십시오 (ASCII 코드가 7 비트 미만인 경우 선행 0 비트를 넣으십시오)
  2. 모든 비트를 연결합니다 (이 7*n경우 n문자 수인 비트가 생성됨 )
  3. 이 비트 스트림의 각 비트에 대해 이전 비트와 다른 경우 1을 인쇄하고 그렇지 않으면 0을 인쇄하십시오. 첫 번째 출력 비트는 항상 1입니다.

입력:

Hi

산출:

11011001011101

설명:

문자열 "Hi"에는 ASCII 코드가 있습니다

72 105

비트 단위는 다음과 같습니다.

1001000 1101001

그리고 전환 비트 표시기 :

11011001011101

이것은 코드 골프입니다. 가장 낮은 바이트 수가 이깁니다.

테스트 사례

테스트 사례 1 :

Hello World!
110110010101110011010101101010110001110000111110000110000001011101101010101100110001

테스트 사례 2 :

%% COMMENT %%
1110111111011111100001100010010100001010110101011010011101010011111110011000001101111110111

테스트 사례 3 (Luis Mendo의 신용) :

##
11100101110010

MATL에서 9 바이트의 가장 짧은 솔루션을위한 Luis Mendo에게 축하를 전합니다!


2
제안 된 테스트 사례 ##(리딩 0비트; 현재 일부 답변이 실패하기 때문에)
Luis Mendo

4
이것이 어떻게 맨체스터 인코딩 문제의 복제본입니까? 뭔가 빠졌습니까?
gastropner

2
다른 과제는 각 입력 '1'을 '01'로 변환하고 각 입력 '0'을 '10'으로 변환하여 비트의 입력 스트림을 이중 속도 출력 스트림으로 변환하는 것 입니다. 내 의견으로는 속지 마십시오. 많은 사람들이 위의 @gastropner의 의견을 찬성했다면 나는 속임수를 풀 수 있습니다 (또는 그 능력을 가진 다른 사용자)
Luis Mendo

1
@Shaggy : 두 테스트 사례 모두 공백을 포함하며 공백은 단일 비트 세트 만 있고 7 번째는 아닙니다. 따라서 문제 설명이 각 ASCII 코드의 길이가 정확히 7 비트임을 보장한다고 생각하지 않습니다.
재귀

1
@SmileAndNod 두 번째 생각에 빈 문자열을 처리 할 필요가 없다고 생각합니다.
justhalf

답변:


4

MATL , 9 바이트

Hj7&B!hdg

온라인으로 사용해보십시오!

설명

H     % Push 2
j     % Read line of input, unevaluated
7&B   % Convert to binary with 7 bits. Gives a 7-column matrix
!     % Transpose
h     % Concatenate horiontally. The matrix is read in column-major order
d     % Consecutive differences
g     % Convert to logical. Implicitly display

1
지금까지 가장 짧습니다. +1. 연속적인 차이점을 위해 내장 기능을 사용하는 것이 재미 있습니다.
justhalf


4

Japt -P , 11 바이트

0수학 또는이 경우 비트 연산을 수행하려고 할 때 JavaScript에서 공백을 강제 할 수 있다는 사실을 이용 합니다.

c_¤ù7Ãä^ i1

사용해 보거나 모든 테스트 사례를 실행하십시오.

c_¤ù7Ãä^ i1     :Implicit input of string
c_              :Map codepoints
  ¤             :  Convert to binary string
   ù7           :  Left pad with spaces to length 7
     Ã          :End map
      ä^        :XOR consecutive pairs
         i1     :Prepend 1
                :Implicitly join and output

7 비트는 32 자 (공백 문자의 경우)가임을 의미합니다 0100000. 또한 % 문자 (37)는 다음과 같습니다0100101
Justhalf

지금 작동하고 있습니다. +1
justhalf

2

CJam , 21 바이트

1q{i2b7Te[}%e__(;.^);

온라인으로 사용해보십시오!

설명

샘플 입력이있는 스택 표시 5:

1 q      e# Push 1 and then the whole input: 1 "5"
{
  i      e# Convert to its char code: 1 [53]
  2 b    e# Convert to binary: 1 [[1 1 0 1 0 1]]
  7 T e[ e# Left-pad with 0 to length 7: 1 [[0 1 1 0 1 0 1]]
} %      e# Map this block over every character in the string
e_       e# Flatten array: 1 [0 1 1 0 1 0 1]
_ ( ;    e# Duplicate array and remove its first element: 1 [0 1 1 0 1 0 1] [1 1 0 1 0 1]
. ^      e# Element-wise xor: 1 [1 0 1 1 1 1 1]
) ;      e# Remove and pop the last element of the array: 1 [1 0 1 1 1 1]
         e# Stack implicitly printed: 1101111

비트가 이전 비트와 다른지 확인하기 위해 첫 번째 요소없이 비트 배열과 비트 배열 사이에 벡터 (요소 단위) xor를 수행합니다. 또한 항상 더 긴 배열의 마지막 비트는 변경되지 않기 때문에 결과의 마지막 비트를 제거합니다.


2

APL (Dyalog Unicode) , 16 바이트 SBCS

전체 프로그램. stdin에서 문자열을 프롬프트합니다.

1,2≠/∊1↓¨11DR¨⍞

온라인으로 사용해보십시오!

 입력 프롬프트 ( "콘솔에서 인용 부호")

11⎕DR¨ 비트 부울 각 문자를 변경 D ATA R epresentation

1↓¨ 각각에서 첫 번째 비트를 삭제

ε NLIST (편평한)

2≠/ 쌍별 차이

1, 하나를 더하다



2

, 25 바이트

⭆θ◧⍘℅鲦⁷←Wⅈ←I﹪⍘KD²←01 ²1

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

⭆θ◧⍘℅鲦⁷←

모든 문자를 이진수로 변환하고 길이를 7로 채운 다음 인쇄합니다. 그러나 커서는 마지막 숫자 위에 둡니다.

Wⅈ

커서가 첫 번째 숫자 위에 올 때까지 반복하십시오.

←I﹪⍘KD²←01 ²

숫자가 다른지 계산하고 각 숫자를 차이로 덮어 씁니다.

1

첫 번째 숫자를 a로 덮어 씁니다 1.






1

다트 , 213168 바이트

f(s,{t,i}){t=s.runes.map((r)=>r.toRadixString(2).padLeft(7,'0')).join().split('').toList();for(i=t.length-1;i>0;i--)t[i]=t[i]==t[i-1]?'0':'1';t[0]='1';return t.join();}

이전 원 라이너

f(String s)=>'1'+s.runes.map((r)=>r.toRadixString(2).padLeft(7,'0')).join().split('').toList().reversed.reduce((p,e)=>p.substring(0,p.length-1)+(p[p.length-1]==e?'0':'1')+e).split('').reversed.join().substring(1);

온라인으로 사용해보십시오!

이 장황함과 쉬운 내장 기능의 부족은 실제로 이것을 죽입니다. 그래도 하나의 라이너를 당겨 관리했습니다.

  • 하나의 라이너를 사용하지 않고 for 루프를 사용하여 -45 바이트


1

코 틀린 , 182 바이트

var l='6'
fun f(b:String)=b.fold(""){t,i->t+"".a(i.toInt())}.map{if(l==it){l=it;0} else {l=it;1}}
fun String.a(v:Int):String=if(v<=0)"${this}0".reversed() else "${this}${v%2}".a(v/2)

온라인으로 사용해보십시오!

잘만되면 나는 이것을 곧 개선 할 수있다. 나는 개선의 여지가있을 것 같은 느낌이 들지만 지금은 생각할 수 없다



1

C (gcc (MinGW)), 90 바이트

를 제공하는 컴파일러가 필요합니다 itoa().

n[9],b,c;f(char*s){for(b=*s<64;c=*s++;printf("%07s",itoa((c^c/2)&127,n,2)))c|=b<<7,b=c&1;}


1

루비 -p , 50 바이트

gsub(/./){"%07b"%$&.ord}
gsub(/./){$`=~/#$&$/?0:1}

온라인으로 사용해보십시오!

설명

첫 번째 줄은 Value Ink의 답변 과 동일합니다 .

gsub(/./){       $&    }   # Replace each character $&…
                   .ord    # …with its ASCII code…
                %          # …formatted as…
          "%07b"           # …binary digits padded to 7 places.

두 번째 줄 :

gsub(/./){      $&      }  # Replace each character $&…
          $`               # …if the text to its left…
            =~             # …matches…
              /#  $/       # …the Regexp /c$/ where "c" is the character…
                    ?0:1   # …with 0, or 1 otherwise.

루비에서는 예를 들어 정규 표현식 리터럴에 보간 사용할 수 있습니다 /Hello #{name}/, 그리고 시작 변수 $또는 @당신은 예 : 그렇다면, 중괄호를 생략 할 수 $&있다 "0"grawlixy 다음 /#$&$/이된다 /0$/.


1

K (ngn / k) , 9 13 바이트

해결책:

~=':,/(7#2)\'

온라인으로 사용해보십시오!

설명:

~=':,/(7#2)\' / the solution
           \' / convert each
      (   )   / do this together
       7#2    / 2 2 2 2 2 2 2
    ,/        / flatten
 =':          / equal to each-previous?
~             / not

노트:

  • 6 비트 문자로만 구성된 문자열을 지원하는 +4 바이트

#예를 들어 이것은 입력 에 실패하는 것 같습니다 (출력에는 6 비트 만 있음)
Luis Mendo

@streetster, 고정 버전을 게시 하시겠습니까?
justhalf

1

이모티콘 코드 , 263 바이트

🏁🍇🔤🔤➡️🖍🆕s🔂b📇🆕🔡👂🏼❗️❗️🍇🍪s🔪🔡🔢b❗️➕128 2❗️1 7❗️🍪➡️🖍s🍉🔤?🔤➡️🖍🆕p🔂b s🍇↪️b🙌p🍇👄🔤0🔤❗️🍉🙅🍇👄🔤1🔤❗️🍉b➡️🖍p🍉🍉

여기에서 온라인으로 사용해보십시오 .

언 골프 드 :

🏁 🍇  💭 Main code block
    🔤🔤 ➡️ 🖍 🆕 s  💭 Start with s as the empty string
    🔂 b 📇 🆕 🔡 👂🏼  💭 For each byte b in the input ...
    ❗️ ❗️ 🍇
        🍪 s  💭 ... append ...
           🔪 🔡 🔢 b ❗️ ➕ 128  💭 ... b + 128 (this gives the leading zero(s) in case the binary representation of b is shorter than 7 digits) ...

                 2  💭 ... in binary ...
              ❗️
              1 7  💭 ... without the leading one ...
           ❗️
        🍪
        ➡️ 🖍 s  💭 ... to s
    🍉
    🔤?🔤 ➡️ 🖍 🆕 p  💭 This will be used as the previous character, by assigning it neither 0 nor 1 we assure the first bit output is always a one
    🔂 b s 🍇  💭 For each character in s:
        ↪️ b 🙌 p 🍇  💭 If it is the same as the previous character ...
            👄 🔤0🔤 ❗️  💭 ... output a zero ...
        🍉 🙅 🍇  💭  ... else ...
            👄 🔤1🔤 ❗️ 💭 ... output a one
        🍉
        b ➡️ 🖍 p  💭 And the current character becomes the new previous character.
    🍉
🍉


1

Python3.8 , 72 바이트

해결책:

lambda a:["10"[a==(a:=x)]for x in"".join(bin(ord(i)+128)[3:]for i in a)]

설명:

파이썬 3.8이 표준 할당 문이 아닌 할당 표현식을 도입 한 이래로, 나는 마지막 항목을 기억해야하는 목록 이해에 그것들을 사용하고 싶었습니다. 이 작업을 수행하는 가장 좋은 방법은 아니지만 할당 식을 사용하는 흥미로운 방법을 보여줍니다.

이 코드는 변환 할 문자열 인 필수 인수를 취하는 람다 함수를 만듭니다. 호출되면 함수는 다음과 같이 진행됩니다. a의 모든 문자는 6 비트 문자를 처리하기 위해 128이 추가 된 문자 코드로 변환됩니다 (이진 표현은 항상 8 비트이며 첫 번째 비트를 잘라낼 수 있습니다). 이 숫자는 이진수로 변환되고 헤더 (0x)와 128을 더한 첫 번째 1은 잘립니다. 그런 다음이 새 문자열은 하나의 큰 문자열로 결합됩니다.

이 새 문자열 (텍스트의 연결된 7 비트 표현이 포함 된)의 각 문자에 대해 문자가 이전 문자와 같은지 확인합니다. 첫 번째 캐릭터는 어떻게 되나요? 첫 번째 결과 문자는 항상 "1"이어야하므로 마지막 문자 변수에있는 것이 "1"도 아니고 "0"도 아닌지 확인해야합니다. 우리는 더 이상 사용하지 않기 때문에 원래 매개 변수를 재사용 하여이 작업을 수행합니다. 원래 문자열이 단일 "0"(단일 "1"이 작동하는 경우) 인 경우 문제가 될 수 있지만이를 무시합니다.

비교하는 동안 이전 문자가 먼저 평가되므로 대입 식을 사용하여 이전 문자 변수를 현재 문자로 설정하면 비교 식의 평가에 영향을 미치지 않습니다.

이 비교는 Python에서 각각 1 또는 0으로도 사용할 수있는 True 또는 False를 생성하므로 문자열에서 "1"또는 "0"을 조회하는 데 사용됩니다.


문자열 형식 리터럴을 사용하여 바이트를 절약 할 수 있습니다 bin(ord(i)+128)[3:].->f"{ord(i):07b}"
movatica

1

TCL , 215 (167) 140 바이트

{{s {B binary} {X ~$w/64}} {join [lmap c [split $s {}] {$B scan $c c w;$B scan [$B format i [expr 2*$w^$w^$X<<7]] B7 r;set X $w;set r}] ""}}

온라인으로 사용해보십시오!

일대일 및 배타적 전환을 사용하거나 전환을 감지합니다. 현재 문자의 lsb를 다음 문자의 msb로 전달합니다. lmap에서 리턴 한 목록을 결합하여 각 문자의 출력을 결합합니다.

초기화 및 반복 명령에서 바이트를 저장하기 위해 기본 인수와 함께 람다를 사용합니다.

작동 순서에 크게 의존합니다. 빈 문자열에서 작동합니다.


1

05AB1E (레거시) , 12 바이트

Çb7jð0:¥ÄJ1ì

이후, 05AB1E의 기존 버전을 사용하여 j암시 적으로 명시 적으로 요구하는 함께 문자열을 결합 J애프터 j05AB1E의 새 버전을.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

Ç             # Convert the (implicit) input-string to a list of ASCII code-points
              #  i.e. "Hi#" → [72,105,35]
 b            # Convert each integer to a binary string
              #  → ["1001000","1101001","100011"]
  7j          # Prepend each with spaces to make them length 7,
              # and join everything together to a single string implicitly
              #  → "10010001101001 100011"
    ð0:       # Replace all those spaces with 0s
              #  → "100100011010010100011"
       ¥      # Get the deltas of each pair of 1s/0s
              #  → [-1,0,1,-1,0,0,1,0,-1,1,-1,0,1,-1,1,-1,0,0,1,0]
        Ä     # Get the absolute value of this
              #  → [1,0,1,1,0,0,1,0,1,1,1,0,1,1,1,1,0,0,1,0]
         J    # Join them all together
              #  → "10110010111011110010"
          1ì  # And prepend a 1
              #  → "110110010111011110010"
              # (after which the result is output implicitly)

1

하스켈 , 137 바이트

import Data.Char
b 0=[]
b n=odd n:b(n`div`2)
d x|x='1'|1<2='0'
c=('1':).map d.(zipWith(/=)<*>tail).concatMap(reverse.take 7.b.(+128).ord)

온라인으로 사용해보십시오!

여기서 가장 큰 문제는 부울 (XOR 결과)을 '0'/ '1'로 변환하는 것입니다.





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