পাইথন 2.6+ - 334 322 316 টি অক্ষর
397 368 366 অক্ষর সঙ্কুচিত
exec'xÚEPMO!½ï¯ i,P*Ýlš%ì‰=‰Ö–*†þz©‰:‡—Lò¾fÜ”bžAù,MVi™.ÐlǃwÁ„eQL&•uÏÔ‹¿1O6ǘ.€LSLÓ’¼›î”3òšL¸tŠv[ѵl»h;ÁºŽñÝ0Àë»Ç‡ÛûH.ª€¼âBNjr}¹„V5¾3Dë@¼¡•gO. ¾ô6 çÊsÃЮürÃ1&›ßVˆùZ`Ü€ÿžcx±ˆ‹sCàŽ êüRô{U¯ZÕDüE+³ŽFA÷{CjùYö„÷¦¯Î[0þøõ…(Îd®_›â»E#–Y%’›”ëýÒ·X‹d¼.ß9‡kD'.decode('zip')
একক নতুন লাইনের প্রয়োজন, এবং আমি এটিকে একটি চরিত্র হিসাবে গণনা করেছি।
ব্রাউজার কোড পৃষ্ঠা মুম্বো জাম্বো এই কোডটির একটি সফল অনুলিপি-আটকাতে বাধা দিতে পারে, তাই আপনি এই কোড থেকে বিকল্পটি ফাইলটি তৈরি করতে পারেন:
s = """
23 63 6F 64 69 6E 67 3A 6C 31 0A 65 78 65 63 27 78 DA 45 50 4D 4F 03 21
10 BD EF AF 20 69 2C 50 2A 02 DD 6C 9A 25 EC AD 07 8D 89 07 3D 89 1C D6
96 2A 86 05 02 1B AD FE 7A A9 89 3A 87 97 4C F2 BE 66 DC 94 62 9E 41 F9
2C 4D 56 15 69 99 0F 2E D0 6C C7 83 77 C1 16 84 65 51 4C 26 95 75 CF 8D
1C 15 D4 8B BF 31 4F 01 36 C7 98 81 07 2E 80 4C 53 4C 08 D3 92 BC 9B 11
EE 1B 10 94 0B 33 F2 9A 1B 4C B8 74 8A 9D 76 5B D1 B5 6C BB 13 9D 68 3B
C1 BA 8E F1 DD 30 C0 EB BB C7 87 DB FB 1B 48 8F 2E 1C AA 80 19 BC E2 42
4E 6A 72 01 7D B9 84 56 35 BE 33 44 8F 06 EB 40 BC A1 95 67 4F 08 2E 20
BE F4 36 A0 E7 CA 73 C3 D0 AE FC 72 C3 31 26 9B DF 56 88 AD F9 5A 60 DC
80 FF 9E 63 78 B1 88 8B 73 43 E0 8E A0 EA FC 52 F4 7B 55 8D AF 5A 19 D5
44 FC 45 2B B3 8E 46 9D 41 F7 7B 43 6A 12 F9 59 F6 84 F7 A6 01 1F AF CE
5B 30 FE F8 F5 85 28 CE 64 AE 5F 9B E2 BB 45 23 96 59 25 92 9B 94 EB FD
10 D2 B7 58 8B 64 BC 2E DF 39 87 6B 44 27 2E 64 65 63 6F 64 65 28 27 7A
69 70 27 29
"""
with open('golftris.py', 'wb') as f:
f.write(''.join(chr(int(i, 16)) for i in s.split()))
পরীক্ষামূলক
ইন্ট্রিটিস
[]
[]
[]
[]
[# # #]
[## #######]
[===========]
টি 2 জেড 6 আই0 টি 7
নিউলাইনগুলি অবশ্যই ইউনিক্স-স্টাইলের (কেবল লাইনফিড)। শেষ লাইনে একটি চলন্ত নিউলাইন optionচ্ছিক।
পরীক্ষা করার জন্য:
> পাইথন golftris.py <ইন্ট্রিস
[]
[]
[]
[# ###]
[# ###]
[##### ####]
[===========]
10
এই কোডটি মূল কোডটি আনজিপ করে এবং এটি দিয়ে কার্যকর করে exec
। এই সংক্রামিত কোডটির ওজন হ'ল 366 টি অক্ষর এবং এর মতো দেখতে:
import sys
r=sys.stdin.readlines();s=0;p=r[:1];a='[##########]\n'
for l in r.pop().split():
n=int(l[1])+1;i=0xE826408E26246206601E>>'IOZTLSJ'.find(l[0])*12;m=min(zip(*r[:6]+[a])[n+l].index('#')-len(bin(i>>4*l&31))+3for l in(0,1,2))
for l in range(12):
if i>>l&2:c=n+l/4;o=m+l%4;r[o]=r[o][:c]+'#'+r[o][c+1:]
while a in r:s+=10;r.remove(a);r=p+r
print''.join(r),s
নিউলাইনগুলি প্রয়োজনীয় এবং এগুলির প্রতিটি চরিত্র।
এই কোডটি পড়ার চেষ্টা করবেন না। চলক নামগুলি আক্ষরিকভাবে সর্বোচ্চ সংকোচনের সন্ধানে এলোমেলোভাবে বেছে নেওয়া হয় (বিভিন্ন ভেরিয়েবলের নাম সহ, আমি কমপ্রেসনের পরে 342 টির মতো অক্ষর দেখেছি)। আরও একটি বোধগম্য সংস্করণ নিম্নলিখিত:
import sys
board = sys.stdin.readlines()
score = 0
blank = board[:1]
full = '[##########]\n'
for piece in board.pop().split():
column = int(piece[1]) + 1
bits = 0xE826408E26246206601E >> 'IOZTLSJ'.find(piece[0]) * 12
drop = min(zip(*board[:6]+[full])[column + x].index('#') -
len(bin(bits >> 4 * x & 31)) + 3 for x in (0, 1, 2))
for i in range(12):
if bits >> i & 2:
x = column + i / 4
y = drop + i % 4
board[y] = board[y][:x] + '#' + board[y][x + 1:]
while full in board:
score += 10
board.remove(full)
board = blank + board
print ''.join(board), score
কর্কসটি তিনটি ক্রিপ্টিক লাইনে রয়েছে আমি বলেছি আমি ব্যাখ্যা করব।
টেট্রোমিনোসের আকারটি সেখানে হেক্সাডেসিমাল সংখ্যায় এনকোড করা হয়েছে। প্রতিটি তেট্রোনিমো কোষের একটি 3x4 গ্রিড অধিগ্রহণ হিসাবে বিবেচনা করা হয়, যেখানে প্রতিটি ঘর হয় ফাঁকা (একটি স্থান) বা পূর্ণ (একটি সংখ্যা চিহ্ন) is তারপরে প্রতিটি টুকরা 3 টি হেক্সাডেসিমাল ডিজিট সহ এনকোড করা হয়, প্রতিটি ডিজিট 4-সেল কলামকে বর্ণনা করে। সর্বনিম্ন উল্লেখযোগ্য অঙ্কগুলি বাম-সর্বাধিক কলামগুলিকে বর্ণনা করে এবং প্রতিটি ডিজিটের সর্বনিম্ন উল্লেখযোগ্য বিট প্রতিটি কলামের শীর্ষ সর্বাধিক ঘরকে বর্ণনা করে। যদি কিছুটা 0 হয়, তবে সেই ঘরটি ফাঁকা, অন্যথায় এটি '#'। উদাহরণস্বরূপ, আই টেট্রোনিমোটি 00F
বাম-সর্বাধিক কলামে চারটি সংখ্যার চিহ্নকে এনকোড করতে সর্বনিম্ন-তাত্পর্যপূর্ণ অঙ্কের চারটি বিট সেট হিসাবে এনকোড করা হয়েছে, এবং টি হয়131
উপরের বিটটি বাম এবং ডানদিকে এবং শীর্ষ দুটি বিট মাঝখানে সেট করে in
পুরো হেক্সাডেসিমাল সংখ্যাটি তখন একটি বিটকে বামে স্থানান্তরিত করে (দুটি দ্বারা গুণিত)। এটি আমাদের নীচের অংশটিকে কিছুটা উপেক্ষা করার অনুমতি দেবে। আমি কেন এক মিনিটে ব্যাখ্যা করব।
সুতরাং ইনপুট থেকে বর্তমান টুকরোটি দেওয়া, আমরা এই হেক্সাডেসিমাল সংখ্যায় সূচকটি পাই যেখানে এটির আকৃতি বর্ণনাকারী 12 টি বিট শুরু হয়, তারপরে নীচে স্থানান্তরিত করুন যাতে bits
ভেরিয়েবলের 1-1 (বিট 0 এড়িয়ে যাওয়া) বিট বর্তমান টুকরাটি বর্ণনা করে।
থেকে নিয়োগ drop
নির্ধারণ করে কিভাবে গ্রিড উপর থেকে অনেক সারি টুকরা অন্যান্য টুকরা টুকরা উপর অবতরণ আগে আসবে। প্রথম লাইনটি খেলার ক্ষেত্রের প্রতিটি কলামের শীর্ষে কতগুলি খালি ঘর রয়েছে তা সন্ধান করে, যখন দ্বিতীয়টি টুকরোটির প্রতিটি কলামের মধ্যে সর্বনিম্ন দখলকৃত সেলটি আবিষ্কার করে। zip
ফাংশন যেখানে প্রতিটি tuple নিয়ে গঠিত tuples একটি তালিকা ফেরৎ এন ম ইনপুট তালিকার প্রতিটি আইটেম থেকে কক্ষ। সুতরাং, নমুনা ইনপুট বোর্ড ব্যবহার করে, zip(board[:6] + [full])
ফিরে আসবে:
[
('[', '[', '[', '[', '[', '[', '['),
(' ', ' ', ' ', ' ', ' ', ' ', '#'),
(' ', ' ', ' ', ' ', '#', '#', '#'),
(' ', ' ', ' ', ' ', ' ', '#', '#'),
(' ', ' ', ' ', ' ', ' ', ' ', '#'),
(' ', ' ', ' ', ' ', ' ', '#', '#'),
(' ', ' ', ' ', ' ', ' ', '#', '#'),
(' ', ' ', ' ', ' ', '#', '#', '#'),
(' ', ' ', ' ', ' ', ' ', '#', '#'),
(' ', ' ', ' ', ' ', ' ', '#', '#'),
(' ', ' ', ' ', ' ', '#', '#', '#'),
(']', ']', ']', ']', ']', ']', ']')
]
আমরা যথাযথ কলামের সাথে সম্পর্কিত এই তালিকাটি থেকে টুপল নির্বাচন করি এবং কলামের প্রথমটির সূচি খুঁজে '#'
পাই। এ কারণেই কল করার আগে আমরা একটি "পূর্ণ" সারি সংযুক্ত করেছি zip
, যাতে index
কলামটি অন্যথায় ফাঁকা থাকলে এর বুদ্ধিমান রিটার্ন (কোনও ব্যতিক্রম ছোঁড়ার পরিবর্তে) আসবে।
তারপরে '#'
টুকরোটির প্রতিটি কলামের সর্বনিম্ন সন্ধান করার জন্য , আমরা সেই কলামটি বর্ণনা করে এমন চারটি বিট স্থানান্তরিত এবং মুখোশ করি, তারপরে সেই bin
ফাংশনটি সেগুলি এবং শূন্যের একটি স্ট্রিংয়ে পরিণত করতে ব্যবহার করি । bin
ফাংশন শুধুমাত্র উল্লেখযোগ্য বিট ফেরৎ, তাই আমরা শুধুমাত্র এই স্ট্রিং এর দৈর্ঘ্য নিরূপণ প্রয়োজন সর্বনিম্ন দখলকৃত সেল (সবচেয়ে গুরুত্বপূর্ণ সেট বিট) খুঁজে। bin
ফাংশন এছাড়াও prepends '0b'
, তাই আমরা যে বিয়োগ করতে হবে। আমরা কমপক্ষে উল্লেখযোগ্য বিটটিকেও উপেক্ষা করি। এ কারণেই হেক্সাডেসিমাল সংখ্যাটি কিছুটা বামে স্থানান্তরিত হয়। এটি খালি কলামগুলির জন্য অ্যাকাউন্টে রয়েছে, যার স্ট্রিং উপস্থাপনাগুলি কেবল শীর্ষ কক্ষ পূর্ণ (যেমন টি টুকরা) সহ কলামের সমান দৈর্ঘ্যযুক্ত হবে ।
উদাহরণস্বরূপ, এর কলাম আমি tetromino, যেমন আগে উল্লেখিত হয় F
, 0
এবং 0
। bin(0xF)
হয় '0b1111'
। উপেক্ষা করার পরে '0b'
, আমাদের দৈর্ঘ্য 4, যা সঠিক। কিন্তু bin(0x0)
হয় 0b0
। '0b'
এটিকে উপেক্ষা করার পরে , আমাদের এখনও '1 এর দৈর্ঘ্য রয়েছে যা ভুল। এটির জন্য অ্যাকাউন্ট হিসাবে, আমরা শেষ পর্যন্ত একটি অতিরিক্ত বিট যুক্ত করেছি, যাতে আমরা এই তুচ্ছ বিটকে উপেক্ষা করতে পারি। অতএব, কোডটিতে শুরুর দিকে +3
নেওয়া অতিরিক্ত দৈর্ঘ্য '0b'
এবং শেষে তুচ্ছ-বিস্তারের জন্য অ্যাকাউন্ট রয়েছে ।
এগুলি সমস্ত তিনটি কলামের জন্য জেনারেটর এক্সপ্রেশন ( (0,1,2)
) এর মধ্যে ঘটে এবং আমরা তিনটি কলামের min
যে কোনওটিতে স্পর্শ করার আগে টুকরোটি সর্বাধিক সারি সরাতে পারে তা সন্ধান করতে ফলাফলটি গ্রহণ করি ।
বাকিটি কোডটি পড়ে বোঝা খুব সহজ হওয়া উচিত, তবে for
এই নিয়োগগুলি অনুসরণ করে লুপটি বোর্ডে টুকরো যোগ করে। এর পরে, while
লুপটি সম্পূর্ণ সারিগুলি সরিয়ে দেয়, তাদের শীর্ষে ফাঁকা সারি দিয়ে প্রতিস্থাপন করে এবং স্কোরটি দীর্ঘায়িত করে। শেষে, বোর্ড এবং স্কোর আউটপুট প্রিন্ট করা হয়।