Keluaran penekanan tombol


14

Dalam bahasa pemrograman apa pun, buat program yang mengambil input dan menghidupkan teks yang sedang diketik pada keyboard.

Penundaan antara setiap karakter harus bervariasi untuk mensimulasikan pengetikan yang sebenarnya pada keyboard. Penundaan harus dalam 0.1, 0.1, 0.5, 0.1, 0.1, 0.5 ...hitungan detik, hingga karakter terakhir dicetak. Hasil akhir harus dibiarkan di layar.

Anda harus menimpa baris teks saat ini Anda tidak dapat memiliki teks dicetak pada baris baru.

Contoh, masukan "Halo, PPCG! Selamat tinggal Earth!" harus menghasilkan animasi berikut (perhatikan bahwa laju pengambilan sampel pembuat gif rendah, sehingga hasil sebenarnya sedikit berbeda):

masukkan deskripsi gambar di sini

Karena ini adalah kode golf, jumlah byte terkecil menang.


"Anda harus menimpa baris teks saat ini Anda tidak dapat memiliki teks dicetak pada baris baru." - Apakah ini menyiratkan bahwa program harus menghapus input dan menghasilkan output di tempatnya? (Catatan: animasi Anda terlihat lebih cepat dari yang ditentukan.)
Jonathan Allan

Bisakah kita menganggap selalu ada input?
Metoniem

1
Apakah penundaan seharusnya acak, atau pola berulang 0,1, 0,1, 0,5?
12Me21

2
Haruskah ada penundaan sebelum mencetak karakter pertama?
Kritixi Lithos

1
Ini polanya ya @ 12Me21
Metoniem

Jawaban:


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]);}

Versi tidak disatukan:

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

@Kritixi Lithos @Metoniem Terima kasih atas masukan Anda! menyimpan beberapa byte.

Entah bagaimana, hanya int imemberi saya kesalahan segmentasi saat menjalankan, jadi saya menginisialisasi dengan 0.


1
Apakah Anda menggunakan peningkatan saya atau tidak: Penundaan Anda harus sebaliknya. jika i%3penundaannya 5.
Metoniem

Ganti 100000dengan 1e5mencukur 3 byte
Albert Renshaw

@AlbertRenshaw Terima kasih atas tipnya, diperbarui. Saya telah menggunakannya di beberapa solusi saya yang lain juga tidak tahu mengapa saya lupa di sini.
Abel Tom

@AbelTom Untuk beberapa alasan, 1e5tidak berfungsi pada perangkat saya
Kritixi Lithos

@KritixiLithos howcome? apakah Anda di Linux?
Abel Tom

6

Jelly , 13 byte

115D÷⁵ṁȮœS¥@"

Ini adalah tautan / fungsi monadik. Karena output implisit, itu tidak berfungsi sebagai program lengkap.

Verifikasi

Bagaimana itu bekerja

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

Penjelasan:

Saya menggunakan beberapa saat untuk membuat fprintfversi lebih pendek daripada disp()dengan clc. Terobosannya adalah ketika saya menemukan / mengingat bahwa pausedapat mengambil vektor sebagai argumen, dalam hal ini hanya akan memilih nilai pertama. Ini memungkinkan untuk meninggalkan konter.

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

Terpendek yang saya gunakan dispadalah 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

Dapat Anda lakukan printfbukan fprintf? Ini bekerja di octave-online.net (tapi itu oktaf dan bukan 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>


Cuplikan sepertinya tidak berfungsi
Kritixi Lithos

@KritixiLithos Yup, sepertinya tidak bekerja di Chrome :-(
Metoniem

bekerja di firefox tho
Conor O'Brien

2
Ini bekerja untuk saya di Chrome, tetapi konsolnya mengatakanBlocked form submission to '' because the form's frame is sandboxed and the 'allow-forms' permission is not set.
numbermaniac

@numbermaniac Saya mengubah cuplikan untuk menggunakan acara yang berbeda. (Saya sudah sangat tua sehingga saya benar-benar dapat mengingat ketika menekan tombol Enter di bidang form tidak memicu tombol berikut tetapi langsung menuju form submission.)
Neil

4

V , 20 19 18 byte

1 byte disimpan berkat @DJMcMayhem

disimpan 1 byte dengan menghapus òdi akhir

òD1gÓulD1gÓulDgÓul

Sangat tidak berperasaan, saya tahu, hanya saja tidak ketat umencegah saya menggunakan loop bersarang.

Penjelasan

Kursor dimulai di awal buffer, yang merupakan karakter pertama dari input.

ò                      " 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 segera hadir ...


tanpa hitungan default hingga 500 ms, jadi Anda bisa menyimpan byte di sana. Juga, ingatlah bahwa Anda tidak membutuhkan yang kedua ò!
DJMcMayhem

Alih-alih tidak udapatkah Anda hanya paste? Tidak yakin apakah itu membantu sama sekali
nmjcman101

@DJMcMayhem Saya tidak tahu mengapa saya melewatkan default 500, terima kasih! Tapi saya perlu yang kedua òkarena jika tidak program berakhir lebih awal karena baris baru implisit pada akhirnya menyebabkan kesalahan.
Kritixi Lithos

@ nmjcman101 Saya juga berpikir untuk menggunakan paste, tetapi sayangnya itu memindahkan kursor ke akhir baris dan untuk kembali saya akan memerlukan sesuatu seperti ``yang hanya akan meningkatkan bytecount saya lebih jauh
Kritixi Lithos

4

MATL , 16 byte

"@&htDTT5hX@)&Xx

Cobalah di MATL Online!

Penjelasan

"        % 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.ṡ€ß

Cobalah:)


Bagaimana itu bekerja

                   # 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.

Cuplikan kode 19 byte yang berulang tanpa henti.

<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
Untuk beberapa alasan, penundaan tampaknya tidak aktif. Penundaannya 100ms, 100ms, 500ms. Anda tampaknya memiliki 100 ms sepanjang waktu.
Ismael Miguel

@ IsmaelMiguel Mata yang bagus. Setelah melihat-lihat sumbernya ada yang menambahkan, bukan yang berlipat ganda. Saya mungkin tetap seperti itu kalau-kalau saya membutuhkannya karena saya bisa melihat di mana itu mungkin berguna. Terima kasih banyak untuk itu!
tkellehe

Sama-sama. Dan saya minta maaf bahwa jumlah byte Anda meningkat.
Ismael Miguel

@ IsmaelMiguel, tidak apa-apa karena ketika saya membuat versi Noodel berikutnya saya dapat membuat solusi 11 byte (karena dasar-dasar yang perlu saya tambahkan). Ini jelas akan nonkompetisi, tetapi ini adalah bahasa baru dan memiliki jalan panjang sebelum itu sama baiknya dengan beberapa bahasa golf terkemuka :)
tkellehe

