স্টেগনোগ্রাফিক স্কোয়ারস


14

স্টেগনোগ্রাফিক স্কোয়ারস

আপনার কাজটি একটি স্ট্রিং নেওয়া এবং একটি NxNচিত্র তৈরি করা যা এই স্ট্রিংটি উপস্থাপন করে। আপনাকে অবশ্যই আলগোরিদিমটি লিখতে হবে যা চিত্রটিতে নেয় এবং এটিকে আবার স্ট্রিংয়ে রূপান্তরিত করে। স্কোরিংটি উভয় অ্যালগরিদমের বাইট গণনা অন্তর্ভুক্ত করবে:

"এনক্রিপশন" অ্যালগরিদম + "ডিক্রিপশন" অ্যালগরিদম

আপনার পৃথকভাবে প্রদর্শিত এনক্রিপশন এবং ডিক্রিপশন অ্যালগরিদম উভয়ের জন্য বাইট-গণনা সহ প্রতিটি আলাদাভাবে পোস্ট করা উচিত।


উদাহরণ অ্যালগরিদম

উদাহরণস্বরূপ, এখানে "প্রোগ্রামিং ধাঁধা এবং কোড গল্ফ" ব্লু চ্যানেলে একটি সাধারণ ASCII ভিত্তিক স্টেগানোগ্রাফিক অ্যালগরিদম ব্যবহার করে:

#2e7250,#6ea972,#04eb6f,#0fc767,#74ab72,#ee6161
#b73b6d,#1aae6d,#f37169,#bda56e,#1fe367,#e99620
#706450,#0d3575,#146b7a,#4ea47a,#2a856c,#95d065
#3f2d73,#cef720,#bab661,#d1b86e,#f22564,#12b820
#0f3d43,#c86e6f,#1ee864,#a66565,#247c20,#c3bb47
#0e296f,#89d46c,#585b66,#c08f20,#455c20,#136f20

আসল চিত্র ( চিত্রটি অ্যালগরিদম দ্বারা উত্পন্ন।)

চিত্র ফুটে উঠেছে।

আপনি দেখতে পাচ্ছেন যে নীল চ্যানেলটি এই চিত্রটির জন্য কেবল অ্যাস্কি মান রাখে:

50 =  80(P) 72 = 114(r) 6f = 111(o) 67 = 103(g) 72 = 114(r) 61 =  97(a) 
6d = 109(m) 6d = 109(m) 69 = 105(i) 6e = 110(n) 67 = 103(g) 20 =  32( ) 
50 =  80(P) 75 = 117(u) 7a = 122(z) 7a = 122(z) 6c = 108(l) 65 = 101(e) 
73 = 115(s) 20 =  32( ) 61 =  97(a) 6e = 110(n) 64 = 100(d) 20 =  32( ) 
43 =  67(C) 6f = 111(o) 64 = 100(d) 65 = 101(e) 20 =  32( ) 47 =  71(G) 
6f = 111(o) 6c = 108(l) 66 = 102(f) 20 =  32( ) 20 =  32( ) 20 =  32( )

বাকি চ্যানেলগুলি এলোমেলোভাবে উত্পন্ন মানগুলিতে ধারণ করে যে চিত্রটিতে বিভিন্ন ধরণের রং "মশলা" করা যায়। বার্তাটি চিত্রের বাইরে ফিরিয়ে আনার সময়, আমরা কেবলমাত্র অন্যান্য চ্যানেল মানগুলি উপেক্ষা করতে পারি, এবং নীল চ্যানেলে হেক্স বিটটি টানতে পারি, স্ট্রিংটি পুনর্গঠন করে:

"Programming Puzzles and Code Golf"

স্কোয়ারে স্ট্রিং প্যাড করতে ব্যবহৃত স্থানগুলি চূড়ান্ত ডিক্রিপ্টড আউটপুটটিতে অন্তর্ভুক্ত নয় Notice আপনি যখন ইমেজটিতে স্ট্রিং প্যাড করতে হবে, আপনি ধরে নিতে পারেন ইনপুট স্ট্রিং ফাঁকা দিয়ে শেষ হবে না।


