আপনি কি ব্রিটিশ গোয়েন্দাকে মারতে পারবেন? (ননোগ্রাম সলভার)


20

সময় এসেছে ব্রিটিশ গোয়েন্দা বিভাগকে পরাস্ত করার জন্য একটি বিপজ্জনক সন্ধানে। এই চ্যালেঞ্জের উদ্দেশ্যটি হ'ল সংক্ষিপ্ততম কোডটি লেখা যা একটি ননোগ্রাম সমাধান করবে।

ননোগ্রাম কী?

ননগ্রাম ধাঁধা

নিয়ম সহজ। আপনার স্কোয়ারগুলির একটি গ্রিড রয়েছে, যা অবশ্যই কালো বা বাম ফাঁকাতে পূর্ণ হতে হবে। গ্রিডের প্রতিটি সারির পাশে সেই সারিতে কালো স্কোয়ারের দৈর্ঘ্যের তালিকাবদ্ধ রয়েছে। প্রতিটি কলামের উপরে that কলামটিতে কালো স্কোয়ারের দৈর্ঘ্যের তালিকাবদ্ধ রয়েছে। আপনার লক্ষ্য সমস্ত কালো স্কোয়ার সন্ধান করা। এই ধাঁধা প্রকারে, সংখ্যাগুলি হ'ল পৃথক টোমোগ্রাফির একটি রূপ যা পরিমাপ করে যে কোনও প্রদত্ত সারিতে বা কলামে ভরাট-ইন স্কোয়ারের কতগুলি অখণ্ড রেখা রয়েছে measures উদাহরণস্বরূপ, "4 8 3" এর একটি সূত্র বলতে বোঝা যাচ্ছে যে ক্রমানুসারে গ্রুপগুলির মধ্যে কমপক্ষে একটি ফাঁকা বর্গক্ষেত্রের সাথে চার, আট এবং তিনটি ভরা স্কোয়ারের সেট রয়েছে। [ ] [ ]

সুতরাং উপরের ননোগ্রামের সমাধানটি হ'ল:

সলভ ননগ্রাম

বাস্তবায়ন বিশদ

আপনি ননোগ্রামের প্রতিনিধিত্ব করতে বেছে নিতে পারেন তবে আপনি যা চান তা বেছে নিতে পারেন এবং আপনার ভাষার জন্য আপনি যেভাবে উপযুক্ত মনে করেন তা ইনপুট হিসাবে নিতে পারেন। আউটপুট জন্য একই যায়। এই চ্যালেঞ্জের উদ্দেশ্য হ'ল আক্ষরিক অর্থে কাজটি করা; যদি আপনি আপনার প্রোগ্রাম যা আউটপুট দেয় তার সাথে যদি ননগ্রামটি সমাধান করতে পারেন তবে তা বৈধ। একটি সতর্কতা হ'ল আপনি কোনও অনলাইন সলভার ব্যবহার করতে পারবেন না :)

এই সমস্যাটি খুব অ্যালগোরিদমিকভাবে চ্যালেঞ্জিং (এনপি-সম্পূর্ণ) যেহেতু এর কোনও সম্পূর্ণ দক্ষ সমাধান নেই এবং এর মতো, বৃহত্তরগুলির সমাধান করতে সক্ষম না হওয়ায় আপনাকে দণ্ডিত করা হবে না, যদিও আপনার উত্তরটি যদি ভারী হয়ে থাকে তবে তা পুরষ্কারপ্রাপ্ত হবে যদি বড় মামলাগুলি পরিচালনা করতে সক্ষম (বোনাস দেখুন)। একটি মানদণ্ড হিসাবে, আমার সমাধান 5-10 সেকেন্ডের মধ্যে প্রায় 25x25 পর্যন্ত কাজ করে। বিভিন্ন ভাষার মধ্যে নমনীয়তার অনুমতি দেওয়ার জন্য, 25x25 ননগ্রামের জন্য 5 মিনিটেরও কম সময় নেওয়া সমাধানগুলি যথেষ্ট ভাল।

আপনি সর্বদা একটি বর্গ NxN ননগ্রামে ধাঁধাটি ধরে নিতে পারেন।

আপনার সমাধানগুলি পরীক্ষা করতে আপনি এই অনলাইন ননগ্রাম ধাঁধা প্রস্তুতকারকটি ব্যবহার করতে পারেন ।

স্কোরিং

আপনি অবশ্যই যে কোনও ভাষা ব্যবহার করতে পারেন নিঃসন্দেহে এবং এটি কোড গল্ফ হওয়ায় এন্ট্রিগুলি ক্রমে সাজানো হবে: accuracy -> length of code -> speed.তবে কোড গল্ফিং ভাষার দ্বারা নিরুৎসাহিত হবেন না, সমস্ত ভাষায় উত্তর যা গল্ফিংয়ের চেষ্টা দেখায় একটি আকর্ষণীয় উপায়ে upvated হবে!

বোনাস

আমি এখানে ব্রিটিশ ইন্টেলিজেন্স দ্বারা প্রকাশিত একটি ক্রিপ্টোগ্রাফিক ক্রিসমাস কার্ড থেকে ননোগ্রাম সম্পর্কে জানতে পারি । প্রথম অংশটি ছিল মূলত একটি বিশাল 25x25 ননোগ্রাম। আপনার সমাধানটি যদি এটি সমাধান করতে সক্ষম হয় তবে আপনি ক্লুডস পাবেন :)

