একটি ননগ্রাম ধাঁধা তৈরি করুন


24

একটি ননোগ্রাম একটি দ্বি-মাত্রিক লজিক ধাঁধা যা এর মতো কিছু দেখায় (গেমটি পিক্সেলো , আমার প্রিয় ননগ্রামের গেমের স্ক্রিনশট ):

একটি খালি ননোগ্রাম বোর্ড

গেমের লক্ষ্যটি হল image নম্বরগুলি এনকোডিং করছে কোন চিত্রটি figure নিয়মগুলি সহজ: একটি কলাম বা সারিতে একটি সংখ্যার অর্থ হ'ল কোথাও that কলাম বা সারিতে, অনেকগুলি বাক্স একটি সারিতে ভরাট। উদাহরণস্বরূপ, উপরের চিত্রের নীচের সারিটিতে অবশ্যই কোনও বাক্স পূরণ করা উচিত নয়, যখন এটির উপরে একটিতে অবশ্যই এর সমস্ত বাক্স ভরাট থাকতে হবে। নীচে থেকে তৃতীয় সারিতে 8 টি ভরাট বাক্স রয়েছে এবং এগুলি সমস্ত এক সারিতে থাকবে।

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

এখানে প্রায় একই ধাঁধা, প্রায় সমাপ্ত:

প্রায় সমাপ্ত ননোগ্রাম বোর্ড

(এক্সটিএস গুরুত্বপূর্ণ নয়, তারা খেলোয়াড়েরা কেবল এই ইঙ্গিত দিয়েছিলেন যে "এই বর্গটি অবশ্যই পূর্ণ হয় না" Min

আশা করি আপনি এটি দেখতে পাচ্ছেন, উদাহরণস্বরূপ, "2 2" বলে এমন ইঙ্গিতযুক্ত মাঝারি কলামগুলিতে বাক্সগুলিতে দুটি 2-দৈর্ঘ্যের রান রয়েছে।

আপনার মিশনটি, আপনি যদি এটি গ্রহণ করতে চান তবে এটি এমন কোনও প্রোগ্রাম বা ফাংশন লিখতে হবে যা এই ধরণের ধাঁধা তৈরি করবে create আপনাকে বোর্ডের আকার একক পূর্ণসংখ্যা হিসাবে দেওয়া হবে (5 <= n <= 50) স্টিডিনে বা যুক্তি হিসাবে (কোনও ননগ্রাম ধাঁধাটি বর্গক্ষেত্র হওয়ার কোনও কারণ নেই, তবে এই চ্যালেঞ্জের জন্য এটি হবে)। এর পরে, আপনাকে যথাক্রমে চিত্রের ভরাট এবং পূরণ করা স্কোয়ারগুলি উপস্থাপন করে 1s এবং 0 এর একটি সিরিজ দেওয়া হবে। এর মধ্যে প্রথম এনটি শীর্ষ সারি, তারপরে পরের সারি ইত্যাদি You আপনি 2 * 1 কোষের বোর্ডকে স্টডআউট করতে ফিরে বা মুদ্রণ করতে পারবেন (কারণ তারা আরও ভাল দেখায়, এবং এটি আপনাকে একটি কলামের জন্য 2-অঙ্কের ইঙ্গিতের জন্য জায়গা দেয়) ), ইনপুট ডেটার সাথে সম্পর্কিত ইঙ্গিত সহ এগুলি সমস্ত খালি।

আউটপুট ফরমেট

আউটপুট ফরমেট

নমুনা

ইনপুট:

./nonogram <<< '5 0 1 1 1 0 1 1 0 1 1 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0'
                                 OR
      n(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])

চিত্র:

প্রথম উদাহরণ চিত্র

আউটপুট:

           1
         2 1 2
       3 2 1 2 3
     +----------
    3|
  2 2|
1 1 1|
  2 2|
    3|

ইনপুট:

./nonogram <<< '15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1'

চিত্র:

দ্বিতীয় উদাহরণ চিত্র

আউটপুট:

                   1                       1
                 1 1 3       3 5   5 3   3 1
                 7 2 3 2 4 2 3 210 2 3 0 4 215
               +------------------------------
              2|
              1|
              1|
              1|
              1|
            1 1|
        3 3 1 1|
        1 5 1 1|
          3 5 3|
          1 5 1|
          1 3 1|
      1 1 1 1 1|
