রুবি (১৩৫ টি অক্ষর)
a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}
নমুনা আউটপুট
2 1 6 9 4 5 1
9 34 4 37 2 31 3
7 2 3 1 8 1 7
5 42 4 40 2 47 9
3 9 9 4 9 4 7
3 44 4 41 2 47 4
6 9 1 5 7 6 8
ভাঙ্গন
এটি কীভাবে কাজ করে তা খুব স্পষ্ট নয়, সুতরাং এখানে দ্রুত ব্রেকডাউন। দ্রষ্টব্য: আপনি সম্ভবত এই কয়েকটি পদক্ষেপটি এড়িয়ে যেতে পারেন এবং আরও দ্রুত সংক্ষিপ্ত সংস্করণে ঝাঁপিয়ে পড়তে পারেন, তবে আমি মনে করি যে বিভিন্নভাবে আমি অক্ষরগুলি শেভ করেছি, বিশেষত আক্ষরিক ক্ষেত্রে 2-সংখ্যার সংখ্যাকে 1-সংখ্যার সংস্করণে রূপান্তর করতে প্যাটার্নগুলি চিহ্নিত করে এটি যথেষ্ট শিক্ষামূলক think ।
নিষ্পাপ সংস্করণ
দ্বি-মাত্রিক অ্যারে নির্ভর করে এমন অন্যান্য রুবি সমাধানগুলির বিপরীতে , আপনি (শেষ পর্যন্ত) 1-মাত্রিক অ্যারে দিয়ে শুরু করে এবং অফসেট মানগুলির সাথে কাজ করে সংক্ষিপ্ত সংস্করণ পেতে পারেন, কারণ নিদর্শনগুলি পুনরাবৃত্তি করে।
ary=(0..48).map { rand(9) + 1 }
offsets = [-8,-7,-6,-1,1,6,7,8]
3.times do |i|
[8,10,12].each do |j|
ary[j + 14*i] = ary.values_at(*offsets.map { |e| j+14*i + e }).inject(:+)
end
end
ary.each.with_index do |e,i|
$> << ("%-3s" % e)
$> << ?\n if i % 7==6
end
এখানে মূল নীতিটি হ'ল আমরা সূচী অবস্থানে 8, 10, 12 এ কাজ করছি, এটি কেবল 14 এর গুণক দ্বারা অফসেট 8. 8, 10 এবং 12 অবস্থানগুলি 3x3 গ্রিডের কেন্দ্র যা আমরা সংক্ষেপণ করছি। নমুনা আউটপুটে 34 অবস্থান 8, 42, 8 + 14 * 1, ইত্যাদি অবস্থান আমরা সঙ্গে 34 অবস্থানের দ্বারা অবস্থানে 8 থেকে অফসেট অবস্থান 8 প্রতিস্থাপন [-8,-7,-6,-1,1,6,7,8]- অন্য কথায় 34 = sum(ary[8-8], ary[8-7], ..., ary[8+8])। [8 + 14*i, 10 + 14*i, 12 + 14*i]প্যাটার্নটি পুনরাবৃত্তি হওয়ার পরে, এই একই নীতিটি সমস্ত মানগুলির জন্য ধারণ করে।
এটি অপ্টিমাইজ করা
প্রথমত, কিছু দ্রুত প্রত্যাশা:
- পরিবর্তে
3.times { ... }, এবং j + 14*iপ্রতিবার গণনা করা , অবস্থানগুলি "ইনলাইন" করুন [8,10,12,22,24,26,36,38,40]।
offsetsঅ্যারে একবার ব্যবহার হয়, তাই আক্ষরিক সঙ্গে পরিবর্তনশীল প্রতিস্থাপন করুন।
- প্রতিস্থাপন
do ... endসঙ্গে {...}এবং প্রিন্টিং প্রায় সুইচ $> << foo। (এখানে একটি কৌশল জড়িত রয়েছে puts nilএবং () == nil))
- সংক্ষিপ্ত পরিবর্তনশীল নাম।
এর পরে কোডটি 177 টি অক্ষর:
a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[-8,-7,-6,-1,1,6,7,8].map{|e|j+e}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
পরবর্তী হ্রাসের জন্য, নোট করুন যে injectঅফসেট অ্যারেগুলি ক্রমযুক্ত হওয়ার দরকার নেই। আমরা হয় [-8,-7,-6,-1,1,6,7,8]বা অন্য কোনও অর্ডার করতে পারি, যেহেতু সংযোজনটি পরিবর্তনীয়।
সুতরাং ইতিবাচক এবং নেতিবাচকগুলি পেতে প্রথমে জুটি দিন [1,-1,6,-6,7,-7,8,-8]।
এখন আপনি সংক্ষিপ্ত করতে পারেন
[1,-1,6,-6,7,-7,8,-8].map { |e| j+e }.inject(:+)
প্রতি
[1,6,7,8].flat_map { |e| [j+e, j-e] }
এর ফলে
a=(0..48).map{rand(9)+1}
[8,10,12,22,24,26,36,38,40].each{|j|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
যা 176 টি অক্ষর।
8 দ্বারা শিফট করুন এবং পার্থক্যে সরান
দ্বি-চরিত্রের আক্ষরিক মানগুলি দেখে মনে হচ্ছে এগুলি ছোট করা যেতে পারে, তাই লুপের শুরুতে আপডেট [8,10,12,22,24,26,36,38,40]করে সবকিছু নীচে নিয়ে যান এবং স্থানান্তরিত করুন । (নোট করুন যে অফসেট মানগুলি আপডেট করার প্রয়োজন এড়িয়ে চলে ))8j+=81,6,7,8
a=(0..48).map{rand(9)+1}
[0,2,4,14,16,18,28,30,32].each{|j|j+=8;a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
এটি 179, যা বড়, তবে j+=8প্রকৃতপক্ষে সরানো যেতে পারে।
প্রথম পরিবর্তন
[0,2,4,14,16,18,28,30,32]
পার্থক্য একটি অ্যারে:
[2,2,10,2,2,10,2,2]
এবং প্রাথমিকভাবে এই মানগুলি সংযোজন করুন j=8। এটি শেষ পর্যন্ত একই মানগুলি আবরণ করবে। (আমরা সম্ভবত প্রথমে 8 টি স্থানান্তরিত না করে সরাসরি এটিতে যেতে পারি))
মনে রাখবেন আমরা এছাড়াও একটি ডামি মান যোগ করব 9999পার্থক্য অ্যারের শেষ, এবং যোগ jএ শেষ না শুরু লুপের। যৌক্তিকতাটি হ'ল 3 বার পুনরাবৃত্তি হওয়া একই 3 টি সংখ্যার কাছে খুব ভয়ঙ্করভাবে2,2,10,2,2,10,2,2 দেখতে পাওয়া যায় এবং লুপের শেষে গণনা করার মাধ্যমে চূড়ান্ত মানটি আউটপুটকে প্রভাবিত করে না, কারণ কোনও কল নেই যেখানে কিছু মান আছে ওভার ।j+difference9999a[j]j10000
a=(0..48).map{rand(9)+1}
j=8
[2,2,10,2,2,10,2,2,9999].each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
এই পার্থক্যের অ্যারে দিয়ে, j+=8এখন এটি j=8অবশ্যই ন্যায়সঙ্গত , যেহেতু অন্যথায় আমরা বারবার 8অনেকগুলি যুক্ত করতাম । আমরা থেকে ব্লক পরিবর্তনশীল পরিবর্তন করেছি jকরতে l।
সুতরাং যেহেতু 9999উপাদানটির আউটপুটটিতে কোনও প্রভাব নেই, তাই আমরা এটিকে পরিবর্তন করতে 10এবং অ্যারে সংক্ষিপ্ত করতে পারি।
a=(0..48).map{rand(9)+1}
j=8
([2,2,10]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
এটি 170 টি অক্ষর।
তবে এখন j=8চেহারাটি খানিকটা আড়ম্বরপূর্ণ এবং আপনি অ্যাসাইনমেন্টের জন্য ব্যবহার করতে পারেন [2,2,10]এমন সুবিধার্থে 2 দ্বারা নীচে নামিয়ে 2 অক্ষর সংরক্ষণ 8করতে পারেন। এটিও j+=lহয়ে উঠতে হবে j+=l+2।
a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+);j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
এটি 169 টি অক্ষর। 7 টি বর্ণচিহ্নগুলি আটকানোর প্রায় উপায়, তবে এটি ঝরঝরে।
চূড়ান্ত টুইটগুলি
values_atকল অপ্রয়োজনীয় এর আসলে কেমন হয়, এবং আমরা একটি ইনলাইন করতে Array#[]কল। সুতরাং
a.values_at(*[1,6,7,8].flat_map{|e|[j+e,j-e]}).inject(:+)
হয়ে
[1,6,7,8].flat_map{|e|[a[j+e],a[j-e]]}.inject(:+)
আপনি এটিও দেখতে পারেন যে অ্যারেতে প্রাথমিকের সাথে flat_map+ j+e/j-e+ injectআরও সরাসরি সংশ্লেষে হ্রাস করা যায় 0।
এটি আপনাকে 152 টি অক্ষরের সাথে ছেড়ে দেয় :
a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.map.with_index{|e,i|$><<"%-3s"%e<<(?\nif i%7==6)}
অবশেষে:
map.with_indexহয়ে যেতে পারে each_slice।
- মুদ্রণের পদ্ধতির পরিবর্তন করুন।
135 :
a=(0..48).map{rand(9)+1}
([0,0,j=8]*3).each{|l|a[j]=[0,1,6,7,8].inject{|s,e|s+a[j+e]+a[j-e]};j+=l+2}
a.each_slice(7){|r|puts"%-3s"*7%r}