二重文字のステガノグラフィ


19

ステガノグラフィは、特定のキャリア内の特定のメッセージを隠し、疑わしく見えないパッケージを作成します。このチャレンジでは、入力としてASCIIメッセージとASCIIキャリアを使用するプログラムを作成し、メッセージに対応する文字が2倍になることを除いて、キャリアと同じパッケージを返すか印刷します。メッセージ。

ルール:

  1. キャリアにすでに同じ文字のシーケンスが複数回含まれており、それらがメッセージの文字のエンコードに使用されていない場合、プログラムはそれらを単一の文字に減らします。
  2. 運送業者にメッセージ文字が正しい順序で含まれていない場合、プログラムは何も返さないか、運送業者自体、またはエラーを返します。
  3. メッセージとキャリアが空ではないASCII文字列であると想定できます。
  4. 大文字と小文字の区別:Aはaと同等ではありません。
  5. 複数のパッケージが有効な場合、プログラムはそれらの一部またはすべてを出力できます。
  6. スペースは、他の文字と同様の文字です。

テストケース:

メッセージキャリアパッケージ
「こんにちは」「到着しましたか?」「やったー?」または「それは実現しましたか?」
「先生」「届いたの?」「どうした?」
「foo」「届いたの?」「」または「届きましたか?」またはエラー。
「車」「猫はかっこいい」「CCaats arre col。」
「車」「猫はかっこいい」「」または「猫はクールです。」またはエラー。
「ソファ」「ソファ」「CCoouucchh」
「oo」「oooooooooo」「oooo」
「おお」「おおおおおあ」「おおおお」

これはコードゴルフであるため、最も少ないバイトが勝ちます。


5
全く疑わない...:P
Quintec

である"oooo oa"(2つのスペースで)最後のテストケースのための有効な出力?
アーナルド

3
パッケージ内の2文字の順序は、メッセージ内の文字の順序と一致する必要があるため、有効な出力ではありません。メッセージには、「o」、「」、「o」がありますが、パッケージにはoの後にスペースがあります
jkpate

ああ、それは理にかなっています。
アーナルド

1
いいえ。この規則の背後にある私の理由は、解決策がない場合のプログラムの出力は、解決策が不可能であることを明確にする必要があるということです。3つの許可された出力は明確ですが、重複排除された場合にはより広範なチェックが必要になります。
jkpate

回答:


5

ゼリー、28 バイト

ẹⱮŒp<ƝẠ$ƇṪ
nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç?

フルプログラム撮影carrier及びmessage結果を印刷するコマンドライン引数として
(非パック可能についてmessage印刷不変carrier)。

オンラインでお試しください!または、テストスイートを参照してください。

どうやって?

ẹⱮŒp<ƝẠ$ƇṪ - Link 1, helper function to find the indices to double: carrier, message
           -                               e.g. "programming", "rom"
 Ɱ         - map across message with:
ẹ          -   indices of                       [[2,5], [3], [7,8]]
  Œp       - Cartesian product                  [[2,3,7],[2,3,8],[5,3,7],[5,3,8]]
        Ƈ  - filter keep if:
       $   -   last two links as a monad:
     Ɲ     -     for neighbours:
    <      -       less than?                    [1,1]   [1,1]   [0,1]   [0,1]
      Ạ    -     all truthy?                     1       1       0       0
           -                                    [[2,3,7],[2,3,8]]
         Ṫ - tail (if empty yields 0)                    [2,3,8]

nƝ+çṬ¥a⁸ḟ0Ḥç¦ð¹ç? - Main Link: carrier, message
                ? - if...
               ç  - ...condition: last Link (the helper function) as a dyad
             ð    - ...then: perform the dyadic chain to the left (described below)
              ¹   - ...else: do nothing (yields carrier)
                  - (the then clause:)
 Ɲ                - for neighbours in the carrier
n                 - not equal?
     ¥            - last two links as a dyad:
   ç              -   call last Link (the helper function) as a dyad
    Ṭ             -   untruth (e.g. [2,5] -> [0,1,0,0,1])
  +               - add (vectorises)
      a⁸          - logical AND with carrier
        ḟ0        - filter out zeros
            ¦     - sparse application...
           ç      - ...to indices: call last Link (the helper function) as a dyad
          Ḥ       - ...do: double (e.g. 'x' -> 'xx')

3

JavaScript(ES6)、71バイト

入力をとして受け取ります(message)(carrier)

s=>g=([c,...C],p)=>c?(c==s[0]?(s=s.slice(1),c)+c:p==c?'':c)+g(C,c):s&&X

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


代替バージョン、66バイト

メッセージを文字の配列として取得できる場合:

s=>g=([c,...C],p)=>c?(c==s[0]?s.shift()+c:p==c?'':c)+g(C,c):s+s&&X

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


編集:非再帰バージョンから再帰バージョンに切り替えるときにコードを削除するのを忘れていたことに気付いた@tshに感謝します。


p=pはパラメーターによって渡されるため、削除できます。
tsh

@tshおっと。削除するのを忘れたのは、以前の非再帰バージョンからの残余コードです。ありがとうございました!
アーナルド

2

ハスケル、124 121 107 101 97 95 90バイト

