Hãy cùng hoạt hình!


8

Các thách thức

GIF là định dạng hình ảnh phổ biến nhất cho hoạt hình và được sử dụng khá nhiều trong phương tiện truyền thông xã hội ngày nay. Với mục đích của thử thách này, tôi sẽ định nghĩa lại GIF có thể là gì. Thử thách này sẽ yêu cầu bạn tham gia vào một mảng 3D có chứa một số loại hình đại diện của một "hình ảnh 2D" và lặp lại qua chúng, hiển thị một hình ảnh động. Hoạt hình này có thể được thực hiện ở bất cứ đâu, trong GIF, trong bảng điều khiển của bạn, trong GUI, v.v; việc giao hàng không thành vấn đề, miễn là nó hoạt hình.

Đầu vào

  • Mảng 3D trong đó dữ liệu bên trong bằng cách nào đó đại diện cho hình ảnh 2D.
    • Mảng có thể chứa dữ liệu RGB, dữ liệu đúng / sai hoặc bất kỳ thứ gì khác mà bạn thấy phù hợp.
    • Tôi cũng ổn với bạn làm giảm nó xuống một chuỗi các chuỗi 2D hoặc một cái gì đó tương tự, nhưng hoạt hình phải là hoạt hình 2D .
  • Thời gian giữa mỗi khung hình theo định dạng bạn chọn (Giây, mili giây, v.v ...).
    • Mọi người đã hỏi tôi liệu họ CÓ bao gồm thời lượng hay không. Câu trả lời của tôi là "meh", miễn là bạn có thể hiển thị hình ảnh động. Tôi quan tâm hơn rằng bạn tuân thủ tham số "Mảng" hơn tham số này, nghĩa là không có hoạt ảnh ngẫu nhiên.

Đầu ra

  • Một chuỗi đầu ra được lặp lại liền mạch trông giống như một hình ảnh động 2D với độ trễ chính xác trên mỗi lần chuyển đổi dựa trên đầu vào giá trị.

Những quy định

  • Đầu ra có thể, nhưng không giới hạn:
    • Ảnh GIF.
    • GUI hoạt hình (ví dụ của tôi).
    • Hoạt hình trong bàn điều khiển.
    • Thành thật mà nói, bất kỳ "hoạt hình" nào bạn thấy phù hợp, miễn là nó tuân theo các quy tắc dưới đây.
  • Khi xuất hình ảnh của bạn, bạn phải xóa bảng điều khiển trước khi hiển thị khung hình tiếp theo, bạn không thể chỉ in chúng liên tục.
    • Việc mô phỏng một giao diện điều khiển "rõ ràng" cũng được chấp nhận, miễn là nó trông giống như một hình ảnh động liền mạch (xem gợi ý dưới ví dụ của tôi để biết thêm thông tin về ý tôi).
  • Bất kể thực hiện, hoạt hình của bạn sẽ lặp đi lặp lại mãi mãi hoặc cho đến khi dừng lại.
    • Việc "lặp" có thể đơn giản như while(true){}hoặc đệ quy vô hạn, bạn có thể cho rằng người dùng muốn xem kiệt tác này cho đến khi họ nhấn "ctrl + c".
  • Bạn phải có khả năng xử lý bất kỳ kích thước 2D 'hình ảnh' nào, nếu ngôn ngữ của bạn bị giới hạn bởi kích thước bộ đệm, điều này có thể chấp nhận được và bạn có thể nêu điều này trong phần giải thích của mình.
  • Sơ hở tiêu chuẩn là không được phép.

Ví dụ I / O

Đầu vào (Mảng 3D, Độ trễ)

f([
  [[1,0,0],
   [0,0,0],
   [0,0,0]],
  [[0,0,0],
   [0,1,0],
   [0,0,0]],
  [[0,0,0],
   [0,0,0],
   [0,0,1]],
], 1)

Đầu ra (Ví dụ, 2020 Byte - Java)

import javax.swing.JFrame;
import javax.swing.JTextArea;

/**
 * Simple GIF class to animate a 3D integer array in a swing text area.
 * (Clearing the console in java isn't something you really do, so I chose
 * java on purpose to make it an extremely ungolf-able answer that someone
 * wouldn't bother to steal).
 */
