Cầu thang ASCII của Animate Jacob


23

Bạn có thể đã nhìn thấy thang của Jacob trong bảo tàng khoa học của trẻ em. Nếu bạn không quen thuộc với những gì họ trông như thế nào, có một số ví dụ hình ảnh và video trên Wikimedia Commons . Thách thức ngày nay là tạo ra một phiên bản ASCII hoạt hình của thiết bị điện. Cuối cùng, nó sẽ trông giống như thế này:

LadderGIFExample


Xây dựng thang

Dưới đây là hình dạng cơ bản của một cái thang có chiều cao ( H ) là 6:

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

Các số ở bên trái chỉ đơn giản chỉ ra số hàng cho ví dụ này và không nên được bao gồm trong đầu ra. Chúng tôi sẽ đề cập đến một hàng nhất định theo số đó ( R ). Hàng 0 là dưới cùng ¯¯. Mỗi hàng 1 đến H bao gồm bốn phần:

  • Một khoảng trắng (U + 0020) được lặp lại ( H - R ) lần
  • Dấu gạch chéo ngược \(U + 005C)
  • Một khoảng trắng (U + 0020) được lặp lại (2 * R ) lần
  • Một dấu gạch chéo về phía trước /(U + 002F)

Hàng 0 giống hệt nhau, ngoại trừ cả hai dấu gạch chéo được thay thế bằng macron ¯(U + 00AF). Trailing khoảng trắng ở cuối mỗi dòng hoặc bên dưới thang là OK. Khoảng trắng hàng đầu là không.


Xây dựng hồ quang