1 1 1 1 1 1 1 1|
           11 3|
           11 3|

ব্যাখ্যা

  • আপনার আউটপুটটি সমাধানযোগ্য ধাঁধা হওয়া উচিত নয়। সমস্ত ননোগ্রামগুলি সমাধানযোগ্য নয়, তবে এটি আপনার উদ্বেগ নয়। ইনপুটটির সাথে মিলে এমন ইঙ্গিতগুলি কেবল আউটপুট করুন, তারা কোনও ভাল ধাঁধা তৈরি করে কিনা।
  • কমান্ড লাইনে আর্গুমেন্ট গ্রহণকারী একটি প্রোগ্রাম অনুমোদিত। এটি উপরে বর্ণিত এক ধরণের, তবে ভুল ধারণা পাওয়া সম্ভব possible এই জন্য স্পষ্টতা কি।
  • 0কোনও সারি বা কলামের জন্য মুদ্রণ মুদ্রণ করা বাধ্যতামূলক boxes আমি এটি কোথাও শব্দ দিয়ে বলি না তবে এটি নমুনা ডেটাতে।

আমি আমার সমাধানটি প্রায় শেষ করেছি। আমরা কি ধরে নিতে পারি যে একটি সারিতে বা কলামে 3-অঙ্কের বাক্স থাকবে না?
সুস্পষ্ট

2
@ ভয়েডপিজিয়ন: 5<=n<=50এটি অনুমান , তাই কোনও 3-সংখ্যার সংখ্যা থাকতে পারে না
কাইল কানোস

এই প্রশ্নটি পোস্ট করার পরে, আমি নিজেই একটি সমাধান নিয়ে কাজ শুরু করি। আমি এটি এখনও পোস্ট করব না ( এই মেটা উত্তর অনুসারে) তবে আমি আমার বাইট গণনাটি পোস্ট করব যাতে আপনারা লোকেদের জন্য কিছু করার চেষ্টা করতে হবে: পাইথন ২.7 এ ৪০৪ বাইট
আন্ডারগ্রাউন্ডোমোনাইল

আপনার প্রথম উদাহরণ আউটপুটটিতে যা -হওয়া উচিত তার চেয়ে বেশি কী নেই?
ভেন্টোরো

@ ভেন্ট্রো আপনি সঠিক! আমি জানতাম কীভাবে আমি এটি করতে একটি প্রোগ্রাম লিখব, তবে আমি আসলে এটি এখনও করি নি, তাই আমার নমুনা আউটপুটগুলি হাতে ছিল। ওহো! (আমি দ্বিতীয় নমুনা আউটপুটটিও স্ক্রু করেছি, তবে কোনও উত্তর আসার আগেই আমি এটি ঠিক করেছি।)
আন্ডারগ্রাউন্ডোমোরিয়েল

উত্তর:


9

গল্ফস্ক্রিপ্ট, 128 টি অক্ষর

~](:k/.{{1,%{,}%.!,+}%}:^~{' ':s*}%.{,}%$-1=:9{s*\+9~)>'|'n}+%\zip^.{,~}%$0=){.~[s]*@+>{s\+-2>}%}+%zip{9)s*\n}%\[9s*'+''--'k*n]\

স্থান পৃথক নম্বর হিসাবে ইনপুটটি STDIN এ সরবরাহ করতে হবে।

আপনি উদাহরণ এখানে পরীক্ষা করতে পারেন ।

মন্তব্য করা কোড:

# Parse the input into an 2D array of digits. The width is saved to variable k
~](:k/

# Apply the code block ^ to a copy of this array
.
{                # begin on code block
  {              # for each line
   1,%           #   split at 0s (1, => [0]) (leading, trailing, multiple 0s are 
                 #   removed because of operator % instead of /)
   {,}%          #   calculate the length of each run of 1s                 
   .!,+          #   special case: only zeros, i.e. []
                 #   in this case the ! operator yiels 1, thus [0], else []
  }%             # end for
}:^              # end of code block
~                # apply

# Format row headers
{' ':s*}%        # join numbers with spaces
.{,}%$-1=:9      # calulate the length of the longest row header
                 # and save it to variable <9>
{                # for each row
  s*\+           #   prepend padding spaces
  9~)>           #   and cut at length <9> from the right
  '|'n           #   append '|' and newline
}+%              # end for

