দ্বিগুণ-অক্ষরের স্টেগনোগ্রাফি


19

স্টিগানোগ্রাফি কোনও প্রদত্ত বার্তা একটি প্রদত্ত ক্যারিয়ারের মধ্যে লুকিয়ে রাখে, এমন একটি প্যাকেজ তৈরি করে যা সন্দেহজনক মনে হয় না। এই চ্যালেঞ্জের জন্য, আপনি এমন একটি প্রোগ্রাম লিখবেন যা কোনও ASCII বার্তা এবং কোনও ASCII ক্যারিয়ারকে ইনপুট হিসাবে গ্রহণ করবে এবং বার্তাটির সাথে সম্পর্কিত অক্ষর বাদে ক্যারিয়ারের অনুরূপ প্যাকেজটি ফিরিয়ে আনবে বা মুদ্রণ করবে, একই ক্রমে যাতে তারা উপস্থিত হবে বার্তা.

নিয়মাবলী:

  1. যদি ক্যারিয়ারে ইতিমধ্যে একই চরিত্রের সিক্যুয়েন্সগুলি একাধিকবার রয়েছে এবং তারা বার্তার কোনও অক্ষর এনকোড করতে ব্যবহার না করে তবে প্রোগ্রামটি তাদের একক অক্ষরে কমাবে।
  2. যদি ক্যারিয়ারটিতে সঠিক ক্রমে বার্তার অক্ষর না থাকে তবে প্রোগ্রামটি কিছুই, ক্যারিয়ার নিজেই বা কোনও ত্রুটি ফিরে পাবে না।
  3. আপনি ধরে নিতে পারেন যে বার্তা এবং ক্যারিয়ারটি শূন্য নয় ASCII স্ট্রিং।
  4. মূলধন বিষয়সমূহ: ক এর সমতুল্য নয়।
  5. যখন একাধিক প্যাকেজ বৈধ হয়, আপনার প্রোগ্রামটি যে কোনও বা সমস্ত আউটপুট দিতে পারে।
  6. স্থান অন্য যে কোনও চরিত্রের মতো একটি চরিত্র।

পরীক্ষার কেস:

বার্তা বাহক প্যাকেজ
"হাই" "এটা এসে গেছে?" "হ্যাঁ আইট এরিভড?" বা "এটি কি এরিভয়েড হয়েছে?"
"স্যার" "এসে গেছে?" "হায়েস আইটি এসেছে?"
"ফু" "এটা এসেছে?" "" বা "এটি এসেছে?" বা একটি ত্রুটি।
"গাড়ি" "বিড়ালগুলি দুর্দান্ত।" "সিসাটস অ্যারে কর্নেল।"
"গাড়ি" "বিড়ালগুলি দুর্দান্ত।" "" বা "বিড়ালগুলি দুর্দান্ত।" বা একটি ত্রুটি।
"পালঙ্ক" "পালঙ্ক" "সিসিউউচ্চ"
"oo" "oooooooooo" "oooo"
"ও ও" "oooo oooa" "ooooa"

এটি কোড গল্ফ, তাই খুব কম বাইট জিতেছে।


5
মোটেই সন্দেহজনক নয় ...: পি
কুইনটেক

Is "oooo oa"(2 ব্যবধান সহ) শেষ টেস্ট কেস জন্য একটি বৈধ আউটপুট?
আর্নৌল্ড

3
এটি বৈধ আউটপুট নয় কারণ প্যাকেজে দ্বিগুণ অক্ষরের ক্রম অবশ্যই বার্তায় থাকা অক্ষরের ক্রমের সাথে মেলে। বার্তায়, আমাদের একটি 'ও', তারপরে একটি '', তারপরে একটি 'ও' রয়েছে, তবে আপনার প্যাকেজটির
ওগুলির

হ্যাঁ হ্যাঁ, এটা বোঝা যায়।
আর্নল্ড

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

জাভাস্ক্রিপ্ট (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

এটি অনলাইন চেষ্টা করুন!


সম্পাদনা করুন : নন-রিকার্সিভ ভার্সন থেকে পুনরাবৃত্ত সংস্করণগুলিতে স্যুইচ করার সময় আমি কিছু কোড সরিয়ে দিতে ভুলে গিয়েছি তা দেখার জন্য @ এসটিএসকে ধন্যবাদ Thanks


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 বা একাধিক রান রয়েছে তবে দুটি রানের সংক্ষিপ্তরটিকে আউটপুটে সদৃশ হিসাবে সংযুক্ত করুন, অন্যথায় আউটপুটে ক্যারিয়ারের একটি একক অক্ষর যুক্ত করুন। ইনপুট থেকে আলাদা করার জন্য আউটপুট অক্ষরের প্রতিটি রান একটি নতুন লাইন দিয়ে শেষ করা হয়। (?!¶)ক্যারিয়ারের চিন্তা থেকে Regex শেষ প্রতিরোধ বার্তা একবার বার্তা ক্লান্ত হয়, যেমন সাধারণত হয় $যেখানে মেলে অনুমতি দেওয়া হয় ¶$মেলে যাবে।

M!s`.*¶$

বার্তাটি পুরোপুরি এনকোড করা না থাকলে সবকিছু মুছুন।

আউটপুট থেকে নতুন লাইনগুলি সরান।


আমি মনে করি এটি দ্বিতীয় থেকে শেষ পরীক্ষার ক্ষেত্রে পাস করবে না (যা সত্যি বলতে গেলে আমার প্রাথমিক পোস্টে ছিল না)।
jkpate

@ জেকেপেট যে বিষয়টি দেখানোর জন্য ধন্যবাদ; আমাকে আমার পদ্ধতির কিছুটা নতুন করে লিখতে হয়েছিল।
নিল


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
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.