文字列からビットへの移行


10

仕事

コードポイントが0〜128(排他的)である1つ以上のASCII文字の入力文字列が与えられた場合、以下を実行します。

  1. 各文字を7ビットのASCIIコードに変換します(ASCIIコードが7ビット未満の場合は、先行ゼロビットを挿入します)
  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

Luis MendoがMATLで9バイトの最短のソリューションを提供してくれました!


2
推奨されるテストケース##(先行0ビット、そのため現在一部の回答が失敗する)
Luis Mendo

4
これはどのようにマンチェスターエンコーディングチャレンジの複製ですか?何か不足していますか?
ガストロパ

2
もう1つの課題は、ビットの入力ストリームをダブルレート出力ストリームに変換し、各入力「1」を「01」に変換し、各入力「0」を「10」に変換することです。だから私の意見ではだましません。上記の@gastropnerのコメントに多数の人が賛成票を投じた場合、私(またはその機能を持つ他のユーザー)の重複を取り消すことができます
Luis Mendo

1
@Shaggy:両方のテストケースには、7番目ではなく、単一のビットのみが設定されたスペースが含まれます。だから私は問題の文が各ASCIIコードが正確に7ビット長であることを保証しているとは思いません。
再帰的

1
@SmileAndNod考え直して、空の文字列を処理する必要はないと思います。
半分

回答:


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。連続した違いに対応できるのは楽しいことです。
半分


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
ちょうど半分に

それは今働いています。+1
半分

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表現に変更する

1↓¨ それぞれから最初のビットを落とす

ϵ nlist(平坦化)

2≠/ ペアごとの違い

1, 1を付加



2

チャコール、25バイト

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

オンラインでお試しください!リンクはコードの詳細バージョンです。説明:

⭆θ◧⍘℅鲦⁷←

すべての文字をバイナリに変換し、長さ7にパディングしてから印刷しますが、カーソルを最後の桁に置いたままにします。

Wⅈ

カーソルが最初の数字の上に来るまで繰り返します。

←I﹪⍘KD²←01 ²

数字が異なるかどうかを計算し、各数字をその違いで上書きします。

1

最初の桁をで上書きし1ます。


2

PowerShell73 56 49バイト

$args|%{$b=+$_
6..0}|%{+($c-ne($c=($b-shr$_)%2))}

オンラインでお試しください!

-17バイトmazzyのおかげで :)



すばらしいです。自分で投稿する必要があります。
Andrei Odegov

あなたのためのこの答え。私の王女は別の城にいます:))))
マジー

1
@mazzy、さらに-7バイト:)
Andrei Odegov

素晴らしくて素晴らしい!【ツ】
マジー


2

オクターブ36 30バイト

ルイスメンドーのおかげで修正

-Sanchisesのおかげで2バイト

@(a)[1;~~diff(de2bi(a,7)'(:))]

オンラインでお試しください!


あなたはおそらくかなりの数バイトを削ることができますde2bi
Sanchises

@sanchisesの前は機能していませんでしたが、可能な場合はもう一度確認します
期限切れのデータ



1

Dart213 168バイト

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);

オンラインでお試しください!

この冗長性と組み込みの容易さの欠如は、これを本当に殺しています。それでもワンライナーを引っ張ることができました。

  • -45バイト(ワンライナーを使用せず、forループを使用)


1

Kotlin、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

Ruby -p、50バイト

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

オンラインでお試しください!

説明

Value Inkの回答と同じ1行目:

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.

Rubyでは、あなたは、例えば正規表現リテラル、補間を使用することができ/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

ノート:

  • +4バイト。6ビット文字のみで構成される文字列をサポートします。

これは#、たとえば入力では失敗するようです(出力は6ビットのみです)
Luis Mendo

@streetster、固定バージョンを投稿しますか?
半分

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)]

説明:

Python 3.8が(標準の割り当てステートメントではなく)割り当て式を導入して以来、私は最後の項目を覚えておく必要があるリスト内包表記でそれらを使用したいと思っていました。これは最善の方法ではありませんが、代入式を使用する興味深い方法を示しています。

コードは、変換する文字列である必要な引数を取るラムダ関数を作成します。呼び出されると、関数は次のように進行します。aのすべての文字は、6ビット文字を処理するために128が追加された文字コードに変換されます(バイナリ表現は常に8ビットであり、最初のビットを切り捨てることができます)。この数値はバイナリに変換され、ヘッダー(0x)と128の追加からの最初の1は切り落とされます。これらの新しい文字列は、1つの大きな文字列に結合されます。

この新しい文字列(テキストの連結された7ビット表現を含む)の各文字について、その文字が前の文字と同じであるかどうかがチェックされます。最初のキャラクターはどうなりますか?最初の結果文字は常に「1」である必要があるため、最後の文字変数の内容が「1」でも「0」でもないことを確認する必要があります。これを行うには、元のパラメーターをもう使用しないので、これを再利用します。元の文字列が単一の「0」であった場合(単一の「1」がたまたま機能する場合)、これは問題になる可能性がありますが、それは無視します。

比較時には、前の文字が最初に評価されるため、代入式を使用して前の文字変数を現在の文字に設定しても、比較式の評価には影響しません。

比較はTrueまたはFalseを生成し、Pythonではそれぞれ1または0としても使用できるため、文字列の「1」または「0」を検索するために使用されます。


文字列形式のリテラルを使用して、いくつかのバイトを節約できます:bin(ord(i)+128)[3:]->f"{ord(i):07b}"
movatica

1

Tcl215 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}] ""}}

オンラインでお試しください!

遷移を検出するために、shift-by-oneおよびexclusive-orを使用します。現在の文字の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)





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