कोड गोल्फ: टेट्रिस खेलना


83

मूल बातें:

निम्नलिखित टेट्रोमिनो और खाली खेल मैदान पर विचार करें:

                                            0123456789
    IOZTLSJ []
                                           []
    # ## ## ### # ## # []
    # # # # # # # # # # []
    # # # ## []
    # #]
                                           [==========]

खेल मैदान के आयाम तय हो गए हैं। शीर्ष नंबर पर कॉलम संख्या (इनपुट देखने के लिए) को इंगित करने के लिए बस यहां हैं।

इनपुट:

। आपको एक विशिष्ट खेल का मैदान दिया जाता है (उपरोक्त के आधार पर) जिसे पहले से ही आंशिक रूप से टेट्रोमिनोइन्स से भरा जा सकता है (यह एक अलग फाइल में हो सकता है या स्टड के माध्यम से प्रदान किया जा सकता है)।

नमूना इनपुट:

[]
[]
[]
[]
[# # #]
[## ######]
[==========]

। आपको एक स्ट्रिंग दी जाती है जो वर्णन करती है (रिक्त स्थान से अलग) जो टेट्रोमिनो को किस कॉलम में सम्मिलित (और ड्रॉप डाउन) करना है। Tetrominoes को घुमाए जाने की आवश्यकता नहीं है। इनपुट को स्टडिन से पढ़ा जा सकता है।

नमूना इनपुट:

T2 Z6 I0 T7

आप मान सकते हैं कि इनपुट 'सुव्यवस्थित' है (या ऐसा न होने पर अपरिभाषित व्यवहार उत्पन्न करता है)।

उत्पादन

परिणामी फ़ील्ड को रेंडर करें ('पूर्ण' लाइनें गायब होनी चाहिए) और स्कोर गणना (10 अंकों के लिए हर गिराई गई रेखाएं) प्रिंट करें।

ऊपर दिए गए नमूना इनपुट के आधार पर नमूना आउटपुट:

[]
[]
[]
[# ###]
[# ###]
[##### ####]
[==========]
10

विजेता:

सबसे छोटा समाधान (कोड वर्ण गणना द्वारा)। उपयोग के उदाहरण अच्छे हैं। मज़ा गोल्फ है!

संपादित करें : +500उत्तरदाताओं द्वारा पहले से किए गए अच्छे प्रयासों (और संभवतः इस प्रश्न के कुछ नए समाधान) पर कुछ और ध्यान आकर्षित करने के लिए प्रतिष्ठा का एक इनाम जोड़ा गया ...


5
@omouse: जांच meta.stackoverflow.com - कोड गोल्फ आम तौर पर अनुमति दी है (समुदाय विकी रूप में)
ChristopheD

18
@omouse: यही मतदान बंद करने के लिए है। प्रश्न को फ़्लैग करके यहां मॉडरेटर्स को खींचना संभवत: आपको उतना लोकप्रिय बनाने वाला नहीं है, यह देखते हुए कि उस समय और समय को फिर से समुदाय ने (अनिच्छा से) कोड गोल्फ को अस्तित्व में रखने की अनुमति दी है (कोड-गोल्फ टैग और मेटा चर्चा देखें; यह कोई नई बात नहीं है) ।
मार्क पीटर्स

8
@omouse: ऑफ-टॉपिक! = स्पैम। यहां तक ​​कि अगर आप बंद करने के लिए मतदान नहीं कर सकते हैं, तो भी उस स्पैम ध्वज को बंद कर दिया गया था।
BoltClock

3
मैं एक एपीएल जॉक का इंतजार कर रहा हूं! मुझे यकीन है कि वह इसे 3.5 प्रतीकों में कर सकते हैं
n8wrl

3
आयामों को तय किया जाना चाहिए, लेकिन नमूना इनपुट और रिक्त क्षेत्र में अलग-अलग ऊंचाइयां हैं। क्या ऊंचाई माना जाता है?
नबंवर

जवाबों:


27

गोल्फस्क्रिप्ट - 181 वर्ण

नई खबरें जरूरी नहीं हैं। आउटपुट मानक आउटपुट में है, हालांकि कुछ त्रुटियां स्टेडर में मौजूद हैं।
\10181 वर्ण होने के लिए प्रोग्राम के लिए इसी ASCII वर्ण द्वारा प्रतिस्थापित किया जाना चाहिए।

{):X!-{2B{" #"=}%X" ":f*+-1%}%:P;:>.{\!:F;>P{\(@{3&\(@.2$&F|:F;|}%\+}%\+F![f]P+:P
;}do;{"= "&},.,7^.R+:R;[>0="#"/f*]*\+}0"R@1(XBc_""~\10"{base}:B/3/~4*"nIOZTLSJR "
";:"*~;n%)n*~ 10R*+n*

नमूना I / O:

$ cat inp
[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
T2 Z6 I0 T7
$ cat inp|golfscript tetris.gs 2>/dev/null
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

टेट्रोमिनो संपीड़न:
टुकड़ों को तीन आधार 8 अंकों के रूप में संग्रहीत किया जाता है। यह एक साधारण बाइनरी प्रतिनिधित्व है, उदाहरण के लिए T=[7,2,0], S=[6,3,0], J=[2,2,3]। संपीड़न में टुकड़े के [1]लिए उपयोग किया जाता है I, लेकिन यह स्पष्ट रूप से [1,1,1,1]बाद में निर्धारित होता है (अर्थात 4*कोड में)। इन सभी सरणियों को एक एकल सरणी में समवर्ती किया जाता है, जिसे पूर्णांक में परिवर्तित किया जाता है, और फिर एक स्ट्रिंग (गैर-मुद्रण योग्य वर्णों को कम करने के लिए आधार 126, लंबाई और मुठभेड़ utf8 नहीं)। यह तार बहुत छोटा है "R@1(XBc_":।

घटाव तो सीधा है। हम सबसे पहले एक आधार 8 रूपांतरण के बाद एक आधार 8 रूपांतरण करते हैं ( "~\10"{base}/यानी, "~\10"प्रत्येक तत्व के लिए आधार रूपांतरण करते हैं और करते हैं)। परिणामी सरणी को 3 के समूहों में विभाजित किया जाता है, जिसके लिए सरणी Iतय की गई है ( 3/~4*)। हम फिर प्रत्येक तत्व को बेस 2 में परिवर्तित करते हैं और (शून्य को हटाने के बाद) प्रत्येक बाइनरी अंक को स्ट्रिंग में उस सूचकांक के चरित्र से प्रतिस्थापित करते हैं " #"( 2base{" #"=}%...-1%- ध्यान दें कि हमें सरणी को उलटने की आवश्यकता है अन्यथा इसके बजाय 2बन "# "जाएगा " #")।

बोर्ड / टुकड़ा प्रारूप, टुकड़े टुकड़े करना
बोर्ड बस स्ट्रिंग की एक सरणी है, प्रत्येक पंक्ति के लिए एक। इस पर कोई काम शुरू में नहीं किया जाता है, इसलिए हम इसे n/(इनपुट पर जनरेट कर सकते हैं । टुकड़े भी स्ट्रिंग के सरणियों हैं, अपने एक्स स्थिति के लिए बाईं ओर रिक्त स्थान के साथ गद्देदार, लेकिन अनुगामी रिक्त स्थान के बिना। टुकड़ों को सरणी से बहकर गिरा दिया जाता है, और लगातार परीक्षण किया जाता है कि क्या कोई टक्कर है।

टकराव परीक्षण टुकड़े में सभी पात्रों के माध्यम से पुनरावृत्ति द्वारा किया जाता है, और बोर्ड पर एक ही स्थिति के चरित्र के खिलाफ तुलना की जाती है। हम टकरावों के रूप में #+ =और #+ के संबंध में चाहते हैं #, इसलिए हम परीक्षण करते हैं कि क्या ((टुकड़ा और 3) और बोर्डचर) गैर-शून्य है। इस पुनरावृत्ति को करते समय, हम बोर्ड ((प्रति) और 3) की एक प्रति) (बोर्डर) के साथ अपडेट करते हैं, जो जोड़े #+ , + #, + के लिए सही मान सेट करता है [। हम इस अद्यतन किए गए बोर्ड का उपयोग करते हैं यदि टुकड़े को दूसरी पंक्ति से नीचे ले जाने के बाद टक्कर होती है।

भरी हुई पंक्तियों को निकालना काफी सरल है। हम सभी पंक्तियों को हटा देते "= "&हैं जिसके लिए झूठे वापस आते हैं। एक भरा पंक्ति है न होगा =या , इसलिए संयोजन के रूप में एक खाली स्ट्रिंग है, जो गलत के बराबर हो जाएगा। फिर हम उन पंक्तियों की संख्या की गणना करते हैं जिन्हें हटा दिया गया है, गिनती को स्कोर में जोड़ें और कई "[ ... ]"एस को प्रीपेन्ड करें । हम ग्रिड की पहली पंक्ति लेकर और उसके #साथ प्रतिस्थापित करके इसे कॉम्पैक्ट रूप से उत्पन्न करते हैं

बोनस
चूंकि हम गणना करते हैं कि बोर्ड टुकड़े की प्रत्येक स्थिति में कैसा दिखता है क्योंकि यह गिरता है, हम इन्हें हटाने के बजाय स्टैक पर रख सकते हैं! कुल तीन वर्णों से अधिक के लिए, हम इन सभी पदों (या दो वर्णों को आउटपुट कर सकते हैं यदि हमारे पास एकल बोर्ड हैं)।

{):X!-{2B{" #"=}%X" ":f*+-1%}%:P;:>.{>[f]P+:P(!:F;{\(@{3&\(@.2$&F|:F;|}%\+}%\+F!}
do;{"= "&},.,7^.R+:R;[>0="#"/f*]*\+}0"R@1(XBc_""~\10"{base}:B/3/~4*"nIOZTLSJR "
";:"*~;n%)n*~ ]{n*n.}/10R*

कुछ चरम कोड-गोल्फिंग यहीं पर चल रहा है (मुझे नहीं लगता था कि यह कम से कम 200 अक्षरों में हो सकता है)। अच्छी नौकरी!
क्रिस्टोफडी

8
गजब का। मेरी इच्छा है कि मैं गोल्फस्क्रिप्ट को समझूं। रुको ... नहीं मैं नहीं।
पी डैडी

26

पर्ल, 586 523 483 472 427 407 404 386 387 356 353 चार्ट

(परिभाषित या //ऑपरेटर के लिए पर्ल 5.10 की आवश्यकता है )।

स्टड से सभी इनपुट लेता है। अभी भी कुछ गंभीर गोल्फ की जरूरत है।
ध्यान दें कि ^ Q ASCII 17 (DC1 / XON) का प्रतिनिधित्व करता है, ^ C ASCII 3 का प्रतिनिधित्व करता है और ^ @ ASCII 0 (NUL) का प्रतिनिधित्व करता है।

while(<>){push@A,[split//]if/]/;while(/\w/g){for$i(0..6){for($f=0,$j=4;$j--;){$c=0;map{if($_){$i--,$f=$j=3,redo if$A[$k=$i+$j][$C=$c+$'+1]ne$";$A[$k][$C]="#"if$f}$c++}split//,unpack"b*",chr vec"3^@'^@c^@^Q^C6^@\"^C^Q^Q",index(OTZLSJI,$&)*4+$j,4;$s+=10,@A[0..$k]=@A[$k,0..$k-1],map{s/#/ /}@{$A[0]},$i++if 9<grep/#/,@{$A[$k]}}last if$f}}}print+(map@$_,@A),$s//0,$/

टिप्पणी संस्करण:

while(<>){
    # store the playfield as an AoA of chars
    push@A,[split//]if/]/;
    # while we're getting pieces
    while(/\w/g){
            # for each line of playfield
            for$i(0..6){
                    # for each line of current piece
                    for($f=0,$j=4;$j--;){
                            # for each column of current piece
                            $c=0;
                            map{
                                    if($_){
                                            # if there's a collision, restart loop over piece lines
                                            # with a mark set and playfield line decremented
                                            $i--,$f=$j=3,redo if$A[$k=$i+$j][$C=$c+$'+1]ne$";
                                            # if we already found a collision, draw piece
                                            $A[$k][$C]="#"if$f
                                    }
                                    $c++
                            # pieces are stored as a bit vector, 16 bits (4x4) per piece,
                            # expand into array of 1's and 0's
                            }split//,unpack"b*",chr vec"3^@'^@c^@^Q^C6^@\"^C^Q^Q",index(OTZLSJI,$&)*4+$j,4;
                            # if this playfield line is full, remove it. Done by array slicing
                            # and substituting all "#"'s in line 0 with " "'s
                            $s+=10,@A[0..$k]=@A[$k,0..$k-1],map{s/#/ /}@{$A[0]},$i++if 9<grep/#/,@{$A[$k]}
                    }
                    # if we found a collision, stop iterating over the playfield and get next piece from input
                    last if$f
            }
    }
}
# print everything
print+(map@$_,@A),$s//0,$/

संपादित 1: कुछ गंभीर गोल्फ, उत्पादन बग को ठीक करें।
2 संपादित करें: कुछ inlining, (ड्रम रोल ...) 3 वर्ण, गोल्फ गोल्फ की बचत के लिए एक में दो छोरों को मिला दिया।
संपादित करें 3: कुछ सामान्य सबडिप्रेशन उन्मूलन, थोड़ा निरंतर विलय और एक regex tweaked।
4 संपादित करें: एक बिट बिट वेक्टर, मिस गोल्फिंग में टेट्रोमिनो का प्रतिनिधित्व बदल गया।
संपादित करें 5: tetromino पत्र से सरणी सूचकांक में अधिक प्रत्यक्ष अनुवाद, गैर-मुद्रण योग्य वर्णों का उपयोग करें, मिस गोल्फिंग।
एडिट 6: फिक्स्ड बग क्लीनिंग टॉप लाइन, जिसे आर 3 (एडिट 2) में पेश किया गया है, जिसे नाकिलन द्वारा स्पॉट किया गया है। अधिक गैर-मुद्रण योग्य वर्णों का उपयोग करें।
7 संपादित करें: vecटेट्रोमिनो डेटा प्राप्त करने के लिए उपयोग करें । इस तथ्य का लाभ उठाएं कि प्लेफील्ड के निश्चित आयाम हैं। ifकथन =>ifसंशोधक, संपादन 2 के छोरों का विलय बंद होने लगता है। //0-स्कोर मामले के लिए उपयोग करें ।
संपादित करें 8: एक और बग को ठीक किया, जिसे r6 (एडिट 5) में पेश किया गया था, जिसे नाकिलन द्वारा देखा गया था।
9 संपादित करें: लाइनों को साफ करते समय नए संदर्भ न बनाएं, केवल सरणी स्लाइसिंग के माध्यम से संदर्भों को स्थानांतरित करें। दो mapको एक में मिलाएं । होशियार रेगेक्स। "होशियार" for। विविध गोल्फ।
संपादित करें 10: इनलेटेड टेट्रोमिनो सरणी, जोड़ा गया टिप्पणी संस्करण।


बहुत अच्छी तरह से काम करना (और पहले से ही इस गैर-तुच्छ समस्या के लिए एक अच्छे चरित्र की गिनती में)। एक छोटी सी ख़ासियत यह है कि मेरे पर्ल (पर्ल, वी 5.10.0 को डार्विन-थ्रेड-मल्टी -2 एलवेल के लिए बनाया गया है) दो बार परिणाम प्रिंट करने के लिए लगता है (इनपुट पाइप इन)।
क्रिस्टोफीडी

@ChristopheD: डुप्लिकेट किए गए आउटपुट को ठीक किया, मैं अपने मुख्य लूप के अंदर प्रिंट कर रहा था, लेकिन केवल प्लेफील्ड के बिना लाइनों के लिए। आपके पास शायद एक बहुत अधिक थी :)
निंजाल

अजगर को हराने के लिए 4 और चरखे !!
विविन पालीथ

1
मैंने अभी तक हार नहीं मानी है! xD (हालांकि मैं कुछ अन्य समाधान भी देखने के लिए अब तक चाहते हैं ..)
प्रहार

@ नाकिलोन: अच्छी पकड़! आपके पास एक अच्छा परीक्षण मामला है।
नवजाल

24

रूबी - 427 408 398 369 359

t=[*$<]
o=0
u=->f{f.transpose}
a=u[t.reverse.join.scan /#{'( |#)'*10}/]
t.pop.split.map{|w|m=(g='I4O22Z0121T01201L31S1201J13'[/#{w[0]}\d+/].scan(/0?\d/).zip a.drop w[1].to_i).map{|r,b|(b.rindex ?#or-1)-r.size+1}.max
g.map{|r,b|b.fill ?#,m+r.size,r.to_i}
v=u[a]
v.reject!{|i|i-[?#]==[]&&(o+=10;v)<<[' ']*10}
a=u[v]}
puts u[a].reverse.map{|i|?[+i*''+?]},t[-1],o

बहुत अच्छा समाधान! मुझे इस बात पर एक नज़र डालनी होगी कि आपने टेरोमिनोसेस के रूपों को वास्तव में कैसे एनकोड किया था (इस तरह से बहुत कॉम्पैक्ट दिखता है)।
क्रिस्टोफीडी

3
मैं वास्तव में इस कोड की विस्तारित व्याख्या देखना पसंद करूंगा। यह बहुत बीमार लग रहा है ... इसके चारों ओर मेरा सिर नहीं मिल सकता है।
नेल्स रिडमैन

1
@ निल्स रिडमैन, मैं अभी एक स्पष्टीकरण लिखता हूं, लेकिन मैं इसे अभी पोस्ट करने के बारे में सोच रहा हूं, या विजेता घोषणा के बाद) वैसे भी एक बार मैं सभी सवालों का जवाब दूंगा, क्योंकि यह मुख्य विचार के साथ एक समुदाय विकि है जो उपयोगी होगा)
नकिलन

डेबियन के माणिक 1.9.2dev (2010-07-30) पर यह आपके टेस्ट केस के लिए असफल हो जाता है। paste.org.ru/?6ep1on। इसके अलावा, यह हमेशा प्लेफील्ड को दस लाइनों तक फैलाता है?
नंजलज

@ninjalj, माणिक 1.9.2p0 (2010-08-18) [i386-mingw32] paste.org.ru/?1qnjhj ठीक लगता है। 10 की चौड़ाई एक टेट्रिस लेबर है, मुझे लगता है।
नकीलोन

17

बैश शेल स्क्रिप्ट ( 301 304 अक्षर)


अद्यतन: शीर्ष पंक्ति में विस्तार करने वाले टुकड़ों से युक्त बग फिक्स्ड। इसके अलावा, आउटपुट अब मानक से बाहर भेजा जाता है, और एक बोनस के रूप में, खेल खेलना जारी रखने के लिए स्क्रिप्ट को फिर से चलाना संभव है (जिस स्थिति में आपको कुल स्कोर खुद जोड़ना होगा)।

इसमें गैर-वर्णक वर्ण शामिल हैं, इसलिए मैंने एक हेक्स डंप प्रदान किया है। इसे इस रूप में सहेजें tetris.txt:

0000000: 7461 696c 202d 3120 245f 7c7a 6361 743e  tail -1 $_|zcat>
0000010: 753b 2e20 750a 1f8b 0800 35b0 b34c 0203  u;. u.....5..L..
0000020: 5590 516b 8330 10c7 dff3 296e 4c88 ae64  U.Qk.0....)nL..d
0000030: a863 0c4a f57d 63b0 07f7 b452 88d1 b4da  .c.J.}c....R....
0000040: 1a5d 5369 91a6 df7d 899a d05d 5e72 bfbb  .]Si...}...]^r..
0000050: fbff 2fe1 45d5 0196 7cff 6cce f272 7c10  ../.E...|.l..r|.
0000060: 387d 477c c4b1 e695 855f 77d0 b29f 99bd  8}G|....._w.....
0000070: 98c6 c8d2 ef99 8eaa b1a5 9f33 6d8c 40ec  ...........3m.@.
0000080: 6433 8bc7 eeca b57f a06d 27a1 4765 07e6  d3.......m'.Ge..
0000090: 3240 dd02 3df1 2344 f04a 0d1d c748 0bde  2@..=.#D.J...H..
00000a0: 75b8 ed0f 9eef 7bd7 7e19 dd16 5110 34aa  u.....{.~...Q.4.
00000b0: c87b 2060 48a8 993a d7c0 d210 ed24 ff85  .{ `H..:.....$..
00000c0: c405 8834 548a 499e 1fd0 1a68 2f81 1425  ...4T.I....h/..%
00000d0: e047 bc62 ea52 e884 42f2 0f0b 8b37 764c  .G.b.R..B....7vL
00000e0: 17f9 544a 5bbd 54cb 9171 6e53 3679 91b3  ..TJ[.T..qnS6y..
00000f0: 2eba c07a 0981 f4a6 d922 89c2 279f 1ab5  ...z....."..'...
0000100: 0656 c028 7177 4183 2040 033f 015e 838b  .V.(qwA. @.?.^..
0000110: 0d56 15cf 4b20 6ff3 d384 eaf3 bad1 b9b6  .V..K o.........
0000120: 72be 6cfa 4b2f fb03 45fc cd51 d601 0000  r.l.K/..E..Q....

फिर, bash कमांड प्रॉम्प्ट पर, अधिमानतः स्थापित होने के elvisबजाय :vimvi

$ xxd -r tetris.txt tetris.sh
$ chmod +x tetris.sh
$ cat << EOF > b
> [          ]
> [          ]
> [          ]
> [          ]
> [ #    #  #]
> [ ## ######]
> [==========]
> EOF
$ ./tetris.sh T2 Z6 I0 T7 2>/dev/null
-- removed stuff that is not in standard out --
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

यह काम किस प्रकार करता है

कोड स्वयं को इसी तरह निकालता है कि gzexeस्क्रिप्ट का उपयोग करके निष्पादन योग्य प्रोग्राम कैसे संपीड़ित करते हैं। Tetromino के टुकड़े vi संपादक आदेशों के अनुक्रम के रूप में दर्शाए जाते हैं। कैरेक्टर काउंटिंग का उपयोग टकरावों का पता लगाने के लिए किया जाता है, और स्कोर की गणना करने के लिए लाइन काउंटिंग का उपयोग किया जाता है।

अनजिप कोड:

echo 'rej.j.j.:wq!m'>I
echo '2rejh.:wq!m'>O
echo '2rej.:wq!m'>Z
echo '3rejh1.:wq!m'>T
echo 'rej.j2.:wq!m'>L
echo 'l2rej2h.:wq!m'>S
echo 'lrej.jh2.:wq!m'>J
for t
do for y in `seq 1 5`
do echo -n ${y}jk$((${t:1}+1))l|cat - ${t:0:1}|vi b>0
grep ========== m>0||break
[ `tr -cd '#'<b|wc -c` = `tr -cd '#'<m|wc -c` ]||break
tr e '#'<m>n
done
cat n>b
grep -v '##########' b>m
$((S+=10*(`wc -l < b`-`wc -l < m`)))
yes '[          ]'|head -7|cat - m|tail -7>b
done
cat b
echo $S

गोल्फिंग से पहले मूल कोड:

#!/bin/bash

mkpieces() {
    pieces=('r@j.j.j.' '2r@jh.' '2r@j.' '3r@jh1.' 'r@j.j2.' 'l2r@j2h.' 'lr@j.jh2.')
    letters=(I O Z T L S J)

    for j in `seq 0 9`; do
        for i in `seq 0 6`; do
            echo "jk$(($j+1))l${pieces[$i]}:wq! temp" > ${letters[$i]}$j
        done
    done
}

counthashes() {
    tr -cd '#' < $1 | wc -c
}

droppiece() {
    for y in `seq 1 5`; do
        echo -n $y | cat - $1 | vi board > /dev/null
        egrep '={10}' temp > /dev/null || break
        [ `counthashes board` -eq `counthashes temp` ] || break
        tr @ "#" < temp > newboard
    done
    cp newboard board
}

removelines() {
    egrep -v '#{10}' board > temp
    SCORE=$(($SCORE + 10 * (`wc -l < board` - `wc -l < temp`)))
    yes '[          ]' | head -7 | cat - temp | tail -7 > board
}

SCORE=0
mkpieces
for piece; do
    droppiece $piece
    removelines
done
cat board
echo $SCORE

1
एक बैश फाइल, डिकम्प्रेसिंग और रनिंग vi .. इस तरह के एबोमिनेशन की वैधता के बारे में निश्चित नहीं है .. लेकिन यह सबसे प्रभावशाली है, +1। kudos आप के लिए श्रीमान।
माइकल एंडरसन

एक हास्यास्पद रूप से पूरा होने में लंबा समय लगता है, और फिर परीक्षण मामले के लिए गलत आउटपुट उत्पन्न करता है "T2 Z6 I0 T7 T2 Z6 T2 I5 I1 I0 T4 T8 T1 T3 Z3 I9 I6 O7 T3 I2 O8 J8 O7 I3 J8 S8 O6 I6 I1 O4 I4 "(उदाहरण इनपुट के समान बोर्ड)। इसके अलावा, पाइप लाइन के टूटने पर हजारों कचरे की लाइनें डगमगाने लगती हैं, और बोर्ड का परिणाम शायद इसके बजाय वहां जाना चाहिए।
Nabb

यह बहुत तेज़ होगा अगर विम के बजाय एल्विस को vi के रूप में स्थापित किया गया हो।
PleaseStand

2
@ नब: मैंने केवल तीन पात्रों की लागत पर उन सभी मुद्दों को तय किया है।
कृपया

वाह। यह बैश के कुछ बहुत प्रभावशाली दुरुपयोग है।
पी डैडी

13

पायथन: 504 519 वर्ण

(पायथन 3 समाधान) वर्तमान में प्रारूप में इनपुट सेट करने की आवश्यकता है जैसा कि शीर्ष पर दिखाया गया है (इनपुट कोड की गणना नहीं की गई है)। मैं बाद में फ़ाइल या स्टड से पढ़ने के लिए विस्तार करूँगा। अब एक प्रॉम्प्ट के साथ काम करता है, बस इनपुट को (8 लाइनों को कुल) पेस्ट करें।

R=range
f,p=[input()[1:11]for i in R(7)],p
for(a,b)in input().split():
 t=[' '*int(b)+r+' '*9for r in{'I':'#,#,#,#','O':'##,##','Z':'##, ##','T':'###, # ','L':'#,#,##','S':' ##,##','J':' #, #,##'}[a].split(',')]
 for r in R(6-len(t),0,-1):
  for i in R(len(t)):
   if any(a==b=='#'for(a,b)in zip(t[i],f[r+i])):break
  else:
   for i in R(0,len(t)):
    f[r+i]=''.join(a if b!='#'else b for(a,b)in zip(t[i],f[r+i]))
    if f[r+i]=='#'*10:del f[r+i];f[0:0]=[' '*10];p+=10
   break
print('\n'.join('['+r+']'for r in f[:7]),p,sep='\n')

यकीन नहीं होता कि मैं वहां ज्यादा बचा सकता हूं। बहुत सारे वर्ण बिटफ़िल्ड में परिवर्तन से खो जाते हैं, लेकिन यह तार के साथ काम करने की तुलना में बहुत अधिक पात्रों को बचाता है। इसके अलावा, मुझे यकीन नहीं है कि मैं और अधिक व्हाट्सएप निकाल सकता हूं, लेकिन मैं इसे बाद में कोशिश करूंगा।
इसे बहुत कम करने में सक्षम नहीं होगा; बिटफील्ड-आधारित समाधान होने के बाद, मैंने स्ट्रिंग्स पर वापस संक्रमण किया, क्योंकि मुझे इसे और अधिक संपीड़ित करने का एक तरीका मिला (बिटफील्ड पर 8 वर्णों को बचाया!)। लेकिन यह देखते हुए कि मैं इसमें शामिल करना भूल गया Lथा और अंदर के अंकों के साथ एक त्रुटि थी, मेरा चरित्र गिनती केवल उच्छ्वास पर चला जाता है ... हो सकता है कि मुझे बाद में इसे थोड़ा और संक्षिप्त करने के लिए कुछ मिल जाए, लेकिन मुझे लगता है कि मैं अंत के पास हूं। मूल और टिप्पणी कोड के लिए नीचे देखें:

मूल संस्करण:

field = [ input()[1:11] for i in range(7) ] + [ 0, input() ]
# harcoded tetrominoes
tetrominoes = {'I':('#','#','#','#'),'O':('##','##'),'Z':('##',' ##'),'T':('###',' # '),'L':('#','#','##'),'S':(' ##','##'),'J':(' #',' #','##')}
for ( f, c ) in field[8].split():
    # shift tetromino to the correct column
    tetromino = [ ' ' * int(c) + r + ' ' * 9 for r in tetrominoes[f] ]

    # find the correct row to insert
    for r in range( 6 - len( tetromino ), 0, -1 ):
        for i in range( len( tetromino ) ):
            if any( a == b == '#' for (a,b) in zip( tetromino[i], field[r+i] ) ):
                # skip the row if some pieces overlap
                break
        else:
            # didn't break, insert the tetromino
            for i in range( 0, len( tetromino ) ):
                # merge the tetromino with the field
                field[r+i] = ''.join( a if b != '#' else b for (a,b) in zip( tetromino[i], field[r+i] ) )

                # check for completely filled rows
                if field[r+i] == '#' * 10:
                    # remove current row
                    del field[r+i]
                    # add new row
                    field[0:0] = [' '*10]
                    field[7] += 10
            # we found the row, so abort here
            break
# print it in the requested format
print( '\n'.join( '[' + r + ']' for r in field[:7] ) )
# and add the points = 10 * the number of redundant lines at the end
print( str( field[7] ) )

मुझे नहीं लगता कि यह सही है। यह कहते हुए कोई नियम नहीं है कि केवल नीचे की रेखा गायब हो सकती है, लेकिन आपकी टिप्पणियों को देखते हुए, आप केवल उस रेखा की जांच करते हैं।
माइकल मैडसेन

कृपया, अपने इनपुट को कार्य की तरह बनाएं। मेरा मतलब है, फ़ाइल या एसटीडीआईएन से इनपुट।
नैकिलोन

6
क्या आपको यह पसंद नहीं है कि कैसे पायथन कोड भी अभी भी काफी पठनीय है?
ईएमपी

पर्ल या Malbolge) के साथ तुलना में @Evgeny, सिर्फ तभी जब
Nakilon

खैर, मेरा मतलब अन्य कोड गोल्फ उत्तरों के सापेक्ष "पठनीय" था!
ईएमपी

13

रूबी 1.9, 357 355 353 339 330 310 309 चरस

d=0
e=[*$<]
e.pop.split.map{|f|f="L\003\003\007J\005\005\007O\007\007Z\007\013S\013\007I\003\003\003\003T\017\005"[/#{f[j=0]}(\W*)/,1].bytes.map{|z|?\0+?\0*f[1].hex+z.to_s(2).tr("01"," #")[1,9]}
k,f,i=i,[p]+f,e.zip(f).map{|l,m|l.bytes.zip(m.to_s.bytes).map{|n,o|j|=n&3&q=o||0;(n|q).chr}*""}until j>0
e=[]
e+=k.reject{|r|r.sum==544&&e<<r.tr(?#,?\s)&&d+=10}}
puts e,d

ध्यान दें कि \000एस्केप (तीसरी पंक्ति पर नल बाइट्स सहित) को उनके वास्तविक गैर-समान समकक्ष के साथ प्रतिस्थापित किया जाना चाहिए।

नमूना इनपुट:

[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
T2 Z6 I0 T7

उपयोग:

ruby1.9 tetris.rb < input

या

ruby1.9 tetris.rb input

Tetrominos ड्रॉप करने के लिए एक और तरीका है और सभी ग्लास को सरणी में रखते हुए, यहां तक ​​कि सीमाओं के साथ ... अच्छा। अब आप रूबी / पर्ल नेता होंगे। पुनश्च: मैं नहीं जानता था ?\s
निकीलोन

12

C, 727 [...] 596 581 556 517 496 471 461 457 chars

यह मेरा पहला कोड गोल्फ है, मुझे लगता है कि चरित्र गणना बहुत कम हो सकती है, अच्छा होगा यदि अनुभवी गोल्फर मुझे कुछ संकेत दे सकें।

वर्तमान संस्करण विभिन्न आयामों के साथ प्लेफील्ड को भी संभाल सकता है। इनपुट में डॉस / विंडोज और यूनिक्स प्रारूप दोनों में लाइनब्रीक हो सकते हैं।

अनुकूलन से पहले कोड बहुत सीधा था, टेट्रोमिनोइज़ को 4 पूर्णांक में संग्रहीत किया जाता है जिन्हें एक (7 * 3) x4 बिट सरणी के रूप में व्याख्या किया जाता है, प्लेफील्ड को-के रूप में संग्रहीत किया जाता है, टाइलें पूरी की जाती हैं और प्रत्येक के बाद और बाद में पूरी लाइनें हटा दी जाती हैं। टाइल ड्रॉप।

मुझे यकीन नहीं था कि वर्णों की गणना कैसे की जाती है, इसलिए मैंने कोड की फाइल का उपयोग सभी अप्राकृतिक रेखा-रेखाओं को हटा दिया।

EDIT 596 => 581: KitsuneYMG के लिए धन्यवाद, %lsसुझाव को छोड़कर सब कुछ पूरी तरह से काम किया, इसके अलावा, मैंने देखा कि putchइसके बजाय putcharइस्तेमाल किया जा सकता है ( getchकिसी तरह काम नहीं करता है) और सभी कोष्ठक को हटा दिया #define G

EDIT 581 => 556: शेष forऔर नेस्टेड Fछोरों से संतुष्ट नहीं थे , इसलिए कुछ विलय, परिवर्तन और हटाने के छोरों के साथ, काफी भ्रमित थे लेकिन निश्चित रूप से इसके लायक थे।

EDIT 556 => 517: अंत में aएक अंतर सरणी बनाने का एक तरीका मिला । कुछ के N;साथ विलय हो गया c, breakअब नहीं।

EDIT 496 => 471: Playfield की चौड़ाई और ऊंचाई अभी तय की गई है।

EDIT 471 => 461: एक मानक कार्य के putcharरूप putchमें फिर से उपयोग किए जाने वाले मामूली संशोधन ।

संपादित करें: Bugfix, पूरा लाइनों को हटा दिया गया से पहले टाइल बूंद के बजाय के बाद , इसलिए पूरा लाइनों अंत में छोड़ा जा सकता है। फिक्स कैरेक्टर काउंट को नहीं बदलता है।

#define N (c=getchar())
#define G T[j%4]&1<<t*3+j/4
#define X j%4*w+x+j/4
#define F(x,m) for(x=0;x<m;x++)
#define W while
T[]={916561,992849,217,1},C[99],c,i,j,s,t,x,A,a[99],w=13;
main(){F(j,7)C["IJLSTZO"[j]]=j;
F(j,91)a[j]=N;
W(N>w){t=C[c];x=N-86;
W(c){F(j,12)if(G&&X>1?a[X]-32:0)c=0;
F(j,12)if(G&&X>w&&!c)a[X-w]=35;x+=w;}N;
F(i,6){A=0;t=i*w;F(x,w)A|=(a[t+x]==32);
if(!A){s++;F(j,t)a[t+w-j]=a[t-j];
x=1;W(a[x]-93)a[x++]=32;}}}
F(i,91)putchar(a[i]);printf("%i0",s);}

1
आप के forरूप में परिभाषित नहीं कर सकते #define F(x,m) for(x=0;x++<m;)? यह C # ...: P
BrunoLM

@ ब्रूनोएलएम: धन्यवाद, लेकिन यह काम नहीं करेगा, इस बदलाव के बजाय फ़े F(x,3){printf("%i",x}प्रिंट । में बदल सकता है , लेकिन इससे कुछ भी बचा नहीं है :)12012for(x=-1;x++<m;)
श्नाइडर

1
यदि आपने कोड को सही ढंग से लिखा है, यदि आप C के रूप में संकलित करते हैं तो आपको stdio.h को शामिल करने की आवश्यकता नहीं है (जब तक कि मैं कुछ याद नहीं करता)। कुछ वर्णों को बचाएं :)

1
आप N के अपने परिभाषित को बदल सकते हैं (c=getchar())और 6 वर्णों की बचत करने वाली सभी c = N पंक्तियों को हटा सकते हैं। जब तक मैं इन के बारे में गलत हूँ, आप टी नीचे 585 करने के लिए मिलना चाहिए
KitsuneYMG

1
कम से कम C89 के लिए, चर के लिए भी int प्रकार की चूक।
नवजाल

8

पायथन 2.6+ - 334 322 316 वर्ण

397 368 366 अक्षर असम्बद्ध

#coding:l1
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()))

परिक्षण

intetris

[]
[]
[]
[]
[# # #]
[## ######]
[==========]
T2 Z6 I0 T7

न्यूलाइन्स को यूनिक्स-स्टाइल (केवल लाइनफीड) होना चाहिए। अंतिम पंक्ति पर एक अनुगामी न्यूलाइन वैकल्पिक है।

परीक्षा करना:

> अजगर golftris.py <intetris
[]
[]
[]
[# ###]
[# ###]
[##### ####]
[==========]
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] # notice that I rely on the first line being blank
full  = '[##########]\n'

for piece in board.pop().split():
    column = int(piece[1]) + 1 # "+ 1" to skip the '[' at the start of the line

    # explanation of these three lines after the code
    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: # if the current cell should be a '#'
            x = column + i / 4
            y = drop + i % 4
            board[y] = board[y][:x] + '#' + board[y][x + 1:]

    while full in board:      # if there is a full line,
        score += 10           # score it,
        board.remove(full)    # remove it,
        board = blank + board # and replace it with a blank line at top
        
print ''.join(board), score

क्रुक्स तीन क्रिप्टिक लाइनों में है मैंने कहा कि मैं समझाता हूं।

टेट्रोमिनो का आकार वहां हेक्साडेसिमल संख्या में एन्कोडेड है। प्रत्येक टेट्रोनिमो को कोशिकाओं के 3x4 ग्रिड पर कब्जा करने के लिए माना जाता है, जहां प्रत्येक कोशिका या तो रिक्त होती है (एक स्थान) या पूर्ण (एक संख्या चिह्न)। प्रत्येक टुकड़ा को 3 हेक्साडेसिमल अंकों के साथ एन्कोड किया गया है, प्रत्येक अंक एक 4-सेल कॉलम का वर्णन करता है। कम से कम महत्वपूर्ण अंक बाएं-सबसे स्तंभों का वर्णन करते हैं, और प्रत्येक अंक में सबसे कम महत्वपूर्ण बिट प्रत्येक स्तंभ में शीर्ष-सबसे सेल का वर्णन करता है। यदि बिट 0 है, तो वह सेल रिक्त है, अन्यथा यह '#' है। उदाहरण के लिए, I tetronimo के रूप में एन्कोड किया गया है 00F, सबसे कम-संख्या वाले चार बिट्स के साथ बाएं-सबसे कॉलम में चार नंबर चिह्नों को एनकोड करने के लिए सेट किया गया है, और T है131, बाईं और दाईं ओर शीर्ष बिट सेट के साथ, और शीर्ष दो बिट्स मध्य में सेट हैं।

पूरे हेक्साडेसिमल संख्या को फिर एक बिट बाईं ओर शिफ्ट किया जाता है (दो से गुणा)। यह हमें नीचे-सबसे थोड़ा अनदेखा करने की अनुमति देगा। मैं समझाता हूँ कि एक मिनट में क्यों।

तो इनपुट से वर्तमान टुकड़ा दिया जाता है, हम सूचकांक को इस हेक्साडेसिमल संख्या में खोजते हैं, जहां 12 बिट्स यह बताते हैं कि यह आकार शुरू है, फिर इसे नीचे शिफ्ट करें ताकि bitsचर के 1-12 (स्किपिंग बिट 0) बिट्स वर्तमान टुकड़े का वर्णन करें।

यह dropनिर्धारित करने के लिए कि ग्रिड के ऊपर से कितनी पंक्तियाँ आती हैं, टुकड़ा दूसरे टुकड़े पर उतरने से पहले गिर जाएगा। पहली पंक्ति को पता चलता है कि खेल के मैदान के प्रत्येक स्तंभ के शीर्ष पर कितनी खाली कोशिकाएँ हैं, जबकि दूसरी टुकड़ा के प्रत्येक स्तंभ में सबसे कम कब्जे वाली कोशिका को खोजती है। zipसमारोह जहां प्रत्येक टपल के होते हैं tuples की एक सूची, रिटर्न n वें इनपुट सूची में प्रत्येक आइटम से सेल। इसलिए, नमूना इनपुट बोर्ड का उपयोग करके, zip(board[:6] + [full])वापस आ जाएगा:

[
 ('[', '[', '[', '[', '[', '[', '['),
 (' ', ' ', ' ', ' ', ' ', ' ', '#'),
 (' ', ' ', ' ', ' ', '#', '#', '#'),
 (' ', ' ', ' ', ' ', ' ', '#', '#'),
 (' ', ' ', ' ', ' ', ' ', ' ', '#'),
 (' ', ' ', ' ', ' ', ' ', '#', '#'),
 (' ', ' ', ' ', ' ', ' ', '#', '#'),
 (' ', ' ', ' ', ' ', '#', '#', '#'),
 (' ', ' ', ' ', ' ', ' ', '#', '#'),
 (' ', ' ', ' ', ' ', ' ', '#', '#'),
 (' ', ' ', ' ', ' ', '#', '#', '#'),
 (']', ']', ']', ']', ']', ']', ']')
]

हम उपयुक्त कॉलम के अनुरूप इस सूची से टपल का चयन करते हैं, और कॉलम में पहले का इंडेक्स पाते हैं '#'। यही कारण है कि हमने कॉल करने से पहले एक "पूर्ण" पंक्ति जोड़ दी zip, ताकि indexकॉलम अन्यथा रिक्त होने पर एक समझदार रिटर्न (अपवाद को फेंकने के बजाय) होगा।

फिर '#'टुकड़े के प्रत्येक कॉलम में सबसे कम खोजने के लिए , हम उस कॉलम का वर्णन करने वाले चार बिट्स को शिफ्ट और मास्क करते हैं, फिर binफ़ंक्शन का उपयोग करके उन्हें एक स्ट्रिंग और शून्य में बदल देते हैं। binसमारोह केवल महत्वपूर्ण बिट देता है, इसलिए हम केवल इस स्ट्रिंग की लंबाई की गणना की जरूरत सबसे कम कब्जे वाले सेल (सबसे महत्वपूर्ण सेट बिट) खोजने के लिए। binसमारोह भी पहले जोड़ता '0b'है, तो हम है कि घटाना है। हम कम से कम महत्वपूर्ण बिट को भी अनदेखा करते हैं। यही कारण है कि हेक्साडेसिमल संख्या बाईं ओर एक बिट स्थानांतरित होती है। यह खाली स्तंभों के लिए है, जिनके स्ट्रिंग निरूपण में केवल शीर्ष सेल पूर्ण (जैसे T टुकड़ा) वाले स्तंभ के समान लंबाई होगी ।

उदाहरण के लिए, के स्तंभों मैं tetromino, के रूप में, जैसा कि पहले उल्लेख कर रहे हैं F, 0और 0bin(0xF)है '0b1111'। की अनदेखी करने के बाद '0b', हमारे पास 4 की लंबाई है, जो सही है। लेकिन bin(0x0)है 0b0। की अनदेखी करने के बाद '0b', हमारे पास अभी भी '1' की लंबाई है, जो गलत है। इसका हिसाब रखने के लिए, हमने अंत में एक अतिरिक्त बिट जोड़ा है, ताकि हम इस महत्वहीन बिट को अनदेखा कर सकें। इसलिए, +3कोड '0b'में शुरुआत में अतिरिक्त लंबाई और अंत में महत्वहीन बिट के लिए खाता है ।

यह सब तीन स्तंभों ( (0,1,2)) के लिए एक जनरेटर अभिव्यक्ति के भीतर होता है , और हम तीन minपंक्तियों में से किसी को छूने से पहले टुकड़ा को छोड़ने के लिए अधिकतम पंक्तियों को खोजने के लिए परिणाम ले सकते हैं।

बाकी को कोड पढ़कर समझना बहुत आसान होना चाहिए, लेकिन forइन असाइनमेंट के बाद लूप इस टुकड़े को बोर्ड में जोड़ता है। इसके बाद, whileलूप पूरी पंक्तियों को हटा देता है, उन्हें शीर्ष पर खाली पंक्तियों के साथ बदल देता है, और स्कोर को लंबा करता है। अंत में, बोर्ड और स्कोर आउटपुट पर प्रिंट किए जाते हैं।


6

पायथन, 298 वर्ण

सभी गैर- गूढ़ भाषा समाधानों को अब तक पीट (पर्ल, रूबी, सी, बैश ...)


... और कोड-ज़िपिंग वाले चिकेनरी का उपयोग भी नहीं करता है।

import os
r=os.read
b='[%11c\n'%']'*99+r(0,91)
for k,v in r(0,99).split():
    t=map(ord,' -:G!.:; -:; !-.!"-. !". !./')['IJLOSTZ'.find(k)*4:][:4];v=int(v)-31
    while'!'>max(b[v+j+13]for j in t):v+=13
    for j in t:b=b[:v+j]+'#'+b[v+j+1:]
    b=b.replace('[##########]\n','')
print b[-91:],1060-10*len(b)/13

परीक्षण उदाहरण पर

[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
T2 Z6 I0 T7

यह आउटपुट करता है

[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

पुनश्च। +5 की कीमत पर नैकिलोन द्वारा इंगित एक बग तय किया गया


यह कुछ बहुत प्रभावशाली कोड है। इसे ( ideone.com/zeuYB ) ठीक करने के लिए 14 और चरित्रों को लेना होगा , जब तक कि कोई बेहतर तरीका न हो, लेकिन फिर भी, यह सब कुछ धड़कता है, लेकिन GolfScript और बैश। यह निश्चित रूप से एक चतुर समाधान है।
पी डैडी

हाँ, बिल्कुल एक बहुत अच्छा समाधान!
क्रिस्टोफीडी

@ नाकिलोन: धन्यवाद, जाहिर है कि एक चूक। निर्धारित @ लागत
293-

@P डैडी, धन्यवाद - मुझे "सभी गैर-गूढ़" कहने में ईमानदारी रखने के लिए बैश और टूलचिन के तहत फिक्स लाने का एक तरीका मिला :)
Nas Banov

@ नब: कोड को कम रखने के लिए, इसे कुछ सीमाओं को ध्यान में रखकर लिखा गया था। 33 tetrominos मैक्स और 99 लाइन ड्रॉप्स जैसे कुछ अधिकतम। आसानी से +3 की कीमत के लिए बढ़ाया जा सकता है। या कम-कम कीमत के लिए :), सीमाओं को पूरी तरह से उठाया जा सकता है। BTW, यह एक बेहतरीन उदाहरण है कि किस प्रकार एक परीक्षण सेट ने कल्पना को स्पष्ट कर दिया होगा (मैं टिप्पणियों में क्रिस्टोफर को क्या बता रहा था)
Nas Banov

5

गोल्फस्क्रिप्ट 260 वर्ण

मुझे यकीन है कि इसमें सुधार किया जा सकता है, मैं गोल्फस्क्रिप्ट के लिए नया हूं।

[39 26.2/0:$14{.(}:?~1?15?1?14 2??27?13.!14?2?27?14 1]4/:t;n/)\n*:|;' '/-1%.,:c;~{)18+:&;'XIOZTLSJX'\%~;,1-t\={{.&+.90>{;.}*|\=32=!{&13-:&;}*}%}6*{&+}/|{\.@<'#'+\)|>+}4*{'['\10*']'++}:
;n/0\~n+:|;0\{.'#'
={;)}{n+|+:|;}if\.}do;' '
n+\.@*|+\$+:$;.,1-<:|;}c*|n?$*

लाइनों के अंत प्रासंगिक हैं (अंत में एक नहीं होना चाहिए)। वैसे भी, यहाँ कुछ परीक्षण मामले हैं जिनका मैंने उपयोग किया है:

> बिल्ली init.txt 
[]
[]
[]
[]
[# # #]
[## ######]
[==========]
T2 Z6 I0 T7> बिल्ली init.txt | माणिक गोल्‍फस्क्रिप्ट.आरबी टेट्रिस.जीएससी
[]
[]
[]
[# ###]
[# ###]
[##### ####]
[==========]
10

> बिल्ली init.txt
[]
[]
[]
[]
[# # #]
[## ######]
[==========]
I0 O7 Z1 S4> बिल्ली init.txt | माणिक गोल्‍फस्‍क्रिप्‍ट ।rb tetris.gsc
[]
[]
[]
[#]
[### ####]
[### #####]
[==========]
10

> बिल्ली init.txt
[]
[]
[]
[## ###]
[# #]
[## ######]
[==========]
T7 I0 I3> बिल्ली init.txt | माणिक गोल्‍फस्‍क्रिप्‍ट ।rb tetris.gsc
[]
[]
[]
[]
[# #]
[## # # # #]
[==========]
20

ध्यान दें कि इनपुट फ़ाइल में लाइन का कोई अंत नहीं है, लाइन का अंत स्क्रिप्ट को तोड़ देगा।


2
/ मुझे GolfScript समझता है एक सच्चे प्रतियोगिता भाषा होने के लिए नहीं ... यह सिर्फ एक पुस्तकालय, गोल्फ कार्यों के लिए सीधे आकार का है ... इस पुस्तकालय के आकार golfscript कोड के आकार के लिए जोड़ा जा सकता है ...
Nakilon

4
@Nakilon - क्या आप ऐसी किसी चीज़ के बारे में कुछ नहीं कह सकते जो कच्ची मशीन की भाषा में नहीं लिखी गई है? :) अजगर दुभाषिया सिर्फ एक पुस्तकालय है, इसे अपनी प्रविष्टि में आकार जोड़ें। </ sarcasm>
bta

2
@Nakilon: यह सिर्फ दुभाषिया है। इसे किसी अन्य भाषा में लिखा जा सकता है; क्या आप अभी भी कहेंगे कि गोल्फस्क्रिप्ट वास्तविक भाषा नहीं है?
माइकल फोकरिसिस

1
@ नब: धन्यवाद, मुझे लगा कि कुछ ऐसी चालें हैं जिनसे मैं चूक गया ... बुरा मत मानो, मैंने अपना कोड या तो समझने की जहमत नहीं उठाई :)।
कोडरज

1
@ मिचेल फौकरीस, मैं 1 मिनट में इस कार्य को हल करने के लिए अपनी व्याख्या लिख ​​सकता हूं, तो क्या?
Nakilon

4

ओकेमेकल 809 782 चार्ज

open String let w=length let c s=let x=ref 0in iter(fun k->if k='#'then incr x)s;!x open List let(@),g,s,p,q=nth,ref[],ref 0,(0,1),(0,2)let l=length let u=Printf.printf let rec o x i j=let a=map(fun s->copy s)!g in if snd(fold_left(fun(r,k)(p,l)->let z=c(a@r)in blit(make l '#')0(a@r)(i+p)l;if c(a@r)=z+l then r+1,k else r,false)(j-l x+1,true)x)then g:=a else o x i(j-1)and f x=let s=read_line()in if s.[1]='='then g:=rev x else f(sub s 1 10::x)let z=f [];read_line();;for i=0to w z/3 do o(assoc z.[i*3]['I',[p;p;p;p];'O',[q;q];'Z',[q;1,2];'T',[0,3;1,1];'L',[p;p;q];'S',[1,2;q];'J',[1,1;1,1;q]])(Char.code z.[i*3+1]-48)(l!g-1);let h=l!g in g:=filter(fun s->c s<>w s)!g;for i=1to h-(l!g)do incr s;g:=make 10' '::!g done;done;iter(fun r->u"[%s]\n"r)!g;u"[==========]\n";u"%d\n"(!s*10)

4

आम लिस्प 667 657 645 चार्ज

कोड गोल्फ में मेरा पहला प्रयास है, इसलिए शायद बहुत सी चालें हैं जो मुझे अभी तक नहीं पता हैं। मैंने कुछ अवशिष्ट "पठनीयता" को बनाए रखने के लिए कुछ नए समाचारों को छोड़ दिया (मैंने नए बाइट्स को 2 बाइट्स के रूप में गिना, इसलिए 6 अनावश्यक न्यूलाइनों को हटाकर 12 अधिक वर्ण प्राप्त किए)।

इनपुट में, पहले आकृतियाँ डालें फिर फ़ील्ड।

(let(b(s 0)m(e'(0 1 2 3 4 5 6 7 8 9)))
(labels((o(p i)(mapcar(lambda(j)(+ i j))p))(w(p r)(o p(* 13 r)))(f(i)(find i b))
(a(&aux(i(position(read-char)"IOZTLSJ")))(when i(push(o(nth i'((0 13 26 39)(0 1 13 14)(0 1 14 15)(0 1 2 14)(0 13 26 27)(1 2 13 14)(1 14 26 27)))(read))m)(a))))
(a)(dotimes(i 90)(if(find(read-char)"#=")(push i b)))(dolist(p(reverse m))
(setf b`(,@b,@(w p(1-(position-if(lambda(i)(some #'f(w p i)))e)))))
(dotimes(i 6)(when(every #'f(w e i))(setf s(1+ s)b(mapcar(lambda(k)(+(if(>(* 13 i)k)13(if(<=(* 13(1+ i))k)0 78))k))b)))))
(dotimes(i 6)(format t"[~{~:[ ~;#~]~}]
"(mapcar #'f(w e i))))(format t"[==========]
~a0"s)))

परिक्षण

T2 Z6 I0 T7
[          ]
[          ]
[          ]
[          ]
[ #    #  #]
[ ## ######]
[==========]
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10
NIL

बहुत कम नहीं, लेकिन कुरूपता के लिए +1! मुझे लगता है कि अगर यह कोष्ठक के साथ आया तो वर्णमाला का सूप कैसा दिखेगा।
पी डैडी

@P डैडी: धन्यवाद। हाँ, शायद यह है कि यह कैसा लगेगा :)।
लेप्रू

2

रूबी 505 479 474 442 439 426 वर्ण

पहला प्रयास। यह IronRuby के साथ किया है। मुझे यकीन है कि इसमें सुधार किया जा सकता है, लेकिन मुझे वास्तव में आज कुछ काम करना चाहिए!

p,q,r,s=(0..9),(0..2),(0..6),0
t=[*$<]
f=p.map{|a|g=0;r.map{|b|g+=2**b if t[6-b][a+1]==?#};g}
t.pop.split.map{|x|w,y=[15,51,306,562,23,561,113]["IOZTLSJ"=~/#{x[0]}/],x[1].to_i
l=q.map{|d|r.inject{|b,c|f[d+y]&(w>>(d*4)&15-c+1)>0?c:b}}.max
q.map{|b|f[b+y]|=w>>(b*4)&15-l}
r.map{i=f.inject{|a,b|a&b};f.map!{|a|b=i^(i-1);a=((a&~b)>>1)+(a&(b>>1))};s+=i>0?10:0}}
p.map{|a|r.map{|b|t[6-b][a+1]=f[a]&2**b>0??#:' '}}
puts t,s

परिक्षण

cat test.txt | ruby tetris.rb
[          ]
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

सामान्य माणिक का उपयोग करके अब संपादित करें। दीवारों का उत्पादन मिला ।।


एक और रूबिस्ट, अच्छा! लेकिन ईंटों के चारों ओर एक गिलास बनाओ।
Nakilon

1

रूबी में एक और, 573 546 अक्षर

: **

Z={I:?#*4,J:'#,###',L:'###,#',O:'##,##',S:'#,##, #',Z:' #,##,#',T:' #,##, #'}
t=[*$<]
R=->s{s.reverse}
T=->m{m.transpose}
a = T[R[t].join.scan /.#{'(\D)'*10}.$/]
t.pop.split.each{|z|
t,o=Z[z[0].to_sym].split(',').map{|x|x.split //},z[1].to_i
r=0..t.size-1
y=r.map{|u|1+a[o+u].rindex(?#).to_i-t[u].count(' ')}.max
(0..3).each{|i|r.each{|j|t[j][i]==?#&&a[o+j][y+i]=t[j][i]}}}
s=0
a.each{|x|s=a.max_by(&:size).size;x[s-=1]||=' 'while s>0}
a=R[T[a].reject{|x|x*''=~/[#]{10}/&&s+=10}.map{|x|?[+x*''+?]}[0..6]]
puts (0..8-a.size).map{?[+' '*10+?]},a,s

परिक्षण:

cat test.txt | ruby 3858384_tetris.rb
[          ]
[          ]
[          ]
[          ]
[#      ###]
[#     ### ]
[##### ####]
[==========]
10

साथ फिक्स्डa.each{|x|s=a.max_by(&:size).size;x[s-=1]||=' 'while s>0}
glebm
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.