सर्पिल शब्द बनाएं [बंद]


11

परिदृश्य

ASCII के अक्षरों और रिक्त स्थान के इनपुट को देखते हुए, वर्णों का एक सर्पिल ड्रा करें जो रिक्त स्थान को छोड़कर वर्णों के मूल इनपुट का पता लगाता है।

नियम

1) वर्ण बाहरी रूप से बाईं ओर सर्पिल वामावर्त होगा। यदि बाएं मोड़ संभव नहीं है, तो सीधे जाएं।

Given: abcdefg
Output:
  g
baf   
cde   

पहला उदाहरण छवि अनुरेखण

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

Given: apples appeal
Output:
PAs
PLe
ea

छवि अनुरेखण दूसरा उदाहरण


1
तो अगर शब्द सर्पिल में रहता है लेकिन अगले चरित्र का उल्लंघन करता है तो कार्यक्रम बंद हो जाता है?
मैट

मुझे लगता है कि यह एक अच्छी चुनौती है जो आपको "स्टैक को रिवाइंड" करने के लिए होगी ताकि एक ऐसे बिंदु पर बोलना और फिर से शुरू किया जा सके जो नियम # 1 हमेशा काम करता है।
टिम रेड्डी

5
वर्तमान शब्द नियम 2 पूरी तरह से वैकल्पिक लगता है। यदि यह अनिवार्य होना चाहिए तो मुझे लगता है कि एक अधिक व्यापक परीक्षण सूट आवश्यक है।
पीटर टेलर

1
इनपुट के लिए आउटपुट क्या होना चाहिए abcdefghab?
पीटर टेलर

जवाबों:


2

जावास्क्रिप्ट, 225 221 212 बाइट्स

-9 बाइट्स कॉनर ओ'ब्रायन को धन्यवाद

कृपया ध्यान दें कि आपके पाठ एक दूसरे के साथ संघर्ष करते हैं। आपका पहला परीक्षण मामला सर्पिल के बीच में शुरू होता है। आपका दूसरा परीक्षण मामला सर्पिल के शीर्ष मध्य में शुरू होता है। मैं आपके पहले परीक्षण मामले के साथ गया था, क्योंकि यह पहला ऐसा था जिसे मैंने देखा था। आपने एक वर्ष में अपना प्रश्न संपादित नहीं किया है, इसलिए अनुमान के लिए खेद है।

पहला टेस्ट केस:

9<-8<-7
|     |
2<-1  6
|     |
3->4->5

दूसरा टेस्ट केस:

2<-1<-6
|     |
3->4->5
|     |
7->8->9

बिना किसी और विज्ञापन के, यहाँ गोल्फ कोड है। मुझे शत-प्रतिशत यकीन है कि अगर कम्युनिटी चीप करती है तो इसमें काफी कटौती की जा सकती है। यह एक मल्टीलाइन सरणी देता है।

s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++}if(!s[i])break}a")

Prettification स्निपेट (कंसोल के लिए एक मल्टीलाइन स्ट्रिंग प्रिंट करता है)। कृपया मेरे टेस्ट केस # 2 और ओपी के टेस्ट केस # 2 में भिन्न नोट करें (ऊपर देखें कि क्या आपके पास पहले से नहीं है):

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

f=
s=>eval("s=[...s.replace(/ /g,'')];i=0;k=j=1;a=[[],[],[]];b='00122210';c=b*100+'';for(;;){for(l=0;l<8;l++){if(!s[i])break;if(a[k][j]==s[i])s[i]=s[i].toUpperCase();a[k][j]=s[i];k=b[l];j=c[l];i++;g(a)}if(!s[i])break}a")

//replace argument here to change output
var arr = f("apples appeal");

function g(ar) {
  var str = "";

  for (x = 0; x < 3; x++) {
    for (y = 0; y < 3; y++) {
      str += ar[y][x] || " ";
    }
    str += "\n";
  }
  console.log(str);
}

अनगढ़ और व्याख्या

f=(input)=>{
    //remove spaces
    input = input.replace(/ /g, "");

    //convert to array (so I can uppercase individual letters)
    input = input.split("");

    //position in input
    var pos = 0;

    //positions inside output
    var xPos = 1;
    var yPos = 1;

    //output container (3 rows, 3 columns)
    var arr = [[],[],[]];

    //counterclockwise indexes for x
    var xOrder = "00122210";

    //counterclockwise indexes for y
    //var yOrder = "12221000"
    var yOrder = xOrder * 100 + "";

    //loop infinitely (breaks when input[pos] is undefined)
    for (;;) {
        //loop around circle
        for (var i = 0; i < 8; i++) {
            if (!input[pos]) {
                break;
            }

            //if item already in array equal next item in input, set next item in input to caps before
            if (arr[xPos][yPos] == input[pos]) {
                input[pos] = input[pos].toUpperCase(); 
            }

            //write or overwrite in array with current from input
            arr[xPos][yPos] = input[pos];

            //increment last because we do not prime our loops
            xPos = xOrder[i];
            yPos = yOrder[i];
            pos++;
        }
        if(!input[pos]) {
            break;
        }
    }
    return arr;
}

1
a.split("")के बराबर है [...a]; s=>{...;return a;}के बराबर है s=>eval("...;a")(और ;कम गोल्फ वाले संस्करण में वैकल्पिक है); सभी अर्धविरामों के बाद }वैकल्पिक हैं
कॉनर ओ'ब्रायन

@ ConorO'Brien धन्यवाद :)
स्टीफन

टेस्ट केस के लिए आपको क्या आउटपुट मिलता है apples appeal? मैं देख रहा हूं ppa eas aLe, जो निश्चित रूप से सही नहीं है क्योंकि एस के lआगे कोई नहीं है p
पीटर टेलर

@PeterTaylor पहले परीक्षण मामले के सर्पिल आदेश के अनुसार, आउटपुट सही है, जिस पर मैंने अपना कार्यक्रम आधारित किया था। दूसरा परीक्षण मामला एक अलग सर्पिल आदेश (शीर्ष पर शुरू) का उपयोग करता है। मैंने स्निपेट के प्रत्येक पुनरावृत्ति के लिए एक लॉग जोड़ा। वह देखो - यह अधिक समझ में आ सकता है।
स्टीफन

पहले टेस्ट केस के तर्क से आउटपुट होगा eppa apas lple s
पीटर टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.