ডেটা প্রবেশের ক্ষেত্রে আপনার জীবনকে আরও সহজ করার জন্য, আমি আপনার বিনামূল্যে ব্যবহারের জন্য এই নির্দিষ্ট ধাঁধাটির জন্য কীভাবে ডেটা উপস্থাপন করেছি তা সরবরাহ করেছি। প্রথম 25 টি লাইনগুলি সারি ক্লু, তারপরে একটি '-' বিভাজনকারী রেখা, তারপরে কোল ক্লুগুলির 25 লাইন, তারপরে একটি '#' বিভাজক রেখা এবং তারপরে স্কয়ারের ক্লুগুলি পূরণ করে গ্রিডের প্রতিনিধিত্ব করা হয়।

7 3 1 1 7
1 1 2 2 1 1
1 3 1 3 1 1 3 1
1 3 1 1 6 1 3 1
1 3 1 5 2 1 3 1
1 1 2 1 1
7 1 1 1 1 1 7
3 3
1 2 3 1 1 3 1 1 2
1 1 3 2 1 1
4 1 4 2 1 2
1 1 1 1 1 4 1 3
2 1 1 1 2 5
3 2 2 6 3 1
1 9 1 1 2 1
2 1 2 2 3 1
3 1 1 1 1 5 1
1 2 2 5
7 1 2 1 1 1 3
1 1 2 1 2 2 1
1 3 1 4 5 1
1 3 1 3 10 2
1 3 1 1 6 6
1 1 2 1 1 2
7 2 1 2 5
-
7 2 1 1 7
1 1 2 2 1 1
1 3 1 3 1 3 1 3 1
1 3 1 1 5 1 3 1
1 3 1 1 4 1 3 1
1 1 1 2 1 1
7 1 1 1 1 1 7
1 1 3
2 1 2 1 8 2 1
2 2 1 2 1 1 1 2
1 7 3 2 1
1 2 3 1 1 1 1 1
4 1 1 2 6
3 3 1 1 1 3 1
1 2 5 2 2
2 2 1 1 1 1 1 2 1
1 3 3 2 1 8 1
6 2 1
7 1 4 1 1 3
1 1 1 1 4
1 3 1 3 7 1
1 3 1 1 1 2 1 1 4
1 3 1 4 3 3
1 1 2 2 2 6 1
7 1 3 2 1 1
#
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

এবং আপনার সুবিধার জন্য এখানে কিছুটা আলাদা সংস্করণ রয়েছে; কমা দ্বারা পৃথক করা টুপল (সারি, কর্ন) যেখানে প্রতিটি উপাদান তালিকার তালিকা থাকে।

([[7, 3, 1, 1, 7],
  [1, 1, 2, 2, 1, 1],
  [1, 3, 1, 3, 1, 1, 3, 1],
  [1, 3, 1, 1, 6, 1, 3, 1],
  [1, 3, 1, 5, 2, 1, 3, 1],
  [1, 1, 2, 1, 1],
  [7, 1, 1, 1, 1, 1, 7],
  [3, 3],
  [1, 2, 3, 1, 1, 3, 1, 1, 2],
  [1, 1, 3, 2, 1, 1],
  [4, 1, 4, 2, 1, 2],
  [1, 1, 1, 1, 1, 4, 1, 3],
  [2, 1, 1, 1, 2, 5],
  [3, 2, 2, 6, 3, 1],
  [1, 9, 1, 1, 2, 1],
  [2, 1, 2, 2, 3, 1],
  [3, 1, 1, 1, 1, 5, 1],
  [1, 2, 2, 5],
  [7, 1, 2, 1, 1, 1, 3],
  [1, 1, 2, 1, 2, 2, 1],
  [1, 3, 1, 4, 5, 1],
  [1, 3, 1, 3, 10, 2],
  [1, 3, 1, 1, 6, 6],
  [1, 1, 2, 1, 1, 2],
  [7, 2, 1, 2, 5]],
 [[7, 2, 1, 1, 7],
  [1, 1, 2, 2, 1, 1],
  [1, 3, 1, 3, 1, 3, 1, 3, 1],
  [1, 3, 1, 1, 5, 1, 3, 1],
  [1, 3, 1, 1, 4, 1, 3, 1],
  [1, 1, 1, 2, 1, 1],
  [7, 1, 1, 1, 1, 1, 7],
  [1, 1, 3],
  [2, 1, 2, 1, 8, 2, 1],
  [2, 2, 1, 2, 1, 1, 1, 2],
  [1, 7, 3, 2, 1],
  [1, 2, 3, 1, 1, 1, 1, 1],
  [4, 1, 1, 2, 6],
  [3, 3, 1, 1, 1, 3, 1],
  [1, 2, 5, 2, 2],
  [2, 2, 1, 1, 1, 1, 1, 2, 1],
  [1, 3, 3, 2, 1, 8, 1],
  [6, 2, 1],
  [7, 1, 4, 1, 1, 3],
  [1, 1, 1, 1, 4],
  [1, 3, 1, 3, 7, 1],
  [1, 3, 1, 1, 1, 2, 1, 1, 4],
  [1, 3, 1, 4, 3, 3],
  [1, 1, 2, 2, 2, 6, 1],
  [7, 1, 3, 2, 1, 1]])

