एससी-आर्ट को संक्षिप्त करें


12

चुनौती

एक स्ट्रिंग के रूप में या मानक इनपुट के माध्यम से प्रिंट करने योग्य अस्की पात्रों के एक आयताकार ग्रिड को देखते हुए, एक फ़ंक्शन या प्रोग्राम लिखें जो गैर-अंतरिक्ष वर्णों को नीचे एक ढेर में ढह जाता है।

नियम:

  • आउटपुट में इनपुट के समान आयाम और वर्ण हैं।
  • पर एक गैर अंतरिक्ष चरित्र (row a,column b)एक अंतरिक्ष चरित्र नहीं हो सकता है ' 'पर (a-1, b), (a-1,b-1)या (a-1,b+1), जहां पंक्तियों सबसे नीचे से ऊपर गिने जा रहे हैं। इसका परिणाम यह है कि सभी ऊर्ध्वाधर बवासीर बग़ल में गिरना चाहिए।
  • एक गैर-अंतरिक्ष चरित्र अधिकांश (initial height - final height)स्थानों पर बाईं या दाईं ओर यात्रा कर सकता है (चित्र 1 देखें)।
  • आप मान सकते हैं कि स्क्रीन के बाहर गिरने वाले पात्रों के बिना तस्वीर के गिरने की पर्याप्त जगह है।

चित्र 1: क्रमशः @#$दिखाए गए वर्णों के लिए संभावित अंतिम स्थान x,y,z

..............
...@..........
..xxx.........
.xxxxx...#....
xxxxxxx.yyy.$.

वह क्रम जिसमें वर्णों का पतन स्वतंत्र रूप से किया जा सकता है। अनुगामी रिक्त स्थान ठीक नहीं हैं लेकिन अनुगामी न्यूलाइन्स हैं।

यह , इसलिए बाइट्स में सबसे कम जवाब जीतता है!

उदाहरण

                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\
            ~~   ~~
..."Have you mooed today?"...

एक संभावित उत्पादन:

 
 
 
                --(_
           /----|/|(o_)
          /|/~\---~\\/o)
..."Have*you~mooed~today?"...

बस स्पष्ट करने के लिए, हर बार बेतरतीब ढंग से उत्पन्न होने के बजाय जिस तरह से अक्षर गिरते हैं, उसे कठोर-कोडित किया जा सकता है?
ETHproductions

