चेतन जैकब का ASCII लैडर


23

आपने बच्चों के विज्ञान संग्रहालयों में जैकब की सीढ़ी देखी होगी । यदि आप उन चीज़ों से परिचित नहीं हैं जो वे दिखते हैं, तो विकिमीडिया कॉमन्स पर कई चित्र और वीडियो उदाहरण हैं । आज चुनौती विद्युत गैजेट के एक एनिमेटेड ASCII संस्करण बनाने की है। अंत में, यह कुछ इस तरह दिखना चाहिए:

LadderGIFExample


सीढ़ी निर्माण

यहां 6 की ऊंचाई ( एच ) के साथ सीढ़ी का मूल आकार है :

6   \            /
5    \          /
4     \        /
3      \      /
2       \    /
1        \  /
0         ¯¯

बाईं ओर स्थित संख्याएं केवल इस उदाहरण के लिए पंक्ति संख्या दर्शाती हैं और इसे आउटपुट में शामिल नहीं किया जाना चाहिए। हम एक दी गई पंक्ति को उसके नंबर ( R ) से संदर्भित करेंगे । रो 0 नीचे है ¯¯H के माध्यम से प्रत्येक पंक्ति 1 में चार भाग शामिल हैं:

  • एक स्थान (यू + 0020) दोहराया ( एच - आर ) बार
  • एक बैक स्लैश \ (U + 005C)
  • एक स्थान (U + 0020) बार (2 * R ) बार
  • फ़ॉरवर्ड स्लैश /(U + 002F)

रो 0 समान है सिवाय इसके कि दोनों स्लैश को मैक्रोन ¯(U + 00AF) से बदल दिया जाता है । प्रत्येक पंक्ति के अंत में या सीढ़ी के नीचे व्हाट्सएप को पीछे छोड़ना ठीक है। प्रमुख व्हाट्सएप नहीं है।


आर्क निर्माण

सीढ़ी के निर्माण के बाद, आप बाईं और दाईं ओर के बीच चाप बना सकते हैं। एक चाप पूरी तरह से एक पंक्ति के भीतर है और अग्रणी \और अनुगामी के बीच रिक्त स्थान को प्रतिस्थापित करता है /। इसलिए, पंक्ति 2 के आर्क में 4 अक्षर होंगे, पंक्ति 3 में 6 और इसके बाद के संस्करण होंगे। प्रत्येक चाप निम्नलिखित नियमों का उपयोग करके बना है:

  • केवल स्वीकार्य पात्र हैं _/¯\ (U + 005F, U + 002F, U + 00AF, U + 005C)
  • आदेश में एक चिकनी उपस्थिति सुनिश्चित करने के लिए, किसी भी ¯या /द्वारा एक पालन किया जाना चाहिए ¯या\
  • आदेश में एक चिकनी उपस्थिति सुनिश्चित करने के लिए, किसी भी _या \द्वारा एक पालन किया जाना चाहिए _या/
  • उपरोक्त दो नियम सीढ़ी के किनारों पर भी लागू होते हैं
  • उपरोक्त तीन नियमों का प्रभावी रूप से मतलब है कि चाप में पहला वर्ण होना चाहिए _या /अंतिम वर्ण होना चाहिए _या \( \¯\_//दोनों सिरों पर अमान्य \_/¯\/है। ठीक है)
  • किसी दिए गए बिंदु पर प्रत्येक स्वीकार्य चरित्र के लिए एक गैर-शून्य मौका होना चाहिए
  • प्रत्येक चाप हर दूसरे चाप से स्वतंत्र होता है

एनीमेशन

एक एकल चाप का जीवन इसे पंक्ति 1 पर शुरू करके बनाया गया है और इसे शीर्ष पर पहुंचने तक एक बार में एक पंक्ति को "आगे" बढ़ाना है। IE, पहले पंक्ति 1 पर एक आर्क उत्पन्न करते हैं, फिर इसे रिक्त स्थान पर सेट करते हैं और पंक्ति 2 पर एक आर्क उत्पन्न करते हैं, और इसके बाद। ( एन ) दिखाने के लिए कई आर्क्स को देखते हुए, निम्न दिशानिर्देशों का उपयोग करके एक समय में एक के बाद एक कई आर्क्स का पूरा जीवन दिखाएं:

  • किसी भी एक समय में केवल एक चाप "जीवित" होना चाहिए। अगला चाप तब तक शुरू नहीं हो सकता है जब तक कि वर्तमान शीर्ष पर नहीं पहुंच जाता है और फिर बुझ जाता है।
  • चाप के जीवन की प्रत्येक पंक्ति को ठीक एक फ्रेम के लिए दिखाया जाना चाहिए
  • नए आर्क शुरू होने से पहले बस मूल सीढ़ी (बिना आर्क के साथ) का एक फ्रेम होना चाहिए (पहले आर्क से पहले वैकल्पिक)
  • एनीमेशन को एन आर्क्स का पूरा जीवन दिखाना चाहिए । यदि एन = 0 है, तो इसे बंद होने तक हमेशा के लिए यादृच्छिक रूप से चेतन करना चाहिए।
  • यदि N > 0 है, तो आप अभी भी एनीमेशन को हमेशा के लिए लूप कर सकते हैं लेकिन यह एक ही आर्क्स का लूप होना चाहिए। (इस पोस्ट के शीर्ष पर जीआईएफ का उदाहरण एच = 6 और एन है = 3 है लेकिन यह हमेशा के लिए बंद हो जाता है।)
  • एनीमेशन में जगह होनी चाहिए। यही है, प्रत्येक फ्रेम को अगले फ्रेम को पूरी तरह से लिखना चाहिए और उसी स्थान पर होना चाहिए।
  • प्रत्येक फ्रेम की लंबाई आप जो भी चाहते हैं, लेकिन इसे एक मानव (आईई) द्वारा उपयोग करने योग्य बना सकते हैं, अपने सामान्य ज्ञान का उपयोग करें: 0.01s / फ्रेम और 30s / फ्रेम दोनों अस्वीकार्य हैं।)