দুঃখজনকভাবে আমার ওয়েবসাইটটি বন্ধ আছে তবে এটিতে যুক্তিসঙ্গত দ্রুত ননোগ্রাম সলভার ছিল; 5-10 মিনিট অত্যধিক শোনায়।
নীল


1
@ দ্বানা আপনার অবিশ্বাস্য কেস নিয়ে চিন্তার দরকার নেই। এলোমেলো উত্তর হিসাবে, 25x25 ননোগ্রামে আপনার কাছে 2 ^ 625 সম্ভাব্য কনফিগারেশন রয়েছে। প্রসঙ্গে, এটি জানা মহাবিশ্বের পরমাণুর সংখ্যার দ্বিগুণেরও বেশি (যেমন আপনি যদি মহাবিশ্বের প্রতিটি পরমাণুকে কিছুটা হিসাবে ব্যবহার করেন, তবে এখনও আপনার সম্ভাবনাগুলি সংরক্ষণের জন্য পর্যাপ্ত জায়গা থাকবে না)। সময়ের নিরিখে, যদি প্রতিটি কনফিগারেশনের বৈধতা পরীক্ষা করতে আপনাকে ন্যানো সেকেন্ড (উদার) লাগে, কোডটি চালানো শেষ করতে মহাবিশ্বের 7 টি জীবনকাল লাগবে :)
গৌরথ

1
অবিশ্বাস্য কেস স্পষ্ট করার জন্য Ty। (+ I একটি ঐন্দ্রজালিক পিসি আছে ~ 2.1546362E-186 সেকেন্ডের মধ্যে একটি উত্তর যাচাই)
dwana

1
আপনার সিএসভিতে কোনও স্কোয়ার ইঙ্গিত নেই। এগুলি উত্পন্ন করার জন্য এখানে কিছু জেএস রয়েছে:s=[].fill([].fill(0,0,25),0,25);s[3][3]=s[3][4]=s3[3][12]=s3[3][13]=s3[3][21]=s[8][6]=s[8][7]=s[8][10]=s[8][14]=s[8][15]=s[8][18]=s[16][6]=s[16][11]=s[16][16]=s[16][20]=s[21][3]=s[21][4]=s[21][9]=s[21][10]=s[21][15]=s[21][20]=s[21][21]=1;
টাইটাস

উত্তর:


5

ব্র্যাচল্যাগ , 70 69 বাইট

[R:C]hlL~l:L:1f=.:3aR,.z:3aC,
tL,?he##ElL,E:2a
.<2,_1<
@b:4f:la
e.h1,

এটি দুটি তালিকার একটি তালিকা নেয় (প্রথমে সারি সূচকগুলি, তারপরে কলামগুলি)। প্রতিটি সূচক নিজেই একটি তালিকা ( [3,1]এক সারির মতো অবস্থার জন্য )।

এই সংস্করণটি চ্যালেঞ্জের 5 বাই 5 উদাহরণটি সমাধান করতে প্রায় 3 মিনিট সময় নেয়।

ওয়ে আরও দক্ষ সংস্করণ, 91 বাইট

[R:C]hlL~l:L:1f:Cz:3az:Rz:3a=.:4aR,.z:4aC,
tL,?he##ElL,E:2a
.<2,_1<
:+a#=,?h
@b:5f:la
e.h1,

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

এইটি সম্পূর্ণ নিষ্ঠুর শক্তি নয়: কেবলমাত্র তাত্পর্যটি হ'ল এই এককটি কক্ষের মানগুলিতে সীমাবদ্ধতা আরোপ করে যে প্রতি সারিতে এবং কলামে 1 এস সংখ্যাটি ইনপুটটিতে সূচক হিসাবে প্রদত্ত সংখ্যার সাথে মেলে। একমাত্র নিষ্ঠুর বলের অংশটি তখন সেই প্রতিবন্ধকতাগুলির সাথে একটি গ্রিড সন্ধান করা যার জন্য 1 এর "ব্লক" ইঙ্গিত হিসাবে দেওয়া হয়েছে যা মিলে।

এইটি চ্যালেঞ্জের 5 বাই 5 উদাহরণে প্রায় 0.05 সেকেন্ড সময় নেয়। এটি এখনও বোনাসের ক্ষেত্রে খুব ধীরে ধীরে, কারণ সীমাবদ্ধতার ক্ষেত্রে কীভাবে এক বা একাধিক শূন্য দ্বারা পৃথক করা ব্লকগুলি প্রকাশ করতে হবে তা আমার কোনও ধারণা নেই।

ব্যাখ্যা

