Tổ hợp phím đầu ra


14

Trong bất kỳ ngôn ngữ lập trình nào, hãy tạo một chương trình lấy đầu vào và tạo hiệu ứng cho văn bản được gõ trên bàn phím.

Độ trễ giữa mỗi ký tự sẽ khác nhau để mô phỏng việc gõ đúng trên bàn phím. Độ trễ sẽ là 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...giây, cho đến khi ký tự cuối cùng được in. Đầu ra cuối cùng sẽ được để lại trên màn hình.

Bạn phải ghi đè lên dòng văn bản hiện tại mà bạn không thể in văn bản trên các hàng mới.

Ví dụ, đầu vào "Xin chào, PPCG! Tạm biệt Trái đất!" sẽ dẫn đến hoạt ảnh sau (lưu ý rằng tốc độ lấy mẫu của nhà sản xuất gif thấp, vì vậy kết quả thực sự hơi khác nhau):

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

Vì đây là mã golf, nên số byte nhỏ nhất sẽ thắng.


"Bạn phải ghi đè lên dòng văn bản hiện tại mà bạn không thể in văn bản trên các hàng mới." - điều này có nghĩa là chương trình phải xóa đầu vào và sản xuất đầu ra ở vị trí của nó? (Lưu ý bên lề: hoạt hình của bạn trông nhanh hơn chỉ định.)
Jonathan Allan

Chúng ta có thể cho rằng luôn luôn có đầu vào?
Metoniem

1
Là độ trễ được cho là ngẫu nhiên, hoặc một mẫu lặp lại 0,1, 0,1, 0,5?
12Me21

2
Có nên trì hoãn trước khi in ký tự đầu tiên?
Kritixi Lithos

1
Đó là mẫu đó có @ 12Me21
Metoniem

Câu trả lời:


8

C 108 93 89 78 73 80 byte

f(char *s){for(int i=0;s[i];fflush(0),usleep(100000*(i++%3?1:5)))putchar(s[i]);}

Phiên bản bị đánh cắp:

 void f(char *s)
 {
  for( int i=0;s[i];)
  {
    putchar(s[i]);
    fflush(0);
    usleep(100000*(i++%3?1:5));
 }
}

@Kritixi Lithos @Metoniem Cảm ơn bạn đã đóng góp! lưu một số byte.

Bằng cách nào đó, chỉ int icho tôi một lỗi phân đoạn khi chạy, vì vậy tôi đã khởi tạo nó bằng 0.


1
Bạn có sử dụng những cải tiến của tôi hay không: Sự chậm trễ của bạn nên theo cách khác. nếu i%3độ trễ phải là 5.
Metoniem

Thay thế 100000bằng 1e5để cạo 3 byte
Albert Renshaw

@AlbertRenshaw Cảm ơn vì tiền boa, đã cập nhật. Tôi đã sử dụng nó trong một số giải pháp khác của tôi quá không biết tại sao tôi quên ở đây.
Abel Tom

@AbelTom Vì một số lý do, 1e5không hoạt động trên thiết bị của tôi
Kritixi Lithos

@KritixiLithos làm thế nào? bạn có dùng Linux không?
Abel Tom

6

Thạch , 13 byte

115D÷⁵ṁȮœS¥@"

Đây là một liên kết / chức năng đơn âm. Do đầu ra ngầm định, nó không hoạt động như một chương trình đầy đủ.

xác minh

Làm thế nào nó hoạt động

115D÷⁵ṁȮœS¥@"  Monadic link. Argument: s (string)

115            Set the return value to 115.
   D           Decimal; yield [1, 1, 5].
    ÷⁵         Divide all three integers by 10.
      ṁ        Mold; repeat the items of [0.1, 0.1, 0.5] as many times as
               necessary to match the length of s.
          ¥@"  Combine the two links to the left into a dyadic chain and apply it
               to each element in s and the corr. element of the last return value.
       Ȯ         Print the left argument of the chain (a character of s) and sleep
                 as many seconds as the right argument indicates (0.1 or 0.5).

6

MATLAB, 74 byte

c=input('');p=[1,1,5]/10;for i=c;fprintf('%s',i);p=p([2,3,1]);pause(p);end

Giải trình:

Tôi đã sử dụng khá nhiều thời gian để làm cho fprintfphiên bản ngắn hơn so disp()với clc. Bước đột phá là khi tôi phát hiện ra / nhớ rằng pausecó thể lấy một vectơ làm đối số, trong trường hợp đó nó sẽ chỉ chọn giá trị đầu tiên. Điều này làm cho nó có thể rời khỏi một quầy.

c=input('');    % Take input as 'Hello'
p=[.1,.1,.5];   % The various pause times