इनपुट आउटपुट

  • इनपुट और आउटपुट किसी भी मानक प्रारूप में हो सकते हैं
  • आप जीआईएफ निर्यात कर सकते हैं, स्क्रीन पर पाठ लिख सकते हैं, प्रत्येक फ्रेम के लिए एक फ़ाइल का उत्पादन कर सकते हैं, या कोई अन्य उचित साधन
  • मानक खामियों को मना किया जाता है
  • सीढ़ी एच की ऊंचाई एक सकारात्मक पूर्णांक होगी
  • एन दिखाने के लिए आर्क्स की संख्या एक गैर-नकारात्मक पूर्णांक होगी
  • H और N दोनों को आपके द्वारा चुने गए किसी भी क्रम में इनपुट के रूप में लिया जाता है (कृपया अपने उत्तर में आदेश को शामिल करें)

जीतने की स्थिति

यह इसलिए सबसे छोटा कोड जीतता है।

सैंडबॉक्स


1
क्या चाप को इसके केंद्र द्वारा सममित बनाया जा सकता है? मैं नियमों में उस पर प्रतिबंध नहीं देख सकता
डेड पोसुम

क्या मैं कंसोल के बाद प्रत्येक फ्रेम को एक दूसरे से प्रिंट कर सकता हूं?
TFeld

@DeadPossum मैं सोच रहा था कि आप इस तथ्य के बावजूद सही थे कि यह बहुत हल्का नहीं होगा, लेकिन यह वास्तव में दो नियमों के संयोजन द्वारा अस्वीकृत है: the first character in the arc must be _ or / and the last character must be _ or \ और There must be a non-zero chance for each allowable character to occur at a given point। सममित होने के लिए, पहले और अंतिम दोनों वर्णों को _हर एक बार होना होगा, जिसका अर्थ है कि /या तो शून्य होने की संभावना है ।
इंजीनियर टोस्ट

