क्या घन पर चलने से कोई चींटी शब्द बोल सकती है?


10

एक फ़ंक्शन लिखें जो दो पैरामीटर लेता है: एक सकारात्मक पूर्णांक n और शब्दों की एक सूची।

N -by- n -by- n इकाइयों के घन को देखते हुए , प्रत्येक सतह इकाई को एक यादृच्छिक अक्षर (AZ) निर्दिष्ट करें। (एक 3x3x3 घन के लिए, प्रत्येक चेहरे पर 9 सतह इकाइयाँ होंगी।)

फिर निर्धारित करें कि क्या आपूर्ति किए गए प्रत्येक शब्द को वर्तनी देने के लिए सतह के साथ-साथ चींटी पर चलना संभव है (चेहरे को पार करने की क्षमता के साथ)। मान लें कि किसी शब्द को लिखने के लिए अक्षरों को ऊपर / नीचे या बाएं / दाएं बगल में होना चाहिए, लेकिन जरूरी नहीं कि एक ही चेहरे पर हो। [ संपादित करें, स्पष्टता के लिए: चींटी अपने पथ को उलट सकती है और अक्षरों का एक से अधिक बार उपयोग कर सकती है। प्रत्येक सतह इकाई को एक वर्ण के रूप में गिना जाता है, इसलिए दोहराए गए अक्षरों के साथ एक शब्द को वर्तनी के लिए (उदाहरण के लिए "देखें") चींटी को तीन आसन्न इकाइयों का दौरा करना होगा।]

फ़ंक्शन को दो चीजों का उत्पादन करना चाहिए:

1) प्रत्येक अक्षर प्रत्येक चेहरे पर, इस तरह से कि टोपोलॉजी का अनुमान लगाया जा सके। उदाहरण के लिए, 2x2x2 घन के लिए, एक स्वीकार्य आउटपुट जैसा दिखेगा:

   QW
   ER
TY OP UI
DF JK XC
   AS
   GH
   LZ
   VB

2) प्रत्येक शब्द, एक बूलियन के साथ यह दर्शाता है कि चींटी की सतह के साथ चलने से चींटी के लिए शब्द का वर्तनी संभव है या नहीं। उदाहरण के लिए:

1 ask
0 practical
1 pure
0 full

बोनस चुनौती (स्कोर में कारक नहीं होगा, सिर्फ मनोरंजन के लिए): इसके बजाय n घन के केवल आकार का प्रतिनिधित्व करने, चलो n भी आकार के आयामी स्वरूप प्रतिनिधित्व करते हैं। तो, एक एन 2 के एक 2x2 वर्ग प्राप्त होते हैं; 3 के एक n एक 3x3x3 घन उपज होगा; और 4 के एक n 4x4x4x4 टेसेरैक्ट का उत्पादन करेगा।


1
मुझे लगता है कि आपको और विनिर्देश प्रदान करने की आवश्यकता है कि क्यूब का आउटपुट कैसे होना चाहिए। उदाहरण के लिए, क्या सभी पत्र एक पंक्ति में हो सकते हैं, बशर्ते हम हमेशा यह जानते हों कि उन्हें कैसे व्यवस्थित करना है?
दरवाज़े

1
जब तक टोपोलॉजी का अनुमान लगाया जा सकता है, तब तक मैं कोई अतिरिक्त सीमा नहीं रखना चाहता हूं कि पत्र कैसे आउटपुट होते हैं। विवरण में मेरा बहु-पंक्ति उदाहरण अभियोगात्मक के बजाय उदाहरणात्मक था।
jawns317

3
ऐसा लगता है कि चींटी दिशा बदलने में सक्षम है; यह स्पष्ट रूप से कहा जाना चाहिए। क्या यह 180 डिग्री का मोड़ बना सकता है, और क्या यह एक ही अक्षर को दो बार पंक्ति में उपयोग कर सकता है? दूसरे शब्दों में, क्या आप क्यूब में qwqया qqउदाहरण में पा सकते हैं ?
4