আমি 93 বাইট সংস্করণ নীচে ব্যাখ্যা করব। উভয়ের মধ্যে কেবলমাত্র তফাতটি 3 হ'ল ভবিষ্যদ্বাণী করা কল যা 70 বাইট সংস্করণে নেই এবং ভবিষ্যদ্বাণীগুলির সংখ্যা (যেহেতু এটির চেয়ে কম রয়েছে)।

  • প্রধান শিকারী:

    [R:C]     Input = [R, C]
    hlL       The length of R is L
    ~l        Create a list of length L
    :L:1f     Each element of that list is a sublist of length L with cells 0 or 1 (Pred 1)
              %%% Part unique to the 93 bytes version
    :Cz       Zip the rows of the list of lists with C
    :3a       The sum of 1s in each row is equal to the sum of the indicators (Pred 3)
    z         Transpose
    :Rz       Zip the columns of the list of lists with R
    :3a       The sum of 1s in each column is equal to the sum of the indicators (Pred 3)
              %%%
    =.        Assign values to the cells of the list of lists which satisfy the constraints
    :4aR,     The blocks of 1s must match the indicators on rows
    .z        Transpose
    :4aC,     The blocks of 1s must match the indicators on columns
    
  • ভবিষ্যদ্বাণী 1: সারিগুলিকে একটি নির্দিষ্ট দৈর্ঘ্য থাকতে বাধ্য করে এবং প্রতিটি ঘর 0 বা 1 হয়।

    tL,       L is the length given as second element of the input
    ?he       Take an element from the list
    ##ElL,    That element E is itself a list of length L
    E:2a      The elements of E are 0s and 1s (Pred 2)
    
  • ভবিষ্যদ্বাণী 2: 0 বা 1 হতে ভেরিয়েবলকে সীমাবদ্ধ করুন

    .<2,      Input = Output < 2
    _1<       Output > -1
    
  • পূর্বাভাস 3: একটি তালিকার 1 টিয়ের যোগফল অবশ্যই সূচকগুলির যোগফলের সমান (উদাহরণস্বরূপ যদি সূচক [3: 1] হয় তবে তালিকার অবশ্যই যোগফল 4 হবে)

    :+a       Sum the elements of the list and sum the indicator
    #=,       Both sums must be equal
    ?h        Output is the list
    
  • ভবিষ্যদ্বাণী 4: 1s এর ব্লক সূচকের সাথে মেলে কিনা তা পরীক্ষা করুন

    @b        Split the list in blocks of the same value
    :5f       Find all blocks of 1s (Pred 5)
    :la       The list of lengths of the blocks results in the indicator (given as output)
    
  • ভবিষ্যদ্বাণী 5: 1 এস ব্লকের জন্য সত্য, অন্যথায় মিথ্যা

    e.        Output is an element of the input
      h1,     Its first value is 1
    

কাজের জন্য নিখুঁত সরঞ্জাম মনে হচ্ছে। ব্যাখ্যার অপেক্ষায় রইলাম।
Emigna

@ ফ্যাটালাইজ এটি দুর্দান্ত, আমি অপেক্ষা করছিলাম কেউ এটি করার জন্য প্রোলোগ-এস্কে ভাষা ব্যবহার করবে। আপনি কি 25x25 কেস দিয়ে চেষ্টা করেছেন? আমি ইতিমধ্যে
করিয়েছি

@ গৌরাথ আমি আজ বিকেলে এটি আমার কম্পিউটারে চালাব, আমরা কী করব তা দেখব।
54

@ ফ্যাটালাইজ সময় মতো মনে হয় তবে আমি এটি ভুল করে ফেলছি। আমি আমার ডেটা প্রবেশের দক্ষতার উপর পুরোপুরি নির্ভর করব না: ডি
গৌরথ

@ গওরাথ এটি টিআইওর সময়সাপেক্ষে বেরিয়ে গেছে, তবে আমি এটি সরাসরি আমার কম্পিউটারে অফলাইন ইন্টারপ্রেটারে চালাব।
ফ্যাটালাইজ করুন

9

হাস্কেল, 242 230 201 199 177 163 160 149 131 বাইট

import Data.Lists
m=map
a#b=[x|x<-m(chunk$length b).mapM id$[0,1]<$(a>>b),g x==a,g(transpose x)==b]
g=m$list[0]id.m sum.wordsBy(<1)

অবশেষে 200 বাইটের নিচে, @ বারগিকে জমা দিন। আকার প্রায় অর্ধেক করাতে সাহায্য করার জন্য @ নিমিকে অনেক ধন্যবাদ Hu

কি দারুন. প্রায় অর্ধেক আকারে এখন আংশিকভাবে আমার কারণে কিন্তু মূলত @ নিমির কারণে।