for i=c;            % For each of the characters in the input c
  fprintf('%s',i);  % Print the character i, without any trailing newline or whitespace
                    % No need to clear the screen, it will just append the new character 
                    % after the existing ones
  pause(p);         % pause for p(1) seconds. If the input to pause is a vector, 
                    % then it will choose the first value
  p=p([2,3,1]);     % Shift the pause times
end

Thời gian ngắn nhất tôi sử dụng displà 81 byte:

c=input('');p=[1,1,5]/10;for i=1:nnz(c),clc;disp(c(1:i));pause(p(mod(i,3)+1));end

Bạn có thể làm printfthay vì fprintf? Nó hoạt động trên octave-online.net (nhưng đó là Octave chứ không phải Matlab)
Kritixi Lithos

4

JavaScript (ES6), 67 byte

f=(i,o,n=0)=>i[n]&&(o.data+=i[n],setTimeout(f,++n%3?100:500,i,o,n))
<form><input id=i><button onclick=f(i.value,o.firstChild)>Go!</button><pre id=o>


Đoạn trích dường như không hoạt động
Kritixi Lithos

@KritixiLithos Yup, dường như không hoạt động trên Chrome :-(
Metoniem

hoạt động trong firefox tho
Conor O'Brien

2
Nó hoạt động với tôi trong Chrome, nhưng bảng điều khiển cho biếtBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac Tôi đã thay đổi đoạn trích để sử dụng một sự kiện khác. (Tôi rất cũ tôi thực sự có thể nhớ khi nhấn Enter trong một trường mẫu không kích hoạt các nút sau nhưng đi thẳng để tạo trình.)
Neil

4

V , 20 19 18 byte

Lưu 1 byte nhờ @DJMcMayhem

lưu 1 byte bằng cách xóa òở cuối

òD1gÓulD1gÓulDgÓul

Vô duyên vô cùng, tôi biết, chính điều đó ukhiến tôi không thể sử dụng các vòng lặp lồng nhau.

Giải trình

Con trỏ bắt đầu ở phần đầu của bộ đệm, là ký tự đầu tiên của đầu vào.

ò                      " Start recursion
 D                     " Deletes everything from the cursor's position to the end of line
  1gÓ                  " Sleep for 100ms
     u                 " Undo (now the deletion is reverted)
      l                " Move cursor one to the right
       D1gÓul          " Do it again
             D         " Same as before but...
              gÓ       " Sleep for 500ms this time
                ul     " Then undo and move right
                       " Implicit ò

Gif sắp ra mắt ...


không có giá trị mặc định là 500 ms, vì vậy bạn có thể lưu một byte ở đó. Ngoài ra, hãy nhớ rằng bạn không cần thứ hai ò!
DJMcMayhem

Thay vì undo bạn chỉ có thể paste? Không chắc chắn nếu điều đó có ích gì cả
nmjcman101

@DJMcMayhem Tôi không biết tại sao tôi lại bỏ lỡ 500 mặc định, cảm ơn! Nhưng tôi cần thứ hai òvì nếu không chương trình chấm dứt sớm trên tài khoản của dòng mới ẩn ở cuối gây ra lỗi vi phạm.
Kritixi Litva

@ nmjcman101 Tôi cũng đã suy nghĩ về việc sử dụng paste, nhưng than ôi, nó di chuyển con trỏ đến cuối dòng và để quay trở lại, tôi sẽ cần một cái gì ``đó sẽ chỉ làm tăng thêm số lượng của tôi hơn nữa
Kritixi Lithos

4

MATL , 16 byte

"@&htDTT5hX@)&Xx

Hãy thử nó tại MATL Online!

Giải trình

"        % Implicitly input string. For each char of it
  @      %   Push current char
  &h     %   Concatenate everything so far into a string
  tD     %   Duplicate and display
  TT5h   %   Push array [1 1 5]
  X@)    %   Get the k-th element modularly, where k is current iteration.
         %   So this gives 1, 1, 5 cyclically
  &Xx    %   Pause for that many tenths of a second and clear screen
         % Implicit end. Implicitly display the final string, again (screen
         % was deleted at the end of the last iteration)

4

Noodel , 18 byte

ʋ115ṡḶƙÞṡạḌ100.ṡ€ß

Thử nó:)


Làm thế nào nó hoạt động

                   # Input is automatically pushed to the stack.