Khi thang được xây dựng, bạn có thể tạo vòng cung giữa bên trái và bên phải. Một cung hoàn toàn nằm trong một hàng và thay thế khoảng trắng giữa đầu \và cuối /. Do đó, hàng 2 sẽ có 4 ký tự trong cung của nó, hàng 3 sẽ có 6, v.v. Mỗi cung được cấu tạo bằng các quy tắc sau:

  • Các ký tự được phép duy nhất là _/¯\(U + 005F, U + 002F, U + 00AF, U + 005C)
  • Để đảm bảo vẻ ngoài mượt mà, bất kỳ ¯hoặc /phải được theo sau bởi một ¯hoặc\
  • Để đảm bảo vẻ ngoài mượt mà, bất kỳ _hoặc \phải được theo sau bởi một _hoặc/
  • Hai quy tắc trên cũng áp dụng cho các cạnh của thang
  • Ba quy tắc trên có nghĩa là ký tự đầu tiên trong cung phải _hoặc /và ký tự cuối cùng phải _hoặc \( \¯\_//không hợp lệ ở cả hai đầu nhưng \_/¯\/vẫn ổn)
  • Phải có cơ hội khác không cho mỗi nhân vật được phép xảy ra tại một điểm nhất định
  • Mỗi cung độc lập với mọi cung khác

Hoạt hình

Tuổi thọ của một cung duy nhất được tạo ra bằng cách bắt đầu nó ở hàng 1 và "di chuyển" nó lên một hàng tại một thời điểm cho đến khi nó đạt đến đỉnh. IE, đầu tiên tạo một cung ở hàng 1, sau đó đặt nó trở lại khoảng trắng và tạo một cung ở hàng 2, v.v. Đưa ra một số cung để hiển thị ( N ), hiển thị toàn bộ vòng đời của nhiều cung đó cùng một lúc bằng các hướng dẫn sau:

  • Chỉ một cung nên "sống" bất cứ lúc nào. Vòng cung tiếp theo không thể bắt đầu cho đến khi vòng cung hiện tại đạt đến đỉnh và sau đó dập tắt.
  • Mỗi hàng trong vòng đời của vòng cung phải được hiển thị cho chính xác một khung
  • Cần có một khung chỉ là bậc thang cơ bản (không có cung) trước khi bắt đầu một cung mới (tùy chọn trước cung thứ nhất)
  • Hoạt hình sẽ hiển thị toàn bộ cuộc sống của N cung. Nếu N = 0, nó sẽ làm động các cung ngẫu nhiên mãi mãi cho đến khi dừng lại.
  • Nếu N > 0, bạn vẫn có thể lặp lại hoạt hình mãi mãi nhưng nó phải là một vòng lặp của cùng một cung. (Ví dụ GIF ở đầu bài này có H = 6 và N = 3 nhưng nó lặp lại mãi mãi.)
  • Các hình ảnh động nên xảy ra tại chỗ. Nghĩa là, mỗi khung nên ghi đè hoàn toàn khung tiếp theo và ở cùng một vị trí.
  • Độ dài của mỗi khung hình có thể là bất cứ thứ gì bạn muốn nhưng làm cho nó có thể xem được bởi con người (IE, sử dụng ý thức chung của bạn: 0,01s / khung hình và 30 giây / khung hình đều không được chấp nhận.)

Đầu ra đầu vào

  • Đầu vào và đầu ra có thể ở bất kỳ định dạng tiêu chuẩn nào
  • Bạn có thể xuất GIF, viết văn bản lên màn hình, xuất một tệp cho mỗi khung hoặc bất kỳ phương tiện hợp lý nào khác
  • Sơ hở tiêu chuẩn bị cấm
  • Chiều cao của thang H sẽ là một số nguyên dương
  • Số lượng cung để hiển thị N sẽ là số nguyên không âm
  • Cả HN được lấy làm đầu vào theo bất kỳ thứ tự nào bạn chọn (Vui lòng bao gồm thứ tự trong câu trả lời của bạn)

Điều kiện chiến thắng

Đây là nên mã ngắn nhất sẽ thắng.

Hộp cát


1
Có thể tạo hồ quang đối xứng bởi trung tâm của nó? Tôi không thể thấy sự hạn chế trong quy tắc đó
Dead Possum

Tôi có thể in từng khung hình cho nhau trên bàn điều khiển không?
TFeld

@DeadPossum Tôi đã nghĩ rằng bạn đã đúng mặc dù thực tế nó sẽ trông rất chớp nhoáng nhưng thực sự nó không được phép bởi sự kết hợp của hai quy tắc: 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. Để đối xứng, cả ký tự đầu tiên và ký tự cuối cùng sẽ phải xuất hiện _mỗi lần, điều đó có nghĩa là không có cơ hội nào /xảy ra hoặc `\` xảy ra.
Kỹ sư Toast

@TFeld Miễn là mỗi khung hình xuất hiện ở cùng một vị trí trên màn hình, vâng. Điều đó có nghĩa là bạn sẽ phải xóa bảng điều khiển (hoặc có thể cuộn xuống, nếu có thể) mỗi lần.
Kỹ sư Toast

2
Yêu cầu macron có nghĩa là QBasic không thể cạnh tranh? Nó sử dụng CP437 , trong đó điểm mã 0xAF».
DLosc

Câu trả lời:


5

Python 2 , 287 271 270 276 275 byte

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)

Hãy thử trực tuyến!

Không xóa màn hình trên tio, nhưng hoạt động trong bảng điều khiển.

Gif của nó đang chạy:

nhập mô tả hình ảnh ở đây


Một chút lén lút nhưng bạn có thể sử dụng print'\n'*99thay vì os.system('cls')và mất osnhập. Vẫn không hoạt động trên TIO nhưng hoạt động trong cả bảng điều khiển Windows và Linux.
ElPedro

1
Cần có một khung chỉ là bậc thang cơ bản (không có cung) trước khi bắt đầu một vòng cung mới (tùy chọn trước vòng cung đầu tiên)
lãng phí

5
Tôi nghĩ rằng bạn đang sử dụng dấu gạch nối (U + 002D) thay vì macrons (U + 00AF). Tôi không nghĩ rằng nó sẽ tăng số byte của bạn để sửa nó. Ngoài ra, như @wastl đã chỉ ra, không có khung thang trống giữa các cung.
Kỹ sư Toast

Hàng dưới cùng sử dụng macrons nhưng các cung không có
Kỹ sư Toast

1
@EngineerToast Đã sửa ngay bây giờ :)
TFeld

4

JavaScript (ES6), 245 byte

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>

Số lượng byte giả định mã hóa ISO-8859-1.


Có thể giảm xuống còn 242 bằng cách xác định A=x=>[...Array(x)].map;lúc bắt đầu và thay thế cả hai cách sử dụng.
Bary12

@ Bary12 Bạn không thể trả lại map, đó chỉ là một tài sản Array.prototypevà không thể sử dụng. Tôi đã thử các phiên bản làm việc nhưng tất cả chúng đều dài hơn 245 byte.
Neil

3

C (gcc) , 406 byte

#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");}}}

Hãy thử trực tuyến!

Sự miêu tả:

#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

Lưu ý: chỉ thực sự hoạt động trong Xterm ... nhiều trình giả lập thiết bị đầu cuối chỉ không hỗ trợ vị trí lưu / khôi phục.
LambdaBeta

Hàng dưới cùng là hàng 0 và chỉ có hai macrons. Nó không phải là \--/. Đó có lẽ là một sửa chữa dễ dàng. Bạn có thể chụp và đăng một GIF của nó hoạt động trong Xterm không?
Kỹ sư Toast

Đáng buồn là tôi thiếu các công cụ để làm điều đó (chỉ chơi xung quanh trong thời gian xây dựng tại nơi làm việc). Tôi sẽ cập nhật với hàng 0 chính xác, đây là một sửa chữa dễ dàng.
LambdaBeta

Không hợp lệ: Nên [là] một khung chỉ là bậc thang cơ bản (không có cung) trước khi bắt đầu một cung mới (tùy chọn trước cung thứ nhất)
lãng phí

thay đổi k = 1 thành k = 0 sửa lỗi ... 0 byte chi phí. Sẽ cập nhật sớm.
LambdaBeta

2

PowerShell , 347 319 byte

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}}}

Hãy thử trực tuyến! Không thể có được$args chơi tốt, vì vậy liên kết gọi hàm mà không xóa bảng điều khiển.

Bị đánh cắp

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à một điều nhỏ, nhưng hàng dưới cùng là dấu gạch ngang thay vì macrons. Đó là một thay đổi không byte$l=(($h..1)|%{"$(" "*($h-$_))\$(" "*$_*2)/"})+"$(" "*$h)¯¯"
Kỹ sư Toast

1
¯ \ (° _o) / ôi! hoán đổi trong macrons: p
Peter Vandivier

1
Tôi không biết rõ về PowerShell, nhưng bạn có thể xóa hầu hết các dòng mới. Ngoài ra for($x=0;$x-ne$n;$x++)có thể được for($x=0;$x++-ne$n;). Tôi đã nhận được nó xuống còn 324 byte (321 ký tự) làm như vậy. Mẹo chơi gôn bằng <tất cả các ngôn ngữ>Mẹo chơi gôn trong PowerShell cũng có thể thú vị để đọc qua.
Kevin Cruijssen

1
sleep 1tiết kiệm một chút (mặc định là-giây) nhưng khá chậm nhưng vẫn hợp lý-ish, sleep -m 99khá nhanh nhưng cũng hợp lý. Lưu 5/1 byte tùy thuộc vào những gì bạn thích. Không kiểm tra nỗ lực của Kevin nhưng functionđể filterlà một byte miễn phí là tốt.
Veskah

1

Ruby , 293 byte

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

Hãy thử trực tuyến!

Tôi đang ở trên windows nên nó chỉ in nhiều "\ n" để xóa giao diện điều khiển. Có 2 đối số nhnhư hai dòng trên stdin.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.