যাদু ফাংশন হয় (#)। এটি প্রদত্ত ননোগ্রামের সমস্ত সমাধান সন্ধান করে।

এটি সমস্ত ক্ষেত্রে সমাধান করতে সক্ষম, তবে এটি খুব ধীর হতে পারে, কারণ এটির জটিলতা প্রায় O(2^(len a * len b))। একটি দ্রুত মানদণ্ডটি 5x5 ননগ্রামের জন্য বরাদ্দ হওয়া 86 গিগাবাইট প্রকাশ করেছে।

মজাদার ঘটনা: এটি কেবল স্কোয়ারগুলির জন্য নয়, সমস্ত ননোগ্রামের জন্য কাজ করে।


কিভাবে এটা কাজ করে:

  • a#b: পূর্ণসংখ্যার তালিকা প্রদত্ত তালিকাগুলি যা স্কোয়ারের সংখ্যা উপস্থাপন করে, সমস্ত গ্রিড তৈরি করে ( map(chunk$length b).mapM id$a>>b>>[[0,1]]) এবং কেবলমাত্র বৈধ রাখার জন্য ফলাফলগুলি ফিল্টার করে।
  • g: একটি সম্ভাব্য ননোগ্রাম দেওয়া এটি অনুভূমিকভাবে 1 এর রানগুলির যোগফল।

আপনার অর্থ ও (২ ^ (লেন এ * লেন বি)), না ও ((লেন এ * লেন বি) ^ 2)।
অ্যান্ডারস ক্যাসরগ

পছন্দ করুন আমি দুর্ঘটনাক্রমে সেখানে মিলিয়ন মিলিয়ন রাখুন। : ডি
থ্রিএফএক্স

1
আরেকটি কয়েকটি বাইট: m(chunk$l b)এবংreplicate(l$a>>b)
বার্গি

@ থ্রিএফএক্স 86 86 জিবি: ও ... বিটিডব্লিউ আপনি কীভাবে এটি সংকলন করবেন সংক্ষেপে ব্যাখ্যা করতে পারবেন? আমি কেবল হাস্কেল শিখতে শুরু করেছি এবং এটি জিসিসি-তে ত্রুটি দিচ্ছে। এটি পরীক্ষা করে দেখতে চান :)
গৌরথ

1
import Data.Listsযথেষ্ট, কারণ এটি পুনরায় রপ্তানির উভয় Data.Listএবং Data.List.Split
নিমি

4

পাইথ, 91 72 71 বাইট

D:GHdRq@@QdG.nCf.)TrH8V^,01^hQ2=TcNhQ=Y1VhQ=*Y*:H@TH1:H@CTH2)IYjbmjkdTb

এমন একটি প্রোগ্রাম যা [size, [horizontal clues], [vertical clues]]প্রতিটি সূত্রের পূর্ণসংখ্যার তালিকা হিসাবে ফর্মের তালিকার ইনপুট নেয় (খালি ক্লুগুলি খালি তালিকা হয় []), এবং বাইনারি গ্রিডের আকারে ছায়াযুক্ত 1এবং 0শেডযুক্ত নয় এমন প্রতিটি সলিউশন, নিউলাইন পৃথক করে মুদ্রণ করে ।

এটি একটি নিষ্ঠুর শক্তি, মোটামুটিভাবে O(2^n^2)। এটি বৃহত্তর ধাঁধাগুলির জন্য খুব দীর্ঘ সময় গ্রহণ শুরু করে, তবে পর্যাপ্ত সময় দেওয়া কোনও আরব্রিটরি আকার সমাধান করবে।

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

কিভাবে এটা কাজ করে

[0, 1]সমান দৈর্ঘ্যের বারবার কার্টেসিয়ান পণ্যটি গ্রহণ করে প্রোগ্রামটি প্রতিটি সম্ভাব্য বিন্যাস উত্পন্ন করে size^2। এর পরে প্রতিটি অনুভূমিক রেখার জন্য একটি তালিকা প্রদান করে এগুলি খণ্ডগুলিতে ভাগ করা হবে। প্রতিটি লাইন রান লেন্থ এনকোডড থাকে, উপস্থিতি দ্বারা ফিল্টার করা হয় 1এবং সমতল করা হয়, সেই লাইনের ক্লু রেখে leaving এটি পরে ইনপুট বিরুদ্ধে পরীক্ষা করা হয়। উপরের প্রক্রিয়া খণ্ডগুলি স্থানান্তর করার জন্য উল্লম্ব রেখাগুলি পরীক্ষা করে পুনরাবৃত্তি হয়। যদি কোনও হিট হয় তবে প্রতিটি খণ্ডটি সংক্ষিপ্ত আকারে যুক্ত হয় এবং সংক্ষিপ্ত অংশগুলি নতুন লাইনে যোগ হয় এবং একটি প্রচ্ছন্ন নিউলাইন সহ স্পষ্টভাবে মুদ্রিত হয়।

D:GHdRq@@QdG.nCf.)TrH8V^,01^hQ2=TcNhQ=Y1VhQ=*Y*:H@TH1:H@CTH2)IYjbmjkdTb  Program. Input: Q
                            hQ                                           Q[0], size
                           ^  2                                          Square
                        ,01                                              [0, 1]
                       ^                                                 Cartesian product
                      V                                     )            For N in the Cartesian product:
                                 cNhQ                                    Split N into Q[0] chunks
                               =T                                        Assign that to T
                                     =Y1                                 Y=1
                                        VhQ                              For H in range [0, Q[0]-1]:
D:GHd                                                                     def :(G, H, d)
                   rH8                                                     Run-length-encode(H)
               f.)T                                                        Filter by presence of 1 in character part
            .nC                                                            Transpose and flatten, giving the clue
       @@QdG                                                               Q[d][G], the relevant input clue
     Rq                                                                    Return clue==input clue
                                               :H@TH1                     :(H, T, 1)
                                                     :H@CTH2              :(H, transpose(T), 2)
                                           =*Y*                           Y=Y*product of above two
                                                             IY           If Y:
                                                                 mjkdT     Conacatenate each element of T
                                                               jb          Join on newlines
                                                                      b    Add a newline and implicitly print

