एक बोर्ड को घुमाने का अनुकरण करें


14

परिचय

आप एक मिलान गेम खेल रहे हैं, जिसमें सिक्के शीर्ष पर डाले गए हैं और गुरुत्वाकर्षण के कारण नीचे (शीर्ष सिक्के पर) गिर गए हैं।

तो यह

O <- inserting this coin

OO O
OOOOO

यह बन जाएगा

O
OO O
OOOOO

अब कल्पना करें कि कोई व्यक्ति बोर्ड को दक्षिणावर्त घुमाता है। निम्नलिखित होगा:

1. बोर्ड को घुमाया जाता है

OOO
OO
O
OO
O

2. गुरुत्वाकर्षण के कारण सिक्के नीचे गिरते हैं

O
O
OO
OO
OOO

आपका कार्य

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

इनपुट

इनपुट एक स्ट्रिंग होने वाला है, जिसमें 3 प्रकार के अक्षर हैं:

  • ओ (राजधानी ओ) या 0 (शून्य) - एक सिक्का (आप तय करते हैं कि आपका कौन सा समाधान समर्थन करता है)
  • (स्पेस) - एक खाली क्षेत्र
  • \ n (नई पंक्ति) - पंक्ति का अंत

इनपुट बोर्ड की स्थिति का प्रतिनिधित्व करता है। आप मान सकते हैं, इनपुट अच्छी तरह से बना है और इसमें बोर्ड की एक वैध स्थिति है (कोई सिक्के नहीं चल रहे हैं)। इनपुट एक फ़ंक्शन पैरामीटर हो सकता है, या मानक इनपुट से या किसी फ़ाइल से पढ़ा जा सकता है।

उत्पादन

आउटपुट रोटेशन के बाद बोर्ड की नई स्थिति है। आउटपुट में इनपुट के समान 3 प्रकार के वर्ण होते हैं। आउटपुट को आपके फ़ंक्शन से वापस किया जा सकता है या मानक आउटपुट या फ़ाइल में लिखा जा सकता है।

नमूना

इनपुट 1:

O
OO O
OOOOO

output1:

O
O
OO
OO
OOO

इनपुट 2:

O O
O O

Output2:

OO
OO

आप किसी भी भाषा और चुने हुए भाषा के मानक पुस्तकालय का उपयोग कर सकते हैं। बाइट्स जीत में सबसे छोटा कार्यक्रम।


क्या छोटी रेखाएं अनुगामी स्थानों के साथ गद्देदार हैं?
वेंटरो

अगर आपको जरूरत है तो हां।
डेविड फ्रैंक

बोर्ड आकार के लिए क्या आवश्यकताएं हैं? क्या मैं एक उचित अधिकतम आकार चुन सकता हूं, या क्या एप्लिकेशन / फ़ंक्शन को सभी संभावित आकारों के लिए काम करने की आवश्यकता है?
जॉन्स

2
यदि गुरुत्वाकर्षण को रोटेशन के बाद लागू किया जाता है, तो इनपुट 2 आउटपुट 2 कैसे बनता है? मैंने सोचा होगा कि यह शीर्ष सिक्कों को नीचे गिरा देगा लेकिन क्षैतिज रूप से नहीं?
मैट

2
@ मैट नोट, कि इनपुट 2 में कोई खाली पंक्तियाँ नहीं हैं, न ही आउटपुट 2 में (एसई पंक्तियों के बीच मार्जिन प्रदर्शित करता है)।
डेविड फ्रैंक

जवाबों:


16

GolfScript, 14 12 अक्षर

' '-n%zip$n*

इनपुट STDIN पर दिया जाना चाहिए, सिक्कों के लिए वर्ण किसी भी गैर-व्हाट्सएप वर्ण हो सकते हैं। यहाँ कोशिश करो । पीटर के लिए धन्यवाद एक दो चरित्र कमी को इंगित करने के लिए।


ओह, मैं transposeरूबी में एक के लिए क्या नहीं दूंगा जो अलग-अलग लंबाई के साथ सरणियों को संभाल सकता है ...
वेंचरो

@ वेंटरो अधिकांश बार मैं इस हैक किए गए संस्करण का उपयोग करता हूं ([nil]*a.map(&:size).max).zip(*a):। गोल्फ के लिए हालांकि अच्छा नहीं है।
हावर्ड

आप 2 वर्ण बचा सकते हैं: के बाद से सबसे लंबे समय तक लाइनों हमेशा निचले भाग में खत्म हो, तो आप बदल सकते हैं -1%के साथ $
पीटर टेलर

