রুবি (১৩৫ টি অক্ষর)
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]
করে সবকিছু নীচে নিয়ে যান এবং স্থানান্তরিত করুন । (নোট করুন যে অফসেট মানগুলি আপডেট করার প্রয়োজন এড়িয়ে চলে ))8
j
+=8
1,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+difference
9999
a[j]
j
10000
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}