কিছু টিপসের জন্য @ Pietu1998 ধন্যবাদ


এটি আমার মধ্যে দেখা সবচেয়ে দীর্ঘ পাইথ প্রোগ্রাম হতে পারে
বিজনেস ক্যাট

=ZhZসমান =hZ, এবং FNসমান V
পূর্কাকাডারী

@ দ্য বাইকিংভিকিং আপনার যথাযথ সময় দেওয়ার অর্থ কী? আমি মোটামুটি নিশ্চিত যে আপনি যদি মহাবিশ্বের ধারণা থেকেই এটি শুরু করে থাকেন তবে এখনই এটি কোনও 25x25 সমাধান করবে না।
গওরাথ

1
@ গৌরথ আমিও এ সম্পর্কে মোটামুটি নিশ্চিত! আমি পাইথের কাছে নতুন, এবং যে সময়টি আমাকে গ্রহণ করেছে, তার পরেও আমি আরও ভাল অ্যালগরিদম বাস্তবায়নের চেষ্টা বিবেচনা করতে চাই না
দ্য বাইকিংভিকিং

2

জাভাস্ক্রিপ্ট (ES6), 401 386 333 বাইট

এটি একটি প্রাথমিক প্রচেষ্টা। এটি খুব দক্ষ নয় তবে আমি সারি এবং কলামগুলির বাইনারি উপস্থাপনার উপর নিয়মিত প্রকাশগুলি ব্যবহার করে একটি সমাধান পরীক্ষা করতে আগ্রহী ছিলাম।

উদাহরণস্বরূপ, এটি ক্লুটি [3,1]নিম্নলিখিত নিয়মিত অভিব্যক্তিতে অনুবাদ করবে :

/^0*1{3}0+1{1}0*$/

এই মুহুর্তে, এই সংস্করণটি স্কোয়ার ক্লুগুলি আমলে নিচ্ছে না। আমি সম্ভবত এটি পরে যুক্ত করব।

কোড

(c,r)=>{W=c.length;w=[];S=0;M=(n,p)=>eval(`/^0*${p.map(v=>`1{${v}}`).join`0+`}0*$/`).exec(n);R=(y,i=0)=>S||(w[y]=r[y][i],y+1<W?R(y+1):c.every((c,y)=>(n=0,w.map((_,x)=>n+=w[W-1-x][y]),M(n,c)))&&(S=w.join`
`),r[y][i+1]&&R(y,i+1));r=r.map(r=>[...Array(1<<W)].map((_,n)=>((1<<30)|n).toString(2).slice(-W)).filter(n=>M(n,r)));return R(0)}

আউটপুট

সমাধান বাইনারি বিন্যাসে প্রদর্শিত হয়। যেমন:

00110
01110
11100
11101
00001

পরীক্ষা

উদাহরণ গ্রিডে এটি একটি সাধারণ পরীক্ষা।

let f =
(c,r)=>{W=c.length;w=[];S=0;M=(n,p)=>eval(`/^0*${p.map(v=>`1{${v}}`).join`0+`}0*$/`).exec(n);R=(y,i=0)=>S||(w[y]=r[y][i],y+1<W?R(y+1):c.every((c,y)=>(n=0,w.map((_,x)=>n+=w[W-1-x][y]),M(n,c)))&&(S=w.join`
`),r[y][i+1]&&R(y,i+1));r=r.map(r=>[...Array(1<<W)].map((_,n)=>((1<<30)|n).toString(2).slice(-W)).filter(n=>M(n,r)));return R(0)}

console.log(f(
  [[2],[3],[4],[2],[2]],
  [[2],[3],[3],[3,1],[1]]
));


ভাল যুক্তি. যদিও ক্রিসমাস ধাঁধাতে আমার ব্রাউজারগুলিকে হত্যা করে।
তিতাস

2

হাস্কেল, 109 বাইট

দাবি অস্বীকার : এটি @ থ্রিএফএক্স এর উত্তর থেকে প্রাপ্ত । আমি তার উত্তরটি গল্ফ করতে তাকে সহায়তা করেছিলাম তবে মনে হয় তিনি আমার শেষ উল্লেখযোগ্য উন্নতি অন্তর্ভুক্ত করার আগ্রহ হারিয়ে ফেলেছেন, তাই আমি তাদের নতুন উত্তর হিসাবে পোস্ট করি।

import Data.List
n=mapM id
a#b=[x|x<-n$(n$" #"<$a)<$b,g x==a,g(transpose x)==b]
g=map$max[0].map length.words

ব্যবহারের উদাহরণ: [[2],[3],[3],[3,1],[1]] # [[2],[3],[4],[2],[2]]-> [[" ## "," ### ","### ","### #"," #"]]

পাশবিক বল. দৈর্ঘ্য গণনা করুন এবং ইনপুটটির সাথে তুলনা করুন, এর সমস্ত অংশের বিভাজন এবং এর সমস্ত সমন্বয় চেষ্টা করুন।##


1

পিএইচপি, 751 833 (720) 753 724 726 710 691 680 682 বাইট

