एक Rubik है घन एल्गोरिथ्म उल्टा


19

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

इस चुनौती का लक्ष्य किसी दिए गए एल्गोरिदम का उलटा पता लगाना है।

विशिष्टता:

इनपुट में व्यक्तिगत चाल की एक सरणी होती है। प्रत्येक चाल 1 या 2 लंबाई की एक स्ट्रिंग है। बेशक, आप अपनी भाषा में जो भी इनपुट प्रारूप बनाते हैं, उसका उपयोग कर सकते हैं। प्रत्येक चाल में संरचना Xया X'या X2, जहां Xएक अपरकेस या लोअरकेस अक्षर होता है।

रिवर्स करने के लिए X, बस इसे बदलें X'। वैसे ही, X'बन जाता है XX2दूसरी ओर परिवर्तन नहीं होता है।

आउटपुट बनाने के लिए, प्रत्येक चाल को उल्टा करें, और फिर सरणी को उल्टा करें।

उदाहरण (रिक्त स्थान द्वारा अलग किए गए तार):

R => R'

D U' => U D'

S T A C K => K' C' A' T' S'

A2 B2 => B2 A2

स्कोरिंग:

यह कोड-गोल्फ है, इसलिए सबसे कम मात्रा में बाइट्स जीतते हैं। मानक खामियों की अनुमति नहीं है।


क्या R2-> R2'या B-> B3अनुमति है?
कैलक्यूलेटरफ्लेन

2
संभालना X3या X1चुनौती के लिए एक अच्छा जोड़ रहा होगा।
शैगी

1
"इस वजह से, हर एल्गोरिथ्म (चाल का सेट) में एक रिवर्स एल्गोरिथ्म होता है जो पहले एल्गोरिथ्म को अनडू करता है" क्या यह हर एल्गोरिदम के लिए सही है ?? क्योंकि मुझे लगता है कि हैशिंग एल्गोरिदम एक तरीका है। इसका मतलब यह है कि कोई रिवर्स एल्गोरिदम नहीं है, है ना? कृपया मुझे बताएं
अविषेक साहा

4
@AvishekSaha: रूबिक क्यूब समस्याओं के लिए, "एल्गोरिथ्म" का अर्थ "आप क्यूब पर कर सकते हैं चाल का एक क्रम" तक ही सीमित है। इस अर्थ में, क्यूब पर एकतरफा हैशिंग एल्गोरिथ्म जैसी कोई चीज नहीं है।
रॉस प्रेसर

5
D2R2टेस्ट केस के रूप में होना चाहिए था ...
नील

जवाबों:


7

पायथन 2 , 71 57 54 53 बाइट्स

-15 बाइट्स ओव्स के लिए धन्यवाद! -3 बाइट्स रॉड के लिए धन्यवाद।

lambda l:[i.strip("'")+" '"[len(i):]for i in l[::-1]]

इसे ऑनलाइन आज़माएं!

स्ट्रिंग I / O, 70 बाइट्स

lambda s:' '.join(i.strip("'")+"'"*(len(i)<2)for i in s.split()[::-1])

इसे ऑनलाइन आज़माएं!



7

वी , 13 10 बाइट्स

æGÇä/á'Ó''

इसे ऑनलाइन आज़माएं!

3 बाइट्स ने मेरी पसंदीदा सुविधा को इंगित करते हुए @nmjmcman को धन्यवाद दिया। स्पष्टीकरण:

æG          " Revere the order of every line
  Ç         " On every line not containing...
   ä/       " a digit:
     á'     "   Append an '
       Ó    "   Remove every instance on this line
        ''  "     Of two single quotes

äजब विम करने के लिए संकलित एक रेगेक्स का प्रतिनिधित्व करता है ?
डाउनगेट

@Downgoat हाँ! ऐसा होता है। Vim में अनुवाद किया, यह समाधान है :g!/\d/norm A'<CR>:%s/''//g<CR>gg:g/^/m0<CR>कैसे वी नियमित अभिव्यक्ति को संपीड़ित पर अधिक जानकारी पाया जा सकता है यहां
DJMcMayhem

@DJMcMayhem अपने पसंदीदा फ़ीचर की तरह निहित अंत नहीं हैं? इसे ऑनलाइन आज़माएं!
nmjcman101

3
मुझे पता है कि यह काफी देर हो चुकी है, लेकिन यह मेरे लिए काम नहीं करता है। यह एक R2 को 2R में बदल देता है, जो कि वैध नहीं है
Jamie Sanborn

7

रेटिना 0.8.2 , 27 26 बाइट्स

\w
$&'
''