@PeterTaylor आप सही हैं - हम चार्ट में सहेज सकते हैं। धन्यवाद।
हावर्ड

1
@PeterTaylor खैर, मैंने इसके लिए एक-चरित्र वाला उपनाम शामिल किया " "
एडित्सू ने छोड़ दिया क्योंकि एसई ईवीआईएल

6

जावास्क्रिप्ट (E6) 103

पहले प्रयास करें, बस मैट्रिक्स ऑपरेशन। इनपुट स्ट्रिंग में प्रत्येक पंक्ति को गद्देदार करने की आवश्यकता है।
काफी खराब।

R=t=>(x=t.split('\n').reverse().map(x=>[...x].sort()),x.map((c,i)=>x.map(r=>r[i]).join('')).join('\n'))

छद्म कोड

  1. स्ट्रिंग -> पंक्तियों की सरणी
  2. ऊपर / नीचे रिवर्स सरणी
  3. प्रत्येक पंक्ति -> चार सरणी
  4. प्रत्येक पंक्ति को क्रमबद्ध करें (सिक्के 'फॉल' को दाईं ओर)
  5. पक्षांतरित
  6. एक पंक्ति में प्रत्येक चार सरणी -> एक स्ट्रिंग
  7. ज्वाइन अरेंज -> सिंगल स्ट्रिंग

ओह वाह, सॉर्टिंग स्मार्ट (+1) है! अगर मैं इसे चुरा लूँ तो मन?
देखिए

मैंने पहले सिंटैक्स नहीं देखा है [...x]। इसे क्या कहते है?
कॉमफ्रिक