# Format column headers
\zip^            # transpose input array and apply the code block ^
                 # i.e. calculate length of runs
.{,~}%$0=)       # determine (negative) length of the longest column header
{                # for each column
  .~[s]*@+       #   prepend enough spaces
  >              #   and cut at common length (from right)
  {s\+-2>}%      #   format each number/empty to 2 chars width
}+%              # end for
zip              # transpose column header into output lines
{9)s*\n}%        # prepend spaces to each line and append newline

# Inject separator line
\[
9s*              # spaces
'+'              # a plus sign
'--'k*           # k (width) number of '--'
n                # newline
]\

1
+1 দুর্দান্ত, আমি এই পোস্টটি থেকে বেশ কয়েকটি ভাল কৌশল শিখেছি
ক্রিশ্চিয়ান লুপাস্কু

আমি এটি 123 টি ~](:k/.zip\]{{1,%{,}%.!,+}%}/{' ':^*}%{.{,}%$-1=}:f~:r{^*\+r~)>'|'n}+%\f{.~)\[^]*@+>{^\+-2>}%}+%zip{r)^*\n}%r^*'+''--'k*n](অক্ষরে গল্ফ করতে পেরেছি: (কোনও কারণে লেটারকাউন্ট ডটকম বলেছেন 125 টি অক্ষর আপনি এটি অনুলিপি করেন তবে আমি আপনাকে আশ্বাস দিচ্ছি যে এটি 123 অক্ষর)। অ্যালগরিদমের কিছু অংশ পরিবর্তন করা হয়েছে, তবে সংখ্যাগরিষ্ঠতা এখনও একইরকম। আমি কিছু পরিবর্তনশীল নামও পরিবর্তন করেছি (ভেরিয়েবল হিসাবে 9 হওয়া স্মার্ট, তবে বিভ্রান্তিকর) তবে আপনি চাইলে এগুলি আবার পরিবর্তন করতে পারেন।
অস্থিরতা

7

রুবি, 216 255

n=$*.shift.to_i;k=*$*.each_slice(n)
u=->k{k.map{|i|r=i.join.scan(/1+/).map{|i|"%2d"%i.size}
[*["  "]*n,*r[0]?r:" 0"][-n,n]}}
puts u[k.transpose].transpose.map{|i|" "*(n-~n)+i*""},"  "*n+?++"--"*n,u[k].map{|i|i*""+?|}

যদিও এটি প্রশ্নের মধ্যে দেওয়া ঠিক নমুনা আউটপুট উত্পাদন করে না, এটি চশমা অনুসরণ করে। উদাহরণগুলির মধ্যে পার্থক্য কেবলমাত্র আমি কয়েকটি শীর্ষস্থানীয় স্পেস / নিউলাইন মুদ্রণ করি।

উদাহরণ:

$ ruby nonogram.rb 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
# empty lines removed for brevity
                                  1                       1  
                                1 1 3       3 5   5 3   3 1  
                                7 2 3 2 4 2 3 210 2 3 0 4 215
                              +------------------------------
                             2|
                             1|
                             1|
                             1|
                             1|
                           1 1|
                       3 3 1 1|
                       1 5 1 1|
                         3 5 3|
                         1 5 1|
                         1 3 1|
                     1 1 1 1 1|
               1 1 1 1 1 1 1 1|
                          11 3|
                          11 3|

পরিবর্তণের:

  • 240 -> 231: স্টিডিনের পরিবর্তে কমান্ড লাইন আর্গুমেন্টগুলি ব্যবহার করতে ইনপুট ফর্ম্যাট পরিবর্তন করা হয়েছে।
  • 231 -> 230: থেকে মান চেক সরিয়ে একটি স্থান থেকে বিদায় chunkকরার জন্য map
  • 230 -> 226: [nil]কল করার পরিবর্তে বিয়োগ করুন Array#compact
  • 226 -> 216: ইঙ্গিত জেনারেশন সরল করুন।

আপনি কিছু অতিরিক্ত নিউলাইন এবং স্পেসগুলি মুদ্রণ করেন তবে এখনও পর্যন্ত আমার সমস্ত পরীক্ষায় সেগুলি "0 বা তার বেশি" স্পেসিফিকেশন ফিট করে, তাই আপনি ভাল। আমি এখন আপনাকে সতর্ক করছি, যদিও, আমি যদি আমার মনিটরের বাম দিকে বাতাসে ভাসমান সংখ্যাগুলি দেখতে শুরু করি, তবে আমি এই উত্তরটি অযোগ্য করতে যাব :)
আন্ডারগ্রাউন্ডোমোরিয়েল