3

APL, 23 byte

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

Penjelasan:

               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

Tidak banyak yang bisa dijelaskan. Hanya membutuhkan string (terbungkus "") sebagai argumen dan mencetak setiap karakter menggunakan pola penundaan yang benar. Setelah animasi, ia keluar dengan OutOfRangeExceptionkarena loop tidak berhenti setelah loop di atas semua karakter. Karena ini adalah infinite loop, itu juga berarti saya bisa menggunakan int Maindaripada void Main;-)

Golf

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

Tidak disatukan

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

Suntingan

  • Disimpan 1 byte dengan memindahkan penambahan idi dalam Sleep()metode alih-alih di forloop. (Terima kasih Maliafo )

1
Saya bukan programmer C #, tetapi tidak bisakah Anda melakukan sesuatu seperti Sleep(i++ [...])menyimpan byte tambahan di dalam for loop?
Maliafo

@Maliafo Anda mungkin benar! Saya akan menjalankannya untuk memastikan apakah masih berjalan dengan benar dan kemudian memperbarui posting saya. Terima kasih!
Metoniem

2

SmileBASIC, 61 byte

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

Saya pikir perhitungan penundaan bisa menjadi jauh lebih pendek.


2

Clojure, 81 byte

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

Loop atas string input di-zip dengan daftar infinite [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 (+ utilities), 32 byte

Catatan, ini akan berbunyi bip dalam proses, tetapi yang mengatakan pengiriman tidak dapat memiliki efek suara mewah!

Golf

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

Demo

masukkan deskripsi gambar di sini


2

Python 3 , 83 75 byte

import time;i=0
for c in input():i+=1;print(end=c);time.sleep(i%3and.1or.5)

Cobalah online!


1
Ini tidak berfungsi pada TIO. Lakukan di sini . Di repl.it, Anda bahkan tidak perlu ,flush=1.
mbomb007

1

Powershell, 66 65 63 Bytes

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

masukkan deskripsi gambar di sini

-1 menghapus spasi putih yang tidak dibutuhkan setelahnya -m

-2 Terima kasih kepada AdmBorkBork - digunakan 1,1,5dan *hasil akhirnya oleh100 bukannya menggunakan100,100,500

mengambil $argssebagai array char, loop melalui tidur seperti yang ditentukan, Write-Hostdengan-N argumen oNewline digunakan untuk menulis karakter pada baris yang sama.

Perbaikan?

  • gunakan [0..99]sebagai ganti[char[]] untuk menyimpan 1 byte, tetapi tidak akan bekerja pada string lebih dari 100 karakter.
  • gunakan 100,500dan[(++$i%3)-gt1] tapi buat jadi lebih pendek.
  • menggabungkannya menjadi string tunggal dan menghapus antar output, menghilangkan yang panjang Write-Host

tidak dapat menemukan cara untuk membuat dua yang terakhir berfungsi, dan yang pertama tidak valid oleh aturan tertentu.


1
Pecah seratus untuk menghemat dua byte -sleep -m((1,1,5)[++$i%3]*100)
AdmBorkBork

@AdmBorkBork smart one - terima kasih!
colsw

0

Perl, 63 byte

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

0

Python 3, 88 Bytes

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]

Tidak Disatukan:

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

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


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 berkat @KritixiLithos untuk sesuatu yang selalu saya lupa ..

Penjelasan:

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

Pemakaian:

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

1
Saya belum mengujinya, tetapi bisakah Anda melakukan sesuatu seperti itu a[0].split("")?
Kritixi Lithos

@KritixiLithos Argg .. Saya selalu lupa itu. Terima kasih.
Kevin Cruijssen

Berbicara tentang itu, saya juga harus menggunakan splitjawaban Pemrosesan saya ...
Kritixi Lithos

0

Memproses, 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);}}

Saya mencoba melakukan args[0]dan memasukkan argumen"" sebagai gantinya, tetapi tidak berhasil karena suatu alasan.

Ngomong-ngomong ... ini adalah pertama kalinya saya menulis sebuah program Pemrosesan yang mengambil argumen. Tidak seperti Java, Anda tidak perlu mendeklarasikan argumen menggunakan String[]args, tetapi variabel argsakan secara otomatis diinisialisasi ke argumen.

Masukkan ke dalam file bernama di sketch_name.pdebawah folder bernama sketch_name(ya, nama yang sama untuk folder dan sketsa). Sebut saja seperti:

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

cheese

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.