আমি একটি বিশেষায়িত ক্রমবৃদ্ধি তৈরি করতে এবং আমার কার্টেসিয়ান জেনারেটরটি আরও একবার চেষ্টা করতে আগ্রহী ছিলাম;
তবে কার্টেসিয়ানকে বড় ধাঁধাটি দ্রুত সমাধানের জন্য ব্যাকট্র্যাকিংয়ের পক্ষে নামিয়েছেন।

$p=[];foreach($r as$y=>$h){for($d=[2-($n=count($h)+1)+$u=-array_sum($h)+$w=count($r)]+array_fill($i=0,$n,1),$d[$n-1]=0;$i<1;$d[0]+=$u-array_sum($d)){$o=$x=0;foreach($d as$i=>$v)for($x+=$v,$k=$h[$i];$k--;)$o+=1<<$x++;if(($s[$y]|$o)==$o){$p[$y][]=$o;$q[$y]++;}for($i=0;$i<$n-1&$d[$i]==($i?1:0);$i++);if(++$i<$n)for($d[$i]++;$i--;)$d[$i]=1;}}
function s($i,$m){global$c,$w,$p;for(;!$k&&$i[$m]--;$k=$k&$m<$w-1?s($i,$m+1):$k){for($k=1,$x=$w;$k&&$x--;){$h=$c[$x];for($v=$n=$z=$y=0;$k&&$y<=$m;$y++)$n=$n*($f=($p[$y][$i[$y]]>>$x&1)==$v)+$k=$f?:($v=!$v)||$n==$h[$z++];if($k&$v)$k=$n<=$h[$z];}}return$k?is_array($k)?$k:$i:0;}
foreach(s($q,0)as$y=>$o)echo strrev(sprintf("\n%0{$w}b",$p[$y][$o]));
  • $rসারি ইঙ্গিতগুলির $cজন্য, কলামের $sজন্য এবং বর্গক্ষেত্রের ইঙ্গিতগুলির জন্য অ্যারেতে ইঙ্গিতগুলি প্রত্যাশা করে ।
  • invalid argument supplied for foreachএটির কোনও সমাধান না পেলে ছোঁড়ে ।
  • সঠিক বাইট গণনা পেতে, একটি শারীরিক ব্যবহার করুন \nএবং অন্যান্য দুটি লাইন বিরতি সরান।

বিবরণ

1) সারি ইঙ্গিতগুলি
থেকে সম্ভাব্য সারি তৈরি হয় যা বর্গের ইঙ্গিতগুলিকে সন্তুষ্ট করে
এবং প্রতিটি সারি সূচকের জন্য তাদের গণনাগুলি মনে রাখে।

২) সারি সংমিশ্রণগুলির ব্যাকট্র্যাক:
যদি সংমিশ্রণটি কলামের ইঙ্গিতগুলিকে সন্তুষ্ট করে, আরও গভীরভাবে অনুসন্ধান করুন বা সফল সংমিশ্রণটি ফিরে পান,
অন্যথায় এই সারির জন্য পরবর্তী সম্ভাবনার চেষ্টা করুন

3) মুদ্রণ সমাধান


সর্বশেষ গল্ফিংয়ের পারফরম্যান্সে মারাত্মক প্রভাব পড়েছিল;
তবে আমি চূড়ান্ত মানদণ্ডের জন্য প্রোফাইলিং কার্যভার সরিয়েছি।

প্রতিস্থাপন $n=$n*($f=($p[$y][$i[$y]]>>$x&1)==$v)+$k=$f?:($v=!$v)||$n==$h[$z++];
সঙ্গে if(($p[$y][$i[$y]]>>$x&1)-$v){$k=($v=!$v)||$n==$h[$z++];$n=1;}else$n++;
গত golfing পদক্ষেপ পূর্বাবস্থা।

উদাহরণ

ছোট উদাহরণের জন্য ( 17 থেকে 21 প্রায় 12 8 7 6.7 5.3 এমএস) ব্যবহার করুন

$r=[[2],[3],[3],[3,1],[1]];$c=[[2],[3],[4],[2],[2]];$s=[0,0,0,0,0];

ক্রিসমাস ধাঁধা জন্য:

  • পুরানো সমাধান দিয়ে আমার ছোট হোম সার্ভারটি মেরে ফেলেছে
  • পরীক্ষার ফলাফলগুলি দিয়ে ব্রাউজারটিকে হত্যা করে
  • এখন প্রায় 36 সেকেন্ডের মধ্যে 50 37.8 45.5 এ সমাধান হয়েছে

প্রশ্ন থেকে কোনও ফাইলের ডেটা রাখুন christmas.nonogramএবং আমদানি করতে এই কোডটি ব্যবহার করুন:

$t=r;foreach(file('christmas.nonogram')as$h)if('-'==$h=trim($h))$t=c;elseif('#'==$h){$t=s;$f=count($h).b;}else
{$v=explode(' ',$h);if(s==$t)for($h=$v,$v=0,$b=1;count($h);$b*=2)$v+=$b*array_shift($h);${$t}[]=$v;}

ভাঙ্গন