বিধি

  • আপনাকে অবশ্যই প্রতি পিক্সেলটিতে 1 টি অক্ষর এনকোড করতে হবে, চরটি এনকোড করার জন্য নির্বাচিত চ্যানেলটি নির্বিচারে।
  • অন্যান্য আরজিবি রঙের চ্যানেলগুলিকে অবশ্যই এলোমেলোভাবে তৈরি করা উচিত, আপনি স্ট্রিংটিকে এনকোড করার জন্য বেছে নিচ্ছেন এমন একটি ছাড়া; এর অর্থ আপনার চূড়ান্ত নন-এনকোড হওয়া চ্যানেলগুলির মধ্যে 0x0000-0xFFFF(এলোমেলোভাবে নির্বাচিত) হওয়া দরকার।
  • আরজিবি রঙের মানগুলির 2D অ্যারে হিসাবে চূড়ান্ত ফলাফলটি প্রকাশ করা ভাল 0x000000-0xFFFFFF, আপনি যদি এটির সাথে মজা না চান বা এটির বাইটস কম না লাগে তবে চিত্র তৈরির প্রয়োজন হবে না। আপনি যদি হেক্স স্ট্রিং হিসাবে আউটপুট চয়ন করেন, হেক্স স্ট্রিংকে #EG #FFFFFFবা এর সাথে উপস্থাপন করুন #05AB1E। আপনি ট্যাব, কমা বা অন্য যে কোনও কিছু দিয়ে অনুভূমিকভাবে বোধগম্য হতে পৃথক করতে পারেন, তবে এটি অবশ্যই বর্গীয় প্যাটার্ন বজায় রাখতে পারে; অন্য কথায়, আপনাকে অবশ্যই যথাযথ নিউলাইন বিচ্ছেদ ব্যবহার করতে হবে।
  • আউটপুট অবশ্যই একটি বর্গক্ষেত্রের হতে হবে এবং এটিকে সামঞ্জস্য করার জন্য স্ট্রিংটি ফাঁকা স্থানের সাথে শেষের দিকে আবশ্যক। এর অর্থ N≈SQRT(Input#Length())। যদি ইনপুট দৈর্ঘ্য একটি নিখুঁত বর্গক্ষেত্র না হয়, আপনি Nফাঁকা এবং প্যাড ফাঁকা উচিত।
  • পূর্বে উল্লিখিত হিসাবে, আপনি যদি চিত্রটিতে শূন্যস্থান দিয়ে প্যাডিং করছেন তবে আপনাকে চূড়ান্ত "ডিক্রিপ্টেড" আউটপুটে প্যাডযুক্ত অক্ষরগুলি অন্তর্ভুক্ত করবেন না।
  • আপনি ধরে নিতে পারেন:
    • ইনপুট স্ট্রিং ফাঁকা দিয়ে শেষ হবে না।
    • ইনপুট স্ট্রিংটি কেবল প্রিন্টযোগ্য এএসসিআইআই অক্ষর ব্যবহার করবে।
  • এটি , সর্বনিম্ন বাইট গণনা জয়।

শুধু নির্মল, সমাধান এনকোড আবশ্যক / ডিকোড ঠিক এক পিক্সেল প্রতি চরিত্র?
ETH প্রোডাকশনগুলি

@ETH প্রোডাকশনগুলি যেটি একটি ভাল ফলো-আপ চ্যালেঞ্জ বলে মনে হচ্ছে তবে এই প্রতিযোগিতার উদ্দেশ্যে আপনি একটি এনকোডিং চ্যানেল বেছে নিয়েছেন এবং প্রতি পিক্সেলটিতে 1 টি অক্ষর এনকোড করেছেন।
যাদু অক্টোপাস উরন

আমি সম্ভবত এটি ব্যবহার করতে যাচ্ছি না, তবে: প্রয়োজনের চেয়ে আরও স্পেস সহ চিত্রটি "ওভারপ্যাড" করা কি ঠিক? এবং এই ধারণাটি ঠিক করা ঠিক আছে যে এনকোডারটি উত্পন্ন করবে সেই চিত্রের একই পরিমাণে ওভারপ্যাডিং হবে?

@ ais523 আমি এই ধরণের পদ্ধতির কীভাবে কিছু করতে পারি তা দেখতে পাচ্ছি না তবে প্রয়োগের জন্য আরও বাইটের প্রয়োজন। আমি যাই হোক না কেন, চ্যালেঞ্জ যে যেমন বড় পরিবর্তন করতে খুব পুরানো তাই।
ম্যাজিক অক্টোপাস উরন

1
ঠিক আছে, আমি নিশ্চিত ছিলাম না যে পরিবর্তনের প্রস্তাব দেওয়ার চেয়ে এটি মূল প্রশ্নে অনুমোদিত হয়েছিল কিনা। (আমি ইনপুটটিকে একটি আয়তক্ষেত্রটি প্যাক করার বিষয়ে ভাবছিলাম, যা বর্গক্ষেত্রের মধ্যে প্যাকিংয়ের চেয়ে সহজ এবং সম্ভবত বাইট-শর্ট সমন্বয় গণনাগুলি পরে আয়তক্ষেত্রটি আরও বড় স্কোয়ারে

উত্তর:


2

05 এ বি 1 ই , 34 + 12 = 46 বাইট

লাল চ্যানেল ব্যবহার করে।
05AB1E ব্যবহার করে সিপি এনকোডিং ব্যবহার করে।

এনকোড:

DgDtî©n-Äð×JvyÇh`4F15Ý.Rh«}})'#ì®ä

D                                   # duplicate input
 gDtî©n-Ä                           # abs(len(input)-round_up(sqrt(len(input)))^2)
         ð×J                        # join that many spaces to end of input
            v                       # for each char in string
             yÇ                     # get ascii value
               h`                   # convert to base-16 number
                 4F                 # 4 times do:
                   15Ý.Rh           # push random base-16 number
                         «          # concatenate
                          }}        # end inner and outer loop
                            )       # wrap in list
                             '#ì    # prepend a "#" to each element in list
                                ®ä  # split in pieces round_up(sqrt(len(input))) long

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