ʋ                  # Vectorize the string into an array of characters.
 115               # Push on the string literal "115" to be used to create the delays.
    ṡ              # Swap the two items on the stack.

     ḶƙÞṡạḌ100.ṡ€  # The main loop for the animation.
     Ḷ             # Loops the following code based off of the length of the string.
      ƙ            # Push on the current iteration's element of the character array (essentially a foreach).
       Þ           # Pop off of the stack and push to the screen.
        ṡ          # Swap the string "115" and he array of characters (this is done because need array of characters on the top for the loop to know how many times to loop)
         ạ         # Grab the next character in the string "115" (essentially a natural animation cmd that every time called on the same object will access the next item looping)
                   # Also, turns the string into an array of characters.
          Ḍ100.    # Pop the character off and convert to a number then multiply by 100 to get the correct delay. Then delay for that many ms.
               ṡ   # Swap the items again to compensate for the one earlier.
                €  # The end of the loop.

                 ß # Clears the screen such that when implicit popping of the stack occurs it will display the correct output.

Đoạn mã 19 byte lặp lại vô tận.

<div id="noodel" cols="30" rows="2" code="ʋ115ṡḷḶƙÞṡạḌ100.ṡ€ß" input='"Hello, PPCG! Goodbye Earth!"'/>
<script src="https://tkellehe.github.io/noodel/release/noodel-2.5.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


1
Vì một số lý do, sự chậm trễ dường như tắt. Độ trễ là 100ms, 100ms, 500ms. Bạn dường như có 100ms mọi lúc.
Ismael Miguel

@IsmaelMiguel Mắt tốt. Sau khi xem qua nguồn có thêm một thay vì nhân. Tôi có thể giữ nó theo cách đó mặc dù trong trường hợp tôi cần điều đó bởi vì tôi có thể thấy nó có thể hữu ích ở đâu. Cảm ơn rất nhiều vì điều đó!
tkellehe

Không có gì. Và tôi xin lỗi vì số byte của bạn tăng lên.
Ismael Miguel

@IsmaelMiguel, thật tốt vì khi tôi tạo phiên bản tiếp theo của Noodel, tôi có thể tạo ra một giải pháp 11 byte (vì những điều cơ bản tôi cần thêm). Nó rõ ràng sẽ không được soạn thảo, nhưng đây là một ngôn ngữ mới và có một chặng đường dài để đi trước nó cũng tốt như một số ngôn ngữ chơi gôn hàng đầu :)
tkellehe

3

APL, 23 byte

⊢{⍞←⍺⊣⎕DL⍵÷10}¨1 1 5⍴⍨⍴

Giải trình:

               1 1 5⍴⍨⍴  ⍝ repeat the values [1,1,5] to match the input length
⊢                        ⍝ the input itself
 {           }¨          ⍝ pairwise map
      ⎕DL⍵÷10            ⍝ wait ⍵÷10 seconds, where ⍵ is the number
     ⊣                   ⍝ ignore that value, and
  ⍞←⍺                    ⍝ output the character   

3

C #, 131 byte

Không có nhiều để giải thích. Nó chỉ lấy một chuỗi (được bọc trong "") làm đối số và in từng ký tự bằng cách sử dụng mẫu trễ chính xác. Sau khi hình ảnh động xuất hiện với một OutOfRangeExceptionvì vòng lặp không dừng lại sau khi nó lặp trên tất cả các ký tự. Vì đó là một vòng lặp vô hạn, điều đó cũng có nghĩa là tôi có thể sử dụng int Mainthay vì void Main;-)

Chơi gôn

class C{static int Main(string[]a){for(int i=0;){System.Console.Write(a[0][i]);System.Threading.Thread.Sleep(i++%3<1?500:100);}}}

Ung dung

class C
{
    static int Main(string[] a)
    {
        for (int i = 0; ;)
        {
            System.Console.Write(a[0][i]);
            System.Threading.Thread.Sleep(i++ % 3 < 1 ? 500 : 100);
        }
    }
}

Chỉnh sửa

  • Đã lưu 1 byte bằng cách di chuyển gia tăng ibên trong Sleep()phương thức thay vì trong forvòng lặp. (Cảm ơn Maliafo )

1
Tôi không phải là lập trình viên C #, nhưng bạn không thể làm gì đó Sleep(i++ [...])để lưu thêm một byte trong vòng lặp for?
Maliafo

@Maliafo Bạn có thể đúng! Tôi sẽ chạy nó để đảm bảo nếu nó vẫn chạy chính xác và sau đó cập nhật bài viết của tôi. Cảm ơn!
Metoniem

2

SmileBASIC, 61 byte

LINPUT S$FOR I=0TO LEN(S$)-1?S$[I];
WAIT 6+24*(I MOD 3>1)NEXT

Tôi nghĩ việc tính toán độ trễ có thể ngắn hơn rất nhiều.


2

Clojure, 81 byte

#(doseq[[c d](map vector %(cycle[100 100 500]))](Thread/sleep d)(print c)(flush))

Vòng lặp trên chuỗi đầu vào được nén với một danh sách vô hạn [100 100 500].