$p=[];  // must init $p to array or `$p[$y][]=$o;` will fail
foreach($r as$y=>$h)
{
    // walk $d through all combinations of $n=`hint count+1` numbers that sum up to $u=`width-hint sum`
    // (possible `0` hints for $h) - first and last number can be 0, all others are >0
    for(
        $d=[2-
            ($n=count($h)+1)+               // count(0 hint)=count(1 hint)+1
            $u=-array_sum($h)+$w=count($r)  // sum(0 hint) = width-sum(1 hint)
        ]                           // index 0 to max value $u-$n+2
        +array_fill($i=0,$n,1)      // other indexes to 1
        ,$d[$n-1]=0;                // last index to 0
                                    // --> first combination (little endian)
        $i<1;   // $i:0 before loop; -1 after increment; >=$n after the last combination
        $d[0]+=$u-array_sum($d) // (see below)
    )
    {
        // A: create row (binary value) from 1-hints $h and 0-hints $d
        $o=$x=0;
        foreach($d as$i=>$v)
            for($x+=$v,$k=$h[$i];$k--;)
                $o+=1<<$x++;
        // B: if $o satisfies the square hints
        if(($s[$y]|$o)==$o)
        {
            $p[$y][]=$o;    // add to possible combinations
            $q[$y]++;       // increase possibility counter
        }
        // C: increase $d
            // find lowest index with a value>min
                // this loop doesn´t need to go to the last index:
                // if all previous values are min, there is nothing left to increase
        for($i=0;$i<$n-1&$d[$i]==($i?1:0);$i++);
        if(++$i<$n)             // index one up; increase $d if possible
            for($d[$i]++        // increase this value
            ;$i--;)$d[$i]=1;    // reset everything below to 1
            // adjust $d[0] to have the correct sum (loop post condition)
    }
}

// search solution: with backtracking on the row combinations ...
function s($i,$m)
{
    global $c,$w,$p;
    for(;
        !$k // solution not yet found
        &&$i[$m]    // if $i[$m]==0, the previous iteration was the last one on this row: no solution
            --;     // decrease possibility index for row $m
        $k=$k&$m<$w-1? s($i,$m+1) : $k      // if ok, seek deeper while last row not reached ($m<$w-1)
    )
    {
        // test if the field so far satisfies the column hints: loop $x through columns
        for($k=1,$x=$w;$k&&$x--;)   // ok while $k is true
        {
            $h=$c[$x];
            // test column hints on the current combination: loop $y through rows up to $m
            for($v=$n=$z=   // $v=temporary value, $n=temporary hint, $z=hint index
                $y=0;$k&&$y<=$m;$y++)
                // if value has not changed, increase $n. if not, reset $n to 1
                // (or 0 for $k=false; in that case $n is irrelevant)
                $n=$n*  
                    // $f=false (int 0) when value has changed, true (1) if not
                    ($f=($p[$y][$i[$y]]>>$x&1)==$v)
                    +$k=$f?:    // ok if value has NOT changed, else
                        ($v=!$v)        // invert value. ok if value was 0
                        || $n==$h[$z    // value was 1: ok if temp hint equals current sub-hint
                        ++]             // next sub-hint
                ;
            // if there is a possibly incomplete hint ($v==1)
            // the incomplete hint ($n) must be <= the next sub-hint ($c[x][$z])
            // if $n was <$h[$z] in the last row, the previous column hints would not have matched
            if($k&$v)$k=$n<=$h[$z];
        }
        // ok: seek deeper (loop post condition)
        // not ok: try next possibility (loop pre condition)
    }
    return$k?is_array($k)?$k:$i:0;  // return solution if solved, 0 if not
}

// print solution
foreach(s($q,0)as$y=>$o)echo strrev(sprintf("\n%0{$w}b",$p[$y][$o]));

1
বড় উদাহরণটি আমার ছোট হোম সার্ভারকে হত্যা করে (500 - অভ্যন্তরীণ সার্ভার ত্রুটি)। সংযোগগুলি 15 সেকেন্ড পরে প্রস্তুত, তবে কার্টেসিয়ান পণ্যটিতে 1.823E + 61 সদস্য রয়েছে। (সপ্তম এবং 22 তম সারিতে কেবল একটি বিটিডব্লিউ সমাধান রয়েছে)) অ্যালগরিদমকে অবশ্যই উন্নত করতে হবে।
তিতাস

আমি মনে করি আপনি যদি পুনরাবৃত্ত ব্যাকট্র্যাকিং ব্যবহার করেন তবে এটিকে আরও বাড়িয়ে দেওয়া যেতে পারে। তবুও, দুর্দান্ত কাজ!
গৌরথ

@ গৌরথ: ব্যাকট্র্যাকিং কিছুটা দেয় এবং এমনকি বাইটগুলিও সাশ্রয় করে ... বিট পাটিগণিতের সাথে পূর্ণসংখ্যা প্রায় 50% গতি দেয় তবে আকার বাড়ায় (এটি ঠিক কতটা ব্যয় করে তা এখনও খুঁজে বের করতে হবে) ... এটি এখনও রয়েছে on
তিতাস

@ গৌরথ: আমি আমার বাগটি তাড়া করেছিলাম; এটি ইনক্রিমেন্টে ছিল (অন্য কোথায়?): $dসঠিক ক্রমে থাকতে হবেforeach
তিতাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.