2
@ComFreak इसे कहा जाता है spread[ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
edc65

2
@ edc65 आपने कोष्ठक के साथ अपने स्वयं के लिंक को तोड़ दिया। यहाँ सही लिंक है
क्रिस क्रेफ़िस

6

रूबी 2.0, 59 वर्ण

puts$<.map(&:chars).reverse.transpose.sort[1,50].map &:join

स्टड के माध्यम से इनपुट, सभी लाइनों की लंबाई समान है। यह संभवतः आवश्यकता से बहुत अधिक लंबा है। लेकिन कम से कम यह पठनीय है ...


मुझे लगता है कि आप $<.mapइसके बजाय उपयोग कर सकते हैं ।
हावर्ड

@ हॉवर्ड वह एक बात है जिसे मैं हमेशा भूल जाता हूं । धन्यवाद!
वेंटरो

1
वहाँ क्या कर रहा है?
नहीं कि चार्ल्स

1
@Charles यह पहली पंक्ति को छोड़ देता है, जिसमें इनपुट से सभी नए अंक होते हैं। डेविड ने एक टिप्पणी में उल्लेख किया कि 50x50 अधिकतम संभव आकार है, इसलिए सभी को चुनने के बजाय पहली पंक्ति ( 1..-1), मैं सिर्फ 50 पंक्तियों का चयन करता हूं जो दूसरे के साथ शुरू होता है ( 1,50)।
वेंटरो

@ वेंटरो मिल गया। ठंडा। धन्यवाद!
चार्ल्स

3

जे - 49 31 24 बाइट्स

मुझे लगता है कि वहां अनावश्यक घुमाव हो सकते हैं, लेकिन अन्यथा यह ठीक काम करता है। यह एक फ़ंक्शन है जो इनपुट को निर्दिष्ट करता है, सिक्के हैं O। इनपुट में कोई अनुगामी व्हाट्सएप की आवश्यकता नहीं है।

नया संस्करण, edc65 के जावास्क्रिप्ट उत्तर से प्रेरित है :

f=:[:|."1@|:[:/:~"1,;._2

स्पष्टीकरण:

f=:[:|."1@|:[:/:~"1,;._2
                   ,;._2 Split the string at every fret, which is the last character in the string (newline).
              /:~"1      Sort every row separately.
     |."1@|:             Rotate the array clockwise.

पुराना संस्करण:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)

स्पष्टीकरण:

f=:[:|:((#~=&' '),=&'O'#])"1@|:@(|."1@|:)@(,;._2)
                                          (,;._2) Split the string at every fret, which is the last character in the string (newline).
                                (|."1@|:)@        Rotate the array clockwise.
                             |:@                  Reverse the axes (columns become rows and vice-versa).
       ((#~=&' '),=&'O'#])"1                      Function that applies the "gravity"
                          "1                       Apply to every row separately:
                  =&'O'#]                           Get the O's in the row.
       (#~=&' ')                                    Get the spaces in the row.
                ,                                   Join them, spaces come first.
  [:|:                                            Reverse axes again.

उदाहरण (ध्यान दें कि मल्टीलाइन स्ट्रिंग्स के साथ शुरू 0 : 0और अंत में एक ब्रैकेट होता है):

   f 0 : 0
O
OO O
OOOOO
) NB. output starts now
O  
O  
OO 
OO 
OOO
   f 0 : 0
O O
O O
) NB. Output starts now.

OO
OO

यदि आप कर सकते हैं, घुमाए जाने से पहले सॉर्ट करें
edc65

@ edc65 आप एक चतुर व्यक्ति हैं।
देखिए

2

हास्केल - 86

बस सीखना, इसलिए मुझे यकीन है कि इसमें सुधार किया जा सकता है।

import Data.List
c=putStr.unlines.filter(/="").sort.map(filter(/=' ')).transpose.lines

नमूना इनपुट:

let a = "O    \nOO O \nOOOOO"
let b = " O O \n O O "
c a
c b

नमूना आउटपुट:

O
O
OO
OO
OOO

OO
OO

2

अजगर 2 (69) (79)

for c in sorted(zip(*raw_input().split("\\n"))):print''.join(c[::-1])

रिक्त स्थान के साथ इनपुट पेड किया जाता है ताकि सभी लाइनों की लंबाई समान हो। splitप्रत्येक पंक्ति के arrat पैदा करता है। zipप्रभावी ढंग से सरणी transposes। फिर, sortedलेक्सिकोग्राफ़िक क्रम में टाइप करता है, जिससे सभी सिक्के नीचे गिर जाते हैं। अंत में, हम प्रत्येक पंक्ति को प्रिंट करते हैं, इसे वापस एक स्ट्रिंग में बदल देते हैं, हालांकि हमें इसे पहले रिवर्स करना होगा। करना print'O'*c.count('O')समतुल्य है और समान वर्णों का उपयोग करता है।

उदाहरण रन:

>> O    \nOO O \nOOOOO
O
O
OO
OO
OOO

1

सी, 167 119 बाइट्स

यह छोटा संस्करण (दुर्भाग्य से?) मूल की तुलना में बहुत स्पष्ट है।

m;j;b[99];r;main(){while(j=getchar()+1)j-11?m+=j-33&&++b[r]>m:++r;for(j=r;m+1;putchar(j--?m<b[j]?79:32:(j=r,m--,10)));}

0

रैकेट: 130

(let l((a'()))(let((b(sort(string->list(read-line))char<?)))(if
(null? b)(apply map(λ x(map display x)(newline))a)(l(cons b a)))))

यह आपको रिक्त स्थान के साथ पैड की आवश्यकता होती है ताकि लाइनें समान लेमगथ हों।


0

सी # - 209 174 बाइट्स

ठीक है, मुझे इस कोड गोल्फ को किसी बिंदु पर मानना ​​होगा। एक फ़ंक्शन (r) बनाया गया जो बोर्ड को घुमाता है और प्रिंट करता है। मुझे लगता है कि मैं थोड़ा धोखा दे रहा हूं जब मैं अपने चार सरणी को प्रिंट कर रहा हूं, लेकिन अगर आप यह पता नहीं लगा सकते हैं कि आपको पागल क्यों नहीं होना चाहिए :)

टिप्स के लिए ProgramFOX को धन्यवाद :)

void r(string s){int x=s.IndexOf('\n'),j,i=-1,k,z=x+1;var y=new char[x*x+x];for(;++i<x;y[z*(i+1)-1]='\n')for(k=j=x;j>0;)if(s[i*z+--j]=='0')y[k--*z-i-2]='0';Console.Write(y);}

धोखा

new char[x*x+x]सरणी को भरता है '\0'और नहीं' '


1
नई पंक्तियां निकाल रहा है और बीच की जगह को हटाने char[]और y192 अक्षरों तक अपने चरित्र गिनती कम हो जाएगा। साथ ही, staticयहां उत्तर पोस्ट करते समय कीवर्ड प्रदान करना वास्तव में आवश्यक नहीं है। इसे हटाने से आपकी वर्ण संख्या 185 वर्णों तक कम हो जाएगी।
प्रोग्राम फॉक्स

मैं 'रेफ' को हटाने में भी सक्षम था, जो पहले की कोशिश के बाद से भूल गया था।
वोज़्जेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.