3
इसके अलावा, क्या चींटी एक से अधिक बार पत्र का उपयोग कर सकती है?
lirtosiast

1
रैंडम अक्षरों के वितरण के नियम क्या हैं? आपका उदाहरण कोई दोहराए गए पत्र नहीं दिखाता है, फिर भी एक सरल एल्गोरिथ्म के साथ जहां प्रत्येक पत्र को 26 संभावनाओं से स्वतंत्र रूप से उठाया जाता है, शून्य दोहराव की संभावना अत्यधिक संभावना नहीं है। जाहिर है N> 2 के साथ दोहराव होना पड़ेगा। यदि आप किसी घन को केवल दो अलग-अलग अक्षरों के साथ यादृच्छिक रूप से पूरे घन में वितरित करते हैं, तो आपको इसे और अधिक स्पष्ट रूप से निर्दिष्ट करना चाहिए।
लेवल रिवर सेंट

जवाबों:


3

रूबी, 272 बाइट्स

gपठनीयता में सुधार के लिए नेस्टेड फ़ंक्शन के दोनों ओर कोड में दो अनावश्यक न्यूलाइन्स जोड़े जाते हैं । इन्हें स्कोर से बाहर रखा गया है। f=अनाम चर को अनाम वर्ण प्रदान करने वाले वर्णों को भी बाहर रखा गया है।

आउटपुट स्वरूप है 0या 1बजाय प्रश्न रूबी की मूल प्रति trueऔर false। बूलियन और शब्द को अलग करने के लिए एक नई रेखा (एक स्थान के बजाय) का उपयोग किया जाता है। मेरी समझ यह है कि यह आउटपुट आवश्यकताओं की एक स्वीकार्य व्याख्या है, लेकिन यदि नहीं, तो बाइट काउंट पर प्रभाव मामूली होगा।

f=->n,l{c=''
x=[p=6*n,1,-p,-1]
(m=3*p*n).times{|i|c<<(5+i/n%6-i/n/p&6==6?65+rand(26):i%p==p-1?10:46)}
q=m+3*n
puts c

g=->w,i,d{w==''?$r=1:c[i]<?A?g[w,(i+x[d])%q,d^1]:w[0]==c[i]&&4.times{|j|g[w[1..-1],(i+x[j])%q,j^1]}}

l.each{|w|$r=0
m.times{|i|c[i]>?@&&g[w,i,0]}
puts $r,w}}

उत्पादन

इस तरह के लगभग 50 कॉल के बाद:

f[4,['PPCG','CODE','GOLF','ANT','CAN','CUBE','WORD','WALK','SPELL']]

अंत में मुझे 2 हिट के साथ निम्न आउटपुट मिला। ANTनीचे दाईं ओर ऊपर की ओर जा रहा है, और इसके ANद्वारा साझा किया गया है CAN, Cरैपिंग राउंड से टॉप लेफ्ट तक।

....KCAAXRHT...........
....ALRZXRKL...........
....NDDLCMCT...........
....ETQZHXQF...........
........FYYUSRZX.......
........CFNPAUVX.......
........ZTJVHZVQ.......
........AUWKGVMC.......
............XWKSDWVZ...
............DPLUVTZF...
............DMFJINRJ...
............ZRXJIAFT...
0
PPCG
0
CODE
0
GOLF
1
ANT
1
CAN
0
CUBE
0
WORD
0
WALK
0
SPELL

व्याख्या

चुने गए घन के विशेष रूप से, ड्राइंग की आसानी के लिए आंशिक रूप से चुना गया था, लेकिन मुख्य रूप से इसकी खोज में आसानी के लिए।

गैर-वर्णमाला वर्ण (डॉट्स प्लस प्रत्येक पंक्ति के अंत में नई रेखा) उस क्षेत्र का एक महत्वपूर्ण हिस्सा है जहां चींटी को चलते हुए पाया जा सकता है।

