डबल-लेटर स्टेग्नोग्राफ़ी


19

स्टेग्नोग्राफ़ी किसी दिए गए वाहक के अंदर दिए गए संदेश को छुपाती है, एक पैकेज का निर्माण करती है जो संदिग्ध नहीं दिखता है। इस चुनौती के लिए, आप एक प्रोग्राम लिखेंगे जो एक ASCII संदेश और एक ASCII वाहक को इनपुट के रूप में लेता है, और एक पैकेज को प्रिंट करता है या प्रिंट करता है जो संदेश के अनुरूप वर्णों को छोड़कर वाहक के समान है, उसी क्रम में वे दिखाई देते हैं। संदेश।

नियम:

  1. यदि वाहक में पहले से ही एक से अधिक बार एक ही वर्ण के अनुक्रम होते हैं, और उनका उपयोग संदेश के एक चरित्र को एन्कोड करने के लिए नहीं किया जाता है, तो कार्यक्रम उन्हें एक ही चरित्र में कम कर देगा।
  2. यदि वाहक के पास सही क्रम में संदेश वर्ण नहीं हैं, तो प्रोग्राम कुछ भी नहीं लौटा सकता, वाहक स्वयं या कोई त्रुटि।
  3. आप मान सकते हैं कि संदेश और वाहक गैर-खाली ASCII तार हैं।
  4. कैपिटलाइज़ेशन मायने रखता है: ए बराबर नहीं है।
  5. जब एक से अधिक पैकेज मान्य होते हैं, तो आपका प्रोग्राम किसी भी या सभी को आउटपुट कर सकता है।
  6. अंतरिक्ष किसी भी अन्य चरित्र की तरह एक चरित्र है।

परीक्षण के मामलों:

संदेश वाहक पैकेज
"हाय" "यह आ गया है?" "ह्हस् इइवित्?" या "यह क्या है?"
"साहब" "आ गया है?" "परेशानी आईट आई?"
"फू" "यह आ गया है?" "" या "यह आ गया है?" या कोई त्रुटि।
"कार" "बिल्लियाँ शांत होती हैं।" "CCaats arre col।"
"कार" "बिल्लियाँ शांत होती हैं।" "" या "बिल्लियाँ शांत हैं।" या कोई त्रुटि।
"काउच" "काउच" "CCoouucchh"
"ऊँ" "ऊओउऊऊऊऊओ" "ऊऊओ"
"ओ ओ" "ओओओओओओ" "ओओ ओओआ"

यह कोड गोल्फ है, इसलिए सबसे कम बाइट जीतती है।


5
बिल्कुल भी शक नहीं ...: P
Quintec

क्या "oooo oa"(2 रिक्त स्थान के साथ) अंतिम परीक्षण मामले के लिए एक वैध आउटपुट है?
अरनौलड

3
यह एक मान्य आउटपुट नहीं है क्योंकि पैकेज में दोगुने अक्षरों का क्रम संदेश के पात्रों के क्रम से मेल खाना चाहिए। संदेश में, हमारे पास एक 'ओ' है, फिर एक 'ओ', फिर एक 'ओ' है, लेकिन आपके पैकेज में ओ के बाद जगह है
jkpate

आह हाँ, यह समझ में आता है।
अरनौलड

1
नहीं। इस नियम के पीछे मेरा तर्क यह है कि बिना किसी समाधान के मामले में कार्यक्रम का आउटपुट असंदिग्ध होना चाहिए कि कोई समाधान संभव नहीं है। तीन अनुमत आउटपुट असंदिग्ध हैं, लेकिन कटे हुए मामले के लिए अधिक व्यापक जाँच की आवश्यकता होगी।
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

जावास्क्रिप्ट (ईएस 6), 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

@ अंश उफ़। यह पिछले, गैर-पुनरावर्ती संस्करणों से कुछ अवशिष्ट कोड है जिन्हें मैं हटाना भूल गया था। धन्यवाद!
अरनौलड

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

रेटिना 0.8.2 , 67 बाइट्स

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

इसे ऑनलाइन आज़माएं! पहली लाइन पर कैरियर लेता है और दूसरी लाइन पर संदेश। स्पष्टीकरण:

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

वाहक के 1 या अधिक समान वर्णों की प्रक्रिया चलती है। यदि संदेश में समान वर्णों का 1 या अधिक रन है, तो दो रनों के छोटे को डुप्लिकेट में आउटपुट में जोड़ दें, अन्यथा आउटपुट के लिए वाहक के एक भी चरित्र को जोड़ दें। आउटपुट वर्णों के प्रत्येक रन को इनपुट से अलग करने के लिए एक नई रेखा के साथ समाप्त किया जाता है। (?!¶)वाहक सोच से regex अंत रोकता है पर संदेश एक बार संदेश समाप्त हो रहा है, के रूप में सामान्य रूप से है $जहां मैच के लिए अनुमति दी है ¶$से मेल खाएगा।

M!s`.*¶$

यदि संदेश पूरी तरह से एन्कोड नहीं किया गया था, तो सब कुछ हटा दें।

आउटपुट से newlines निकालें।


मुझे लगता है कि यह दूसरे से अंतिम परीक्षण के मामले में पारित नहीं होता है (जो कि निष्पक्ष होने के लिए, मेरे पास प्रारंभिक पोस्ट में नहीं था)।
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पद्धति का उपयोग करने की उम्मीद कर रहा था जो एक ही चरित्र के एक ही उदाहरण के लगातार रन अनुबंधित करता है। लेकिन दुर्भाग्य से, नोप - पिछले दो परीक्षण मामलों ने इतनी बुरी तरह से सब कुछ खराब कर दिया, कि मुझे पूरी तरह से अलग दृष्टिकोण का सहारा लेना पड़ा, और यह मूल रूप से अर्नुलद के जवाब का एक बंदरगाह बन गया ।


0

पॉवरशेल, 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

सी (जीसीसी) , 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
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.