@TFeld जब तक स्क्रीन पर प्रत्येक फ्रेम एक ही स्थान पर दिखाई देता है, हाँ। इसका मतलब है कि आपको हर बार कंसोल को साफ़ करना होगा (या हो सकता है कि नीचे स्क्रॉल करें, यदि संभव हो तो)।
इंजीनियर टोस्ट

2
क्या मैक्रॉन की आवश्यकता का मतलब यह है कि QBasic प्रतिस्पर्धा नहीं कर सकता है? यह CP437 का उपयोग करता है , जिसमें कोड बिंदु 0xAFहै »
DLosc

जवाबों:


5

पायथन 2 , 287 271 270 276 275 बाइट्स

import time,random
r,n=input()
c=n*-~r or-r
while c:
 c-=1;L=[list(' '*i+'\\'+'  '*(r-i)+'/')for i in range(r)];x=c%-~r;time.sleep(1);y=x+1;exec"L[x][y]=random.choice('\xaf/\_'[L[x][y-1]in'\_'::2][y==2*r-x:]);y+=1;"*2*(r-x)
 for l in['']*99+L+[' '*r+'\xaf'*2]:print''.join(l)

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

टियो पर स्क्रीन को साफ नहीं करता है, लेकिन कंसोल में काम करता है।

यह चल रहा है:

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


थोड़ा डरपोक लेकिन आप आयात के print'\n'*99बजाय इस्तेमाल कर सकते हैं os.system('cls')और खो osसकते हैं। अभी भी TIO पर काम नहीं करता है, लेकिन Windows और Linux कंसोल में काम करता है।
ElPedro

1
नए आर्क शुरू होने से पहले (मूल आर्क के साथ) सिर्फ एक सीढ़ी (एक आर्क के साथ) का एक फ्रेम होना चाहिए (पहला आर्क से पहले वैकल्पिक)
बजे

5
मुझे लगता है कि आप मैक्रों (U + 00AF) के बजाय हाइफ़न (U + 002D) का उपयोग कर रहे हैं। मुझे नहीं लगता कि इसे ठीक करने के लिए आपकी बाइट गिनती बढ़ेगी। इसके अलावा, @wastl ने बताया कि आर्क के बीच कोई खाली सीढ़ी नहीं है।
इंजीनियर टोस्ट

नीचे की पंक्ति मैक्रोन का उपयोग करती है लेकिन आर्क नहीं करते हैं
इंजीनियर टोस्ट


4

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

f=(o,h,n,i=0)=>(o.innerText=[...Array(h+1)].map((_,j)=>` `.repeat(j)+(j<h?`\\${[...Array(w--*2)].map((_,k)=>h+~j-i?` `:k>w*2|Math.random()<.5?s[s=t,1]:s[s=`¯\\`,0],s=t=`/_`).join``}/`:`¯¯`),w=h).join`
`,(++i<h||--n)&&setTimeout(f,250,o,h,n,i%h))
Height: <input type=number min=1 value=6 id=h><br>Arcs: <input type=number min=0 value=3 id=n><br><input type=button value=Go! onclick=f(o,+h.value,+n.value)><pre id=o></pre>

बाइट गिनती आईएसओ-8859-1 एन्कोडिंग मानती है।


यह संभव है कि इसे 242 तक कम किया जा सके A=x=>[...Array(x)].map;
बैरी 12

@ Bary12 आप वापस नहीं लौट सकते map, यह सिर्फ एक संपत्ति है Array.prototypeऔर इसका अपने आप में कोई उपयोग नहीं है। मैंने काम करने वाले संस्करणों की कोशिश की, लेकिन वे सभी 245 बाइट्स की तुलना में अधिक लंबे थे।
नील

3

सी (जीसीसी) , 406 बाइट्स

#define p(X) printf(X),usleep(999)
#define x(X) do{s[X]=0;p(s);s[X]=' ';}while(0)
char c[2][2]={95,47,92,'¯'};R;i;j;k;a(){char s[2]={92,0};for(j=0;j<2*R-1;++j,p(s))*s=c[*s<50][rand()%2];*s=c[*s<50][0];p(s);}f(H,N){char s[99];for(i=0;i<99;++i)s[i]=' ';p("\e[s");for(i=0;;++i){i%=(N?N:i+1);srand(i^H^N);for(k=1;k<H;++k){for(R=H;--R;){x(H-R+1);p("\\");if(R==k)a();else x(2*R);p("/\n");}x(H);p(" ¯¯\n\e[u");}}}

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