पुनरावर्ती फ़ंक्शन द्वारा खोज की जाती है g, जो फ़ंक्शन में नेस्टेड है f। यदि पास किया गया शब्द रिक्त स्ट्रिंग है तो खोज पूरी हो गई है और 1 $rपर सेट है। यदि चींटी एक वर्ण वर्ग पर है जो शब्द के पहले अक्षर से मेल खाती है, तो खोज को चारों दिशाओं में जारी रखा गया है: फ़ंक्शन को फिर से बुलाया जाता है शब्द के साथ पहले अक्षर को हटाकर छोटा कर दिया। इस मामले में दिशा पैरामीटर की अनदेखी की जाती है। मूव को सेल इंडेक्स के साथ कॉल करके रीसर्च करके कॉल किया जाता है x.। इसके अलावा रिजल्ट को ग्रिड के आकार के अलावा प्लस हाफ लाइन के रूप में लिया जाता है। इसका मतलब है कि नीचे की रेखा सही क्षैतिज ऑफसेट के साथ शीर्ष और इसके विपरीत के लिए गोल लपेटती है।

यदि चींटी एक गैर-अक्षर वर्ग पर होती है, तो उसे एक अक्षर वर्ग मिलने तक सीढ़ी की गति में ज़िगज़ैग करना चाहिए। वह दक्षिण-पूर्व या उत्तर-पश्चिम दिशा में झिझकेंगी। यह dउसके आंदोलन पर नज़र रखने के लिए हर बार 1 के साथ पैरामीटर XORed होने के साथ पुनरावर्ती कॉल द्वारा सिम्युलेटेड है । जब तक वह अगले अक्षर वर्ग तक नहीं पहुंचती, तब तक इनपुट शब्द की कोई कमी नहीं है। आसानी से, यह उसी पुनरावृत्ति द्वारा किया जा सकता है जैसा कि हम पत्रों के साथ क्षेत्र में खोज करते समय उपयोग किया जाता है। अंतर यह है कि, पुनरावृत्ति की केवल एक शाखा होती है जब चींटी व्हाट्सएप क्षेत्र में होती है, जैसा कि पत्र क्षेत्र में 4 के विपरीत होता है।

टिप्पणी कोड

->n,l{                                   #n=square size, l=list of words to search
  c=''                                   #empty grid
  x=[p=6*n,1,-p,-1]                      #offsets for south, east, north, west. p is also number of characters per line
  (m=3*p*n).times{|i|                    #m=total cells in grid. for each cell
    c<<(5+i/n%6-i/n/p&6==6?              #apppend to c (according to the formula)
      65+rand(26):                       #either a random letter
      i%p==p-1?10:46)                    #or a "whitespace character" (newline, ASCII 10 or period, ASCII 46)
  }
  q=m+3*n                                #offset for vertical wraparound = grid size plus half a row.                           
  puts c                                 #print grid

  g=->w,i,d{                             #search function. w=word to search for, i=start index in grid, d=direction
    w==''?                               #if length zero, already found,
      $r=1:                              #so set flag to 1. Else
      c[i]<?A?                           #if grid cell is not a letter
        g[w,(i+x[d])%q,d^1]:             #recursively call from the cell in front, with the direction reflected in NW-SE axis
        w[0]==c[i]&&                     #else if the letter on the grid cell matches the start of the word
          4.times{|j|                    #for each direction (iterate 4 times, each time a different direction is "in front")
            g[w[1..-1],(i+x[j])%q,j^1]}  #recursively call from the cell in front. Chop first letter off word. 
   }                                       #Direction parameter is XORed (reflected in NW-SE axis) in case ant hits whitespace and has to zigzag.

   l.each{|w|                            #for each word in the list
     $r=0                                #set global variable $r to zero to act as a flag
     m.times{|i|c[i]>?@&&g[w,i,0]}       #call g from all cells in the grid that contain a letter 
     puts $r,w}                          #output flag value and word
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.