Çift harfli steganografi


19

Steganografi, belirli bir mesajı belirli bir taşıyıcıya gizleyerek şüpheli görünmeyen bir paket üretir. Bu meydan okuma için, bir ASCII iletisini ve bir ASCII taşıyıcısını girdi olarak alan bir program yazacaksınız ve iletiye karşılık gelen karakterler iki kez göründükleri sırayla iki katına çıkmadan taşıyıcıyla aynı olan bir paketi geri gönderecek veya yazdıracaksınız. mesaj.

Kurallar:

  1. Taşıyıcı zaten bir kereden fazla aynı karakterin dizilerini içeriyorsa ve mesajın bir karakterini kodlamak için kullanılmıyorsa, program bunları tek bir karaktere indirecektir.
  2. Taşıyıcı, mesaj karakterlerini doğru sırada içermiyorsa, program hiçbir şey, operatörün kendisi veya bir hata döndürebilir.
  3. İletinin ve operatörün boş olmayan ASCII dizeleri olduğunu varsayabilirsiniz.
  4. Büyük harf kullanımı önemlidir: A, a ile eşdeğer değildir.
  5. Birden fazla paket geçerli olduğunda, programınız bunlardan herhangi birini veya tümünü çıktısını alabilir.
  6. Uzay, diğer karakterler gibi bir karakterdir.

Test senaryoları:

Mesaj Taşıyıcı Paketi
"merhaba" "geldi mi?" "ne arive mi?" VEYA "ne oldu?"
"efendim" "geldi mi?" "geldi mi?"
"foo" "geldi mi?" "" VEYA "geldi mi?" VEYA bir hata.
"Araba" "Kediler havalı." "CCaats arre col."
"araba" "Kediler havalı." "" VEYA "Kediler havalı." VEYA bir hata.
"Kanepe" "Kanepe" "CCoouucchh"
"oo" "oooooooooo" "oooo"
"o o" "oooo oooa" "oo ooa"

Bu kod golf, çok az bayt kazanır.


5
Hiç şüpheli değil ...: P
Quintec

"oooo oa"son test durumu için geçerli bir çıkışı (2 boşluklu)?
Arnauld

3
Bu geçerli bir çıktı değil çünkü paketteki çift karakterlerin sırası mesajdaki karakterlerin sıralamasıyla eşleşmelidir. Mesajda, bir 'o', sonra bir '', sonra 'o' var, ancak paketinizin
o'dan

Ah evet, bu mantıklı.
Arnauld

1
Hayır. Bu kuralın ardındaki mantığım, hiçbir çözüm olmaması durumunda programın çıktısının, hiçbir çözümün mümkün olmadığı konusunda net olması gerektiğidir. İzin verilen üç çıkış kesin değildir, ancak tekilleştirilen vaka için daha kapsamlı bir kontrol gerekir.
jkpate

Yanıtlar:


5

Jöle , 28 bayt

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

Tam bir program alma carrierve messagesonuçları ekranda komut satırı bağımsız değişken olarak
, (a olmayan packable için messagebaskı değişmeden carrier).

Çevrimiçi deneyin! Veya test takımına bakın .

Nasıl?

ẹⱮŒ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 bayt

Girişi alır (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

Çevrimiçi deneyin!


Alternatif sürüm, 66 bayt

Mesajı bir karakter dizisi olarak alabilirsek:

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

Çevrimiçi deneyin!


Düzenleme : @tsh sayesinde özyinelemeli olmayan özyinelemeli sürümlere geçiş yaparken bazı kodları kaldırmayı unuttuğumu fark ettim.


p=P bir parametre tarafından geçtiği için kaldırabilirsiniz .
tsh

@tsh Hata! Kaldırmayı unuttuğum önceki, özyinelemeli olmayan sürümlerden kalan bazı kodlar. Teşekkür ederim!
Arnauld

2

Haskell, 124 121 107 101 97 95 90 bayt

(#).(++"ü")
"ü"#[]=[]
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

Taşıyıcı iletiyi içermiyorsa "Ayrıntılı olmayan kalıplar" istisnasını yükseltir.

Çevrimiçi deneyin!

Düzenleme: @Laikoni sayesinde -5 bayt.


Ben davaları değiştirmek bırakmanıza izin düşünüyorum m==c: Çevrimiçi deneyin!
Laikoni

1

Retina 0.8.2 , 67 bayt

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

Çevrimiçi deneyin! İlk satırdaki taşıyıcıyı ve ikinci satırdaki mesajı alır. Açıklama:

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

İşlem, taşıyıcının 1 veya daha fazla aynı karakterinin çalışmasını sağlar. İletide aynı karakterlerden 1 veya daha fazlası da varsa, iki işlemden daha kısa olanını çıktıya çift olarak ekleyin, aksi takdirde çıktıya tek bir taşıyıcı karakteri ekleyin. Çıktı karakterlerinin her bir çalışması, onu girdiden ayırmak için yeni satırla sonlandırılır. (?!¶)Taşıyıcıyı düşünmekten uç engeller de regex mesajı tümüyle tükendiğinde, hem normal mesajdır $nerede maç için izin verilir ¶$eşleşir.

M!s`.*¶$

Mesaj tamamen kodlanmamışsa her şeyi silin.

Yeni satırları çıktıdan kaldırın.


Sanırım sondan ikinci test senaryosunu geçmediğini düşünüyorum (bu adil olmak gerekirse, ilk yazımda yoktu).
jkpate

@jkpate Bunu işaret ettiğiniz için teşekkür ederiz; Yaklaşımımı biraz yeniden yazmak zorunda kaldım.
Neil

0

Temiz , 118 bayt

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]

Çevrimiçi deneyin!

Önce taşıyıcıyı, sonra mesajı alır.

Run time error, rule '$;2' in module 'main' does not matchMesaj sığmayacaksa ile ilgili hatalar .


0

Ruby , 73 bayt

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:''}

Çevrimiçi deneyin!

Özyinelemeli işlev, girdileri karakter dizisi olarak alır.

Bir keresinde squeezeaynı karakterin ardışık çalışmalarını tek bir örneğe dayatan Ruby'nin yerleşik yöntemini kullanmayı umuyordum . Ama ne yazık ki hayır - son iki test vakası her şeyi o kadar berbat etti ki, tamamen farklı bir yaklaşıma başvurmak zorunda kaldım ve bu temelde Arnauld'un cevabının bir limanı olduğu ortaya çıktı .


0

Powershell, 134 bayt

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 stringTaşıyıcı, mesaj karakterlerini doğru sırada içermiyorsa, komut dosyasını döndürür .

Daha az golf test senaryosu:

$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"
}

Çıktı:

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 bayt

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

Şununla derle (12 bayt)

-Dp=putchar(

Çevrimiçi deneyin!

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
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.