विवरण:

#define p(X) printf(X),usleep(999)              // Define p to printf(p) + delay
#define x(X) do{s[X]=0;p(s);s[X]=' ';}while(0)  // Define x(X) to print X spaces
                                                // This uses a string s full of
                                                // spaces and adds the null
                                                // terminator where approrpiate
char c[2][2]={95,47,92,'¯'};                    // 2d array of 'next arc' options
R;i;j;k;                                        // Variables
a(){                                            // a() -> print arc for row R
    char s[2]={92,0};                           // s is a string of next char
                                                // initialize to backslash
    for(j=0;j<2*R-1;++j                         // loop over each character
            ,p(s))                              // printing s each time
        *s=c[*s<50][rand()%2];                  // set s to the next arc char
    *s=c[*s<50][0];                             // set s to the 'first' arc char
                                                // note that in definition of c
                                                // first means appropriate as
                                                // final character before /
    p(s);}                                      // print the last character
f(H,N){                                         // f(H,N) -> print jacob ladder
    char s[99];for(i=0;i<99;++i)s[i]=' ';       // this is the space string for x
    p("\e[s");                                  // ANSI terminal save position
    for(i=0;;++i){i%=(N?N:i+1);                 // loop i->N (or i->INT_MAX if N=0)
        srand(i^H^N);                           // seed random with i XOR H XOR N
        for(k=1;k<H;++k){                       // for each row (bottom to top)
            for(R=H;--R;){                      // for each row (top to bottom)
                x(H-R+1);p("\\");               // print left "    \"
                if(R==k)                        // if on the arc row
                    a();                        // print the arc
                else x(2*R);                    // otherwise print spaces
                p("/\n");}                      // finish off the row
            x(H);p(" ¯¯\n\e[u");}}}             // print bottom line and move back

नोट: केवल वास्तव में Xterm में काम करता है ... कई टर्मिनल एमुलेटर बस स्थिति को बचाने / बहाल करने का समर्थन नहीं करते हैं।
लैंबडाटा

नीचे की पंक्ति पंक्ति 0 है और इसमें केवल दो मैक्रोन हैं। यह नहीं है \--/। यह शायद एक आसान तय है। क्या आप Xterm में काम करने वाले GIF को कैप्चर और पोस्ट कर सकते हैं?
इंजीनियर टोस्ट

अफसोस की बात है कि मुझे ऐसा करने के लिए उपकरणों की कमी है (बस काम के दौरान निर्माण के दौरान चारों ओर खेलना)। मैं सही पंक्ति 0 के साथ अपडेट करूंगा, हालांकि यह एक आसान फिक्स है।
लैंबडाटा

अमान्य: वहाँ [होना] चाहिए एक से पहले एक नया चाप शुरू होता है सिर्फ बुनियादी सीढ़ी (कोई आर्क्स के साथ) के फ्रेम (पहली चाप से पहले वैकल्पिक)
wastl

बदलते k = 1 से k = 0 फिक्स होता है ... 0 बाइट लागत। जल्द ही अपडेट होगा।
लैंबडाटा

2

पॉवरशेल , 347 319 बाइट्स