1
@undermonmonorail: আউটপুটটি এমনভাবে মুদ্রিত হয় যে ... length(leading spaces + numbers to the left) == 2*nএবং height(leading newlines + numbers at the top) == nযতক্ষণ না আপনার মনিটর 3*n+1 × 2*n+2চরিত্রের পক্ষে যথেষ্ট বড় হয় , আপনার আমাকে অযোগ্য ঘোষণা করা উচিত নয়। :)
ভেন্টোরো

4

রুবি, 434

n=$*[i=0].to_i
a,b=[],[]
a.push $*.slice!(1..n)*""while $*.size>1
(b.push a.map{|c|c[i]}*"";i+=1)while i<n
a,b=*[a,b].map{|c|c.map{|d|e=d.split(/[0]+/).map(&:size).select{|f|f>i=0}.map &:to_s;(e.size>0)?e:[?0]}}
m,k=*[a,b].map{|c|c.map(&:size).max}
s="  "*m
k.times{$><<s+"  "+b.map{|c|(" "+((c.size==k-i)?(c.shift):(" ")))[-2..-1]}*"";i+=1;puts}
puts s+" "+?++?-*n*2
a.each{|c|puts"  "*(m-c.size)+" "+c.map{|d|(" "+d)[-2..-1]}*""+?|}

আপনি কিভাবে এটি চালান? আমি চেষ্টা ruby $yourprogram <<< $inputকিন্তু পেয়েছিলাম ruby_nanograms:7:in '<main>': undefined method '+' for nil:NilClass (NoMethodError)
আন্ডারগ্রাউন্ডোমোনাইল

@undergroundmonorail ruby nonogram.rb 2 1 0 0 1একটি 2x2 জন্য
afuous

এটি একটি ভাল উত্তর, তবে আপনি 0দ্বিতীয় উদাহরণে চতুর্থ-শেষ কলামটির জন্য মুদ্রণ করবেন না ।
আন্ডারগ্রাউন্ডোমোনাইল

আমি কেবল লক্ষ্য করেছি যে +------... লাইনটি অনেকগুলি স্পেস দ্বারা ইন্টেন্টেড রয়েছে।
আন্ডারগ্রাউন্ডোমোনাইল

1
পুনঃটুইট করেছেন
সুস্পষ্ট

4

গল্ফস্ক্রিপ্ট 149 147

কোড

~](:s/.zip{{[0]%{,`}%['0']or}%.{,}%$)\;:¶;{.,¶\-[' ']*\+}%}:f~¶:v;\[f~]\zip{{{.,2\-' '*\+}%''*}:d2*)' '*:z\+{puts}:o~}%z(;'+'s'-'2**++o~{d'|'+o}/

সম্পাদনা:

  • অকেজো স্থান অপসারণ
  • putsআরও একটি চর সংরক্ষণের জন্য পুনরায় ব্যবহারযোগ্য ওয়ান-চর ফাংশনটি সংজ্ঞায়িত করা হয়েছে

অনলাইন ডেমো

কোডটির কিছুটা বর্ণিত সংস্করণ

# split lines
~](:s/

# make transposed copy
.zip

#prepare numbers to show in the header
{{[0]%{,`}%['0']or}%.{,}%$)\;:¶;{.,¶\-[' ']*\+}%}:f~¶:v;

# prepare numbers to show in the left column
\[f~]\zip

#print header (vertical hints)
{  {{.,2\-' '*\+}%''*}:d~  2*)' '*:z\+puts}%