'2'
2
O$^`.'?2?

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


क्या इसे रेटिना 1.0 के रिलीज के साथ सुधारा जा सकता है ?
एमडी एक्सएफ

@MDXF ऐसा लगता है कि O$^वास्तव में अभी भी मैचों की सूची को उलटने का सबसे अच्छा तरीका है, इसलिए बाइट की गिनती वास्तव में रेटिना 1 में अपरिवर्तित है।
नील

5

जावास्क्रिप्ट (ईएस 6), 45 बाइट्स

s=>s.map(([a,b])=>b?+b?a+b:a:a+"'").reverse()

सबसे कम समाधान Array IO लेना है। तर्क विनाश का सरल और उपयुक्त उपयोग।

स्ट्रिंग आउटपुट +8 बाइट्स के लिए है .join` `

स्ट्रिंग इनपुट, ऐरे आउटपुट: 69 बाइट्स

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

f=

(s,k=[])=>s.replace(/\S\S?/g,([a,b])=>k.unshift(b?+b?a+b:a:a+"'"))&&k

;

console.log(["R", "D U'", "S T A C K", "A2 B2"].map(e => `${e} => ${f(e)}`));
<textarea oninput="out.value=(f(this.value)||[]).join` `" placeholder="input here"></textarea>
<textarea id="out" readonly></textarea>


अच्छा है। क्यों मैं समारोह मापदंडों को नष्ट करने के लिए कभी नहीं सोचते हैं ?! :(
शैगी

आपको 1 बाइट .reverse()को ::reverseबचाने में सक्षम होना चाहिए लेकिन
डाउनगोलाट जूल 6'17

@Downgoat कोई भी जगह जहां मैं ES7 का परीक्षण कर सकता हूं?
कॉनर ओ'ब्रायन

@ ConorO'Brien आप बैबल ऑनलाइन आरईपीएल का उपयोग कर सकते हैं (सभी सुविधा के लिए टिकटें
डाउनगोट

4

जेली , 11 बाइट्स

ḟ;ċ?”'ḣ2µ€Ṛ

पात्रों की सूचियों की सूची ("स्ट्रिंग्स" का एक "सरणी") लेते हुए एक विवादास्पद लिंक।

इसे ऑनलाइन आज़माएं!(पाद लेख आउटपुट को नष्ट करने से बचता है, रिक्त स्थान के साथ सूची को प्रदर्शित करता है।)

कैसे?

ḟ;ċ?”'ḣ2µ€Ṛ - Link: list of lists of characters             e.g. ["F'", "D2" , "R"]
        µ€  - perform the chain to the left for €ach turn instruction:
    ”'      -   literal "'" character
   ?        -   if:
  ċ         -     count (number of "'" in the instruction) i.e.:  1   , 0    , 0
ḟ           -   then: filter out                                  "F"
 ;          -   else: concatenate                                       "D2'", "R'"
      ḣ2    -   head to index 2                                   "F" , "D2" , "R'"
          Ṛ - reverse                                            ["R'", "D2" , "F"]

नई जेली के साथ 10 बाइट्स।
user202729

4

जावास्क्रिप्ट (ईएस 6), 46 बाइट्स

चाल की एक सरणी के रूप में इनपुट लेता है।

a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()

झसे आज़माओ

चालों की अल्पविराम से अलग सूची दर्ज करें।

o.innerText=(f=
a=>a.map(m=>m[1]?+m[1]?m:m[0]:m+"'").reverse()
)((i.value="S,T,A,C,K").split`,`);oninput=_=>o.innerText=f(i.value.split`,`)
<input id=i><pre id=o>


व्याख्या

a=>

पैरामीटर के माध्यम से तर्क के रूप में चाल की सरणी लेने वाला अनाम फ़ंक्शन a

a.map(m=>                       )

सरणी पर नक्शा, प्रत्येक स्ट्रिंग को एक फ़ंक्शन के माध्यम से गुजरना, जहां mवर्तमान स्ट्रिंग है।

 m[1]?

जांचें कि क्या स्ट्रिंग में दूसरा दूसरा वर्ण ( "'"या "2") है।

+m[1]?

यदि यह उस वर्ण स्ट्रिंग को पूर्णांक में डालने का प्रयास करता है। यदि स्ट्रिंग है "2", तो यह सच हो जाता 2है। यदि स्ट्रिंग है "'", तो यह बन जाता है NaN, जो कि गलत है।

m

यदि पिछला परीक्षण सत्य है, तो बस वापस लौटें m

:m[0]

अन्यथा, के पहले चरित्र को वापस करें m

:m+"'"

यदि स्ट्रिंग में दूसरा वर्ण नहीं है, तो ma के साथ संलग्न रिटर्न करें '

.reverse()

संशोधित सरणी उल्टा।


क्षमा करें, मैंने अभी यह देखा। मेरा अपना उत्तर आपके समान है: P
Conor O'Brien

2

पायथन ,  51  48 बाइट्स

lambda a:[(v+"'")[:2-("'"in v)]for v in a[::-1]]

एक अनाम फ़ंक्शन स्ट्रिंग्स की सूची लेना और वापस करना।

इसे ऑनलाइन आज़माएं!

के साथ इनपुट सूची को उलट देता है a[::-1]; के साथ हर प्रविष्टि के 'लिए एक संलग्न करता है ; प्रत्येक के पास 1 या 2 वर्ण होते हैं जो इस बात पर निर्भर करता है कि मूल के साथ था या नहीं ।v+"'"'[:2-("'"in v)]


2

पायथन 3 , 91 89 72 70 69 65 बाइट्स

lambda s:[i[0]+(len(i)-2and"'"or"2"*("2"==i[1]))for i in s[::-1]]

इसे ऑनलाइन आज़माएं! (टेस्टकेस के साथ)

स्पष्ट रूप से आपको स्ट्रिंग्स के रूप में इनपुट और आउटपुट लेने की आवश्यकता नहीं है, इसलिए 69 बाइट समाधान संभव है


AFAIK के बाद आप अंतरिक्ष को हटा सकते हैंlen(i)==1
स्टीफन

@ स्टेफ़ेन हुह, यह नहीं पता था कि अनुमति दी गई थी (जानता था कि कुछ दुभाषियों ने इसकी अनुमति दी थी, बस यह नहीं पता था कि इसे कोडगॉल्फ में अनुमति दी गई है)
sikiksp

2
भाषाएं उनके व्याख्याकारों द्वारा यहां परिभाषित की जाती हैं, अगर यह किसी एक दुभाषिया में काम करता है, तो यह मान्य है।
झबरा

यदि दुभाषिया इसकी अनुमति देता है, तो आप इसे कर सकते हैं। यह सब कोड-गोल्फ परवाह है;)
स्टीफन

len(i)-2से छोटा है len(i)==1(याद रखें 0 झूठी है)
स्टीफन



1

05AB1E , 13 बाइट्स

RεÐ1èQ''si«ëK

इसे ऑनलाइन आज़माएं!

व्याख्या

RεÐ1èQ''si«ëK
R             # Reverse input array
 ε            # Map over each element...
  Ð1èQ         # Is the second char in the element the first one? (Uses the fact that in python indexing loops)
      ''       # Push '
        s      # Swap top items of stack
         i     # If the question above is true...
          «     # Concatenate
           ë   # Else
            K   # Push element without '  

1

जे, 25 बाइट्स

J इसे एक अच्छी तरह से संभालता है, एक एकल उद्धरण का प्रतिनिधित्व करने के लिए आवश्यक दुर्भाग्यपूर्ण एस्केप अनुक्रम के अलावा:

|.,&''''`}:@.(''''={:)&.>

हमें बॉक्सिंग डेटा का उपयोग करके सूची का प्रतिनिधित्व करने की आवश्यकता है, क्योंकि यह एक और दो चरित्र वस्तुओं का मिश्रण है, इसलिए:

  • &.> - "अंडरबॉक्स के तहत", जिसका अर्थ है प्रत्येक तत्व को अनबॉक्स करना, उस ऑपरेशन को निष्पादित करें जो निम्नानुसार है (यानी, नीचे दिए गए प्रतीक) और फिर किए गए बॉक्स।
  • (''''={:) "यदि दूसरा वर्ण एकल उद्धरण है" ...।
  • @. (जे का एजेंडा वर्ब, एक तरह का सामान्यीकृत टर्नरी स्टेटमेंट, या एक केस स्टेटमेंट) "फिर एजेंडा सूची में दूसरा आइटम करें, अन्यथा पहले प्रदर्शन करें"
  • }: (दूसरी सूची एजेंडा सूची में), "अंतिम वर्ण हटाएं", अर्थात, एकल उद्धरण
  • `(जे टाई क्रिया) आप इसे एजेंडा आइटम विभाजक के रूप में सोच सकते हैं
  • ,&'''' (एजेंडा सूची में पहला आइटम) "अंत में एक एकल उद्धरण जोड़ें"
  • |. "रिवर्स"

इसे ऑनलाइन आज़माएं!




0

जावा 8, 141 128 126 बाइट्स

a->new StringBuffer(a.replaceAll("(.)","$1'").replace("'''","").replaceAll("(.)'","'$1").replaceAll("'(.)'2","2$1")).reverse()

Stringरिक्त स्थान के बिना एकल के रूप में इनपुट लेता है (यानी RUR'URU2R'U)।

स्पष्टीकरण:

इसे ऑनलाइन आज़माएं।

a->new StringBuffer(           // Method with String parameter and StringBuffer return-type
  a.replaceAll("(.)","$1'")    //1  Add an apostrophe after every character
   .replace("'''","")          //2  Remove all occurrences of three adjacent apostrophes
   .replaceAll("(.)'","'$1")   //3  Reverse letter+apostrophe to apostrophe+letter
   .replaceAll("'(.)'2","2$1") //4  Reverse letter+2 to 2+letter and remove aphostrophes
  ).reverse()                  //5 Reverse everything

ऊपर दिए गए चरणों का उदाहरण, दिए गए इनपुट के साथ: RUR'URU2R'U

  1. RUR'URU2R'UR'U'R'''U'R'U'2'R'''U'
  2. R'U'R'''U'R'U'2'R'''U'R'U'RU'R'U'2'RU'
  3. R'U'RU'R'U'2'RU''R'UR'U'R'U'2R'U
  4. 'R'UR'U'R'U'2R'U'R'UR'U'R2UR'U
  5. 'R'UR'U'R2UR'UU'RU2R'U'RU'R'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.