filter c{Param($h,$n)if($n-eq0){$n=-1}for($x=0;$x++-ne$n;){($h..1)|%{$l=(($h..1)|%{"$(" "*($h-$_))\$(" "*$_*2)/"})+"$(" "*$h)¯¯"
$r="Get-Random"
$i=0
$z=-join((0..(($h-$_)*2))|%{$i=switch($i%3){0{&$r 0,1}default{&$r 2,3}}"_/¯\"[$i]})+"_\\_"[$i]
$l[$_-1]=($l[$_-1]).Substring(0,$_)+"$z/"
cls
$l
Sleep -m 250}}}

इसे ऑनलाइन आज़माएं! $argsअच्छा खेलने के लिए नहीं मिल सका , इसलिए लिंक कंसोल को साफ़ किए बिना फ़ंक्शन को कॉल करता है।

Ungolfed

filter c{
    Param($h,$n)
    if($n -eq 0){$n=-1} # inelegant swap to allow for an infinite loop. 
                        # Curse you zero-indexing!
    for($x=0;$x++-ne$n;)
    {
        ($h..1) | % {         
            $l=(($h..1)|%{ # (( double paren is needed to induce each line 
                           # as a new array element
                "$(" "*($h-$_))\$(" "*$_*2)/" # offset by total height. 
                                              # N spaces + rung + N*2 spaces + rung
            })+"$(" "*$h)¯¯" # last line is the floor of the ladder

            $r="Get-Random" # shorter to declare once and execute with & operator

            $i=0 # initialize $i so we choose only _ or / for the first char

            $z=-join( # build an electric ZAP!
                (0..(($h-$_)*2))|%{                    
                    $i = switch($i%3) { # choose next char based on previous selection
                        0{&$r 0,1}
                        default{&$r 2,3}
                    }    
                    "_/¯\"[$i]
                }
            )+"_\\_"[$i] # final char is \ or _ to rejoin the ladder        
            $l[$_-1]=($l[$_-1]).Substring(0,$_)+"$z/" # select one rung of the ladder 
                                                      # append an electric ZAP!                
            cls # clear the console
            $l  # display the ladder
            Sleep -m 250
        }
    }
}

यह एक छोटी सी बात है, लेकिन नीचे की पंक्ति मैक्रों के बजाय हाइफ़न है। यह एक शून्य-बाइट परिवर्तन है$l=(($h..1)|%{"$(" "*($h-$_))\$(" "*$_*2)/"})+"$(" "*$h)¯¯"
इंजीनियर टोस्ट

1
¯ \ (° _o) / ¯ उफ़! मैक्रोन में अदला-बदली: p
पीटर वांडिवियर

1
मैं पॉवरशेल को बहुत अच्छी तरह से नहीं जानता, लेकिन आप अधिकांश नई-पंक्तियों को हटा सकते हैं। इसके अतिरिक्त for($x=0;$x-ne$n;$x++)हो सकता है for($x=0;$x++-ne$n;)। मैंने इसे ऐसा करने के लिए 324 बाइट्स (321 वर्ण) नीचे कर दिया। <सभी भाषाओं में गोल्फिंग के लिए टिप्स > और पॉवरशेल में गोल्फिंग के लिए टिप्स के रूप में अच्छी तरह से पढ़ने के लिए दिलचस्प हो सकता है।
केविन क्रूज़सेन

1
sleep 1थोड़ा बचाता है (यह -seconds पर चूक करता है) लेकिन बहुत धीमा है, लेकिन अभी भी उचित-ईश है, sleep -m 99बहुत जल्दी है, लेकिन उचित भी है। जो आपको पसंद है उसके आधार पर 5/1 बाइट बचाता है। केविन के प्रयास की जांच नहीं की, बल्कि functionकरने के लिए filterएक नि: शुल्क बाइट में अच्छी तरह से है।
विस्कह

1

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

m={}
"   __/\\_/¯¯\\/¯\\".chars.each_slice(3){|e|u,*v=e;m[u]=v}
a=->l,c{l<1?"/":(d=m[c].sample;c+a[l-1,d])}
n=gets.to_i
h=gets.to_i
o=0
while o<n||n<1
h.times{|i|puts (0...h).map{|j|" "*j+"\\"+a[2*(h-j),i==h-j-1?["_","/"].sample: " "]}*"\n";puts" "*h+"¯¯";sleep(0.3);puts"\n"*99}
o+=1
end

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

मैं विंडोज़ पर हूँ इसलिए यह कंसोल को खाली करने के लिए कई "\ n" प्रिंट करता है। स्टड पर 2 तर्क nऔर hदो लाइनों के रूप में लेता है ।

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