#print first line
z(;'+'s'-'2**++puts

#print horizontal hints
~{d'|'+ puts}/

4

জাভাস্ক্রিপ্ট (E6) 314 334 357 410

N=(d,l)=>{J=a=>a.join(''),M=s=>(s.match(/1+/g)||['']).map(x=>x.length),f=' '.repeat(d+1),c=[n='\n'],o=n+f+'+'+'--'.repeat(d);for(i=-1;++i<d;)c[i]=M(J(l.map((e,p)=>p%d-i?'':e))),o+=n+(f+J(M(J(l).substr(i*d,d)).map(P=n=>n>9?n:n<10?' '+n:'  '))+'|').slice(-d-2);for(;--i;)o=n+f+' '+J(c.map(e=>P(e.pop())))+o;return o}

Ungolfed

N=(d,l)=> {
  J = a => a.join(''),
  M = s => (s.match(/1+/g)||['']).map(x=>x.length),
  f=' '.repeat(d+1), c=[n='\n'], o=n+f+'+'+'--'.repeat(d);
  for(i = -1; ++i < d;)
    c[i] = M(J(l.map((e,p)=>p%d-i?'':e))),
    o += n+(f+J(M(J(l).substr(i*d,d)).map(P=n=>n>9?n:n<10?' '+n:'  '))+'|').slice(-d-2);
  for(;--i;)
    o=n+f+' '+J(c.map(e=>P(e.pop())))+o;
  return o
}

ব্যবহার

N(5,[0,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1,1,1,0])

N(15,[0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1])

ইতিহাস সম্পাদনা করুন

কলামগুলি খুঁজে পাওয়ার জন্য 1 টি সরানো রিজএক্সপ্যাক্স.ওভারকিল
2 সহজ আরও ভাল। একটি স্ট্রিং আউটপুট, একটি অ্যারে নয়। সরানো ফাংশন পূরণ করুন (এফ)
3 এমনকি সহজ ler এর চেয়ে ভাল আমি আর করতে পারি না। এখনও গল্ফস্ক্রিপ্টের সাথে তুলনা করতে পারবেন না :(


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

@ টিগ্রো দুঃখিত, "=>" সিনট্যাক্স কেবল ফায়ারফক্সে কাজ করে। চলক: সি কলান্নস ইঙ্গিত, ডি মাত্রা, ইনপুট এর l তালিকা, ও আউটপুট, আমি লুপ ভেরিয়েবল, কিউ এবং জেড টেম্প
এডিসি 65


@ ইন্ডারস্কোর কোডটি ঘুরে দেখছেন, আমি পেয়েছি 326. আপনার কোডে আর আরম্ভ করা হয়নি (আপনি যখন বার বার চেষ্টা করবেন তখন সহজ ভুল ...)
edc65

1

আর, 384 অক্ষর

a=scan();p=function(x)paste(x,collapse="");P=paste0;s=sapply;l=length;f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0});g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p);c=P(g(f(1),2),"|");d=g(f(2),1);h=p(rep(" ",nchar(c[1])-1));e=P(h,"+",p(rep("-",nchar(d[1]))));d=P(h," ",d);cat(d,e,c,sep="\n")

ইন্ডেন্টেশন এবং কিছু ব্যাখ্যা সহ:

a=scan() #Takes input

p=function(x)paste(x,collapse="") #Creates shortcuts
P=paste0
s=sapply
l=length

#This function finds the number of subsequent ones in a line (using rle = run length encoding).
#It takes 1 or 2 as argument (1 being row-wise, 2 column-wise
f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0})

#This function takes the result of the previous and format the strings correctly (depending if they are rows or columns)
g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p)

c=paste0(g(f(1),2),"|") #Computes the rows
d=g(f(2),1) #Computes the columns
h=p(rep(" ",nchar(c[1])-1)) 
e=paste0(h,"+",p(rep("-",nchar(d[1])))) #Prepare vertical border
d=paste0(h," ",d) #Pad column indices with spaces
cat(d,e,c,sep="\n") #Prints

ব্যবহার:

> a=scan();p=function(x)paste(x,collapse="");P=paste0;s=sapply;l=length;f=function(i)lapply(apply(matrix(a[-1],nr=a,b=T),i,rle),function(x)if(any(x$v)){x$l[!!x$v]}else{0});g=function(j,i)apply(s(j,function(x)sprintf("%2s",c(rep("",max(s(j,l))-l(x)),x))),i,p);c=P(g(f(1),2),"|");d=g(f(2),1);h=p(rep(" ",nchar(c[1])-1));e=P(h,"+",p(rep("-",nchar(d[1]))));d=P(h," ",d);cat(d,e,c,sep="\n")
1: 15 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
227: 
Read 226 items
                    1                       1  
                  1 1 3       3 5   5 3   3 1  
                  7 2 3 2 4 2 3 210 2 3 0 4 215
                +------------------------------
               2|
               1|
               1|
               1|
               1|
             1 1|
         3 3 1 1|
         1 5 1 1|
           3 5 3|
           1 5 1|
           1 3 1|
       1 1 1 1 1|
 1 1 1 1 1 1 1 1|
            11 3|
            11 3|