(#).(++"ü")
"ü"#[]=[]
p@(m:n)#e@(c:d)|m/=c=c:p#snd(span(==c)d)|m==n!!0=m:m:n#d|1<2=m:n#e

キャリアにメッセージが含まれていない場合、「網羅的でないパターン」例外を発生させます。

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

編集:@ライコニのおかげで-5バイト。


ケースを切り替えるとドロップできるようになると思いますm==cオンラインで試してみてください!
ライコニ

1

Retina 0.8.2、67バイト

+`(.)(\1*)\1*(.*¶)(?(\1)(\1(\2)))(.*)$(?!¶)
$1$4$5¶$3$6
M!s`.*¶$
¶

オンラインでお試しください!最初の行にキャリアを、2行目にメッセージを受け取ります。説明:

+`(.)(\1*)\1*(.*¶)(?(\1)(\1(\2)))(.*)$(?!¶)
$1$4$5¶$3$6

キャリアの1つ以上の同一の文字のプロセス実行。メッセージ内に同じ文字が1つ以上連続している場合は、2つの連続のうち短い方を重複して出力に追加します。それ以外の場合は、キャリアの1文字を出力に追加します。出力文字の各実行は、入力と区別するために改行で終了します。(?!¶)キャリアを考えから端防止における正規表現は、メッセージが排出されると、のような通常のメッセージである$場合に一致させる¶$一致します。

M!s`.*¶$

メッセージが完全にエンコードされていない場合はすべて削除します。

出力から改行を削除します。


私はそれが最後から2番目のテストケースに合格しないと思います(公平のために、私は最初の投稿にはありませんでした)。
jkpate

@jkpateそれを指摘してくれてありがとう。アプローチを少し書き直さなければなりませんでした。
ニール

0

クリーン、118バイト

import StdEnv,StdLib
$[][]=[]
$[u:v]b#(_,w)=span((==)u)v
|b%(0,0)==[u]=[u,u: $if(v%(0,0)<>b%(1,1))w v(tl b)]=[u: $w b]

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

最初に運送業者、次にメッセージを受け取ります。

Run time error, rule '$;2' in module 'main' does not matchメッセージが収まらない場合のエラー。


0

ルビー、73バイト

f=->m,c,b=p{x,*c=c;x ?(x==m[0]?x+m.shift: x==b ?'':x)+f[m,c,x]:m[0]?x:''}

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

再帰関数。入力を文字の配列として受け取ります。

かつてsqueeze、同じキャラクターの連続した実行を単一のインスタンスに縮小するRubyの組み込みメソッドを利用したいと思っていました。しかし、残念ながら、最後の2つのテストケースはすべてをひどくねじ込んだため、まったく異なるアプローチに頼らなければならず、これは基本的にArnauldの答えの移植であることが判明しました。


0

Powershell、134バイト

param($m,$c)$c-csplit"([$m])"|%{$i+=$o=$_-ceq$m[+$i]
if($o-or$_-cne"`0$h"[-1]){$h+=($_-replace'(.)(?=\1)')*($o+1)}}
$h*!($i-$m.Length)

empty stringキャリアにメッセージ文字が正しい順序で含まれていない場合、スクリプトはを返します。

ゴルフの少ないテストスクリプト:

$f = {

param($message,$carrier)
$carrier-csplit"([$message])"|%{                # split by chars of the message, chars itself included ([])
    $offset=$_-ceq$message[+$i]                 # 0 or 1 if current substring is a current message char (case-sensitive equality)
    $i+=$offset                                 # move to next message char if need it
    if($offset-or$_-cne"`0$h"[-1]){             # condition to remove redundant doubles after message char: arrrived -> arrived, ooo -> oo, etc
                                                # `0 to avoid exception error if $h is empty
        $h+=($_-replace'(.)(?=\1)')*($offset+1) # accumulate a double message char or a single substring without inner doubles: arried -> arived, anna -> ana, etc
    }
}
$h*!($i-$message.Length)                        # repeat 0 or 1 times to return '' if the carrier does not contain the message characters in the right order

}

@(
    ,('hi'         ,'has it arrived?'    ,'hhas iit arived?', 'hhas it ariived?')
    ,('hi?'        ,'has it arrived?'    ,'hhas iit arived??', 'hhas it ariived??')
    ,('sir'        ,'has it arrived?'    ,'hass iit arrived?')
    ,('foo'        ,'has it arrived?'    ,'')
    ,('Car'        ,'Cats are cool.'     ,'CCaats arre col.')
    ,('car'        ,'Cats are cool.'     ,'')
    ,('Couch'      ,'Couch'              ,'CCoouucchh')
    ,('oo'         ,'oooooooooo'         ,'oooo')
    ,('o o'        ,'oooo oooa'          ,'oo  ooa')
    ,('er'         ,'error'              ,'eerorr', 'eerror')
    ,('a+b'        ,'anna+bob'           ,'aana++bbob')
) | % {
    $message,$carrier,$expected = $_
    $result = &$f $message $carrier
    "$($result-in$expected): $result"
}

出力:

True: hhas iit arived?
True: hhas iit arived??
True: hass iit arrived?
True:
True: CCaats arre col.
True:
True: CCoouucchh
True: oooo
True: oo  ooa
True: eerror
True: aana++bbob

0

C(gcc)、69 + 12 = 81バイト

g(char*m,char*_){for(;*_;++_)*m-*_?_[-1]-*_&&p*_):p p*m++));*m&&0/0;}

コンパイル(12バイト)

-Dp=putchar(

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

g(char*m,char*_){
    for(;*_;++_)        //step through _
        *m-*_?          //check if character should be encoded
            _[-1]-*_&&  //no? skip duplicates
                p*_)    //    print non-duplicates
        :p p*m++));     //print encoded character twice
    *m&&0/0;            //if m is not fully encoded, exit via Floating point exception
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.