সুন্দর প্যাটার্ন ড্রয়ার
গুড মর্নিং পিপিসি!
অন্য দিন, যখন আমি স্ট্যাক ওভারফ্লোতে কাউকে সাহায্য করার চেষ্টা করছিলাম, তখন তার সমস্যার একটি অংশ আমাকে এই চ্যালেঞ্জের জন্য একটি ধারণা দিয়েছে।
প্রথমত, নিম্নলিখিত আকারটি যাচাই করুন:
সমস্ত কালো সংখ্যা যেখানে আকারের পয়েন্টগুলির সূচক এবং সমস্ত গা dark়-নীল সংখ্যা হ'ল পয়েন্টগুলির মধ্যে লিঙ্কগুলির সূচক।
এখন, 0x00000 থেকে 0xFFFFF এর জন্য একটি হেক্সাডেসিমাল নম্বর দেওয়া, আপনাকে কেবল অক্ষরের স্থান এবং "■" ("ও" অক্ষরটি ব্যবহার করা ঠিক আছে) ব্যবহার করে কনসোলটিতে একটি আকার আঁকতে হবে।
এখানে কয়েকটি উদাহরণ যেখানে হেক্সাডেসিমাল সংখ্যাটি ইনপুট এবং আকারটি আউটপুট:
0xE0C25 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
0xC1043 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■
■
■
■
■
■
■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xE4F27 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xF1957 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xD0C67 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0x95E30 :
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■
0x95622 :
■ ■ ■ ■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■
■
■
■ ■ ■ ■ ■
0xC5463 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
0xE5975 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xB5E75 :
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xF4C75 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
0xF5D75 :
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
এটি কীভাবে কাজ করে সে সম্পর্কে এখানে কিছু ব্যাখ্যা দেওয়া হল:
0xFFFFF(16) = 1111 1111 1111 1111 1111(2)
আপনার এখানে 20 টি বিট রয়েছে, প্রতিটি বিট লিঙ্ক উপস্থিত রয়েছে কি না তা বলে।
সর্বাধিক উল্লেখযোগ্য বিট (এমএসবি) এর সূচক 0 (চিত্রের রেফারেন্স) বা কম উল্লেখযোগ্য বিট (এলএসবি) 19 (আবার চিত্রের রেফারেন্স)।
উদাহরণস্বরূপ প্রদত্ত প্রথম আকারের জন্য এটি কীভাবে কাজ করে তা এখানে:
0xE0C25(16) = 1110 0000 1100 0010 0101(2)
মানে আপনার নীচের বিদ্যমান লিঙ্কগুলি রয়েছে: 0,1,2,8,9,14,17,19।
আপনি যদি এই সংখ্যাগুলির সাথে রেফারেন্স চিত্রের লাইনগুলি হাইলাইট করেন তবে এটি আপনাকে এই আকার দেবে:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■ ■
■ ■
■ ■
■ ■
■ ■ ■ ■ ■
আপনার যদি আরও সহায়তার প্রয়োজন হয় তবে এখানে একটি সরল ও অদম্য পাইথন বাস্তবায়ন রয়েছে:
patterns = [
0xE0C25, 0xC1043, 0xE4F27, 0xF1957,
0xD0C67, 0x95E30, 0x95622, 0xC5463,
0xE5975, 0xB5E75, 0xF4C75, 0xF5D75
]
def printIfTrue(condition, text = "■ "):
if condition:
print(text, end="")
else:
print(" "*len(text), end="")
def orOnList(cube, indexes):
return (sum([cube[i] for i in indexes]) > 0)
def printPattern(pattern):
cube = [True if n == "1" else False for n in str(bin(pattern))[2::]]
for y in range(9):
if y == 0: printIfTrue(orOnList(cube, [0, 2, 3]))
if y == 4: printIfTrue(orOnList(cube, [2, 4, 9, 11, 12]))
if y == 8: printIfTrue(orOnList(cube, [11, 13, 18]))
if y in [0, 4, 8]:
printIfTrue(cube[int((y / 4) + (y * 2))], "■ ■ ■ ")
if y == 0: printIfTrue(orOnList(cube, [0, 1, 4, 5, 6]))
if y == 4: printIfTrue(orOnList(cube, [3, 5, 7, 9, 10, 13, 14, 15]))
if y == 8: printIfTrue(orOnList(cube, [12, 14, 16, 18, 19]))
printIfTrue(cube[int((y / 4) + (y * 2)) + 1], "■ ■ ■ ")
elif y in [1, 5]:
for i in range(7):
if i in [2, 5]:
print(" ", end=" ")
printIfTrue(cube[y * 2 + (1 - (y % 5)) + i])
elif y in [2, 6]:
for i in range(5):
if i in [1, 2, 3, 4]:
print(" ", end=" ")
if i in [1, 3]:
if i == 1 and y == 2:
printIfTrue(orOnList(cube, [3, 4]))
elif i == 3 and y == 2:
printIfTrue(orOnList(cube, [6, 7]))
if i == 1 and y == 6:
printIfTrue(orOnList(cube, [12, 13]))
elif i == 3 and y == 6:
printIfTrue(orOnList(cube, [15, 16]))
else:
printIfTrue(cube[(y * 2 - (1 if y == 6 else 2)) + i + int(i / 4 * 2)])
elif y in [3, 7]:
for i in range(7):
if i in [2, 5]:
print(" ", end="")
ri, swap = (y * 2 - 2) + (1 - (y % 5)) + i, [[3, 6, 12, 15], [4, 7, 13, 16]]
if ri in swap[0]: ri = swap[1][swap[0].index(ri)]
elif ri in swap[1]: ri = swap[0][swap[1].index(ri)]
printIfTrue(cube[ri])
if y == 0: printIfTrue(orOnList(cube, [1, 7, 8]))
if y == 4: printIfTrue(orOnList(cube, [6, 8, 10, 16, 17]))
if y == 8: printIfTrue(orOnList(cube, [15, 17, 19]))
print()
for pattern in patterns:
printPattern(pattern)
অবশ্যই এটি নিখুঁত নয় এবং এটি করা উচিত এটির জন্য এটি দীর্ঘ দীর্ঘ এবং আপনি এখানে আসার সঠিক কারণ!
হাস্যকরভাবে এই প্রোগ্রামটি তৈরি করা :)
এটি কোড-গল্ফ, তাই সংক্ষিপ্ত উত্তর জেতে!