1

সি - 511

সি অবশ্যই আউটপুটটি সুন্দরভাবে বিন্যাসের জন্য তৈরি করা হয়নি। অক্ষর গণনায় কেবল প্রয়োজনীয় স্থান / নতুন লাইন অন্তর্ভুক্ত।

ইনপুটটি এসটিডিআইএন থেকে, সংখ্যাগুলি স্পেস দ্বারা পৃথক করা।

#define P printf
#define L(x) for(x=0;x<s/2+1;x++)
#define l(x) for(x=0;x<s;x++)
#define B(x,y) x[i][j]||y==s/2?P("%2d",x[i][j]):P("  ");
a[50][50],i,j,s,h[25][50],v[50][25],H[50],V[50],x[25],y[25];
main(){
    scanf("%d",&s);
    L(j)x[j]=y[j]=s/2+1;
    l(i)l(j)scanf("%d",&a[i][j]);
    for(i=s-1;i>=0;i--)
        for(j=s-1;j>=0;j--)
            a[i][j]?
                !H[j]&&(x[j]--,H[j]=1),
                h[x[j]][j]++,
                !V[i]&&(y[i]--,V[i]=1),
                v[i][y[i]]++:
            (H[j]=V[i]=0);
    L(i){
        L(j)P("  ");
        P(" ");
        l(j)B(h,i);
        P("\n");
    }
    L(i)P("  ");
    P("+");
    l(i)P("--");
    P("\n");
    l(i){
        L(j)B(v,j);
        P("|\n");
    }
}

1

কয়েক দিন কেটে গেছে এবং অজগরটিতে কারও উত্তর দেওয়া হয়নি, সুতরাং এখানে আমার (সম্ভবত বেশ দরিদ্র) চেষ্টা রয়েছে:

পাইথন ২.7 - 404 397 380 বাইট

def p(n,m):
 k=str.join;l=[];g=lambda y:[['  ']*(max(map(len,y))-len(t))+t for t in[[' '*(a<10)+`a`for a in map(len,k("",c).split('0'))if a]or[' 0']for c in y]]
 while m:l+=[map(str,m[:n])];m=m[n:]
 x=g(l);j=k('\n',['  '*max(map(len,x))+'+'+k("",a)for a in zip(*[list(a)+['--']for a in g(zip(*l))])]);return j.replace('+',' ',j.count('+')-1)+'\n'+k('\n',[k("",a+['|'])for a in x])

আমি শীঘ্রই একটি অদ্বিতীয় সংস্করণ পোস্ট করব, তবে এই মুহুর্তে আমি মনে করি এটি বেশ পঠনযোগ্য। :)

সম্পাদনা: অসম্পূর্ণ সংস্করণটি লেখার সময় আমি লক্ষ্য করেছিলাম যে কিছু উন্নতি আমি করতে পেরেছি যা যথেষ্ট পরিমাণে তাত্পর্যপূর্ণ হতে পারে! কিছু কারণে যা আমি ব্যাখ্যা করতে পারি না, এটির এখন শীর্ষে অতিরিক্ত নিউলাইন এবং বামে ফাঁকা স্থান রয়েছে (যদিও আমি মনে করি না যে আমি কার্যকরী কিছু বদলেছি) তবে এটি এখনও অনুমানের সাথে মিলিত হয়।অবারিত সংস্করণ আসছে!

Ungolfed:

def nonogram(board_size, pixels):
    def hints(board):
        output = []
        for row in board:
            # Convert the row to a string of 1s and 0s, then get a list of strings
            # that came between two 0s.
            s = "".join(row).split('0')

            # A list of the length of each string in that list.
            l = map(len, s)

            # We now have our horizontal hints for the board, except that anywhere
            # there were two 0s consecutively we have a useless 0.
            # We can get rid of the 0s easily, but if there were no 1s in the row at
            # all we want exactly one 0.
            # Solution:
            output.append([h for h in l if h != 0] or [0])
            # In this context, `foo or bar` means `foo if foo is a truthy value, bar
            # otherwise`.
            # An empty list is falsey, so if we strip out all the strings we hardcode
            # the 0.
        return output

    def num_format(hints):
        # For both horizontal and vertical hints, we want a space before single-
        # digit numbers and no space otherwise. Convert hints to strings and add
        # spaces as necessary.
        output = []

        for row in hints:
            output.append([' '*(a < 10) + str(a) for a in row])
            # Multiplying a string by n repeats it n times, e.g. 'abc'*3=='abcabcabc'
            # The only numbers that need a space are the ones less than 10.
            # ' '*(a < 10) first evaluates a < 10 to get a True or False value.
            # Python automatically converts True to 1 and False to 0.
            # So, if a is a one digit number, we do `' '*(1) + str(a)`.
            # If it's a two digit number, we do `' '*(0) + str(a)`.
        return output

    def padding(hints):
        output = []
        longest = max(map(len, hints)) # how long is the longest row?
        for row in hints:
            output.append(['  ']*(longest - len(row)) + row)
            # Add '  ' to the beginning of every row until it's the same length
            # as the longest one. Because all hints are two characters wide, this
            # ensures all rows of hints are the same length.
        return output

    board = []

    while pixels: # non-empty list == True
        # Make a list of the first (board_size) pixels converted to strings, then
        # add that list to board. Remove those pixels from the list of pixels.
        # When pixels is empty, board has a seperate list for each row.
        board.append([str(n) for n in pixels[:board_size]])
        pixels = pixels[board_size:]

    horizontal_hints = padding(num_format(hints(board)))

    vertical_hints = padding(num_format(hints(zip(*board))))
    # zip(*l) is a common way to transpose l.
    # zip([1,2,3], [4,5,6], [7,8,9]) == [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
    # the star operator unpacks an iterable so the contents can be used as
    # multiple arguments, so
    # zip(*[[1,2,3],[4,5,6],[7,8,9]]) is the same as what we just did.
    # Transposing the board and getting the horizontal hints gives us the
    # vertical hints of the original, but transposed. We'll transpose it back,
    # but we'll also add '--' to the end of all of them to make up the line
    vertical_hints = zip(*[a + ['--'] for a in vertical_hints])

    # add n spaces, where n is the length of the longest horizontal hint, plus
    # one space to the beginning of each line in the vertical hints, then join
    # with newlines to make it all one string.
    vertical_hints = '\n'.join(['  '*max(map(len, horizontal_hints)) + '+' +
                               ''.join(a) for a in vertical_hints])

    # find the number of plus signs in the string
    # replace the first (that many - 1) plus signs with spaces
    vertical_hints = vertical_hints.replace('+', ' ', vertical_hints.count('+')-1)

    # add a pipe to each row of horizontal hints, then join it with newlines
    horizontal_hints = '\n'.join([''.join(a + ['|']) for a in horizontal_hints])

    # add and return
    return vertical_hints + '\n' + horizontal_hints

পাঠযোগ্যতার স্বার্থে কয়েকটি পরিবর্তন করা হয়েছিল ( gতিনটি নামকরণের ফাংশনে বিভক্ত হওয়া, জটিল forতালিকাগুলি লুপগুলিতে তৈরি করা ) তবে যৌক্তিকভাবে এটি ঠিক একইভাবে কাজ করে।

যে কারণে এটি বিভ্রান্তিকর যে এই একজন অতিরিক্ত স্পেস এবং নিউলাইনগুলি মুদ্রণ করে না, যখন গল্ফযুক্তরা এটি করে। ¯ \: _ (ツ): _ / ¯


1
উম্ম, আমি আপনার সমাধান খুঁজে পাচ্ছি না। (দুঃখিত, চরিত্রের গণনা সম্পর্কে কেবল একটি ভয়ানক রসিকতা, আমাকে মনে করবেন না :))
ডুরকনব

@ ডোর আহা! আপনার এইচটিটিপি ত্রুটি কোড জোকস এখনই তৈরি করার চেষ্টা করুন! : পি
আন্ডারগ্রাউন্ডোমোনাইল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.