public class Gif implements Runnable {
    /**
     * The output area.
     */
    private final JTextArea area;

    /**
     * The list of images.
     */
    private final int[][][] images;

    /**
     * The delay between image transitions.
     */
    private final long transitionDelay;

    /**
     * Main method, instantiates a GIF object and runs it.
     * @param args Does absolutely nothing.
     */
    public static void main(String[] args) {
        final int[][][] images = {{{1,0,0},{0,0,0},{0,0,0}},{{0,0,0},{0,1,0},{0,0,0}},{{0,0,0},{0,0,0},{0,0,1}}};
        final long transitionDelay = 1000L;
        new Thread(new Gif(images, transitionDelay)).start();
    }

    /**
     * Constructor for a GIF, takes in a 3D array of images and a transition
     * delay to wait between transitioning the images.
     * @param images The list of images.
     * @param delay The delay between each image.
     */
    public Gif(int[][][] images, long transitionDelay) {
        this.images = images;
        this.transitionDelay = transitionDelay;
        this.area = new JTextArea();
        final JFrame frame = new JFrame("It's a GIF!");
        frame.setSize(10,100);
        frame.add(area);
        frame.setVisible(true);
    }

    /**
     * When run, it will alter the area to imitate an animated GIF.
     */
    @Override
    public void run() {
        while (true) {
            for (int i = 0; i < images.length; i++) {
                final StringBuffer frame = new StringBuffer();
                for (int j = 0; j < images[i].length; j++) {
                    for (int k = 0; k < images[i][j].length; k++) {
                        frame.append("" + images[i][j][k]);
                    }
                    frame.append("\n");
                }
                this.area.setText(frame.toString());
                try{Thread.sleep(transitionDelay);}catch(Exception e){}
                this.area.setText("");
            }
        }
    }
}

Điều này dẫn đến một GUI swing xuất hiện, tạo hiệu ứng cho mảng:

Khung một Khung hai Khung ba

GỢI Ý: Sử dụng ngôn ngữ có thể xóa bảng điều khiển hoặc chỉ định lý do tại sao những gì bạn đang làm sẽ kết thúc với kết quả trông giống như một hình ảnh động trong ngôn ngữ bạn đã chọn. Tôi nghĩ rằng một số ngôn ngữ có kích thước bộ đệm mặc định trên bảng điều khiển của chúng, bạn có thể sử dụng điều này để lợi thế của bạn, nhưng tôi mong đợi một lời giải thích hoặc ví dụ. Chỉ vì tôi xuất hình ảnh động của mình dưới dạng chuỗi, bạn không phải; Tôi có thể dễ dàng sử dụng 0 cho màu đen và 1 cho màu trắng và tạo một GIF thực sự.

Đánh giá

Đây là mã golf, số byte thắng thấp nhất (loại trừ đầu vào).
Tôi sẽ +1 bất cứ ai sử dụng ngôn ngữ theo cách tuyệt vời hoặc bất ngờ.


"Rõ ràng" phải dài bao nhiêu dòng? Nó có thể giống như số lượng ký tự trên mỗi dòng không?
Riley

Thử thách tương tự với đầu vào nghiêm ngặt hơn: codegolf.stackexchange.com/questions/27101/NH
luser droog

@Riley Tôi không chắc là tôi hiểu những gì bạn đang hỏi. Rõ ràng về cơ bản là để giữ đầu ra trên cùng một dòng; mã của bạn có thể không thực sự "xóa" bất cứ thứ gì, nhưng cũng thay thế theo dòng. Tôi không quan tâm làm thế nào bạn hoàn thành hoạt hình, hơn nữa nó chủ yếu hoạt động bằng các khung.
Bạch tuộc ma thuật Urn

@luserdroog Tôi chưa từng thấy cái đó, nhưng tôi cũng thấy một cái trên "tạo ra một snowscene", nhưng tôi không thấy đủ gần để đảm bảo không đăng cái này.
Bạch tuộc ma thuật Urn

1
@carusocomputing Không phải lo lắng, hạnh phúc hơn khi kiểm tra ngữ pháp. Nhân tiện, về mặt ngôn ngữ nào được sử dụng cho hoạt hình, có vấn đề gì không nếu nó không còn được sử dụng phổ biến?
Monomeeth

Câu trả lời:


3

MATL , 16 12 11 byte