(defn typer [input]
  ; (map vector... is generally how you zip lists in Clojure 
  (doseq [[chr delay] (map vector input (cycle [100 100 500]))]
    (Thread/sleep delay)
    (print chr) (flush)))

2

Bash (+ tiện ích), 32 byte

Lưu ý, điều này sẽ phát ra tiếng bíp trong quá trình, nhưng ai nói bài nộp không thể có hiệu ứng âm thanh lạ mắt!

Chơi gôn

sed 's/.../&\a\a\a\a/g'|pv -qL10

Bản giới thiệu

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



1

Powershell, 66 65 63 Byte

[char[]]$args|%{sleep -m((1,1,5)[++$i%3]*100);Write-Host $_ -N}

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

-1 loại bỏ khoảng trắng không cần thiết sau -m

-2 cảm ơn admBorkBork - đã sử dụng 1,1,5*kết quả cuối cùng bằng cách 100thay vì sử dụng100,100,500

mất $argsnhư một mảng char, các vòng lặp thông qua việc ngủ như được chỉ định, Write-Hostvới-N đối số oNewline được sử dụng để viết các ký tự ra trên cùng một dòng.

Cải tiến?

  • sử dụng [0..99]thay vì[char[]] để lưu 1 byte, nhưng sẽ không hoạt động trên chuỗi hơn 100 ký tự.
  • sử dụng 100,500[(++$i%3)-gt1] làm cho nó ngắn hơn bằng cách nào đó.
  • kết hợp nó thành một chuỗi duy nhất và xóa giữa các đầu ra, loại bỏ dài Write-Host

không thể tìm thấy bất kỳ cách nào để làm cho hai công việc cuối cùng và cách thứ nhất không hợp lệ theo bất kỳ quy tắc cụ thể nào.


1
Thoát ra hàng trăm để tiết kiệm hai byte -sleep -m((1,1,5)[++$i%3]*100)
admBorkBork

@AdmBorkBork thông minh - cảm ơn!
colsw

0

Perl, 63 byte

foreach(split//,pop){$|=++$i;print;select('','','',$i%3?.1:.5)}

0

Python 3, 88 byte

import time;s=''
for x in input():s+=x;time.sleep(.1+.4*(len(s)%3==0));print('\n'*25+s)

0

Rebol, 65 byte

s: input t:[.1 .1 .5]forall s[prin s/1 wait last append t take t]

Ung dung:

s: input
t: [.1 .1 .5]

forall s [
    prin s/1
    wait last append t take t
]

0

Bash + coreutils, 57 byte

for((;k<${#1};k++)){ echo -n ${1:k:1};sleep .$[2&k%3|1];}

0

Java 7, 151 149 byte

class M{public static void main(String[]a)throws Exception{int n=0;for(String c:a[0].split("")){System.out.print(c);Thread.sleep(n++%3>0?100:500);}}}

-2 byte nhờ @KritixiLithos cho một cái gì đó tôi luôn quên ..

Giải trình:

class M{
  public static void main(String[] a) throws Exception{ // throws Exception is required due to the Thread.sleep
    int n = 0;                                          // Initialize counter (and set to 0)
    for(String c : a[0].split("")){                     // Loop over the characters of the input
      System.out.print(c);                              // Print the character
      Thread.sleep(n++ % 3 > 0 ?                        // if (n modulo 3 != 0)
                                 100                    //   Use 100 ms
                               :                        // else (n modulo 3 == 0):
                                 500);                  //   Use 500 ms
    }
  }
}

Sử dụng:

java -jar M.jar "Hello, PPCG! Goodbye Earth!"

1
Tôi chưa thử nó, nhưng a[0].split("")thay vào đó bạn có thể làm gì đó không?
Kritixi Lithos

@KritixiLithos Argg .. Tôi luôn quên cái đó. Cảm ơn.
Kevin Cruijssen

Nói về điều đó, tôi cũng nên sử dụng splittrong câu trả lời Xử lý của mình ...
Kritixi Lithos

0

Chế biến, 133 131 byte

int i;void setup(){for(String c:String.join("",args).split(""))p{try{Thread.sleep(i++%3<1?500:100);}catch(Exception e){}print(c);}}

Tôi đã thử làm args[0] và gói các đối số trong"" thay vào đó, nhưng nó không hoạt động vì một số lý do.

Dù sao ... đây là lần đầu tiên tôi viết chương trình Xử lý có đối số. Không giống như Java, bạn không cần phải khai báo các đối số bằng cách sử dụngString[]args , nhưng biến argssẽ tự động được khởi tạo cho các đối số.

Đặt nó trong một tệp được gọi sketch_name.pdedưới một thư mục được gọi sketch_name(có, cùng tên cho thư mục và phác họa). Gọi nó như:

processing-java --sketch=/full/path/to/sketch/folder --run input text here

phô mai

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.