18
उस गाय ने कभी तुम्हारा क्या किया ?? :(
FlipTack

@ETHproductions जो सही है। मेरा उदाहरण यह नीचे से ऊपर, बाएं से दाएं लेकिन यादृच्छिक क्रम या कुछ और ठीक है, जब तक कि नियमों का पालन किया जाता है।
19

@ Flp.Tkc यह केवल एक मॉडल है।
19

1
@DestructibleWatermelon यदि कोई पात्र स्क्रीन से बाहर गिरता है, तो यह आपकी गलती है, आपकी नहीं।
अंग्स

जवाबों:


4

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

f=s=>s==(l=s.search`
`,s=s.replace(eval(`/(\\S)([^]{${l-1},${l+1}}) /`),` $2$1`))?s:f(s)
s=`                 (__)        
                 (oo)        
           /------\\/         
          / |    ||          
         *  /\\---/\\          
            ~~   ~~          
..."Have you mooed today?"...`
console.log(s)
console.log(f(s))

स्ट्रिंग को कम से कम दो पंक्तियों की आवश्यकता होती है और सभी पंक्तियों को समान लंबाई तक गद्देदार किया जाता है। उदाहरण छवि के लिए आउटपुट:

              ( --           
            /|---/|-(o__     
          */~~\---~\|\/o))   
..."Have you/mooed~today?"...

ध्यान दें कि यदि यह संभव हो तो तत्वों को दाईं ओर ले जाने की कोशिश करता है, *तो Haveऔर के बीच नहीं गिरता है you

संपादित करें: @ETHproductions के लिए 10% धन्यवाद सहेजा गया। @DanielIndie की बदौलत एक और 2 बाइट्स बचाए।

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

+`(?<=(.)*)(\S)(.*¶(?<-1>)?(?>(?<-1>.)*).?) 
 $3$2

इसे ऑनलाइन आज़माएं! मेरे जावास्क्रिप्ट उत्तर के लिए थोड़ा अलग दृष्टिकोण, यह गैर-अंतरिक्ष चरित्र के नीचे एक स्थान से मेल करने के लिए एक संतुलन समूह का उपयोग करता है; (?<-1>)?अंतरिक्ष बाईं ओर एक स्तंभ होने के लिए है, जबकि की अनुमति देता है .?अंतरिक्ष सही करने के लिए एक स्तंभ हो सकते हैं।

रेटिना , 40 बाइट्स

~0L$`.(.*)¶
+s`(\S)(.{$.1,$.&}) ¶ $$2$$1

इसे ऑनलाइन आज़माएं! मेरे जावास्क्रिप्ट उत्तर का पोर्ट। 0L$परमाणु चरण इनपुट लेता है और आदेश है कि वास्तव में प्रतिस्थापन है, जो तब से मूल इनपुट पर मूल्यांकन किया जाता है करता है, जिसके परिणामस्वरूप दूसरी लाइन में दो लंबाई विकल्प ~यौगिक मंच।


यह एक महान एल्गोरिथ्म है! आप \nइसे दो अंकों तक ले जाने के लिए एक शाब्दिक न्यूलाइन के साथ बदल सकते हैं ;-)
ETHproductions

इसके अलावा, मुझे लगता है कि आप l=s.search`\n` कुछ बाइट्स बचा सकते हैं ।
ETHproductions

tio.run/##ZY/… 86 बाइट्स
DanielIndie

@DanielIndie f=पुनरावृत्ति के लिए आवश्यक है, लेकिन यह अभी भी मुझे 2 बाइट्स बचाता है, धन्यवाद!
नील

आप सही हैं, क्षमा करें: पी
डैनियलएंडिइ

3

पायथन 2, 298 बाइट्स

a=input()
L=len(a);s=' '
a=[list(s*L+l.ljust(L+max(map(len,a))))for l in a]
t=1
while t:
 t=0
 for y in range(L-1):
  for x in range(len(a[y])):
   c=a[y][x];C=a[y+1][x-1:x+2]
   if s!=c and s in C:t=1;a[y][x]=s;a[y+1][[[x+1,x][C[1]==s],x-1][C[0]==s]]=c
for l in map(''.join,a):print l[L:].rstrip()

तार की सूची के रूप में इनपुट लेता है (प्रति पंक्ति एक)

उदाहरण: इनपुट:

['                 (__)',
'                 (oo)',
'           /------\/',
'          / |    ||',
'         *  /\---/\ ',
'            ~~   ~~',
'..."Have you mooed today?"...']

आउटपुट:

              (
            -----/|-(o__
         //|~~\---~\|\/o))
..."Have*you/mooed~today?"...

3

सी, 252 बाइट्स

e=1,l,c,i,j,p,r,w,a[999];f(){while((i=getchar())>0)a[w++]=i,i<16?l++:0,l?0:c++;while(e)for(i=e=0;i<c;i++)for(j=l;j>=0;j--)e=(r=a[p=j*(c+1)+i]-32?a[r=p+c+1]-32?a[r=p+c]-32?a[r=p+c+2]-32?0:r:r:r:0)?l=a[p],a[p]=a[r],a[r]=l:e;for(i=0;i<w;)putchar(a[i++]);}

अनगुल्ड परीक्षण कोड:

#include <stdio.h>

e=1,l,c,i,j,p,r,w,a[999];
f()
{
    // counting lines and columns
    while ((i = getchar())>0)a[w++] = i, i<16 ? l++ : 0, l ? 0 : c++;
    // main shaking loop
    while (e) // repeat while collapsing
        for (i = e = 0; i < c; i++) // columns loop
            for (j = l; j >= 0; j--) // lines loop
                e = ( // remember that collapsing was
                     r = // find place to collapse
                         a[p = j*(c + 1) + i] - 32 ? // if not space
                             a[r = p + c + 1] - 32 ? // if char under the current is not a space
                                 a[r = p + c] - 32 ? // see one position left
                                    a[r = p + c + 2] - 32 ? 0 // then one position right
                                                          : r
                                    : r
                                 : r
                             : 0
                         ) ? // and if place was found
                           l=a[p],a[p]=a[r],a[r]=l // replace values in positions p and r
                           : e;
    //print resulting picture
    for(i=0;i<w;)putchar(a[i++]);
}

int main(void)
{
    int cnt;
    FILE * testf = fopen("caw.txt","w");
    char testd[][31] = {
        "                 (__)        \n",
        "                 (oo)        \n", 
        "           /------\\/         \n", 
        "          / |    ||          \n", 
        "         *  /\\---/\\          \n", 
        "            ~~   ~~          \n", 
        "...\"Have you mooed today ? \"...",
        "" };
    // prepare data for test
    printf("Initial data:\n");
    for(cnt = 0; cnt < 7; cnt++)
    {
        printf("%s", testd[cnt]);
        fprintf(testf, testd[cnt]);
    }
    fclose(testf);
    // redirect standard input
    freopen("caw.txt", "r", stdin);
    printf("\n\nResult:\n");
    // start test
    f();
}

परीक्षा का परिणाम:

यहाँ छवि विवरण दर्ज करें


2

अल्गोडू (गैर-प्रतिस्पर्धात्मक)

इनपुट - पतित उदाहरण का उपयोग किया जाता है।

सेट अप

रनिंग - डिफ़ॉल्ट गुरुत्वाकर्षण और उछल।

चल रहा है

आउटपुट - सटीकता को ऑब्जेक्ट्स पर घर्षण और घनत्व सेटिंग्स के माध्यम से समायोजित किया जा सकता है।

उत्पादन

अल्गोडू लॉजिक प्रोग्रामेबल है


यह गैर-प्रतिस्पर्धा क्यों है? गैर-प्रतिस्पर्धा आम तौर पर चुनौती की तुलना में नई भाषाओं में जवाब के लिए आरक्षित है।
तदर्थ गार्फ हंटर

यद्यपि अल्गोडू वास्तविक तर्क कर सकता है, यह अनुकरण फर्श पर इनपुट के एक श्रेडिंग प्रिंट-आउट को छोड़ने और उसकी तस्वीर लेने के बराबर है। मुझे यकीन नहीं है कि कैसे उस आउटपुट को प्रोग्रामेटिक तरीके से कैप्चर करना है।
wyldstallyns

और "जीरो बाइट प्रोग्राम! मैं जीत गया!" कहना गलत था।
wyldstallyns

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

मैं उस मेटा को खोलूँगा।
wyldstallyns 16

1

जावास्क्रिप्ट, 286 बाइट्स

b=>eval('f=b=>b==null||" "==b;b=b.split`\n`.map(b=>[...b]);a:for(;;){for(c=0;c<b.length-1;c++)for(g=b[c],d=0;d<g.length;d++){h=g[d];if(!f(h)){e=0;f(b[c+1][d])?e=2:f(b[c+1][d-1])?e=1:f(b[c+1][d+1])&&(e=3);if(e){b[c+1][d+e-2]=h;b[c][d]=" ";continue a}}}break}b.map(b=>b.join``).join`\n`')

उदाहरण

// Here I assume that you've assigned the above function to `fall`
console.log(fall(`
                 (__)
                 (oo)
           /------\/
          / |    ||
         *  /\---/\\
            ~~   ~~
..."Have you mooed today?"...`))

आउटपुट:

                -       
            /--(-\--(__  
          /|~~---/~||/oo))
..."Have*you/mooed~today?"...

एक और उदाहरण:

console.log(fall(`
 (\__/)  .~    ~. ))
 /O O  ./      .'
{O__,   \    {
  / .  . )    \\
  |-| '-' \    }
 .(   _(   )_.'
'---.~_ _ _&`))

आउटपुट:

    _ , /            
  OO/__'_.. .         
 {.(|-|.(O'))/.~{      
/('---.~___-_&)_.'}\~.'))

असगंध समारोह

function fall(input) {
  let move = true
  let lines = input.split("\n").map(line => line.split(""))
  let isSpace = c => c == null || c == " "
  loop: for (;;) {
    for (let y = 0; y < lines.length - 1; y++) {
      let line = lines[y]
      for (let x = 0; x < line.length; x++) {
        let ch = line[x]
        if (!isSpace(ch)) {
          let dx = 0
          if (isSpace(lines[y+1][x])) { dx = 2 }
          else if (isSpace(lines[y+1][x-1])) { dx = 1 }
          else if (isSpace(lines[y+1][x+1])) { dx = 3 }
          if (dx) {
            lines[y + 1][x + dx - 2] = ch
            lines[y][x] = " "
            continue loop
          }
        }
      }
    }
    break
  }
  return lines.map(line => line.join("")).join("\n")
}

रिक्त न होने के लिए परीक्षण करने का एक छोटा तरीका वह है c>" "जहाँ cआप परीक्षण कर रहे चरित्र का प्रतिनिधित्व करते हैं।
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.