`G@)D1Y.XxT

Đầu vào là một mảng ô của 2D. Ví dụ:

{[1 0 0; 0 0 0; 0 0 0] [0 0 0; 0 1 0; 0 0 0] [0 0 0; 0 0 0; 0 0 1]}

Thời gian tạm dừng là 1trong mã. Nó có thể được thay đổi thành bất kỳ số thực nào, chẳng hạn như .5hoặc `.2.

Hãy thử nó tại MATL Online! (Nếu nó không hoạt động, hãy làm mới trang và nhấn "Chạy" lại.)

Đầu vào cũng có thể là một mảng ô của mảng char 2D. Ví dụ:

{['x...';'+...';'....';'....'] ['+x..';'....';'....';'....'] ['.+x.';'....';'....';'....'] ['..+x';'....';'....';'....'] ['...+';'...x';'....';'....'] ['....';'...+';'...x';'....'] ['....';'....';'...+';'...x'] ['....';'....';'....';'..x+'] ['....';'....';'....';'.x+.'] ['....';'....';'....';'x+..'] ['....';'....';'x...';'+...'] ['....';'x...';'+...';'....']}

Hãy thử cái này quá!

Giải trình

`       % Do...while
  G     %   Push input: cell array
  @     %   Push iteration index
  )     %   Index to obtain that cell. This uses modular indexing,
        %   so each cell is addressed cyclically
  D     %   Display
  1     %   Push 1: number of seconds to pause
  Y.    %   Pause for that many seconds
  Xx    %   Clear screen
  T     %   True. This is used as loop condition: infinite loop
        % End. Implicitly end do...while loop  

1
Bạn có thể lưu một vài byte bằng thủ thuật của tôi không? Điền vào ma trận với [0.2 0 0.2;0 0.2 0] ... , và do đó giảm xxxuống x, và tránh 1G2G? Tôi tin rằng nó tuân thủ các quy tắc. Bạn cần thêm một vài byte để chuyển đổi 0.2thành 1, trừ khi bạn muốn 0.2nhảy xung quanh, và một số cách để lưu trữ giá trị tạm dừng. Tôi vẫn nghĩ rằng nó có thể làm giảm số lượng byte mặc dù :)
Stewie Griffin

1
@Weeingitfirst Cảm ơn! Vâng, thách thức chỉ định hai đầu vào: mảng và tạm dừng, vì vậy tôi nghĩ cả hai đều cần thiết. Dù sao chúng ta hãy chờ xác nhận
Luis Mendo

2
Ồ Bạn đã theo dõi tóm tắt một cách hoàn hảo, thậm chí tuân thủ các đầu vào. Đây là một câu trả lời rất ấn tượng. Chắc chắn sẽ rất khó để đánh bại, và so với các câu trả lời không bao gồm thời gian tạm dừng, điều này về cơ bản là hoàn hảo, bravo.
Bạch tuộc ma thuật Urn

1
@carusocomputing Tuyệt vời! Cảm ơn vì đã cho tôi biết. Tắt 4 byte! Thời lượng vẫn có thể được thay đổi, mã này khá rõ ràng
Luis Mendo

1
Tôi sẽ thành thật, tôi nghi ngờ điều này sẽ bị đánh bại, vì vậy cho đến khi đệ trình thêm tôi đánh dấu đây là câu trả lời tốt nhất.
Bạch tuộc ma thuật Urn

2

Octave, 56 54 47 byte

Đã loại bỏ khả năng nhập thời gian tạm dừng như một phần của ma trận đầu vào. Tôi rất hài lòng với nó, vì vậy hãy xem lịch sử chỉnh sửa nếu bạn muốn có một cái nhìn. Giải pháp này ngắn hơn 7 byte.

n=input('');while(any(n=~n))spy(n);pause(1);end

n=input('');  % Takes input as a matrix of zeros and ones

k=n(1);       % maximum of the input matrix is the desired pause time. Have to store
              % this, because n is soon to be messed with
              % NOTE: k=n(1); is not needed anymore, since the pause time can be hardcoded!

any(n=~n)     % Check if there are any truthy values in `n` (there is), and at the 
              % same time negate it, thus creating a matrix where all elements
              % alternates between 1 and 0.
while(any(n=~n))   % Loop as long as there are any non-zero elements (always some)
spy(n)        % Create a spy-plot where all non-zero elements are shown as a dot
pause(1)      % Pauses for k seconds
end           % ends the loop (will never happen, since it's infinite).

Đầu vào sẽ giống như thế này : [4 0 0 4;0 4 4 0;4 0 0 0], trong đó đây sẽ là ma trận có kích thước 3x4 và thời gian tạm dừng mong muốn là 4 giây.

Nó hiển thị một âm mưu như bên dưới, nhưng xen kẽ giữa hiển thị giá trị đúng và sai của đầu vào. Vì vậy, tất cả các chấm màu xanh sẽ trở thành màu trắng trong lần lặp tiếp theo và tất cả các màu trắng sẽ trở thành màu xanh.

Trong cốt truyện dưới đây, tôi đã sử dụng đầu vào rand(10,10)>0.6*2. Điều này có nghĩa là nó sẽ có kích thước 10x10 và tất cả các yếu tố của ma trận ngẫu nhiên lớn hơn 0,6 sẽ là đúng. Sau đó, tôi nhân nó với thời gian tạm dừng mong muốn, 2 giây. Tôi đã sử dụng một ma trận ngẫu nhiên ở đây, nhưng tôi cũng có thể tạo ma trận bằng tay.

Tôi chưa cài đặt Octave trên máy tính này, vì vậy tôi đã thực hiện một thay đổi nhỏ để thực hiện công việc này trong MATLAB. Đó là nguyên tắc chính xác tương tự, nhưng n=~nkhông hoạt động trong MATLAB.

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

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


2
@carusocomputing, tôi có phải mất thời gian tạm dừng làm đầu vào không, hoặc tôi có thể tự chọn nó không? Chẳng hạn luôn có 1 giây?
Stewie Griffin

1
@carusocomputing, cũng: Có thể cho phép người dùng chọn thời gian tạm dừng, nhưng không có nó như một tham số riêng biệt? Theo ý kiến ​​không khiêm tốn của tôi, điều này đủ điều kiện là: "một cách tuyệt vời hoặc bất ngờ" ;-)
Stewie Griffin

1
Vâng, tôi hoàn toàn đồng ý, điều này đủ điều kiện; miễn là bạn cho phép người dùng chỉ định một số tham số đầu vào và nó không hoàn toàn ngẫu nhiên, tôi nghĩ nó ổn. Toàn bộ điểm dừng là có thể nhìn thấy hình ảnh động. Tôi không muốn bất kỳ vòng lặp nào mà mọi người nói, "tốt, bạn không thể nhìn thấy nó, nhưng nó chắc chắn là hoạt hình."
Bạch tuộc ma thuật Urn

1
Ngoài ra, tôi thích cả hai ý tưởng của bạn; "Trình tạo tĩnh TV" là một triển khai rất độc đáo, sử dụng ngẫu nhiên, điều mà tôi thậm chí không cân nhắc. Điều này cũng ấn tượng ở chỗ bạn đã xoay sở để thực hiện lần lặp đầu tiên và tuân thủ chặt chẽ hơn với bản tóm tắt. Người đàn ông công việc tuyệt vời.
Bạch tuộc ma thuật Urn

2

sed 141 134 90

-51 cảm ơn seshoumara

/^$/!{H;d}
:;/^$/g;s,^\n,,;s,$, ,;s,^,\d27[2J,p
:p;P;s,[^\n]*\n,,;/^ \n/!bp;N;s,[ \n]*,,;b

Đầu vào: Đầu tiên, mỗi khung hình được phân tách bằng một dòng với một khoảng trắng sau đó hiển thị khung tiếp theo sau khi nhận được mỗi dòng trống (trông giống như một cuốn sách lật). Tối thiểu 3 khung hình.

Theo mặc định trên hệ thống của tôi (Windows 7) khi tôi mở cygwin, nó có 24 dòng theo chiều dọc. Giữa các khung, luôn có ít nhất nhiều dòng trống được in. Điều này có hiệu quả xóa màn hình.

Hơn 1/3 số byte đến từ việc xóa giao diện điều khiển. Tôi chắc chắn có một cách tốt hơn.


1
Bạn có thể giảm 1 byte bằng cách có plệnh đầu tiên như một phần của s///p, cộng thêm 6 byte bằng cách xóa /^\n/!trước Pđó, điều mà tôi nghĩ là không cần thiết. Đối với nỗ lực, +1, mặc dù tôi cũng chắc chắn có một cách tốt hơn.
seshoumara

1
Sau một thời gian duyệt internet, tôi đã tìm thấy một cách đơn giản để thao tác con trỏ của thiết bị đầu cuối, do đó cũng xóa màn hình: sử dụng Chuỗi thoát ANSI. Cơ chế này cũng được sử dụng để in văn bản bằng màu sắc. Xin vui lòng xem câu trả lời của tôi để biết chi tiết và sử dụng ví dụ. Tôi không biết nếu họ làm việc trên cygwin, nhưng bạn có thể thử.
seshoumara

@seshoumara Nó hoạt động trong cygwin khi nó đến từ sed, nhưng vì một số lý do, nó không hoạt động với cathoặc echo.
Riley

Hãy thử echo -e "\e[2Jtest". Với cat, ký tự thoát phải có trong tệp / đầu vào, hãy thử echo -e "\e[2Jtest"|cat -nvà cuộn lên.
seshoumara

@seshoumara Tôi biết nó phải là một cái gì đó như thế. cảm ơn!
Riley

2

GNU sed, 88 84 + 1 (cờ n) = 85 byte

Chỉnh sửa: 3 byte ít hơn nhờ Riley

H;1h;${:
g;s:\n.*::;H;x;s:[^\n]*\n::;x;y:,:\n:;s:^:ESC[2J:;s:ESC:\d27:gp;esleep 1
b}

Định dạng đầu vào là một khung hình động trên mỗi dòng. Đối với nhiều dòng đầu ra trong một khung, sử dụng dấu phẩy làm dấu phân cách. Vì tôi chạy chương trình trong bảng điều khiển Linux, kích thước hình ảnh tối đa có sẵn (được đo bằng hàng và cột) phụ thuộc vào kích thước của cửa sổ đầu cuối. Tạm dừng giữa hai khung hình được thực hiện bằng những giấc ngủ lệnh shell; để có được một cuộc gọi hoạt hình nhanh hơn esleep 0.4(giây).

100,000,000            # The timer could be read from the input as well, but that
000,010,000            #would require a lot more bytes and I understand I'm allowed
000,000,001            #to hardcode the value.

Phần tốt nhất là tôi hỗ trợ hoạt hình màu! Để làm điều này, tôi đã sử dụng cái gọi là Chuỗi thoát ANSI để kiểm soát phông chữ văn bản, màu nền trước và màu nền, cộng với vị trí của con trỏ, do đó có thể xóa màn hình trước mỗi khung hình (mã ESC[2J). Để thêm thông tin màu, sử dụng định dạng sau trong đầu vào, được giải thích rõ hơn ở đây .

ESC[$FORMATm$textESC[0m     # 'ESC' is an actual string, it is then replaced
                            #in sed by the character with the ASCII value 27

Chạy:

sed -nf animate.sed input.txt

Ví dụ: đối với mỗi thử nghiệm, 2 chu kỳ hoạt hình được chụp màn hình và lưu ở định dạng GIF hình ảnh (xin lỗi vì độ phân giải thấp)

Tạm dừng 0,4 giây Chúc mừng sinh nhật!

1 giây theo mặc định chuyển động "pixel"

Giải trình:

H;1h                           # read each line/frame and store them in hold space
${:                            # when the input was read, start a loop
   g                           # copy hold space to pattern space
   s:\n.*::                    # remove all except the first/current frame
   H                           # append frame to hold space
   x;s:[^\n]*\n::;x            # delete first frame from hold space
   y:,:\n:                     # replace all commas with a newline
   s:^:ESC[2J:;s:ESC:\d27:gp   # use an ANSI Escape Sequence to clear the screen
                               #and print frame in color
   esleep 1                    # wait 1 second
b}                             # repeat

Bạn có thể lưu một vài byte bằng cách thay thế 1h;1d;H;bằngH;1h;
Riley

@Riley Cảm ơn, tôi đã cập nhật mã.
seshoumara

Wow, điều này sâu sắc hơn rất nhiều so với những người khác, tôi thích sự hỗ trợ màu sắc và đó là câu trả lời duy nhất làm điều đó :). Sử dụng khá độc đáo của dòng mới là tốt. +1 cho hỗ trợ màu sắc và tính độc đáo của chính câu trả lời. Tôi thực sự sẽ không tin nếu tôi không nhìn thấy nó!
Bạch tuộc ma thuật Urn

1

Ruby, 89 45 byte

f=->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}

Đây ^[là một nhân vật thoát.

Hexdump:

00000000: 663d 2d3e 682c 747b 682e 6379 636c 657b  f=->h,t{h.cycle{
00000010: 7c78 7c70 7574 7322 1b5b 324a 222c 782e  |x|puts".[2J",x.
00000020: 6d61 7028 263a 6a6f 696e 297d 7d         map(&:join)}}

Đã lưu rất nhiều byte nhờ @Jordan


@DLosc À, vâng, đang sửa chữa
Thiền vào

Bạn có thể tiết kiệm rất nhiều byte ở đây. ->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}
Jordan

Câu trả lời hay, cũng như một bản tóm tắt FYI đã được thay đổi, bạn không còn phải tuân thủ thời lượng là đầu vào, vì điều này hạn chế các ngôn ngữ có thể. Bạn chỉ cần tạm dừng để hình ảnh động là rõ ràng.
Bạch tuộc ma thuật Urn

1

Lua ( LÖVE ), 296 287 byte

c=0;f=1;t=10;l=love
function l.load()loadstring('i='..arg[2])()s=tonumber(arg[3])end
function l.update(d)if c>s then
c=0;f=f==#i and 1 or f+1
end;c=c+d;end
function l.draw()for K,V in pairs(i[f])do
for k,v in pairs(V)do if v>0 then l.graphics.rectangle('fill',k*t,K*t,t,t)end
end
end
end

Ví dụ sử dụng

love main.love '{{{1,0,0},{0,0,0},{0,0,0}},{{0,1,0},{0,0,0},{0,0,0}},{{0,0,1},{0,0,0},{0,0,0}},{{0,0,0},{0,0,1},{0,0,0}},{{0,0,0},{0,0,0},{0,0,1}},{{0,0,0},{0,0,0},{0,1,0}},{{0,0,0},{0,0,0},{1,0,0}},{{0,0,0},{1,0,0},{0,0,0}},{{1,0,0},{1,0,0},{0,0,0}},{{1,1,0},{1,0,0},{0,0,0}},{{1,1,1},{1,0,0},{0,0,0}},{{1,1,1},{1,0,1},{0,0,0}},{{1,1,1},{1,0,1},{0,0,1}},{{1,1,1},{1,0,1},{0,1,1}},{{1,1,1},{1,0,1},{1,1,1}},{{1,1,1},{1,1,1},{1,1,1}},{{0,0,0},{0,0,0},{0,0,0}}}' 1

Đầu ra : https://youtu.be/0kDhPbbyG9E


Hmm, tôi đã không tiếp xúc nhiều với lua, tôi không biết nó cũng hỗ trợ đồ họa, nhưng biết rằng nó có hiệu suất tuyệt vời. Một câu trả lời rất thú vị và bất ngờ. Đây có lẽ là câu trả lời gần nhất với việc cho phép nhập màu dựa trên các số được truyền. Đây cũng là câu trả lời đầu tiên cho việc không sử dụng ASCII, mặc dù số byte cao, người làm công việc tuyệt vời +1 vì tính độc đáo.
Bạch tuộc ma thuật Urn

1
@carusocomputing Cảm ơn! LÖVE là một khung để tạo các trò chơi 2d. Bạn nên kiểm tra xem :-)
Master_ex

Người đàn ông, thực sự? Bạn có thể liên kết tôi với một số người đàn ông làm việc khác của bạn? Tôi hoàn toàn thích nhìn thấy nó anh chàng.
Bạch tuộc ma thuật Urn

1

SmallBasic, 167 byte

Là một tham số, xác định và đặt var i toàn cầu! Đáng buồn thay, SmallBasic không hỗ trợ các tham số cho các thường trình con riêng.

sub animate
for j=0 to Array.getItemCount(i)
for k=0 to Array.getItemCount(i[0])
TextWindow.writeLine(i[j][k])
endfor
Program.delay(9)
TextWindow.clear()
endfor
endsub
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.