ডিকোড:

˜vy3£¦HçJ}ðÜ

˜               # deep flatten input to a list
 v              # for each color in the list
  y3£           # take the first 3 chars
     ¦          # remove the hash sign
      H         # convert from base-16 to base-10
       ç        # get the ascii char with that value
        J       # join to string
         }      # end loop
          ðÜ    # remove trailing spaces

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

সমান বাইট-গণনা সহ বিকল্প প্যাডিং পদ্ধতি

Dgð×J¹gtî©n£

আমি মনে করি প্রশ্ন অনুযায়ী আপনার বিশেষত নতুন লাইনে যোগ দিতে হবে? (আপনার উত্তরটি সম্ভবত এটির সাথে মানিয়ে নেওয়ার পরেও আমাকে মারবে, যদিও আমি প্রশ্নের অংশটির সাথে কেবল পাঁচটি

@ আইস ৫৩৩: বিধিগুলিতে 2 ডি অ্যারে ঠিক ছিল। আমি কি কোনওভাবে ভুল বুঝেছি?
Emigna

"আপনি ট্যাবস, কমা বা অন্য যে কোনও কিছু দিয়ে অনুভূমিকভাবে বোধগম্য হতে পৃথক করতে পারেন তবে এটি অবশ্যই বর্গক্ষেত্র বজায় রাখতে হবে; অন্য কথায় আপনাকে অবশ্যই যথাযথ নিউলাইন বিচ্ছেদ ব্যবহার করতে হবে।" দৃ strongly়তার সাথে বোঝায় যে এটির একটি স্ট্রিং হওয়া দরকার, কারণ 2D অ্যারে অন্তর্নিহিতভাবে নিউলাইনগুলিকে ধারণ করে না। অন্য কথায়, আমি "অ্যারে" আউটপুট এর আকার বর্ণনা হিসাবে আউটপুট এর ডাটা টাইপ বর্ণনা হিসাবে ব্যাখ্যা করেছি।

@ আইস ৫৩৩: আমি স্পষ্টতার জন্য ওপিকে জিজ্ঞাসা করেছি। আপনি যেমনটি বলেছেন, এটি বাস্তবায়নে কোনও বড় পরিবর্তন নয়, তবে ফর্ম্যাটের প্রয়োজন না থাকলে আপনি কিছু বাইটও সংরক্ষণ করতে পারেন।
Emigna

@ ais523 যে কোনও উপায়ে গ্রহণযোগ্য।
ম্যাজিক অক্টোপাস

4

সি, 201 (এনকোডিং) + 175 (ডিকোডিং) = 376 বাইট

এনকোড করতে:

E(char*J){size_t L=ceil(sqrt(strlen(J)));int U;srand(time(NULL));for(int i=0;i<L;i++){for(int f=0;f<L;f++){printf("#%02X%02X%02X ",rand()%256,(U<strlen(J))?(int)J[U]:32,rand()%256);U+=1;}printf("\n");}}

দুটি অন্যান্য চ্যানেল এলোমেলো হেক্স মান হিসাবে সেট করার সময় আরজিবি বর্ণালীয়ের সবুজ চ্যানেলে ইনপুট স্ট্রিংয়ের প্রতিটি অক্ষরকে এনকোড করে। STDIN এর মাধ্যমে স্ট্রিং হিসাবে ইনপুট নেয় এবং স্কোয়ারের আকারে হেক্স রঙের কোডের একাধিক স্ট্রিংকে STDOUT এ আউটপুট দেয়। ধরে নিই যে আপনি পাইথন 3 এবং ইমেজম্যাগিক ইনস্টল করেছেন এবং উপরের ফাইলটি a.outবর্তমান ওয়ার্কিং ডিরেক্টরী (সিডাব্লুডি) এর নামের একটি ফাইলের মধ্যে সংকলিত হয়েছে , আপনি Output.pngনিম্নলিখিত কমান্ডটি ব্যবহার করে টেক্সচুয়াল আউটপুট থেকে সিডব্লুডিতে নামকরণযুক্ত ফলস্বরূপ চিত্রটি পেতে পারেন :

./a.out "<Multiline Input>"|python3 -c "import sys,subprocess;Input=sys.stdin.read();print('# ImageMagick pixel enumeration: {0},{0},255,rgb\n'.format(len(Input.split('\n')[1].split()))+'\n'.join(['%d,%d:(%d,%d,%d)'%(g,i,int(j[1:][:2],16),int(j[1:][2:4],16),int(j[1:][4:6],16))for g,h in enumerate(Input.split('\n'))for i,j in enumerate(h.split())]))"|convert - -scale 1000% Output.png

Programming Puzzles and Code Golfইনপুট স্ট্রিং হিসাবে ব্যবহার করে উপরের কমাড দ্বারা তৈরি করা একটি নমুনা আউটপুট চিত্র এখানে রয়েছে :

নমুনা আউটপুট

ডিকোড করতে:

D(int c,char**U){char T[c];for(int Y=1;Y<c;Y++){char G[2]={U[Y][3],U[Y][4]};T[Y-1]=(char)strtol(G,NULL,16);}int C=c-1;T[C]='\0';while(T[C]==' '){T[C]='\0';C-=1;}printf("%s\n",T);}

ডাবল কোট ( ") ( char** argvইন main) এবং এছাড়াও যখন ডাকা হয় প্রত্যেকটির সাথে স্পেস-বিভাজিত হেক্স রঙ কোড স্ট্রিংয়ের একটি অনুক্রম এসটিডিএন-এর মাধ্যমে ইনপুট নেয়main , int argcপূর্ণসংখ্যা ইনপুট জন্য। ডিকোড করা বার্তা উপস্থাপন করে একটি একক / বহু-লাইন স্ট্রিং আটকে আউটপুট।

আমি যখনই ও যেখানেই পারবো সময়ের সাথে সাথে আরও গল্ফ দেওয়ার চেষ্টা করব।


এছাড়াও, যদি আপনি একই পদ্ধতিতে উভয় পদ্ধতি একই mainকরেন তবে প্রতিটি ফাংশনটির সঠিক ইনপুট পাওয়ার জন্য আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন :

int main(int argc,char**argv){if(strcmp(argv[1],"E")==0){Encode(argv[2]);}else{Decode(argc,argv);}}

এবং এটি ব্যবহার করে, এনকোডিংয়ের জন্য আপনাকে অবশ্যই Eএকক স্ট্রিং আর্গুমেন্ট অনুসরণ করে এনকোডিং পদ্ধতিটি কল করার জন্য প্রথম আর্গুমেন্ট হিসাবে সরবরাহ করতে হবে , ডিকোডিংয়ের জন্য, আপনাকে যে সমস্ত প্রদান করা দরকার তা হ'ল স্পেস-বিভাজিত হেক্স রঙের কোড স্ট্রিংগুলির প্রতিটি ক্রমযুক্ত সাথে যুক্ত ডাবল-কোটস ( ")।


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


3

পাইথন 2, 164 160 + 94 93 = 253 বাইট

গম উইজার্ডকে ধন্যবাদ 1 + 1 বাইট সংরক্ষণ করা হয়েছে।

-5 বাইট ধন্যবাদ কাদে

এনকোডার চিত্রএনকোডার: স্ট্রিং অবশ্যই উদ্ধৃতিতে আবদ্ধ হওয়া উচিত, যেমন "CodeGolf"আউটপুট একটি রঙ আসকি পিপিএম চিত্র।

from random import*
s=input()
n=int((len(s)-1)**0.5)+1
s=s.ljust(n*n)
r=randint
print"P3 %d %d 255 "%(n,n)+''.join("%d "*3%(r(0,255),r(0,255),ord(c))for c in s)

ডিকোডার পিকচারডিকোডার: ইনপুট ফাইলের নাম কমান্ড লাইন আর্গুমেন্ট হিসাবে নেয়

from sys import*
print''.join(chr(int(c))for c in open(argv[1]).read().split()[6::3]).strip()

ব্যবহার:

 python golf_stegansquare_enc.py > stega.ppm

 python golf_stegansquare_dec.py stega.ppm

উদাহরণ:

প্রোগ্রামিং ধাঁধা এবং কোড গল্ফপ্রোগ্রামিং ধাঁধা এবং কোড গল্ফ

Lorem Ipsumআপনি এখানে কাজ করতে পারেন, ফলস্বরূপ শৈশবকর্মী, শ্রমসাধ্য এবং ম্যাগাজিনের উপর ভিত্তি করে স্বতঃস্ফূর্তভাবে কাজ করতে পারেন। আপনি যা করতে পারেন তা কেবলমাত্র দুজনেরই এবং পুনরুদ্ধার। স্টেট ক্লিটা ক্যাসড গবার্গ্রেন, সমুদ্রের টাকিমাটা মন্দিরের খুব ভাল নেই est আপনি এখানে কাজ করতে পারেন, ফলস্বরূপ শৈশবকর্মী, শ্রমসাধ্য এবং ম্যাগাজিনের উপর ভিত্তি করে স্বতঃস্ফূর্তভাবে কাজ করতে পারেন। আপনি যা করতে পারেন তা কেবলমাত্র দুজনেরই এবং পুনরুদ্ধার। স্টেট ক্লিটা ক্যাসড গবার্গ্রেন, সমুদ্রের টাকিমাটা মন্দিরের খুব ভাল নেই est


আপনি নিকটবর্তী পেরেন এবং তারপরে স্থানটি সরাতে পারেনfor
পোস্ট রক গার্ফ হান্টার

@ ইথ প্রডাকশনস: স্কয়ার্ট (25-1) = স্কয়ার্ট (24) <5 এবং> ৪. এটি intথেকে 4 যা পরে +1সম্পাদনা করা হয় তাই 5
কার্ল ন্যাপফ

ওহ, আমার খারাপ, আমি এটি দেখিনি -1
ইটিএইচ প্রডাকশন

1
আপনি মধ্যে স্থান অপসারণ করতে পারেন printএবং 'ডিকোডার হবে। আমি বেশ নিশ্চিত যে আপনি int((len(s)+1)**.5)কিছু বাইট সংরক্ষণ করতে পারেন ।
কেডে

1
আমি আমার আগের মন্তব্যের শেষ বাক্য redacting করছি, তবে আপনি পরিবর্তন করে মুদ্রণ খাটো করতে পারেন ' '.join("%d %d %d"থেকে ''.join(3*"%d "যেহেতু আমি নিশ্চিত একটি trailing স্থান ঠিক আছে আছি।
কেডে

2

স্কালা, 97 + 68 = 165 বাইট

এনক্রিপশন (97 বাইট):

s=>s.map(_+((math.random*65535).toInt<<8)).iterator.grouped(math.sqrt(s.size)toInt)withPadding 32

একটি স্ট্রিং নেয় এবং পূর্ণসংখ্যার সিকোয়েন্সেসের একজন আইট্রেটর পুনরায় যোগ করে।

ডিক্রিপশন (68 বাইট):

a=>" +$".r.replaceAllIn(a.flatten.map(h=>(h&0xFF)toChar)mkString,"")

পূর্ণসংখ্যার সিকোয়েন্সগুলির একটি আইট্রেটর নেয় এবং একটি স্ট্রিং প্রদান করে।

ব্যাখ্যা:

s=>                         //define an anonymous function
  s.map(                      //map each char of the string
    _+(                         //to the ascii value plus
      (math.random*65535).toInt)  //a random integer between 0 and 65535
      <<8                         //shifted 8 bits to the left
    )
  )
  .iterator                     //create an iterator
  .grouped(                     //group them in groups of size...
    math.sqrt(s.size)toInt        //sqrt of the size of the input, rounded up
  )withPadding 32               //pad with spaces to make a square

a=>
  " +$"              //take this string
  .r                 //parse it as a regex
  .replaceAllIn(     //replace every occurence of the regex in...
    a.flatten          //a flattened
    .map(h=>           //each element mapped
      (h&0xFF)toChar)    //to the character of the lower 8 bits
    mkString,          //joined to a string
    ""               //with an empty string
  )

2

পার্ল, (103 + 1) + (36 + 2) = 142 বাইট

চিত্র ইনকোডারটিতে পাঠ্য ( -p1 বাইট জরিমানার জন্য চালান ; -p0(জরিমানার অতিরিক্ত বাইটের জন্য) প্রয়োজনীয় যদি আপনি ইনপুট স্ট্রিংয়ে নতুন লাইনগুলি পরিচালনা করতে চান):

$_.=$"while($a=(length)**.5)=~/\./;$_=unpack"H*";s/../sprintf"#%04x$&,",rand+4**8/eg;s/(.*?\K,){$a}/
/g

পাঠ্য ডিকোডারের প্রতিচ্ছবি ( -p02-বাইট জরিমানার জন্য চালানো ):

$\.=chr hex for/..\W/g;$\=~s/ *$//}{

এটি #abcdefপাঠ্য-ভিত্তিক চিত্র ফর্ম্যাট ব্যবহার করে এবং নীল চ্যানেলের এনকোড। এখানে দেওয়া একটি সম্ভাব্য আউটপুট একটি উদাহরণProgramming Puzzles and Code Golf ইনপুট হিসাবে :

# B4d250, # bccb72, # 43f06f, # 4d6767, # 74ba72, # 269461
# E4f26d, # f63d6d, # 701c69, # bbf56e, # 6ef967, # d78d20
# 4e0d50, # 9b2775, # afd37a, # 12a47a, # 63e46c, # 0e9565
# 4cad73, # e43420, # 6da761, # 5a306e, # 8fba64, # 58f720
# D52443, # b4446f, # fbaf64, # 4a4365, # 1a5020, # f3ea47
# 354c6f, # 52cb6c, # 11a766, # 4c380a, # 553820, # b31120

এনকোডারটির ব্যাখ্যা:

$_.=$"             # append a space ($") to the input ($_)
  while            # as long as the following condition holds:
(($a=length)**.5)  # the square root of the input length (save this in $a)
=~/\./;            # has no decimal points in its string represenation
$_=unpack"H*";     # convert the input from base-256 to hexadecimal
s/../              # replace two characters of the input
  sprintf          # with a string formed from the template
  "#%04x$&,",      # four hex digits, the two matched characters, and a comma
  rand+4**8        # those hex digits are a random number from 0 to 4**8 (= 65536)
/eg;               # and do this for every non-overlapping match
s/(.*?             # find the minimum number of characters needed to match
   \K,)            # replacing the part of the match after the last matched comma
  {$a}/            # a string containing $a commas
/gx                # with a newline, for every non-overlapping match

আমি কাজের এই ব্যবহার সত্যিই খুশি \K; এটি কোথায় প্রতিস্থাপন করা হবে তা নির্দিষ্ট করে এবং এটি একটি লুপের মধ্যে রেখে দেয় বলে মনে হয় যে শেষ লুপের পুনরাবৃত্তির সংঘটিত গণনা করে। সুতরাং s/(.*?\K,){$a}/\n/gফর্মের কোনও নূন্যতম দৈর্ঘ্যের স্ট্রিংটি মেলে যা কিছু কমা যেকোনও কমা… কিছু কমা, এতে $aকমা রয়েছে, তবে ম্যাচের আসল প্রতিস্থাপিত অংশটি কেবল শেষ কমা হবে। এটি প্রতিস্থাপনের প্রভাব রয়েছে$a আমাদের প্রতিবিম্বের কমাটিকে একটি নতুন লাইনের সাথে আমাদের চিত্রটির জন্য বর্গক্ষেত্র আকার দেয়।

এই চ্যালেঞ্জটির জন্য পার্লের বড় সুবিধা (অন্তর্নির্মিত অক্ষরের স্ট্রিং-টু-হেক্সাডেসিমাল কনভার্টার ছাড়াও, যা অবিশ্বাস্যভাবে সুবিধাজনক ছিল) এটি হ'ল এটি একটি খুব ছোট সংক্ষেপক (এত সংক্ষিপ্ত, বাস্তবে, যদিও পার্লের জন্য একটি বিল্টিন রয়েছে) হেক্সাডেসিমালকে একটি স্ট্রিংয়ে রূপান্তর করা, এটি ব্যবহার না করা কম ছিল) was এখানে কিভাবে এটা কাজ করে:

$\.=chr      # append to $\ the character code
  hex        # of the hexadecimal-string-to-number-translation
for/..\W/g;  # of each two characters that appear before a
             # non-alphanumeric character (not counting overlapping matches)
$\=~s/ *$//  # delete all spaces at the end of $\
}{           # in this context, this means "implicitly print $\,
             # prevent any other implicit printing"

অ-অক্ষর অক্ষরের সাথে সাথেই দুটি অক্ষরের একমাত্র উদাহরণ হ'ল নীল চ্যানেলগুলি (যা আমরা আনপ্যাক করতে চাই), যা কমা এবং নিউলাইনগুলির ঠিক সামনে উপস্থিত হয়; এবং দুটি চরিত্র যা #প্রথমটির চেয়ে একে অপরের সামনে উপস্থিত হয় । আমরা ম্যাচগুলির পরবর্তী বিভাগটি চাই না, তবে তারা অবশ্যম্ভাবীভাবে পূর্বের বিভাগটি ওভারল্যাপ করে এবং সুতরাং ওভারল্যাপিং ম্যাচের চেক দ্বারা এটি বাদ দেওয়া হবে।


1

মাইএসকিউএল, 438 + 237 = 675 বাইট

আউটপুট শেষে একটি পিছনের নতুন লাইন রয়েছে, তবে এটি ডিক্রিপ্ট হওয়ার পরে প্রদর্শিত হবে না। হেক্স ফাংশন (পূর্ণসংখ্যা ওভারলোড) 0 এর শীর্ষস্থান কেটে ফেলবে, সুতরাং আমি এটি একটি স্ট্রিং 0 দিয়ে প্যাড করতে হয়েছিল। আমি কিছু বাইট সংরক্ষণ করতে পারতাম যদি আমি উভয় ফাংশন ডিলিমিটারের মধ্যে ঘোষণা করতে পারি।

এনক্রিপ্ট

delimiter //create function a(i text)returns text begin declare r int;declare q,p text;while mod(length(i),sqrt(length(i)))<>0 do set i:=concat(i,' ');end while;set r:=1;set q:="";while r<=length(i) do set p:=",";if mod(r,sqrt(length(i)))=0 then set p:="\r\n";end if;set q:=concat(q,'#',right(concat(0,hex(floor(rand()*256))),2),right(concat(0,hex(floor(rand()*256))),2),hex(mid(i,r,1)),p);set r:=r+1;end while;return q;end//
delimiter ;

ডিক্রিপ্ট

delimiter //create function b(i text)returns text begin declare x int;declare y text;set x:=0;set y:="";while instr(i,'#')>0 do set i:=substr(i,instr(i,'#')+5);set y:=concat(y,unhex(left(i,2)));end while;return trim(y);end//
delimiter ;

ব্যবহার:

select a('test')
select b('#7D1874,#FFB465')
select b(a('test'))

1

সি #, 312 + 142 = 454 বাইট

এনকোডিং:

using System;I=>{var r=new Random();int i=I.Length;int N=(int)Math.Floor(Math.Sqrt(i))+1,S=N*N;while(i++<S){I+=' ';}var R="";for(i=0;i<S;){R+=i%N<1&i>0?"\n":i<1?"":" ";R+="#"+r.Next(256).ToString("X").PadLeft(2,'0')+r.Next(256).ToString("X").PadLeft(2,'0')+((int)I[i++]).ToString("X").PadLeft(2,'0');}return R;};

গঠনের কথা মাথায় রেখে:

using System;I=>{var s=I.Replace('\n',' ').Split(' ');var R="";foreach(var t in s)R+=(char)System.Convert.ToInt32(t[5]+""+t[6],16);return R.TrimEnd(' ');};

সম্পূর্ণ প্রোগ্রাম:

using System;
class Steganographic
{
    static void Main()
    {
        Func<string, string> E = null;
        Func<string, string> D = null;

        E=I=>
        {
            var r=new Random();
            int i=I.Length;
            int N=(int)Math.Floor(Math.Sqrt(i))+1,S=N*N;
            while(i++<S){I+=' ';}
            var R="";
            for(i=0;i<S;)
            {
                R+=i%N<1&i>0?"\n":i<1?"":" ";
                R+="#"+r.Next(256).ToString("X").PadLeft(2,'0')+r.Next(256).ToString("X").PadLeft(2,'0')+((int)I[i++]).ToString("X").PadLeft(2,'0');
            }
            return R;
        };

        D=I=>
        {
            var s=I.Replace('\n',' ').Split(' ');
            var R="";
            foreach(var t in s)
                R+=(char)Convert.ToInt32(t[5]+""+t[6],16);
            return R.TrimEnd(' ');
        };

        string encoded = E("Programming Puzzles and Code Golf");
        Console.WriteLine(encoded);
        Console.WriteLine(D(encoded));

        encoded = E("Hello, World!");
        Console.WriteLine(encoded);
        Console.WriteLine(D(encoded));

        Console.Read(); // For Visual Studio
    }
}

1

গণিত, 111 + 65 = 176 বাইট

এনকোডার

Join[255~RandomInteger~{n=⌈Sqrt@Length@#⌉,n,2},ArrayReshape[#,{n,n,1},32],3]~Image~"Byte"&@*ToCharacterCode

সঙ্কেতমোচক

StringTrim[""<>FromCharacterCode@ImageData[#,"Byte"][[;;,;;,3]]]&

1

প্রক্রিয়াজাতকরণ, 220 209 194 + 171 167 151 = 391 380 376 361 345 বাইট

হালনাগাদ:

অকেজো অপসারণ noStroke() এবং উভয় জন্য লুপ এক-স্টেটমেন্টার তৈরি।

অকেজো অপসারণ image(p,0,0); , ডিক্রিপ্টরকে প্যারামিটার হিসাবে ফাইলের নাম দিয়েছেন

এনক্রিপশন অ্যালগরিদম

void g(String h){int s=ceil(sqrt(h.length()));for(int y=0,x;y<s;y++)for(x=0;x<s;rect(x,y,1,1),x++)stroke(h.length()>y*s+x?h.charAt(y*s+x):32,random(255),random(255));get(0,0,s,s).save("t.png");}

ফাংশনটি কল করা: g("Programming Puzzles and Code Golf");

এটি এমন একটি ফাংশন যা কোনও স্ট্রিং গ্রহণ করে এবং সংরক্ষণ করার আগে আউটপুট তৈরি করে t.png। এটি ব্যবহার করেred লুকানো পাঠ্য সংরক্ষণ করার মানটি ।

ডিক্রিপশন অ্যালগরিদম

void u(String f){PImage p=loadImage(f);f="";for(int j=0,i;j<p.height;j++)for(i=0;i<p.width;i++)f+=(char)red(p.get(i,j));print(f.replaceAll(" +$",""));}

এর মাধ্যমে কল করুন: u(file_name);

এটি এমন একটি ফাংশন যা প্যারামিটার দ্বারা নির্দিষ্ট চিত্রটি অনুসন্ধান করে এবং তারপরে লুকানো স্ট্রিংটিকে আউটপুট করে দেয় (যেহেতু এটি স্ট্রিং ফেরার চেয়ে ছোট)।

প্রসারিত কোড

(এনক্রিপশন অ্যালগরিদম)

void g(String h) {
  int s=ceil(sqrt(h.length()));
  for(int y=0,x;y<s;y++)
    for(x=0;x<s;rect(x,y,1,1),x++)
      stroke(h.length()>y*s+x?h.charAt(y*s+x):32,random(255),random(255));
  get(0,0,s,s).save("t.png");
}

ফাংশনটি ডাকা হলে স্ট্রিংটি পাস হয়। ফাংশনের প্রথম লাইন ceilবর্গক্ষেত্রের বর্গমূলের মধ্যবর্তী অংশের দৈর্ঘ্য গণনা করে । তারপরে আমরা একটি লুপটি প্রবেশ করি, যেখানে আমরা strokeঅক্ষরের ASCII মানকে লাল হিসাবে এবং নীল এবং সবুজ রঙের জন্য এলোমেলো মানগুলি সেট করতে (প্রান্তের রঙ) সেট করি । আমরা এটি করার পরে, আমরা rectপ্রস্থ = 1এবং উচ্চতা = দিয়ে একটি (আয়তক্ষেত্র) তৈরি করি 1, অর্থাত্ একটি পিক্সেল (কোনও অদ্ভুত কারণে, আমি pointসঠিকভাবে ব্যবহার করতে পারি না )। শেষ লাইনে, ফলস্বরূপ চিত্রটি তখন সংরক্ষণ করা হয় t.png

(ডিক্রিপশন অ্যালগরিদম)

void u(String f) {
  PImage p=loadImage(f);
  f="";
  for(int j=0,i;j<p.height;j++)
    for(i=0;i<p.width;i++)
      f+=(char)red(p.get(i,j));
  print(f.replaceAll(" +$",""));
}

এই ফাংশনটিতে ফাইলটির নাম প্যারামিটার হিসাবে রয়েছে (স্ট্রিং হিসাবে)। তারপরে ফাইলটিতে থাকা চিত্রটি পরে ব্যবহার করার জন্য একটি ভেরিয়েবলে সংরক্ষণ করা হয়। আমরা এটি সম্পন্ন করার পরে, আমরা ""গোপন স্ট্রিং ধরে রাখার পরিবর্তে একটি নতুন স্ট্রিং তৈরি করার পরিবর্তে স্ট্রিংটি সেট করি । তারপরে আমরা দুটি নেস্টেড-লুপের মাধ্যমে চিত্রটির মাধ্যমে পুনরাবৃত্তি করি এবং আমরা পিক্সেলের লাল মানের বর্ণের মানটিকে স্ট্রিংয়ে যুক্ত করি। অবশেষে, আমরা এর থেকে শীর্ষস্থানগুলি স্পেস অপসারণের পরে ফলাফলটি স্ট্রিংটি মুদ্রণ করি (একটি রেজেক্স ব্যবহার করে)। আমরা লুকানো পাঠ্যটি ফিরে আসার পরিবর্তে মুদ্রণের কারণ হ'ল এটি এভাবে ছোট এবং আমরা বাইটগুলি সংরক্ষণ করি।


এনক্রিপ্ট করা চ্যালেঞ্জ কাঁচা পাঠ্য:

এখানে চিত্র বর্ণনা লিখুন


1

জেলি, 40 + 20 = 60 বাইট জেলির কোডেপেজে

এনকোডার (পাঠ্য → চিত্র):

”#;;ØHX¤¥4¡
»⁶x⁹²¤¤Ob⁴‘ịØHÇ€sj€”,Y
L½Ċç@

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

ডিকোডার (চিত্র → পাঠ্য):

ḣ2ØHiЀ’ḅ⁴Ọ
ṣ”#Ç€œr⁶

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

প্রোগ্রামটি উত্পাদন করতে পারে তার একটি উদাহরণ আউটপুট (এটি রেড চ্যানেলে তথ্য সংরক্ষণ করে):

#504219,#720200,#6F38F1,#67055F,#7228C7,#61AC95
#6DD797,#6D20CB,#6962FA,#6E69B1,#67C41C,#209436
#50CB19,#75C9FC,#7A1B06,#7A695B,#6C5D5B,#6539A6
#735925,#20C80F,#612C38,#6EBF9E,#64C79E,#200915
#4337C5,#6F4704,#64FB5F,#65B2D1,#20E075,#47BC7C
#6F0C16,#6CD8EF,#66060B,#203C6C,#20D6E9,#20C0D7

এই বৃহত্তর চ্যালেঞ্জগুলির মধ্যে, জেলির স্বল্পতা কিছুটা কমতে শুরু করে, পার্সিং অস্পষ্টতাগুলি সমাধান করার জন্য বেশ কয়েকটি "কাঠামোগত" অক্ষর প্রয়োজন, তবে এটি এখনও খুব ক্ষীণ। এনকোডারটি কীভাবে কাজ করে তা এখানে:

Subroutine 1: convert digits to randomly padded hex string
”#;;ØHX¤¥4¡
”#;                     prepend #
    ØHX                 random hexadecimal digit
       ¤                parse ØH and X as a unit
   ;                    append
        ¥               parse ; and ØHX¤ as a unit
         4¡             repeat four times

Subroutine 2: convert string λ to square with size ρ
»⁶x⁹²¤¤Ob⁴‘ịØHÇ€sj€”,Y
 ⁶                      space
   ⁹²                   ρ squared
     ¤                  parse ⁹² as a unit
  x                     repeat string (i.e. ρ² spaces)
      ¤                 parse ⁶x⁹²¤ as a unit
»                       take maximum
Because space has the lowest value of any printable ASCII character,
this has the effect of padding λ to length ρ² with spaces.
       O                take codepoints of string
        b⁴              convert to base 16
           ịØH          use as indexes into a list of hexadecimal digits
          ‘             0-indexed (Jelly uses 1-indexing by default)
              ǀ        run subroutine 1 on each element
                s       split into groups of size ρ
                  €     inside each group
                 j ”,   join on commas
                     Y  join on newlines

Main program: basically just calculates ρ and lets subroutine 2 do the work
L½Ċç@
L                       length of input
 ½                      square rooted
  Ċ                     rounded up to the next highest integer
   ç@                   call subroutine 2 with the original input and the above

এবং এখানে কীভাবে ডিকোডার কাজ করে:

Subroutine: convert hexadecimal color string (without #) to character
ḣ2ØHiЀ’ḅ⁴Ọ
ḣ2                      take first two characters
  ØHi                   find indexes in a string of hexadecimal digits
     Ѐ                 for each of those characters
       ’                0-indexed (Jelly uses 1-indexing by default)
        ḅ⁴              convert from base 16
          Ọ             convert integer to character

Main program:
ṣ”#Ç€œr⁶
ṣ”#                     split on # signs
   ǀ                   run the subroutine for each element
     œr⁶                remove spaces from the right
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.